Бизнес-процессы
События бизнес-процессов
Доставка события ожидающему БП и отличие события процесса от события модуля CRM.
PHP-примеры относятся к коробочному Bitrix24. Код для действия «PHP-код» вставляется без открывающего тега PHP; ядро и контекст действия уже доступны.
Внешнее событие для ожидающего процесса
Внешнее событие отправляет CBPRuntime. Имя события должно совпадать с подпиской конкретного ожидающего действия; произвольное имя не создаёт такую подписку.
<?php
if (!\Bitrix\Main\Loader::includeModule('bizproc')) {
throw new \RuntimeException('Модуль bizproc не загружен');
}
// Значения берутся из сохранённого контекста ожидающего действия.
\CBPRuntime::SendExternalEvent($workflow_id, $event_name, [
'result_code' => 'APPROVED',
]);Метод не возвращает подтверждение успешного завершения бизнес-процесса. Получатель определяет формат параметров и проверяет допустимость перехода. Входящий HTTP-обработчик до этого вызова должен проверить подлинность отправителя.
Событие CRM — другой механизм
OnAfterCrmDealUpdate относится к событиям CRM. Из него можно запустить БП, но это не внешнее событие уже работающего экземпляра. Смешение двух механизмов приводит к лишним запускам.
<?php
\Bitrix\Main\EventManager::getInstance()->addEventHandlerCompatible(
'crm',
'OnAfterCrmDealUpdate',
static function (array &$fields): void {
static $active_ids = [];
$deal_id = (int) ($fields['ID'] ?? 0);
if ($deal_id <= 0 || isset($active_ids[$deal_id])) {
return;
}
$active_ids[$deal_id] = true;
try {
// Здесь вызывается прикладная логика для этой сделки.
} finally {
unset($active_ids[$deal_id]);
}
}
);Это только каркас защиты от вложенного вызова для той же сделки. Он не защищает от параллельных HTTP-запросов и не запускает БП сам по себе. Реальный запуск показан отдельно.