← Назад к справке

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

Запуск бизнес-процесса из PHP

Как запустить бизнес-процесс из коробочного PHP-кода через CBPDocument::StartWorkflow.

Для запуска бизнес-процесса из PHP обычно используется CBPDocument::StartWorkflow(). Самое важное — правильно собрать ID шаблона, document id и параметры процесса.

Основной запуск

Минимальный набор: модуль bizproc, ID шаблона, document id и массив ошибок.

StartWorkflow

Метод принимает ID шаблона бизнес-процесса, document id, параметры запуска и массив ошибок.

\Bitrix\Main\Loader::includeModule('bizproc');

/**
 * Запускает бизнес-процесс.
 */
function startWorkflow(int $template_id, array $document_id, array $parameters = []): array
{
    $error_messages = [];

    $workflow_id = \CBPDocument::StartWorkflow(
        $template_id,
        $document_id,
        $parameters,
        $error_messages
    );

    return [
        'workflow_id' => (string) $workflow_id,
        'is_success' => !empty($workflow_id) && empty($error_messages),
        'error_messages' => $error_messages,
    ];
}

Запустить по сделке

Для сделки CRM document id обычно собирается как ['crm', 'CCrmDocumentDeal', 'DEAL_' . $deal_id].

\Bitrix\Main\Loader::includeModule('bizproc');

/**
 * Собирает document id сделки.
 */
function buildDealDocumentId(int $deal_id): array
{
    return [
        'crm',
        'CCrmDocumentDeal',
        'DEAL_' . $deal_id,
    ];
}

/**
 * Запускает бизнес-процесс по сделке.
 */
function startDealWorkflow(int $template_id, int $deal_id, int $user_id): array
{
    $error_messages = [];

    $workflow_id = \CBPDocument::StartWorkflow(
        $template_id,
        buildDealDocumentId($deal_id),
        [
            'TargetUser' => 'user_' . $user_id,
        ],
        $error_messages
    );

    return [
        'workflow_id' => (string) $workflow_id,
        'is_success' => !empty($workflow_id) && empty($error_messages),
        'error_messages' => $error_messages,
    ];
}

$start_result = startDealWorkflow($template_id, $deal_id, $user_id);

print_r($start_result);

Передать параметры

Если у шаблона есть параметры, их можно передать третьим аргументом. Ключи должны совпадать с кодами параметров шаблона.

$parameters = [
    'TargetUser' => 'user_' . $user_id,
    'manager_id' => $manager_id,
    'comment_text' => 'Запущено из PHP',
];

$start_result = startWorkflow(
    $template_id,
    buildDealDocumentId($deal_id),
    $parameters
);

print_r($start_result);

Шаблоны

Если ID шаблона неизвестен, его можно получить из списка шаблонов по типу документа.

Получить шаблоны документа

\Bitrix\Main\Loader::includeModule('bizproc');

/**
 * Получает активные шаблоны бизнес-процессов для сделок.
 */
function fetchDealWorkflowTemplates(): array
{
    $templates = [];
    $document_type = [
        'crm',
        'CCrmDocumentDeal',
        'DEAL',
    ];

    $template_result = \CBPWorkflowTemplateLoader::GetList(
        [
            'ID' => 'ASC',
        ],
        [
            'DOCUMENT_TYPE' => $document_type,
            'ACTIVE' => 'Y',
        ],
        false,
        false,
        [
            'ID',
            'NAME',
            'DESCRIPTION',
            'PARAMETERS',
        ]
    );

    while ($template = $template_result->Fetch()) {
        $templates[] = $template;
    }

    return $templates;
}

$templates = fetchDealWorkflowTemplates();

print_r($templates);

Проверить ошибки запуска

Если процесс не запустился, первым делом нужно смотреть массив ошибок, который передаётся четвёртым аргументом в StartWorkflow().

$start_result = startDealWorkflow($template_id, $deal_id, $user_id);

if (!$start_result['is_success']) {
    AddMessage2Log(
        [
            'message' => 'Ошибка запуска бизнес-процесса',
            'result' => $start_result,
        ],
        'bizproc_start'
    );
}

Источники