Создаем многостраничный документ с однотипными страницами в Битрикс 24 через rest API

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

Шаблон для примера b24Template.docx

Основные параметры

Функция makeDocParam()

Функция преобразует входные данные в формат, понятный API Битрикс24:

  1. Создание базовой структуры:

    • Указывается ID шаблона, тип и ID сущности

    • Настраивается провайдер данных для страниц (ArrayDataProvider)

  2. Обработка каждой страницы:

    • Для простых полей (не массивов) значения добавляются напрямую

    • Для массивов (подтаблиц) настраивается отдельный провайдер данных:

      • Создается структура для ArrayDataProvider

      • Формируются поля для вставки в документ

      • Генерируются специальные строки-плейсхолдеры для подстановки значений

  3. Формирование специальных полей:

    • Для работы подтаблиц создаются дополнительные поля с определенными названиями

    • Формируются пути доступа к данным через точку (например, Pages.Page.Product)

Пример использования

В примере создается документ с двумя страницами, каждая из которых содержит:

Обработка результата

Ответ от API декодируется из JSON и выводится для проверки. В случае ошибки выводится сырой ответ.


require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");
\Bitrix\Main\Loader::includeModule('rest');
$client = new \Bitrix\Main\Web\HttpClient();
$webHookUrl = 'https://yourbitrix.bitrix24.com/rest/1/i2a57go4esldj09v/'; // ваш вебхук на портале
$prefix = 'crm.documentgenerator';

// Параметры для создания документа
$templateId = 241;          // ID шаблона документа
$entityTypeId = 2;         // Тип сущности
$entityId = 277697;           // ID сущности
$pages = [
	[
		'Product' => 'Товар 1',
		'AssignedFio' => 'Подписатн 1',
		'License' => [
			['Name' => 'Год', 'Value' => '2026'],
			['Name' => 'Квартал', 'Value' => 'V'],
			['Name' => 'Ключ', 'Value' => '3527132421'],
		]
	],
	[
		'Product' => 'Товар 2',
		'AssignedFio' => 'Подписант 2',
		'License' => [
			['Name' => 'Год', 'Value' => '2025'],
			['Name' => 'Квартал', 'Value' => 'VI'],
			['Name' => 'Ключ', 'Value' => '1231212121'],
		]
	],
];

function makeDocParam(array $pages, $entityId, $templateId, $entityTypeId = 2)
{
	$data = [
		'templateId' => $templateId,
		'entityTypeId' => $entityTypeId,
		'entityId' => $entityId,
		'values' => [
			'Pages' => []
		],
		'fields' => [
			'Pages' => [
				'PROVIDER' => 'Bitrix\\DocumentGenerator\\DataProvider\\ArrayDataProvider',
				'OPTIONS' => [
					'ITEM_NAME' => 'Page',
					'ITEM_PROVIDER' => 'Bitrix\\DocumentGenerator\\DataProvider\\HashDataProvider',
				],
			]
		]
	];
	foreach ($pages as $i => $page) {
		if (!isset($data['values']['Pages'][$i])) $data['values']['Pages'][$i] = [];
		foreach ($page as $name => $value) {
			if (is_array($value)) {
				# параметр ArrayDataProvider
				$data['fields'][$name . $i] = [
					'PROVIDER' => 'Bitrix\\DocumentGenerator\\DataProvider\\ArrayDataProvider',
					'OPTIONS' => [
						'ITEM_NAME' => 'Item',
						'ITEM_PROVIDER' => 'Bitrix\\DocumentGenerator\\DataProvider\\HashDataProvider',
					]
				];
				# создаем массив с данными
				$data['values'][$name . $i] = $value;
				# создаем поля для вставки в документ по первому элементу массива
				# имя формируется из названия массива и название параметра
				foreach (array_keys($value[0]) as $valName) {
					$data['values']['Pages'][$i][$name . $valName] = '{' . $name . $i . $valName . '}';
					$data['values'][$name . $valName] = 'Pages.Page.' . $name . $valName;
					$data['values'][$name . $i . $valName] = $name . $i . '.Item.' . $valName;
					# бэз этого таблицы не заполняются
					$data['fields'][$name . $i . $valName] = ['TITLE' => $name . $i . $valName];
				}
			}
			else {
				$data['values']['Pages'][$i][$name] = $value;
				$data['values'][$name] = 'Pages.Page.' . $name;
			}
		}

	}
	return $data;
}
$data = makeDocParam($pages, $entityId, $templateId, $entityTypeId);
$url = $webHookUrl.$prefix.'.document.add/';
$answer = $client->post($url, $data);
try
{
	$result = \Bitrix\Main\Web\Json::decode($answer);
}
catch(Exception $e)
{
	var_dump($answer);
}
print_r($result);
назад в раздел bitrix

Ср 09 Июл 2025.