Как добавить шаблон и создать документ на его основе
Scope:
crmКто может выполнять метод: пользователи с административным доступом к разделу CRM
Если вы разрабатываете интеграции для Битрикс24 с помощью AI-инструментов (Codex, Claude Code, Cursor), подключите MCP-сервер, чтобы ассистент использовал официальную REST-документацию.
Автоматизировать работу с документами в CRM можно с помощью скрипта. Он будет выполнять полный цикл генерации документа: создавать нумератор, загружать шаблон в формате .docx и формировать документ по конкретной сделке.
Чтобы создать документ, последовательно выполним методы:
-
crm.documentgenerator.numerator.add — создадим нумератор документа,
-
crm.documentgenerator.template.add — загрузим шаблон документа,
-
crm.documentgenerator.document.add — сгенерируем документ.
Подготовим переменные
Определим основные переменные, которые будем использовать в процессе генерации документа.
-
filePath— путь к файлу шаблона. Укажемtemplate.docx. -
iDealID— идентификатор сделки. Создадим документ для сделки с идентификатором1. -
sDocName— имя создаваемого документа. УкажемДемонстрационная реализация товара.
Как использовать примеры в документации
let filePath = 'template.docx';
let iDealID = 1;
let sDocName = 'Демонстрационная реализация товара';
$filePath = __DIR__ . '/template.docx';
$iDealID = 1;
$sDocName = 'Демонстрационная реализация товара';
1. Создадим нумератор документа
Создадим нумератор для документов с помощью crm.documentgenerator.numerator.add. В метод передадим два параметра.
-
name— название нумератора. УкажемRest Numerator. -
template— шаблон, по которому будет генерироваться номер документа. Укажем{NUMBER}— это переменная, которая будет заменена на порядковый номер. Можно использовать другие переменные, например,{DAY}—текущий день,{CLIENT_ID}— идентификатор клиента,{RANDOM}— случайный номер.
BX24.callMethod(
'crm.documentgenerator.numerator.add',
{
'fields': {
'name': 'Нумератор из REST',
'template': '{NUMBER}'
}
},
function(resNum) {
if (resNum.error()) {
console.error(resNum.error());
alert('Нумератор не добавлен: ' + resNum.error_description());
return;
}
}
);
$resNum = CRest::call(
'crm.documentgenerator.numerator.add',
[
'fields' => [
'name' => 'Нумератор из REST',
'template' => '{NUMBER}',
]
]
);
Метод crm.documentgenerator.numerator.add вернет объект resNum с информацией о созданном нумераторе.
"numerator":{
"name":"Нумератор из REST",
"template":"{NUMBER}",
"id":43,
"code":null,
"settings":{
"Bitrix_Main_Numerator_Generator_SequentNumberGenerator":{
"start":1,
"step":1,
"length":0,
"padString":"0",
"periodicBy":null,
"timezone":null,
"isDirectNumeration":false
}
}
}
2. Загрузим шаблон документа
Если нумератор создан, добавим шаблон документа с помощью метода crm.documentgenerator.template.add.
Содержимое файла шаблона нужно преобразовать в формат Base64.
В crm.documentgenerator.template.add нужно передать следующие данные:
-
name— название шаблона. Укажем переменнуюsDocName. -
numeratorId— идентификатор нумератора. Передадим его из объектаresNum, который получен на первом шаге. -
region— регион шаблона. Влияет на локализацию, например, валюту и дату. Укажемru— Россия. -
users— массив прав доступа. Определяет, какие группы пользователей могут видеть и использовать шаблон. УкажемUA— все авторизованные пользователи. -
entityTypeId— идентификатор типа объекта CRM. Укажем2— сделка. Полный список типов объектов можно получить с помощью метода crm.enum.ownertype. -
file— контент файлаfilePath, который преобразован в формат Base64.
function fileToBase64(filePath) {
return new Promise((resolve, reject) => {
fetch(filePath)
.then(response => response.blob())
.then(blob => {
let reader = new FileReader();
reader.onloadend = () => resolve(reader.result.split(',')[1]);
reader.onerror = reject;
reader.readAsDataURL(blob);
});
});
}
let fileContent = await fileToBase64(filePath);
BX24.callMethod(
'crm.documentgenerator.template.add',
{
'fields': {
'name': sDocName,
'numeratorId': resNum.data().numerator.id,
'region': 'ru',
'users': ['UA'],
'entityTypeId': ['2'],
'file': fileContent
}
},
function(resTemplate) {
if (resTemplate.error()) {
console.error(resTemplate.error());
alert('Шаблон не добавлен: ' + resTemplate.error_description());
return;
}
}
);
$resTemplate = CRest::call(
'crm.documentgenerator.template.add',
[
'fields' => [
'name' => $sDocName,
'numeratorId' => $resNum['result']['numerator']['id'],
'region' => 'ru',
'users' => [
'UA'//User All
],
'entityTypeId' => ['2'],
'file' => base64_encode(file_get_contents($filePath))
]
]
);
Метод crm.documentgenerator.template.add вернет объект resTemplate с информацией о шаблоне.
template: {
"id": "39",
"name": "Демонстрационная реализация товара",
"region": "ru",
"active": "Y",
"code": null,
"createTime": "2025-07-09T16:12:13+03:00",
"download": "https://some-domain.bitrix24.ru/bitrix/services/main/ajax.php?action=crm.documentgenerator.template.download&SITE_ID=s1&id=39",
"downloadMachine": "https://some-domain.bitrix24.ru/rest/crm.documentgenerator.template.download.json?sessid=c4ad892d7583ead4fd38666a0af85cb7&token=crm%7CYWN0aW9uPWNybS5kb2N1bWVudGdlbmVyYXRvci50ZW1wbGF0ZS5kb3dubG9hZCZTSVRFX0lEPXMxJmlkPTM5Jl89azNRNlFuVVRvUGl5VzNLaExTVDJCR3g1WjdyQ0tSSFA%3D%7CImNybS5kb2N1bWVudGdlbmVyYXRvci50ZW1wbGF0ZS5kb3dubG9hZHxjcm18WVdOMGFXOXVQV055YlM1a2IyTjFiV1Z1ZEdkbGJtVnlZWFJ2Y2k1MFpXMXdiR0YwWlM1a2IzZHViRzloWkNaVFNWUkZYMGxFUFhNeEptbGtQVE01Smw4OWF6TlJObEZ1VlZSdlVHbDVWek5MYUV4VFZESkNSM2cxV2pkeVEwdFNTRkE9fGM0YWQ4OTJkNzU4M2VhZDRmZDM4NjY2YTBhZjg1Y2I3Ig%3D%3D.GMgjAbCT099xlo8CJN9n5mP2s7MBbqfU%2BbEM%2FAzpoYE%3D",
"entityTypeId": [ "0": "2" ],
"length": 1,
"numeratorId": "43",
"users": [ "0": "UA" ],
"sort": 500
}
3. Сгенерируем документ
Если шаблон успешно загружен, создадим документ для сделки с помощью метода crm.documentgenerator.document.add. В методе укажем три параметра.
-
templateId— идентификатор шаблона. Передадим его из объектаresTemplate, который получен на втором шаге. -
entityTypeId— идентификатор типа объекта CRM. Укажем2— сделка. Полный список типов объектов можно получить с помощью метода crm.enum.ownertype. -
entityId— идентификатор сделки. Укажем переменнуюiDealID.
BX24.callMethod(
'crm.documentgenerator.document.add',
{
'templateId': resTemplate.data().template.id,
'entityTypeId': '2',
'entityId': iDealID
},
function(resDoc) {
if (resDoc.error()) {
console.error(resDoc.error());
alert('Документ не создан: ' + resDoc.error_description());
} else {
alert('Документ создан');
}
}
);
$resDoc = CRest::call(
'crm.documentgenerator.document.add',
[
'templateId' => $resTemplate['result']['template']['id'],
'entityTypeId' => '2',
'entityId' => $iDealID,
]
);
Документ будет сформирован и метод crm.documentgenerator.document.add вернет его параметры.
"document":{
"products":{
"currencyId":"RUB",
"totalSum":1500,
"totalRows":1
},
"downloadUrl":"https:\\/\\/some-domain.bitrix24.ru\\/bitrix\\/services\\/main\\/ajax.php?action=crm.documentgenerator.document.download\\u0026SITE_ID=s1\\u0026id=29",
"publicUrl":null,
"title":"Демонстрационная реализация товара 1",
"number":"1",
"id":29,
"createTime":"2025-07-09T16:29:27+03:00",
"createdBy":27,
"updateTime":"2025-07-09T16:29:27+03:00",
"templateId":"39",
"emailDiskFile":4917,
"entityId":"1",
"entityTypeId":"2",
"downloadUrlMachine":"https:\\/\\/some-domain.bitrix24.ru\\/rest\\/crm.documentgenerator.document.download.json?sessid=c4ad892d7583ead4fd38666a0af85cb7\\u0026token=crm%7CYWN0aW9uPWNybS5kb2N1bWVudGdlbmVyYXRvci5kb2N1bWVudC5kb3dubG9hZCZTSVRFX0lEPXMxJmlkPTI5Jl89YlQ2SU9XeGVnR2s3NnZ5M0hGVlRxTDVaRlJtdFgyNTE%3D%7CImNybS5kb2N1bWVudGdlbmVyYXRvci5kb2N1bWVudC5kb3dubG9hZHxjcm18WVdOMGFXOXVQV055YlM1a2IyTjFiV1Z1ZEdkbGJtVnlZWFJ2Y2k1a2IyTjFiV1Z1ZEM1a2IzZHViRzloWkNaVFNWUkZYMGxFUFhNeEptbGtQVEk1Smw4OVlsUTJTVTlYZUdWblIyczNOblo1TTBoR1ZsUnhURFZhUmxKdGRGZ3lOVEU9fGM0YWQ4OTJkNzU4M2VhZDRmZDM4NjY2YTBhZjg1Y2I3Ig%3D%3D.H575mM4Mf%2Fj4PVH2Ngzb1kmkQhdScsAL75ZJkbYkALk%3D"
}
Пример кода
document.addEventListener('DOMContentLoaded', function() {
let filePath = 'template.docx'; // путь к локальному файлу шаблона
let iDealID = 1; // идентификатор сделки
let sDocName = 'Демонстрационная реализация товара';
function fileToBase64(filePath) {
return new Promise((resolve, reject) => {
fetch(filePath)
.then(response => response.blob())
.then(blob => {
let reader = new FileReader();
reader.onload end = () => resolve(reader.result.split(',')[1]);
reader.oner ror = reject;
reader.readAsDataURL(blob);
});
});
}
async function createDocument() {
try {
let fileContent = await fileToBase64(filePath);
BX24.callMethod(
'crm.documentgenerator.numerator.add',
{
'fields': {
'name': 'Нумератор из REST',
'template': '{NUMBER}'
}
},
function(resNum) {
if (resNum.error()) {
console.error(resNum.error());
alert('Нумератор не добавлен: ' + resNum.error_description());
return;
}
if (resNum.data().numerator.id) {
BX24.callMethod(
'crm.documentgenerator.template.add',
{
'fields': {
'name': sDocName,
'numeratorId': resNum.data().numerator.id,
'region': 'ru',
'users': ['UA'],
'entityTypeId': ['2'],
'file': fileContent
}
},
function(resTemplate) {
if (resTemplate.error()) {
console.error(resTemplate.error());
alert('Шаблон не добавлен: ' + resTemplate.error_description());
return;
}
if (resTemplate.data().template.id) {
BX24.callMethod(
'crm.documentgenerator.document.add',
{
'templateId': resTemplate.data().template.id,
'entityTypeId': '2',
'entityId': iDealID
},
function(resDoc) {
if (resDoc.error()) {
console.error(resDoc.error());
alert('Документ не создан: ' + resDoc.error_description());
} else {
alert('Документ создан');
}
}
);
}
}
);
}
}
);
} catch (error) {
console.error(error);
alert('Ошибка: ' + error.message);
}
}
createDocument();
});
$filePath = __DIR__ . '/template.docx'; // путь к локальному файлу шаблона
$iDealID = 1; // идентификатор сделки
$sDocName = 'Демонстрационная реализация товара';
$resNum = CRest::call(
'crm.documentgenerator.numerator.add',
[
'fields' => [
'name' => 'Нумератор из REST',
'template' => '{NUMBER}',
]
]
);
if (!empty($resNum['result']['numerator']['id']))
{
$resTemplate = CRest::call(
'crm.documentgenerator.template.add',
[
'fields' => [
'name' => $sDocName,
'numeratorId' => $resNum['result']['numerator']['id'], // crm.documentgenerator.numerator.add
'region' => 'ru', // eu,de,ua,by,ru
'users' => [
'UA'//User All
],
'entityTypeId' => ['2'], //2 — сделка в CRest::call('crm.enum.ownertype');
'file' => base64_encode(file_get_contents($filePath))
]
]
);
if (!empty($resTemplate['result']['template']['id']))
{
$resDoc = CRest::call(
'crm.documentgenerator.document.add',
[
'templateId' => $resTemplate['result']['template']['id'],
'entityTypeId' => '2', //2 — сделка в CRest::call('crm.enum.ownertype');
'entityId' => $iDealID,
]
);
}
}
if (!empty($resDoc['result']))
{
echo json_encode(['message' => 'Документ создан']);
}
elseif (!empty($resDoc['error_description']))
{
echo json_encode(['message' => 'Документ не создан: ' . $resDoc['error_description']]);
}
else
{
echo json_encode(['message' => 'Документ не создан']);
}