Битрикс24 API работа с бизнес-процессами на D7

08.10.2020

Бизнес-процессы очень популярны в Битрикс24.  В СРМ используются роботы - заготовки бизнес-процессов, в живой ленте можно установить шаблоны стандартных бизнес-процессов - Утверждение счета, Отпуск и т.д.

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

Собственно в документации ничего не найдем и пойдем смотреть исходники в папке /bitrix/modules/bizproc/lib.

Там мы видим три класса WorkflowInstanceTable, WorkflowTemplateTable, WorkflowStateTable.

Допустим у нас известен ID запущенного бизнес-процесса, как пример рассмотрим событие завершения бизнес-процесса OnWorkflowComplete.

 $handler = Bitrix\Main\EventManager::getInstance()->addEventHandler(
"bizproc",
 "OnWorkflowComplete",
 ["наш класс", "OnWorkflowCompleteHandler"]
 );

В функцию обработчик мы получаем ID запущенного экземпляра бизнес-процесса $workflowId и $status. 
И можем получить ID документа и ID шаблона

 
 Bitrix\Main\Loader::includeModule('bizproc'); 
$arBp=Bitrix\Bizproc\WorkflowInstanceTable::getList([
            "filter"=>["ID"=>$workflowId],
            "select"=>["ID","STATE"]])
            ->fetchAll();
В полученном массиве будут такие поля:
  'BIZPROC_WORKFLOW_INSTANCE_STATE_MODULE_ID' => 'lists',
 'BIZPROC_WORKFLOW_INSTANCE_STATE_ENTITY' => 'BizprocDocument',
 'BIZPROC_WORKFLOW_INSTANCE_STATE_DOCUMENT_ID' => '123',
 'BIZPROC_WORKFLOW_INSTANCE_STATE_DOCUMENT_ID_INT' => '123',
 'BIZPROC_WORKFLOW_INSTANCE_STATE_WORKFLOW_TEMPLATE_ID' => '1',
А как получить ID списка - инфоблока по этим данным? По шаблону получаем тип документа - это и будет наш инфоблок. 
 $arCurrentTemplate=Bitrix\Bizproc\WorkflowTemplateTable::getList([
            "filter"=>["ID"=>$arBp[0]['BIZPROC_WORKFLOW_INSTANCE_STATE_WORKFLOW_TEMPLATE_ID']],
            "select"=>["ID","DOCUMENT_TYPE"]])
            ->fetchAll();
В полученном массиве будет поле 'DOCUMENT_TYPE' => 'iblock_3' 

По типу документа мы можем получить все шаблоны бизнес-процессов для данного списка, той же функцией, но с фильтром по типу документа.
Например нам надо запустить для данного элемента другой шаблон бизнес-процесса. Вот тут к сожалению, еще нет функции на D7 и запускаем бизнес-процесс по старому:

$arErrorsTmp = array();
$wfId = \CBPDocument::StartWorkflow(
$arTemplate["ID"],
array("bizproc", "CBPVirtualDocument", $arBp[0]['BIZPROC_WORKFLOW_INSTANCE_STATE_DOCUMENT_ID']),
array(),
$arErrorsTmp
);

Запись в лог при прерывании бизнес-процесса:

 $runtime = CBPRuntime::GetRuntime();
$runtime->StartRuntime();              
$wf=new CBPWorkflow($workflowId,  $runtime);                
$logService =  $wf->GetService("TrackingService");               
 $logService-> Write($workflowId, 5, "-", 1, 0, "тест",  "тест",$GLOBALS["USER"]->GetId());

Возврат к списку


Материалы по теме: