Creatio development guide
Это документация Creatio версии 7.9.0. Мы рекомендуем использовать новую версию документации.

Пример использования встроенного процесса объекта. Добавление автонумерации к полю страницы

Glossary Item Box

Общие сведения

Одной из типовых задач конфигурирования является установка автонумерации для определенного поля страницы редактирования. Примером могут служить разделы [Документы], [Счета], [Договоры], в которых вновь созданный документ получает автоматически сгенерированный номер определенного формата.

Для реализации задачи автонумерации возможно два варианта решения:

  • реализовать автонумерацию на стороне клиента;
  • реализовать автонумерацию на сервере.

Чтобы реализовать автонумерацию на стороне клиента необходимо переопределить базовый виртуальный метод onEntityInitialized() и в нем вызвать метод getIncrementCode() базовой схемы страницы редактирования BasePageV2.

Метод getIncrementCode() принимает два параметра:

  • callback — функция, которая будет вызвана при получении ответа от сервиса. Ответ необходимо передать в соответствующую колонку (атрибут);
  • scope — контекст, в котором будет вызвана функция callback (необязательный параметр).

Для того чтобы автонумерация работала на стороне сервера (например, для реализации задач интеграции системы bpm'online с другими системами), дополнительно к объекту, к колонке которого будет применяться автонумерация, необходимо добавить обработчик события [Перед добавлением записи]. В бизнес-процессе необходимо установить параметры генерации номера, а именно — указать схему объекта, для которого будет осуществляться генерация. Затем вызвать действие [Сгенерировать номер по порядку]. И, наконец, передать сгенерированное значение в необходимую колонку объекта.

К СВЕДЕНИЮ

Это не единственный вариант реализации автонумерации на стороне сервера. Ее можно реализовать пользовательскимии методами, например, создав пользовательский сервис.

Для использования механизма автонумерации независимо от выбранного варианта решения, необходимо добавить две системные настройки:

  • [Entity]CodeMask — маска номера объекта,
  • [Entity]LastNumber — текущий номер объекта,

где [Entity] — это наименование того объекта, к колонке которого будет применяться автонумерация. Например, InvoiceCodeMask (Маска номера счета) и InvoiceLastNumber (Текущий номер счета).

Описание кейса

В разделе [Продукты] установить автогенерацию для поля [Код] страницы редактирования. Код продукта должен формироваться следующим образом — ART_00000.

ВАЖНО

Для выполнения этого кейса ниже представлено два алгоритма его выполнения — на стороне клиента и на стороне сервера. Однако для выполнения этой задачи, в зависимости от потребности, необходимо выполнить только один из них.

Алгоритм реализации кейса на стороне клиента

1. Создать две системные настройки

Сначала необходимо создать системную настройку [Маска кода продукта] с маской номера "ART_{0:00000}" (рис. 1). Для нее указать:

  • [Название] — "Маска кода продукта";
  • [Код] — "ProductCodeMask";
  • [Тип] — "Строка". Зависит от количества символов в маске. В большинстве случаев достаточно строки длиной 50 символов. В этом примере используется строка неограниченной длины;
  • [Маска] — "ART_{0:00000}".

Рис. 1. — Системная настройка [Маска кода продукта]

Затем нужно создать системную настройку [Текущий код продукта] (рис. 2). Для нее указать:

  • [Название] — "Текущий код продукта";
  • [Код] — "ProductLastNumber";
  • [Тип] — "Целое число".

Рис. 2. — Системная настройка [Текущий код продукта]

2. В пользовательском пакете создать замещающую схему

Для этого необходимо создать замещающий клиентский модуль, в котором в качестве родительского объекта указать схему ProductPageV2 (рис. 3). Процесс создания замещающей страницы описан в статье "Создание клиентской схемы".

Рис. 3. — Свойства замещающей схемы страницы редактирования продукта

3. В коллекции методов модели представления страницы редактирования переопределить метод 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. Создать замещающую схему объекта [Продукт]

Для этого необходимо выбрать пользовательский пакет и на вкладке [Схемы] выполнить команду меню [Добавить] — [Замещающий объект]. В свойствах нового объекта нужно указат в в качестве родительского объект [Продукт] (рис. 5).

Рис. 5. — Свойства замещающей схемы продукта

3. Добавить в схему объекта обработчик события [Перед добавлением записи]

Для этого в свойствах объекта, отображающихся в дизайнере объектов, необходимо перейти на вкладку событий и добавить новый обработчик события дважды кликнув по полю [Перед добавлением записи], либо кликнув по пиктограмме события в этом поле (рис. 6).

Рис. 6. — Обработчик события [Перед добавлением записи] продукта

После этого сразу же откроется дизайнер процессов объекта.

4. Добавить событийный подпроцесс

Для реализации обработчика события [Перед добавлением записи] в рабочую область дизайнера процессов объекта необходимо добавить событийный подпроцесс, в котором реализовать бизнес-процесс добавления автогенерируемого номера (рис. 7).

Рис. 7. — Событийный подпроцесс — обработчик события [Перед добавлением записи]

Элементы событийного подпроцесса:

1. Начальное сообщение [Перед добавлением продукта] (рис. 8) — подпроцесс будет запущен при получении сообщения ProductInserting.

Рис. 8. — Свойства начального сообщения [Перед добавлением продукта]

2. Логический оператор [Исключающее ИЛИ], от которого исходят две ветви подпроцесса:

  • Поток по умолчанию — переход по нему произойдет в случае, если не может быть выполнен переход по условному потоку. Эта ветвь завершается событием [Останов] .
  • Условный поток [Код не заполнен] (рис. 9), в котором проверяется заполнена ли колонка [Code]. Дальнейшее выполнение подпроцесса возможно только в том случае, если колонка не заполнена.

Рис. 9. — Свойства условного потока [Код не заполнен]

Код, который необходимо добавить в поле [Условие] условного потока:

string.IsNullOrEmpty(Entity.GetTypedColumnValue<string>("Code"))

3. Задание-сценарий [Определить схему объекта для генерации номера](рис. 10).

Рис. 10. — Свойства задания-сценария [Определить схему объекта для генерации номера]

В этом элементе выполняется программный код сценария С#. Для его добавления необходимо выполнить двойной клик по элементу. В открывшемся окне добавить следующий код:

// Установка схемы для генерации номера.
// Здесь UserTask1 — это пользовательское действие [Выполнить генерацию номера],
// выполняющее системное действие [Сгенерировать номер по порядку].
UserTask1.EntitySchema = Entity.Schema;
return true;

ВАЖНО

После добавления исходного кода, сценарий необходимо сохранить, например, выполнив действие меню [Сохранить и закрыть] вкладки [SkriptTask1].

4. Действие процесса [Выполнить генерацию номера] (рис. 11) — действие, выполняющее системное действие [Сгенерировать номер по порядку], которое непосредственно генерирует текущий порядковый номер в соответствии с установленной маской.

Рис. 11. — Свойства действия процесса [Выполнить генерацию номера]

5. Задание-сценарий [Записать полученный номер в колонку объекта] (рис. 12).

Рис. 12. — Свойства задания-сценария [Записать полученный номер в колонку объекта]

В этом элементе будет выполняться программный код сценария С#:

// Значение, которое было сгенерировано пользовательским действием UserTask1
// записывается в колонку [Code] создаваемого объекта.
Entity.SetColumnValue("Code", UserTask1.ResultCode);
return true;

После публикации процесса, а также после публикации схемы объекта на странице редактирования продукта после сохранения нового продукта в поле [Код] будет указан автоматически сгенерированный код (рис. 13, рис. 14).

Рис. 13. — При создании продукта код не отображается

Рис. 14. — Код добавлен автоматически при сохранении продукта

ВАЖНО

Поскольку автогенерация кода и его сохранение в колонку выполняется на сервере при возникновении события [Перед сохранением записи], то значение кода никак нельзя отобразить на странице добавления продукта. Это связано с тем, что событие возникает уже после отправки запроса на добавление записи с клиенской части приложения.

© Terrasoft 2002-2017.

Был ли данный материал полезен?

Как можно улучшить эту статью?