Матвей Земсков

Заметки веб-мастера

Суббота, 03 июля 2021 10:17

Получаем список бизнес-процессов в коробке Битрикс24

Оцените материал
(262 голосов)

В этой небольшой статье я расскажу, как получить список бизнес-процессов из ленты с помощью 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 Битрикс. Полученные данные необязательно выводить на страницу, они могут быть использованы и для других целей. Например, для сохранения и последующего анализа. Также на основе их можно сформировать какой-нибудь отчет.

Скачать архив с кодом

Прочитано 28883 раз
Мои услуги

Предлагаю следующие услуги:

  • Верстка шаблона сайта из дизайн-макета для CMS «1С-Битрикс Управление сайтом» и CMS “Joomla”
  • Создание форм различной сложности (обратная связь, анкеты и тп) для указанных CMS
  • Настройка и кастомизация компонентов и модулей для указанных CMS
  • Доработка модулей и компонентов для указанных CMS, добавление нестандартного функционала
  • Разработка лендингов (landing-pages)

По все вопросам обращайтесь через форму обратной связи

Скачать

Предлагаю вашему вниманию:

Наверх