В этой небольшой статье я расскажу, как получить список бизнес-процессов из ленты с помощью API Битрикс. Некоторое время назад мне было нужно проанализировать возможность получения данных из определенного бизнес-процесса для последующей работы с ними.
Я решил получить данные и вывести их в табличном виде на страницу портала.
Свой анализ я проводил на копии бизнес-процесса «Заявление на отпуск», шаблон которого был предварительно изменен для нужд клиента. Как известно, часть данных бизнес-процессов из ленты хранится в определенных инфоблоках. Например, инфоблок бизнес процесса, который я взял для анализа имеет ID=75. Он будет встречаться далее в примерах кода. Сейчас я просто обращаю на это внимание. Тип инфоблоков так и называется - «Процессы» (bitrix_processes).
Какие же данные о бизнес-процессе мы может получить из информационного блока? Вот небольшой список:
- Идентификатор (ID)
- Название (NAME)
- Дата начала (DATE_CREATE)
- Комментарий (PREVIEW_TEXT)
- Дата начала (PROPERTY_PROPERTY_FROM)
- Дата окончания (PROPERTY_PROPERTY_TO)
- Утвержден (PROPERTY_IS_APPROVED)
Если судить по названиям, то видно, что для хранения информации задействованы не только поля, но и свойства инфоблока.
Однако, такие важные данные как: имя сотрудника, запустившего БП, текущее состояние конкретного бизнес-процесса и комментарии, которые были добавлены в процессе его выполнения – из инфоблока нам получить не удастся, так как они хранятся в другом месте.
Этим местом является таблица b_bp_task в БД портала. Для получения этой информации используется метод CBPDocument::GetDocumentState(), а также небольшая вспомогательная функция GetWorkflowIDByDocName(), которая делает SQL-запрос к указанной таблице и возвращает ID бизнес-процесса по его наименованию. Выглядит она так:
PHP
function GetWorkflowIDByDocName($docname, $docID){
$docName = trim($docname);
if(strlen($docName) <= 0 || intval($docID) <= 0){
return false;
}
$sql = "SELECT DISTINCT
ID,
WORKFLOW_ID,
PARAMETERS
FROM b_bp_task
WHERE
DOCUMENT_NAME='{$docname}'
AND
PARAMETERS LIKE '%{$docID}%'
ORDER BY ID DESC";
$connection = Main\Application::getConnection();
$dbResult = $connection->query($sql);
$arFields = $dbResult->Fetch();
$arBPParams = unserialize($arFields['PARAMETERS']);
$res = (!empty($arFields['WORKFLOW_ID'])) ? $arFields['WORKFLOW_ID'] : false;
return $res;
}
В качестве аргументов в нее передается ID и наименование элемента инфоблока.
Сейчас настало время описать как работает наш скрипт по порядку. В самом начале подключаем служебную часть пролога, так как подключать шаблон нам не нужно. Используем пространства имен Bitrix\Main и Bitrix\Main\Loader. Подключаем необходимые модули «Информационные блоки» (iblock) и «Бизнес-процессы» (bizproc).
Сначала получаем доступную информацию о бизнес-процессах из элементов инфоблока и сохраняем ее в массив $arResult.
PHP
$arResult = Array();
$procIblockType = 'bitrix_processes';
$procIblockID = 75; // Заявление на отпуск
$obProcessesIBlock = CIBlock::GetByID($procIblockID);
$arrProcessesIBlock = $obProcessesIBlock->Fetch();
$arResult['IBLOCK_NAME'] = $arrProcessesIBlock['NAME'];
$arProcesses = Array();
$arSelect = Array(
"ID",
"NAME",
"DATE_CREATE",
"PREVIEW_TEXT",
"PROPERTY_PROPERTY_FROM",
"PROPERTY_PROPERTY_TO",
"PROPERTY_IS_APPROVED",
);
$arFilter = Array(
"IBLOCK_ID"=>IntVal($procIblockID),
"ACTIVE"=>"Y"
);
$obRes = CIBlockElement::GetList(Array('ID' => 'DESC'), $arFilter, false, false, $arSelect);
while($arRes = $obRes->GetNext()){
$arResult['PROCESSES'][$arRes['ID']] = $arRes;
}
После этого обходим массив в цикле и получаем недостающую информацию. Обращаю внимание читателя на то, что первый параметр, который передается в метод CBPDocument::GetDocumentState() для получения текущего состояния бизнес-процесса является массивом.
PHP
foreach($arResult['PROCESSES'] as $key => &$arItem){
$documentId = array("lists", "BizprocDocument", $key);
$workflowId = GetWorkflowIDByDocName($arItem['NAME'], $key);
$result = CBPDocument::GetDocumentState($documentId, $workflowId);
$arItem['BP_CUR_STATE'] = $result[$workflowId]["STATE_TITLE"];
$arItem['BP_STARTED_BY_ID'] = $result[$workflowId]["STARTED_BY"];
$arItem['BP_TEMPLATE_NAME'] = $result[$workflowId]["TEMPLATE_NAME"];
$arItem['BP_TEMPLATE_ID'] = $result[$workflowId]["TEMPLATE_ID"];
$arUser = CUser::GetByID($result[$workflowId]["STARTED_BY"])->Fetch();
$arItem['BP_STARTED_BY_NAME'] = $arUser['LAST_NAME'].' '.$arUser['NAME'];
}
Имя и фамилию пользователя, запустившего бизнес-процесс получаем методом GetByID() класса CUser.
На этом логика скрипта завершена – данные получены. Далее их уже можно вывести.
HTML
<!doctype html>
<html lang="ru">
<head>
<meta charset="utf-8" />
<title></title>
<link rel="stylesheet" href="/style.css" />
</head>
<body>
<h1><?=$arResult["IBLOCK_NAME"]?></h1>
<table>
<thead>
<tr>
<th>ID</th>
<th>Название</th>
<th>Дата начала</th>
<th>Дата окончания</th>
<th>Комментарий</th>
<th>Утвержден</th>
<th>Сотрудник запустивший БП</th>
<th>Бизнес-процессы</th>
<th>Комментарии</th>
</tr>
</thead>
<tbody>
<?foreach($arResult["PROCESSES"] as $key=>$arProcess):?>
<tr>
<td><?=$arProcess["ID"]?></td>
<td><?=$arProcess["NAME"]?></td>
<td><?=$arProcess["PROPERTY_PROPERTY_FROM_VALUE"]?></td>
<td><?=$arProcess["PROPERTY_PROPERTY_TO_VALUE"]?></td>
<td><?=$arProcess["PREVIEW_TEXT"]?></td>
<td><?=$arProcess["PROPERTY_IS_APPROVED_VALUE"]?></td>
<td><?=$arProcess["BP_STARTED_BY_NAME"]?>[<?=$arProcess["BP_STARTED_BY_ID"]?>]</td>
<td><?=$arProcess["BP_TEMPLATE_NAME"]?>[<?=$arProcess["BP_TEMPLATE_ID"]?>]<br /><?=$arProcess["BP_CUR_STATE"]?></td>
<td> </td>
</tr>
<?endforeach?>
</tbody>
</table>
</body>
</html>
Вот таким несложным способом можно получить данные о бизнес-процессах с помощью API Битрикс. Полученные данные необязательно выводить на страницу, они могут быть использованы и для других целей. Например, для сохранения и последующего анализа. Также на основе их можно сформировать какой-нибудь отчет.
Скачать архив с кодом