Код предназначен для генерации многостраничного документа в Битрикс24 с однотипными страницами, используя REST API. Функция преобразует простой массив данных с подтаблицами в структурированный массив, который может быть передан в API Битрикс24 для создания документа на основе указанного шаблона.
Шаблон для примера b24Template.docx
Основные параметры
$templateId
- ID шаблона документа в Битрикс24 (в примере: 241)$entityTypeId
- тип сущности (по умолчанию 2)$entityId
- ID связанной сущности (в примере: 277697)$pages
- массив данных для страниц документа, где каждый элемент представляет отдельную страницу
Функция makeDocParam()
Функция преобразует входные данные в формат, понятный API Битрикс24:
Создание базовой структуры:
Указывается ID шаблона, тип и ID сущности
Настраивается провайдер данных для страниц (
ArrayDataProvider
)
Обработка каждой страницы:
Для простых полей (не массивов) значения добавляются напрямую
Для массивов (подтаблиц) настраивается отдельный провайдер данных:
Создается структура для
ArrayDataProvider
Формируются поля для вставки в документ
Генерируются специальные строки-плейсхолдеры для подстановки значений
Формирование специальных полей:
Для работы подтаблиц создаются дополнительные поля с определенными названиями
Формируются пути доступа к данным через точку (например,
Pages.Page.Product
)
Пример использования
В примере создается документ с двумя страницами, каждая из которых содержит:
Название товара (
Product
)ФИО подписанта (
AssignedFio
)Таблицу с лицензионными данными (
License
)
Обработка результата
Ответ от 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.