AZykov (обсуждение | вклад) Нет описания правки |
AZykov (обсуждение | вклад) Нет описания правки |
||
Строка 53: | Строка 53: | ||
"paramName2":["parameter", "timeFinish"], | "paramName2":["parameter", "timeFinish"], | ||
} | } | ||
} | }, | ||
"responsePath":"data" | |||
} | } | ||
Строка 109: | Строка 109: | ||
"paramName2":["parameter", "timeFinish"], | "paramName2":["parameter", "timeFinish"], | ||
} | } | ||
} | }, | ||
"responsePath":"data" | |||
} | } |
Текущая версия от 12:43, 12 марта 2025
Предыдущая статья курса: Задание 10. Обработка данных
Общая информация
Универсальный источник данных (dataSource) - это специализированная структура, описывающая способ получения данных для элементов управления (Controls).

Любой контрол (таблица, карточка график и т.д.) может получать данные для отображения не только из хранилища (используется по-умолчанию), но и из сторонних источников.
Примеры сторонних источников:
- class - набор сущностей класса. По факту является вариантом по-умолчанию
- enum - содержимое перечисления (раздел Enum в приложении Builder)
- data - явно заданный константный массив данных
- code - выполнение произвольного фрагмента кода, возвращающее коллекцию значений для отображения
- action - выполнение метода любого микросервиса
Кроме указания источника данных, dataSource также позволяет задать правила фильтрации данных, выводимых контролом.
Пример использования dataSource для доступа к данным класса с фильтрацией:
{
"kind": "class",
"class_fullMultiName": "creomate_tutorial/contact/Contacts",
"selection": {
"filter": [
"or",
["isnull",["parameter","place"]],
["==",["property","place_id"],["parameter","place"]]
]
}
}
Пример использования dataSource для доступа к данным из перечисления:
{
"kind": "enum",
"enum_fullName": "crm/TaskPriority"
}
Пример использования dataSource для обращения к данным микросервиса:
{
"kind": "action",
"action":{
"service":"creomate_tutorial.Server2Service",
"method":"Control_getData",
"request":{
"id":["parameter", "id"],
"parameters":{
"paramName1":["parameter", "timeStart"],
"paramName2":["parameter", "timeFinish"],
}
},
"responsePath":"data"
}
}
В данном примере, в свойства id, paramName1 ичё paramName2 передаются значения параметров из контрола с помощью связи.
Свойство reponsePath задает имя свойства в JSON'е ответа, из которого необходимо вернуть коллекцию. Пример сервиса
Обработчики в универсальном источнике данных
Универсальный источник данных, кроме параметров получения выборки, также позволяет проводить простые операции над данными во время их получения. Для обработки данных существует три опциональных параметра:
- postProcessItemCode - содержит код, применяемый к каждому элементу выборки. Позволяет модифицировать значения свойств данных при получении
- postFilterCode - содержит код, применяемый к каждому элементу выборки. Позволяет фильтровать выбираемые значения, должен возвращать true или false
- postProcessCollectionCode - содержит код, исполняемый после загрузки всей коллекции значений
Пример обработки коллекции с помощью dataSource:
{
"kind": "class",
"class_fullMultiName": "creomate_tutorial/contact/Contacts",
"selection": {
"filter": [
"or",
["isnull",["parameter","place"]],
["==",["property","place_id"],["parameter","place"]]
]
},
"postProcessItemCode":"this.caption = this.name + ' '+ this.registrationDate",
"postFilterCode":"return this.isActive",
"postProcessCollectionCode":"console.log(this.length)"
}
В данном примере для каждого элемента коллекции собирается поле caption, элементы коллекции где this.isActive=False фильтруются, а после обработки всей коллекции в консоль пишется её длина.
Для postProcessItem и postFilter в качестве this передаются элементы коллекции, к свойствам которых можно обратиться. Для postProcessCollection в качестве this передаётся вся коллекция.
Работа сервиса с универсальным источником данных
На примере вызова сервиса Server2Service разберем детали работы с запросами от dataSource.
Структура dataSource для получения данных из сервиса:
{
"kind": "action",
"action":{
"service":"creomate_tutorial.Server2Service",
"method":"Control_getData",
"request":{
"id":["parameter", "id"],
"parameters":{
"paramName1":["parameter", "timeStart"],
"paramName2":["parameter", "timeFinish"],
}
},
"responsePath":"data"
}
}
Данный dataSource обращается к сервису Server2Service и вызывает его метод Control_getData.
Так же в сервис передаются два параметра. В коде ниже рассмотрим код сервиса, который обработает данный запрос:
import { GlobalUtils, Converter, EraRequest } from "./../../utils";
import { PlatformServices, Service } from "./../../platform/core";
import { ITicket, ITickets } from "../model";
import { Tickets } from "../classes";
import { IBaseEntity, IDataUpdateParams } from "../../base/model";
import { EraEnvironment } from "../../../lowlevel";
import { IInvocation } from "../../platform/model";
class Server2Service extends Service {
private _tickets: ITickets; //свойство класса, через которое мы будем доступаться к коллекции Tickets
constructor() {
super("creomate_tutorial.Server2Service");
// onCreateCode
this._tickets = new Tickets(this.context); //инициализируем коллекцию Tickets
this.load();
}
async Control_getData(invocation_: IInvocation){
try{
const timeStart = invocation_.request?.parameters.paramName1;
const timeFinish = invocation_.request?.parameters.paramName2;
return {data: [{id: "123", name:"Test 1"}, {id:"124", name:"Test 2"}]};
}catch(e){
this.log.exception("Control_getData", e);
}
}
}
export default Server2Service;
Метод Control_getData в качестве параметра получает Invocation, который содержит все данные о запросе, включая набор переданных параметров. Сервис возвращает объект со свойством data, в котором лежит коллекция записей с полями id и name.
Соответственно, в контрол будет выведено две записи с такими полями, если не настроена какая-либо фильтрация на стороне dataSource или самого контрола. На свойство data также указывает параметр responsePath в самой структуре dataSource, это означает что контрол должен использовать свойство data в качестве коллекции значений при получении ответа от сервиса.
Следующая статья курса: Разработка отчётов
Предыдущая статья курса: Задание 10. Обработка данных