Работа с типами

Все объекты системы описываются как одноуровневые структуры, в которых кодам полей сопоставляются определённые типы. Типы можно разделить на следующие 4 класса:

Также есть специальный тип TJSON для хранения неструктурированных данных. В зависимости от класса, экземпляры этого типа конструируются разным образом.

Примитивные типы

Примитивные типы сопоставимы с примитивными типами TypeScript, например, в контексте процесса есть поле комментария типа TString, с которым можно работать как с обычной строкой:

Context.data.__comment = 'Скрипт выполнился успешно!';

Структурные типы

Структурные типы по сути представляют собой объект в терминах javascript, например, мы можем взаимодействовать с ФИО инициатора (тип TFullName) следующим образом:

const initiator = await Context.data.__createdBy.fetch();
const fn = initiator.data.fullname;
Context.data.__comment = `Скрипт запустил ${ fn.firstname } ${ fn.lastname }`;

Экземпляры классов

Экземпляры классов необходимо создавать с помощью конструктора или описания поля. Например, если в контексте есть поле total с типом TMoney, то для его заполнения необходимо сделать следующее:

Context.data.total = new Money(17999.99, 'RUB');

Если необходимо добавить строку в поле с типом TTable, то для ее добавления нужно сделать следующее:

// Получаем заказ
const order = await Context.data.orders!.fetch();
// Вставляем строку
const row = order.data.content!.insert();
// Заполняем строку
row.item = Context.data.product!;
row.amount = Context.data.amount!;
// Сохраняем заказ
await order.save();

Примечание: без сохранения элемента приложения не произойдет обновление таблицы.

Ссылки на объекты

Ссылки на объекты системы имеют метод fetch, с помощью которого можно получить сам объект. Подробнее про объекты написано далее в разделе Типы объектов.

Описание поля

Также каждый тип имеет объект описания, с помощью которого можно либо конструировать объекты, либо производить другие операции. Например, если в контексте есть поле participants типа Пользователи (множественное), то само поле будет хранить массив ссылок TUser, а для получения массива пользователей можно воспользоваться соответствующим ему описанием поля, с типом UserField, в котором есть метод UserField.fetchAll:

const participants = await Context.fields.participants.fetchAll();

Если в контексте есть поле order типа Приложение, то через описание этого поля можно получить доступ непосредственно к приложению, например, для того, чтобы создать новый элемент:

const order = Context.fields.order.app.create();
order.client = Context.data.client;
await order.save();
Context.data.order = order;

Типы объектов

Объекты системы представляют из себя записи в базе данных. Это могут быть элементы приложений (ApplicationItem) или базовые объекты системы (UserItem, FileItem, ImageItem). Каждый объект описывается набором соответствующих ему полей (ItemData), где коду поля сопоставляется его тип. Также объекты имеют базовый набор полей BaseItemData. Каждый объект содержит описание своих полей (свойство fields), а также объект значений этих полей (свойство data). Описание поля зависит от его типа.

Ссылки на объекты

Для всех объектов существует также объект-ссылка ItemRef, через который можно получить сам объект. Например, в базовом наборе полей любого объекта есть ссылка на автора этого объекта __createdBy, для того, чтобы получить объект автора, необходимо его запросить:

const author = await Context.data.__createdBy.fetch();

У любой ссылки есть метод fetch, с помощью которого можно запросить сам объект.

Пользователи

Пользователь (UserItem) является объектом системы с набором полей UserData. Для ссылки на пользователя используется объект типа UserItemRef. В данный момент пользователей нельзя создавать или изменять из сценариев.

Например, пусть процесс запускается по элементу приложения order и необходимо поставить задачу на автора этого элемента, тогда достаточно сделать динамическую зону ответственности и в связанную с ней переменную author положить автора элемента:

const order = await Context.data.order.fetch();
Context.data.author = order.data.__createdBy;

На объекте пользователя и на ссылке на него доступен метод UserItemRef.getChiefs для получения руководителей пользователя. Например, если нам необходимо получить руководителей автора из предыдущего примера, то его можно получить следующим образом:

Context.data.chiefs = await Context.data.author.getChiefs();

Файлы

Файл (FileItem) это объект системы с набором полей FileData. Для ссылки на пользователя используется объект типа FileItemRef. В данный момент файлы нельзя изменять из сценариев.

Метод FileField.create позволяет создавать файлы в папке экземпляра процесса

const fileRq = await fetch(`https://jpeg.org/images/jpegsystems-home.jpg`)
const buf = await fileRq.arrayBuffer()
const file = await Context.fields.file.create("home.jpg", buf)

Метод FileField.createFromLink позволяет загружать файлы из сторонних источников в папку экземпляра процесса

const file = await Context.fields.file.createFromLink("home.jpg", `https://jpeg.org/images/jpegsystems-home.jpg`)

Метод FileItem.getDownloadUrl и FileItemRef.getDownloadUrl позволяет получить ссылку на скачивание файла

const url = await file.getDownloadUrl();

Элементы приложений

Элемент приложения (ApplicationItem) состоит из полей этого приложения. Если в контексте есть поле типа Приложение, то в этом поле будет лежать одна ссылка (ApplicationItemRef) или массив таких ссылок (если выбрана опция «Несколько»). Получить объекты приложений можно по ссылкам из других объектов, а также из Глобальных констант. Подробнее про работу с приложениями можно прочитать в соответствующем разделе.