Автоматический запуск бизнес-процессов и роботов
Автоматизация в CRM представлена бизнес-процессами (БП) и роботами. Обязанность инициировать запуск автоматизации возлагается на сам модуль CRM.
Автозапуск бизнес-процессов
Автоматический запуск выполняется при добавлении или изменении сущности. Любая бизнес-логика, создающая или изменяющая сущность, должна после создания/изменения сущности выполнить следующий код:
$startParameters = []; //BP parameters \CCrmBizProcHelper::AutoStartWorkflows( \CCrmOwnerType::Deal, // \CCrmOwnerType::Lead, ... $id, $isNew ? \CCrmBizProcEventType::Create : \CCrmBizProcEventType::Edit, $errors, $startParameters );
где:
$startParameters
– значения параметров автоматически запускаемых шаблонов БП (если настроены);$id
– идентификатор сущности;$isNew
– если сущность только что создана, передаем событие \CCrmBizProcEventType::Create, в остальных случаях передаём \CCrmBizProcEventType::Edit;$errors
– переменная будет содержать массив ошибок, если запуск БП прошел неудачно.
Автозапуск роботов
Алгоритм запуска роботов аналогичен алгоритму запуска бизнес-процессов, однако использует более современный API.
После создания сущности и автозапуска бизнес-процесса необходимо выполнить следующий код:
//Region automation $starter = new \Bitrix\Crm\Automation\Starter(\CCrmOwnerType::Deal, $id); $starter->runOnAdd(); //end region
После изменения сущности и автозапуска бизнес-процесса нужно выполнить:
//Region automation $starter = new \Bitrix\Crm\Automation\Starter(CCrmOwnerType::Deal, $id); $starter->runOnUpdate($currentFields, $previousFields); //end region
где:
$currentFields
– массив текущих значений полей сущности;$previousFields
– массив предыдущих значений полей сущности.
Значения полей очень важны для запуска роботов, так как по ним определятся факт смены стадии и анализируются изменения полей (для триггеров Изменены поля и Изменен ответственный).
При этом, если в сущности бизнес-логикой меняется только стадия, то допускается передать только массив текущих полей с новой стадией, а массив предыдущих полей оставить пустым. Но этим можно пользоваться в крайнем случае (если запрос предыдущих значений полей избыточен в Вашем контексте):
//Region automation $starter = new \Bitrix\Crm\Automation\Starter(CCrmOwnerType::Deal, $id); $starter->runOnUpdate(['STAGE_ID' => 'NEXT'], []); //end region
API запуска роботов поддерживает работу с контекстом. Можно указать пользователя, от которого будут запускаться роботы и интерфейс (сайт, мобильное приложение, REST, бизнес-процесс, импорт сущностей).
На данный момент контекст не анализируется ядром БП и не влияет на запуск бизнес-процессов и роботов, но в будущем будет учитываться. Рекомендуем сразу проставлять пользователя и интерфейс, чтобы позже не дописывать код:
$starter = new Bitrix\Crm\Automation\Starter(CCrmOwnerType::Deal, $id); //Установка пользователя по ID $starter->setUserId(1); //Установка текущего пользователя $starter->setUserIdFromCurrent(); //интерфейс сайта $starter->setContextToWeb(); // используется по умолчанию, если не установлен другой //интерфейс мобильного приложения $starter->setContextToMobile(); //интерфейс REST приложения или Вебхука $starter->setContextToRest(); //интерфейс БП (Роботы запускаются действиями БП) $starter->setContextToBizproc(); //интерфейс импорта сущностей $starter->setContextToImport(); //Запуск из другого модуля $starter->setContextModuleId('voximplant');
Пример запуска всей автоматизации (БП+Роботы)
Окончательный вариант запуска всей автоматизации (бизнес-процессы и роботы) с учетом ранее рассмотренных алгоритмов (реальный пример из компонента crm.deal.details):
\CCrmBizProcHelper::AutoStartWorkflows( \CCrmOwnerType::Deal, $ID, $isNew ? \CCrmBizProcEventType::Create : \CCrmBizProcEventType::Edit, $arErrors, isset($_POST['bizproc_parameters']) ? $_POST['bizproc_parameters'] : null ); $starter = new \Bitrix\Crm\Automation\Starter(\CCrmOwnerType::Deal, $ID); $starter->setUserIdFromCurrent(); if($isNew) { $starter->runOnAdd(); } elseif(is_array($previousFields)) { $starter->runOnUpdate($fields, $previousFields); }
и Ваше мнение важно для нас