🍪 Федеральный Закон №152-ФЗ обязывает нас уведомить вас, что в целях корректного функционирования сайта, мы собираем метаданные, такие как cookie, данные об IP-адресе и местоположении.
OK
Блог
Мануалы

Принудительное (ручное) завершение бизнес-процесса

В работе с Битрикс24 иногда возникает ситуация, когда необходимо принудительно завершить бизнес-процесс (БП) для конкретного элемента.
Штатное активити «Прервать бизнес-процесс» останавливает только текущий шаблон, а не все связанные процессы.

Конечно, можно через интерфейс идти в раздел «Автоматизация → Бизнес-процессы → Все активные», по фильтру находить незавершенные процессы и массово их завершать.
Но такой способ неудобен, особенно если процессов много или требуется завершить БП для конкретного элемента.

Данный материал посвящен решению этой задачи: как с помощью скрипта завершить бизнес-процесс вручную для конкретного элемента смарт-процесса.
Суть решения
Скрипт ищет все запущенные бизнес-процессы у выбранного элемента, проверяет их состояние и принудительно завершает незавершенные.
В карточке смарт-процесса это отразится так же, как если бы вы вручную зашли в раздел БП и нажали кнопку «Остановить».

Код скрипта для смарт-процесса
CModule::IncludeModule('bizproc');

$smart_id = 1046;
//$smart_element_id = 1;
$smart_element_id = $this->ParseValue('{'.'=Variable:id_zayavki}');
$bp_template_id = 190;
$closed_states = ['Completed', 'Terminated'];
$user_id = $GLOBALS['USER']->GetID();

$doc_type = ["crm", "Bitrix\Crm\Integration\BizProc\Document\Dynamic"];
$documentType = array_merge($doc_type, ['DYNAMIC_'.$smart_id]);
$documentId = array_merge($doc_type, ['DYNAMIC_'.$smart_id.'_'.$smart_element_id]);

$arDocumentStates = CBPDocument::GetDocumentStates($documentType, $documentId);
//print_r($arDocumentStates);

foreach ($arDocumentStates as $arDocumentState) {
if ($arDocumentState['TEMPLATE_ID'] == $bp_template_id && !in_array($arDocumentState['STATE_NAME'], $closed_states)) {
print_r($arDocumentState);
$ar = CBPDocument::GetUserTasksForWorkflow($user_id, $arDocumentState["ID"]);
print_r($ar);
CBPDocument::TerminateWorkflow(
$arDocumentState["ID"],
$arDocumentState["DOCUMENT_ID"],
$arErrorsTmp
);
if (count($arErrorsTmp) > 0) {
foreach ($arErrorsTmp as $e)
$errorMessage .= $e["message"] . ". ";
}
}
}

Примечание
Этот скрипт пригодится администраторам и разработчикам Битрикс24, когда нужно быстро завершить зависший или ошибочный процесс без долгих поисков и ручного завершения в интерфейсе.