Пример использования встроенного процесса объекта. Добавление автонумерации к полю страницы
Glossary Item Box
Общие сведения
Вы можете добавить автонумерацию для определенного поля страницы редактирования. Например, автонумерация реализована в разделах [Документы], [Счета] и [Договоры], где при создании записи для нее автоматически генерируется номер в заданном формате.
Для реализации задачи автонумерации возможно два варианта решения:
- реализовать автонумерацию на стороне клиента;
- реализовать автонумерацию на сервере.
Чтобы реализовать автонумерацию на стороне клиента, необходимо переопределить базовый виртуальный метод onEntityInitialized() и в нем вызвать метод getIncrementCode() базовой схемы страницы редактирования BasePageV2.
Метод getIncrementCode() принимает два параметра:
- callback — функция, которая будет вызвана при получении ответа от сервиса. Ответ необходимо передать в соответствующую колонку (атрибут);
- scope — контекст, в котором будет вызвана функция callback (необязательный параметр).
Для реализации автонумерации на стороне сервера дополнительно к объекту, к колонке которого будет применяться автонумерация, необходимо добавить обработчик события [Перед добавлением записи]. В бизнес-процессе необходимо установить параметры генерации номера, а именно:
- Указать схему объекта, для которого будет осуществляться генерация.
- Вызвать действие [Сгенерировать номер по порядку].
- Передать сгенерированное значение в необходимую колонку объекта.
К СВЕДЕНИЮ
Это не единственный вариант реализации автонумерации на стороне сервера. Ее можно реализовать пользовательскими методами, например, создав пользовательский сервис.
Для использования механизма автонумерации, независимо от выбранного варианта решения, необходимо добавить две системные настройки:
- [Entity]CodeMask — маска номера объекта,
- [Entity]LastNumber — текущий номер объекта,
где [Entity] — это наименование того объекта, к колонке которого будет применяться автонумерация. Например, InvoiceCodeMask (Маска номера счета) и InvoiceLastNumber (Текущий номер счета).
Описание примера
В разделе [Продукты] установить автогенерацию для поля [Код] страницы редактирования. Код продукта должен формироваться следующим образом — ART_00001, ART_00002 и т. д.
ВАЖНО
Ниже представлено два алгоритма выполнения примера — на стороне клиента и на стороне сервера. Задача добавления автонумерации реализуется одним из способов.
Исходный код
Пакет с реализацией примеров можно скачать по ссылке.
ВАЖНО
Пакет не содержит привязанных системных настроек ProductCodeMask и ProductLastNumber. Их необходимо добавить вручную.
Алгоритм реализации кейса на стороне клиента
1. Создать две системные настройки
Создайте системную настройку [Маска кода продукта] с маской номера "ART_{0:00000}" (рис. 1). Укажите значения для следующих полей:
- [Название] ([Name]) — "Маска кода продукта" ("Product code mask").
- [Код] ([Code]) — "ProductCodeMask".
- [Тип] ([Type]) — строка, длина которой зависит от количества символов в маске. В большинстве случаев достаточно строки длиной 50 символов. В этом примере используется строка неограниченной длины.
- [Значение по умолчанию] ([Default value]) — "ART_{0:00000}".
Рис. 1. — Системная настройка [Маска кода продукта]
Создайте системную настройку [Текущий код продукта] (рис. 2). Укажите:
- [Название] ([Name]) — "Текущий код продукта" ("Product last number").
- [Код] ([Code]) — "ProductLastNumber";
- [Тип] ([Type]) — "Целое число" ("Integer").
Рис. 2. — Системная настройка [Текущий код продукта]
2. В пользовательском пакете создать замещающую схему
Создайте замещающий клиентский модуль, в котором в качестве родительского объекта укажите схему ProductPageV2 (рис. 3). Процесс создания замещающей страницы описан в статье "Создание клиентской схемы".
Рис. 3. — Свойства замещающей схемы страницы редактирования продукта
3. Переопределить метод onEntityInitialized()
В коллекции методов модели представления страницы редактирования переопределите метод onEntityInitialized(). В методе onEntityInitialized() нужно вызвать метод getIncrementCode(), в callback-функции которого следует присвоить сгенерированный номер колонке [Code]. Исходный код замещающей схемы:
define("ProductPageV2", [], function() { return { // Название схемы объекта страницы редактирования. entitySchemaName: "Product", // Коллекция методов модели представления страницы. methods: { // Переопределение базового метода Terrasoft.BasePageV2.onEntityInitialized, который // срабатывает после окончания инициализации схемы объекта страницы редактирования. onEntityInitialized: function() { // Вызывается родительская реализация метода onEntityInitialized. this.callParent(arguments); // Код генерируется, только если создается новый элемент или копия существующего. if (this.isAddMode() || this.isCopyMode()) { // Вызов базового метода Terrasoft.BasePageV2.getIncrementCode, который генерирует номер // по заданной ранее маске. this.getIncrementCode(function(response) { // Сгенерированный номер возвращается в колонку [Code]. this.set("Code", response); }); } } } }; });
После сохранения схемы и обновления страницы приложения с очисткой кэша, при добавлении нового продукта будет отображен автоматически сгенерированный код (рис. 4).
Рис. 4. — Результат выполнения кейса на стороне клиента
Алгоритм реализации кейса на стороне сервера
1. Создать две системные настройки
Этот шаг полностью идентичен первому шагу алгоритма реализации кейса на стороне клиента.
2. Создать замещающую схему объекта [Продукт]
Выберите пользовательский пакет и на вкладке [Схемы] выполните команду меню [Добавить] — [Замещающий объект]. В свойствах нового объекта нужно указать в качестве родительского объект [Продукт] ([Product]) (рис. 5).
Рис. 5. — Свойства замещающей схемы продукта
3. Добавить в схему объекта обработчик события [Перед добавлением записи]
В свойствах объекта, отображающихся в дизайнере объектов, добавьте новый обработчик события. Для этого перейдите на вкладку событий и дважды кликните по полю [Перед добавлением записи] ([Before Record Adding]) либо кликните по пиктограмме события в этом поле (рис. 6).
Рис. 6. — Обработчик события [Перед добавлением записи] продукта
После этого откроется дизайнер процессов объекта.
4. Добавить событийный подпроцесс
Для реализации обработчика события [Перед добавлением записи] в рабочую область дизайнера процессов объекта добавьте событийный подпроцесс. В нем реализуйте бизнес-процесс добавления автогенерируемого номера (рис. 7).
Рис. 7. — Событийный подпроцесс — обработчик события [Перед добавлением записи]
Элементы событийного подпроцесса:
1. Начальное сообщение [Перед добавлением продукта] ([Before product adding]) (рис. 8) — подпроцесс будет запущен при получении сообщения ProductInserting, добавленном на шаге 3.
Рис. 8. — Свойства начального сообщения [Перед добавлением продукта]
2. Логический оператор [Исключающее ИЛИ], от которого исходят две ветви подпроцесса:
- Поток по умолчанию — переход по нему произойдет в случае, если не может быть выполнен переход по условному потоку. Эта ветвь завершается событием [Останов].
- Условный поток [Код не заполнен] ([Code is empty]), в котором проверяется, заполнена ли колонка [Code] (рис. 9). Дальнейшее выполнение подпроцесса возможно только в том случае, если колонка не заполнена.
Рис. 9. — Свойства условного потока [Код не заполнен]
Код, который необходимо добавить в поле [Условие] условного потока:
string.IsNullOrEmpty(Entity.GetTypedColumnValue<string>("Code"))
3. Задание-сценарий [Определить схему объекта для генерации номера] ([Get entity schema to generate number]) (рис. 10).
Рис. 10. — Свойства задания-сценария [Определить схему объекта для генерации номера]
В этом элементе выполняется программный код сценария С#. Для его добавления дважды кликните по элементу. В открывшемся окне добавьте следующий исходный код:
// Установка схемы для генерации номера. UserTask1.EntitySchema = Entity.Schema; return true;
Здесь UserTask1 — это название пользовательского действия [Выполнить генерацию номера] ([Generate number]).
ВАЖНО
После добавления исходного кода обязательно сохраните сценарий. Для этого на вкладке [SkriptTask1] выполните действие меню [Сохранить].
4. Действие процесса [Выполнить генерацию номера] ([Generate number]) (рис. 11).
Рис. 11. — Свойства действия процесса [Выполнить генерацию номера]
В этом элементе выполняется системное действие [Сгенерировать номер по порядку] ([Generate ordinal number]). Именно системное действие [Сгенерировать номер по порядку] генерирует текущий порядковый номер в соответствии с установленной в системной настройке ProductCodeMask маской.
5. Задание-сценарий [Записать полученный номер в колонку объекта] ([Save number to entity column]) (рис. 12).
Рис. 12. — Свойства задания-сценария [Записать полученный номер в колонку объекта]
В этом элементе будет выполняться программный код сценария С#. Значение, которое было сгенерировано пользовательским действием UserTask1, записывается в колонку [Code] создаваемого объекта [Продукт]. Исходный код сценария приведен ниже:
Entity.SetColumnValue("Code", UserTask1.ResultCode); return true;
Сохраните и закройте дизайнер встроенного процесса, а затем опубликуйте схему объекта [Продукт]. В результате после сохранения нового продукта на его странице редактирования в поле [Код] будет указан автоматически сгенерированный код (рис. 13, рис. 14).
ВАЖНО
Поскольку автогенерация кода и его сохранение в колонку выполняется на стороне сервера при возникновении события [Перед сохранением записи], то значение кода невозможно сразу же отобразить на странице добавления продукта. Это связано с тем, что событие [Перед сохранением записи] возникает на стороне сервера уже после отправки запроса на добавление записи из клиентской части приложения.
Рис. 13. — При создании продукта код не отображается
Рис. 14. — Код отображается в сохраненном продукте