Запуск процесса из клиентского модуля
Glossary Item Box
Общие сведения
Чтобы запустить бизнес-процесс из JavaScript-кода клиентской схемы, необходимо:
- В модуль страницы, из которой вызывается сервис, подключить в качестве зависимости модуль ProcessModuleUtilities. Этот модуль предоставляет удобный интерфейс для выполнения запросов к сервису ProcessEngineService.svc.
- Вызвать метод executeProcess(args) модуля ProcessModuleUtilities, передав ему в качестве параметра объект args с такими свойствами (табл. 1):
Табл. 1. — Свойства объекта args
Свойство | Описание |
---|---|
sysProcessName | Имя вызываемого процесса (необязательное свойство в случае, если определено свойство sysProcessId). |
sysProcessId | Уникальный идентификатор вызываемого процесса (необязательное свойство в случае, если определено свойство sysProcessName). |
parameters |
Объект, свойствами которого являются входящие параметры вызываемого процесса. |
Описание примера
На страницу редактирования контрагента добавить действие, по которому будет запускаться бизнес-процесс "Проведение встречи". В бизнес-процесс передать в качестве параметра основной контакт контрагента.
Исходный код
Пакет с реализацией примера можно скачать по ссылке.
Алгоритм реализации примера
1. Создать пользовательский бизнес-процесс "Проведение встречи"
В примере используется бизнес-процесс "Проведение встречи", создание которого детально описано в разделах "Построение линейных процессов" и "Как работать с email" документации по настройке процессов (рис. 1).
Рис. 1. — Диаграмма исходного бизнес-процесса "Проведение встречи"
После создания бизнес-процесса добавьте в него параметр ProcessSchemaContactParameter, в свойствах которого в поле [Тип данных] ([Data type]) укажите "Уникальный идентификатор" ("Unique identifier") (рис. 2).
Рис. 2. — Добавление входящего параметра
Затем в свойствах первого действия процесса [Позвонить клиенту] ([Call customer]) заполните поле [Контакт] ([Contact]) данным входящим параметром процесса (рис. 3).
Рис. 3. — Передача параметра в элемент процесса
2. Создать замещающую страницу редактирования контрагента и добавить на нее действие
Добавление действия на страницу редактирования подробно описано в статье "Добавление действия на страницу редактирования".
В схему замещающего модуля страницы редактирования и схему раздела контрагента добавьте локализуемую строку CallProcessCaption с заголовком действия, например, "Назначить встречу" ("Schedule a meeting").
Дополнительно в объявлении модуля страницы редактирования подключите в качестве зависимости модуль ProcessModuleUtilities.
Исходные коды схемы раздела и страницы редактирования раздела [Контрагенты] ([Accounts]) приведены ниже.
3. Добавить необходимые методы в схемы
Для запуска процесса воспользуйтесь методом executeProcess() модуля ProcessModuleUtilities, в который в качестве параметра необходимо передать объект со следующими свойствами: имя созданного бизнес-процесса, объект с проинициализированными входящими параметрами для процесса.
В исходном коде, приведенном ниже, все это реализовано в методе callCustomProcess(). Также реализованы методы проверки существования основного контакта isAccountPrimaryContactSet() и добавления элементов меню действий getActions().
Исходный код замещающего модуля страницы редактирования:
define("AccountPageV2", ["ProcessModuleUtilities"], function(ProcessModuleUtilities) { return { // Название схемы объекта страницы редактирования. entitySchemaName: "Account", // Методы модели представления страницы редактирования. methods: { // Проверяет, заполнено ли поле [Основной контакт] страницы. isAccountPrimaryContactSet: function() { return this.get("PrimaryContact") ? true : false; }, // Переопределение базового виртуального метода, возвращающего коллекцию действий страницы редактирования. getActions: function() { // Вызывается родительская реализация метода для получения // коллекции проинициализированных действий базовой страницы. var actionMenuItems = this.callParent(arguments); // Добавление линии-разделителя. actionMenuItems.addItem(this.getActionsMenuItem({ Type: "Terrasoft.MenuSeparator", Caption: "" })); // Добавление пункта меню [Назначить встречу] в список действий страницы редактирования. actionMenuItems.addItem(this.getActionsMenuItem({ // Привязка заголовка пункта меню к локализуемой строке схемы. "Caption": { bindTo: "Resources.Strings.CallProcessCaption" }, // Привязка метода-обработчика действия. "Tag": "callCustomProcess", // Привязка свойства видимости пункта меню к значению, которое возвращает метод isAccountPrimaryContactSet(). "Visible": { bindTo: "isAccountPrimaryContactSet" } })); return actionMenuItems; }, // Метод-обработчик действия. callCustomProcess: function() { // Получение идентификатора основного контакта контрагента. var contactParameter = this.get("PrimaryContact"); // Объект, который будет передан в качестве аргумента в метод executeProcess(). var args = { // Имя процесса, который необходимо запустить. sysProcessName: "UsrCustomProcess", // Объект со значением входящего параметра ContactParameter для процесса CustomProcess. parameters: { ProcessSchemaContactParameter: contactParameter.value } }; // Запуск пользовательского бизнес-процесса. ProcessModuleUtilities.executeProcess(args); } } }; });
Для корректного отображения действия в меню действий в совмещенном режиме отображения страницы с вертикальным реестром добавьте реализацию метода isAccountPrimaryContactSet() в схему раздела.
Исходный код замещающего модуля схемы раздела:
define("AccountSectionV2", [], function() { return { // Название схемы раздела. entitySchemaName: "Account", methods: { // Проверяет, заполнено ли поле [Основной контакт] выбранной записи. isAccountPrimaryContactSet: function() { // Определение активной записи. var activeRowId = this.get("ActiveRow"); if (!activeRowId) { return false; } // Получение коллекции данных списочного представления реестра раздела. // Получение модели выбранного контрагента по заданому значению первичной колонки. var selectedAccount = this.get("GridData").get(activeRowId); if (selectedAccount) { // Получение свойства модели — наличие основного контакта. var selectedPrimaryContact = selectedAccount.get("PrimaryContact"); // Метод возвращает true, если основной контакт установлен. Иначе возвращает false. return selectedPrimaryContact ? true : false; } return false; } } }; });
После сохранения схем и обновления страницы приложения с очисткой кеша, в меню действий страницы контрагента появится новое действие [Назначить встречу] ([Schedule a meeting]) (рис. 4). Это действие будет доступным только в случае наличия основного контакта для активной записи реестра. При выполнении действия будет запущен пользовательский бизнес-процесс "Проведение встречи" ("Holding a meeting"). При этом в параметр бизнес-процесса будет передан основной контакт контрагента (рис. 5).
Рис. 4. — Вызов бизнес-процесса по действию на странице редактирования
Рис. 5. — Результат запуска бизнес-процесса. Передача параметра со страницы редактирования контрагента в бизнес-процесс