Добрый день.
Делаю пользовательское действие в Бизнес-процесс.
Цель действия найти все активные БП которые относятся к Элементу (документу).
И завершить их.
Вот таким кодом:
| Код |
|---|
<?php
// Файл с классом действия. Важно, что файл должен назваться так же, как и каталог.
// Защита
defined('B_PROLOG_INCLUDED') || die();
// Подключаем необходимые модули и классы
use Bitrix\Main\Loader;
use Bitrix\Main\Localization\Loc;
use Bitrix\Bizproc\Workflow\Entity\WorkflowInstanceTable; // Таблица экземпляров бизнес-процессов для получения активных
class CBPOutPutActiveBP extends CBPActivity // Наследуем класс от CBPActivity
{
public function Execute()
{
try {
// Проверяем подключен ли модуль "bizproc"
if (!Loader::includeModule("bizproc")) {
throw new \Exception("Ошибка: модуль 'bizproc' не подключен");
}
// Получаем ID текущего документа, с которым связан БП
$documentId = $this->GetDocumentId();
$this->WriteToTrackingService("Debug: documentId = " . print_r($documentId, true));
// Получаем список активных бизнес-процессов
$bpList = $this->GetBusinessProcessList($documentId);
$this->WriteToTrackingService("Debug: bpList = " . print_r($bpList, true));
} catch (\Exception $e) {
// Обработка ошибки, запись в журнал и завершение процесса с ошибкой
$this->WriteToTrackingService("Ошибка: " . $e->getMessage());
return CBPActivityExecutionStatus::Closed; // Завершение процесса даже при ошибке
}
return CBPActivityExecutionStatus::Closed; // Завершаем действие корректно
}
protected function GetBusinessProcessList($documentId)
{
$result = [];
$workflowInstances = WorkflowInstanceTable::getList([
'filter' => ['DOCUMENT_ID' => $documentId[2]], // Используем только ID элемента
'select' => ['ID'],
]);
while ($workflow = $workflowInstances->fetch()) {
$result[] = $workflow['ID'];
}
return $result;
}
}
|
Получается получить ID бизнес процессов. Вот примерно в таком виде: 66b9c07e209611.25034391 (проверила, действительно те что нужны)
Но, как только пытаюсь что-то с ними сделать, сразу выходит ошибка.
Можно ли внутри файла [название_действия].php закрыть активные БП?
Есть какой-то пример?
Хотела использовать GetWorkflowStatе хотябы просто чтобы получить статусы которые есть в активных БП. Но, снова фиаско...
Использовала вот такие строки:
| Код |
|---|
foreach ($bpList as $workflowId) {
$workflowState = CBPStateService::GetWorkflowState($workflowId);
$this->WriteToTrackingService("Состояние процесса с ID $workflowId: " . print_r($workflowState['STATE'], true));
}
|