Дополнительные действия
AZykov (обсуждение | вклад) |
AZykov (обсуждение | вклад) |
||
(не показаны 4 промежуточные версии этого же участника) | |||
Строка 81: | Строка 81: | ||
|allowSearchPanel | |allowSearchPanel | ||
|True | |True | ||
|Включает отображение поля поиска в панели инструментов | |Включает отображение поля поиска в панели инструментов. Поиск "из коробки" работает только при использовании класса как источника данных. При использовании сервиса необходимо на стороне метода получить из Invocation параметры поиска и отфильтровать содержимое выдачи в соответствии с ними, т.е. поиск остаётся на усмотрение разработчика. | ||
|- | |- | ||
|allowRowNumbers | |allowRowNumbers | ||
Строка 115: | Строка 115: | ||
|} | |} | ||
=== Исходный код сервиса === | |||
<syntaxhighlight lang="typescript"> | |||
import { GlobalUtils, Converter } from "./../../utils"; | |||
import { Service } from "./../../platform/core"; | |||
import { IInvocation } from "../../platform/model"; | |||
class Server2Service extends Service { | |||
constructor() { | |||
super("creomate_tutorial.Server2Service"); | |||
// onCreateCode | |||
this.load(); | |||
} | |||
async Control_getData(invocation_: IInvocation){ | |||
this.log.debug("control get start"); | |||
try{ | |||
this.log.debug({data: [{id: "123", name:"Test 1"}, {id:"124", name:"Test 2"}]}); | |||
return [{name:"Test 1", valuex:"1", id:"223"}, {name:"Test 2", valuex:"2", id:"2345"} ]; | |||
}catch(e){ | |||
this.log.exception("Control_getData", e); | |||
} | |||
} | |||
async onInit() { | |||
await super.onInit(); | |||
try { | |||
// onInitCode | |||
} | |||
catch (e) { | |||
this.log.exception("onInit", e); | |||
} | |||
} | |||
async onTimer() { | |||
await super.onTimer(); | |||
try { | |||
// onTimerCode | |||
} | |||
catch (e) { | |||
this.log.exception("onTimer", e); | |||
} | |||
} | |||
// declarationsCode | |||
// functionsCode | |||
} | |||
export default Server2Service; | |||
</syntaxhighlight> | |||
=== Пример настроенного контрола === | |||
[[Файл:Пример контрола с получением данных из сервиса.png|центр|1051x1051px|безрамки]] | |||
Текущая версия от 18:40, 13 марта 2025
Предыдущая статья курса: Работа с универсальным источником данных
Общая информация
В качестве отчётов, в рамках приложений на платформе Эра, выступают особым образом настроеные контролы. В платформе изначально предусмотрен достаточно исчерпывающий перечень видов контролов, которые закрывают подавляющее большинство задач по разработке отчёта. Полный список базовых видов контролов можно посмотреть в статье этого курса, посвещенной контролам.
Общий алгоритм разработки отчёта следующий:
- Определение источников данных для отчёта. Это могут быть данные объектов, перечислений, информация из внешней системы, константы и т.д.
- Определение логики построения отчёта и выбор способа сбора данных. На этом этапе необходимо понять, как из исходных данных собрать целевой отчёт и какой из инструментов платформы подойдет для этого лучше. Выбранный источник данных должен быть настроен в соответствующем контроле с помощью универсального источника данных, рассмотренного в предыдущей статье. Возможные варианты:
- Получение данных классов напрямую из хранилища. Фильтрация, группировка и преобразование данных выполняется на уровне dataSource
- Разработка сервиса, подготавливающего данные для отчёта
- Использование внешнего источника данных (URL)
- Если на шаге 2 был выбран сервис, то данный сервис необходимо разработать и протестировать
- Создать контрол необходимого для отчёта типа. Выбрать controlMode = Custom. Настроить у контрола dataSource с необходимым способом получения данных, фильтрами и обработками. Удобнее всего начать с контрола с типом table, даже если целевой отчёт не должен быть таблицей. В таблице удобно протестировать создаваемый отчет, его фильтры и обработки. Уже после тестирования можно создать новый контрол другого типа и перенести все настройки в него
- Произвести мелкие настройки контрола, например разрешить или запретить сортировку и изменение состава колонок. Этот этап в целом является опциональным, перечень параметров, доступных для настройки можно найти в статье по контролам. Обращаем внимание, что особые настройки контрола становятся доступными после сохранения контрола с определенным типом. Тип контрола после сохранения изменять нельзя.
В общем виде любой сложный отчёт состоит из двух частей:
- Сервис, который принимает Invocation с параметрами, реализует логику построения отчёта, совершает внутренние и внешние вызовы для сбора данных, подготавливает данные в структуру JSON и возвращает их.
- Контрол необходимого для отчёта типа, с набором необходимых фильтров, набором настроек интерфейса, облегчающих работу с отчётом, а также dataSource, сконфигурированный для работы с созданным сервисом.
Для простых отчётов, сервис может отсутствовать, например если данные для отчёта получаются напрямую из объектов опредленного класса и не требуется какие-либо сложные операции.
Пример вывода данных из сервиса в контрол
Настройки контрола
Свойство | Значение | Комментарий |
---|---|---|
controlKind | table | Используется тип контрола Таблица как стандартный способ вывода отчетов |
controlMode | custom | Режим custom означает, что контрол не привязан к конкретному классу и использует собственные настройки для отображения. |
dataSource | {
"action": {
"method": "Control_getData",
"request": {
"parameters": {}
},
"responsePath": "",
"service": "creomate_tutorial.Server2Service"
},
"kind": "action"
}
|
Универсальный источник данных, получающий данные из сервиса Server2Service. Отдельного внимания заслуживает пустое значение в responsePath. Это означает, что данные из сервиса передаются не обёрнутые в какой-либо объект. |
allowExport | True | Данная настройка разрешает экспорт данных пользователем в Excel, CSV и JSON. Для табличных отчётов полезно оставлять включенной |
showToolbar | True | Включает отображение панели инструментов с полем поиска и кнопками экспорта |
allowShowCard | False | Данная настройка запрещает открытие карточек по ссылкам |
allowColumnChoose | False | Данная настройка разрешает произвольный выбор колонки. Эта настройка остаётся на усмотрение разработчика |
allowColumnReorder | True | Данная настройка разрешает изменение порядка колонок в контроле. Эта настройка остаётся на усмотрение разработчика |
allowColumnResize | True | Настройка разрешает изменение ширины колонок |
allowSearchPanel | True | Включает отображение поля поиска в панели инструментов. Поиск "из коробки" работает только при использовании класса как источника данных. При использовании сервиса необходимо на стороне метода получить из Invocation параметры поиска и отфильтровать содержимое выдачи в соответствии с ними, т.е. поиск остаётся на усмотрение разработчика. |
allowRowNumbers | True | Настройка включает отображение номеров строк |
pageSize | 20 | Настройка задаёт ограничение по количеству строк на одной "странице" отчёта |
customColumns | [
{
"caption": "Имя",
"propertyName": "name"
},
{
"caption": "valuex",
"propertyName": "valuex"
},
{
"caption": "Идентификатор",
"propertyName": "id"
}
]
|
JSON, описывающий колонки для отображения. В поле caption задаётся заголовок для отображения пользователю. В поле propertyName задается имя свойства элемента коллекции |
wordWrap | True | Настройка разрешает перенос строк, если они не помещаются в ширину колонки |
Исходный код сервиса
import { GlobalUtils, Converter } from "./../../utils";
import { Service } from "./../../platform/core";
import { IInvocation } from "../../platform/model";
class Server2Service extends Service {
constructor() {
super("creomate_tutorial.Server2Service");
// onCreateCode
this.load();
}
async Control_getData(invocation_: IInvocation){
this.log.debug("control get start");
try{
this.log.debug({data: [{id: "123", name:"Test 1"}, {id:"124", name:"Test 2"}]});
return [{name:"Test 1", valuex:"1", id:"223"}, {name:"Test 2", valuex:"2", id:"2345"} ];
}catch(e){
this.log.exception("Control_getData", e);
}
}
async onInit() {
await super.onInit();
try {
// onInitCode
}
catch (e) {
this.log.exception("onInit", e);
}
}
async onTimer() {
await super.onTimer();
try {
// onTimerCode
}
catch (e) {
this.log.exception("onTimer", e);
}
}
// declarationsCode
// functionsCode
}
export default Server2Service;
Пример настроенного контрола

Следующая статья курса: Задание 11. Разработка кастомного отчета
Предыдущая статья курса: Работа с универсальным источником данных