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

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

Также есть специальный тип 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) или массив таких ссылок (если выбрана опция Несколько). Получить объекты приложений можно по ссылкам из других объектов, а также из глобальных констант. Подробнее про работу с приложениями можно узнать в статье «Работа с приложениями».