← К документации

Бизнес-процессы

События бизнес-процессов

Доставка события ожидающему БП и отличие события процесса от события модуля 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-запросов и не запускает БП сам по себе. Реальный запуск показан отдельно.

Источники