[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"docs-entities\u002Fdoc-templates":3,"docs-tabs-entities\u002Fdoc-templates":6},{"content":4,"lastmod":5},"# Шаблоны документов\n\nШаблон документов — это файл `.docx` с подстановочными метками, по которому Битрикс24 формирует готовые документы с подставленными значениями.\n\nБитрикс24 API: `documentgenerator.template.*`\nСкоуп: `documentgenerator`\n\n## Операции\n\n- [Создать шаблон](.\u002Fdoc-templates\u002Fcreate.md) — `POST \u002Fv1\u002Fdoc-templates`\n- [Список шаблонов](.\u002Fdoc-templates\u002Flist.md) — `GET \u002Fv1\u002Fdoc-templates`\n- [Получить шаблон](.\u002Fdoc-templates\u002Fget.md) — `GET \u002Fv1\u002Fdoc-templates\u002F:id`\n- [Обновить шаблон](.\u002Fdoc-templates\u002Fupdate.md) — `PATCH \u002Fv1\u002Fdoc-templates\u002F:id`\n- [Удалить шаблон](.\u002Fdoc-templates\u002Fdelete.md) — `DELETE \u002Fv1\u002Fdoc-templates\u002F:id`\n- [Поиск шаблонов](.\u002Fdoc-templates\u002Fsearch.md) — `POST \u002Fv1\u002Fdoc-templates\u002Fsearch`\n- [Поля шаблона](.\u002Fdoc-templates\u002Ffields.md) — `GET \u002Fv1\u002Fdoc-templates\u002Ffields`\n- [Агрегация шаблонов](.\u002Fdoc-templates\u002Faggregate.md) — `POST \u002Fv1\u002Fdoc-templates\u002Faggregate`\n\n## Ключевые поля\n\n| Поле | Описание |\n|------|---------|\n| `name` | Название шаблона |\n| `numeratorId` | Идентификатор нумератора |\n| `region` | Регион, например `ru` |\n| `file` | Содержимое `.docx` в виде строки base64 |\n| `fileId` | Идентификатор файла на Диске. Источник: загрузка через `POST \u002Fv1\u002Ffiles\u002Fupload` |\n\nПолный список полей — [Поля шаблона](.\u002Fdoc-templates\u002Ffields.md).\n\n## Что нужно знать перед работой\n\n1. При создании нужен файл — либо содержимое в виде base64 в поле `file`, либо `fileId` уже загруженного на Диск файла. Передаётся ровно одно из двух.\n2. Обязательные поля при создании: `name`, `numeratorId`, `region`.\n3. Поля ответа приходят в camelCase.\n4. Эндпоинты `\u002Fv1` принимают только JSON. Формат `multipart\u002Fform-data` не поддерживается.\n\n## Типичный сценарий\n\n1. Загрузить файл `.docx` через `POST \u002Fv1\u002Ffiles\u002Fupload` — поле `id` из ответа становится значением `fileId`.\n2. Создать шаблон с этим `fileId` через [`POST \u002Fv1\u002Fdoc-templates`](.\u002Fdoc-templates\u002Fcreate.md).\n3. Получить, обновить или удалить шаблон по `id`: [`GET \u002Fv1\u002Fdoc-templates\u002F:id`](.\u002Fdoc-templates\u002Fget.md), [`PATCH \u002Fv1\u002Fdoc-templates\u002F:id`](.\u002Fdoc-templates\u002Fupdate.md), [`DELETE \u002Fv1\u002Fdoc-templates\u002F:id`](.\u002Fdoc-templates\u002Fdelete.md).\n\n## Лимиты\n\n| Лимит | Значение |\n|-------|----------|\n| Максимум записей на запрос | 5000 (`limit ≤ 5000`) |\n| Авто-пагинация | включается при `limit > 50` |\n| `offset` на больших выборках | рекомендуется `limit ≤ 500` при `offset ≥ 2500` |\n| Batch-запросы | до 50 операций в [`POST \u002Fv1\u002Fbatch`](\u002Fdocs\u002Fbatch) |\n| Rate limit | общий для API Вайбкод — см. [Лимиты и оптимизация](\u002Fdocs\u002Foptimization) |\n\n## Смотрите также\n\n- [Документы](\u002Fdocs\u002Fentities\u002Fdocuments)\n- [Entity API](\u002Fdocs\u002Fentity-api)\n- [Синтаксис фильтрации](\u002Fdocs\u002Ffiltering)\n- [Batch](\u002Fdocs\u002Fbatch)\n","2026-07-09",{"doc-templates\u002Fcreate.md":7,"doc-templates\u002Flist.md":8,"doc-templates\u002Fget.md":9,"doc-templates\u002Fupdate.md":10,"doc-templates\u002Fdelete.md":11,"doc-templates\u002Fsearch.md":12,"doc-templates\u002Ffields.md":13,"doc-templates\u002Faggregate.md":14},"\n## Создать шаблон\n\n`POST \u002Fv1\u002Fdoc-templates`\n\nСоздаёт шаблон документа из файла `.docx`. Файл передаётся одним из двух способов:\n\n- `file` — содержимое `.docx` в виде строки base64.\n- `fileId` — идентификатор файла, заранее загруженного на Диск.\n\n## Поля запроса (body)\n\n| Поле | Тип | Обяз. | Описание |\n|------|-----|:-----:|---------|\n| `name` | string | да | Название шаблона |\n| `numeratorId` | number | да | Идентификатор нумератора |\n| `region` | string | да | Регион, например `ru` |\n| `file` | string | * | Содержимое файла `.docx` в виде строки base64. Альтернатива полю `fileId` |\n| `fileId` | number | * | Идентификатор файла на Диске. Источник: загрузка через `POST \u002Fv1\u002Ffiles\u002Fupload`. Альтернатива полю `file` |\n| `code` | string | нет | Символьный код шаблона |\n| `active` | string | нет | Активность шаблона: `\"Y\"` или `\"N\"` |\n| `withStamps` | string | нет | Использовать печати и подписи: `\"Y\"` или `\"N\"` |\n| `sort` | number | нет | Индекс сортировки |\n| `users` | array | нет | Идентификаторы сотрудников, которым доступен шаблон |\n\n\\* Поля `file` и `fileId` взаимоисключающие: передаётся одно из двух.\n\nЧтобы получить `fileId`, загрузите файл `.docx` через `POST \u002Fv1\u002Ffiles\u002Fupload` — значение `id` из ответа используйте как `fileId`.\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdoc-templates\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"name\": \"Шаблон договора\",\n    \"numeratorId\": 1,\n    \"region\": \"ru\",\n    \"fileId\": 9175\n  }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdoc-templates\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"name\": \"Шаблон договора\",\n    \"numeratorId\": 1,\n    \"region\": \"ru\",\n    \"fileId\": 9175\n  }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdoc-templates', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    name: 'Шаблон договора',\n    numeratorId: 1,\n    region: 'ru',\n    fileId: 9175,\n  }),\n})\n\nconst { success, data } = await res.json()\nconsole.log('ID шаблона:', data.id)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdoc-templates', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    name: 'Шаблон договора',\n    numeratorId: 1,\n    region: 'ru',\n    fileId: 9175,\n  }),\n})\n\nconst { success, data } = await res.json()\n```\n\nАльтернатива — передать содержимое файла `.docx` напрямую в поле `file` (base64):\n\n```json\n{\n  \"name\": \"Шаблон договора\",\n  \"numeratorId\": 1,\n  \"region\": \"ru\",\n  \"file\": \"\u003Cbase64-содержимое .docx>\"\n}\n```\n\n## Поля ответа\n\nВозвращается полный объект созданного шаблона. Статус ответа — `201`.\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `id` | number | Идентификатор созданного шаблона |\n| `name` | string | Название шаблона |\n| `region` | string | Регион |\n| `code` | string | Символьный код шаблона |\n| `active` | string | Активность: `\"Y\"` или `\"N\"` |\n| `moduleId` | string | Идентификатор модуля-источника шаблона |\n| `numeratorId` | number | Идентификатор нумератора |\n| `withStamps` | string | Использование печатей и подписей: `\"Y\"` или `\"N\"` |\n| `providers` | object | Сопоставление поставщиков данных шаблона |\n| `users` | object | Сопоставление идентификаторов пользователей, которым доступен шаблон |\n| `isDeleted` | boolean | Помечен ли шаблон удалённым |\n| `sort` | number | Индекс сортировки |\n| `createTime` | string | Дата создания (ISO 8601) |\n| `updateTime` | string | Дата последнего изменения (ISO 8601) |\n| `download` | string | Адрес скачивания собранного документа из шаблона |\n| `downloadMachine` | string | Адрес скачивания с токеном для программного доступа |\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": 209,\n    \"name\": \"Шаблон договора\",\n    \"region\": \"ru\",\n    \"code\": null,\n    \"download\": \"\u002Fbitrix\u002Fservices\u002Fmain\u002Fajax.php?action=documentgenerator.api.template.download&SITE_ID=s1&id=209\",\n    \"active\": \"Y\",\n    \"moduleId\": \"rest\",\n    \"numeratorId\": 1,\n    \"withStamps\": \"N\",\n    \"providers\": {\n      \"bitrix\\\\documentgenerator\\\\dataprovider\\\\rest\": \"bitrix\\\\documentgenerator\\\\dataprovider\\\\rest\"\n    },\n    \"users\": {\n      \"U1\": \"U1\"\n    },\n    \"isDeleted\": false,\n    \"sort\": 500,\n    \"createTime\": \"2026-05-12T09:03:38.000Z\",\n    \"updateTime\": \"2026-05-12T09:03:38.000Z\",\n    \"downloadMachine\": \"https:\u002F\u002F\u003Cportal>\u002Frest\u002F1\u002F\u003Ctoken>\u002Fdocumentgenerator.api.template.download\u002F?token=\u003Ctoken>\"\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n400 — не передан файл:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"MISSING_FILE_OR_FILE_ID\",\n    \"message\": \"POST \u002Fv1\u002Fdoc-templates requires either \\\"file\\\" (base64-encoded .docx content) or \\\"fileId\\\" (Disk file ID). Neither was provided.\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `MISSING_FILE_OR_FILE_ID` | Не передан ни `file`, ни `fileId` |\n| 400 | `CONFLICTING_FILE_FIELDS` | Переданы и `file`, и `fileId` |\n| 400 | `MISSING_REQUIRED_FIELD` | Отсутствует `name`, `numeratorId` или `region` |\n| 400 | `INVALID_PARAMS` | `name`\u002F`region` не строка либо `numeratorId` не положительное целое |\n| 415 | `UNSUPPORTED_MEDIA_TYPE` | Запрос отправлен с `multipart\u002Fform-data` |\n| 413 | `FST_ERR_CTP_BODY_TOO_LARGE` | Тело запроса в формате `multipart\u002Fform-data` содержит данные |\n| 403 | `SCOPE_DENIED` | Ключу не хватает скоупа `documentgenerator` |\n| 401 | `TOKEN_MISSING` | У ключа нет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Смотрите также\n\n- [Получить шаблон](\u002Fdocs\u002Fentities\u002Fdoc-templates\u002Fget)\n- [Обновить шаблон](\u002Fdocs\u002Fentities\u002Fdoc-templates\u002Fupdate)\n- [Список шаблонов](\u002Fdocs\u002Fentities\u002Fdoc-templates\u002Flist)\n","\n## Список шаблонов\n\n`GET \u002Fv1\u002Fdoc-templates`\n\nВозвращает список шаблонов документов портала с поддержкой фильтрации, выборки полей, сортировки и пагинации.\n\n## Параметры\n\n| Параметр | Тип | По умолч. | Описание |\n|----------|-----|-----------|---------|\n| `filter` | object | — | Фильтрация по полям шаблона. Список полей — `GET \u002Fv1\u002Fdoc-templates\u002Ffields`.\u003Cbr>[Синтаксис фильтрации](\u002Fdocs\u002Ffiltering). Пример: `?filter[active]=Y` |\n| `select` | string | — | Выборка полей: `?select=id,name,region` |\n| `order` | object | — | Сортировка по полю: `?order[sort]=asc` |\n| `limit` | number | `50` | Количество записей (до 5000) |\n| `offset` | number | `0` | Смещение для пагинации |\n\nДля `limit > 50` Вайбкод автоматически запрашивает несколько страниц у Битрикс24 на стороне сервера. Максимум — 5000 записей за вызов.\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdoc-templates?limit=10&filter[active]=Y\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdoc-templates?limit=10&filter[active]=Y\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdoc-templates?limit=10&filter[active]=Y', {\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n  },\n})\n\nconst { success, data, meta } = await res.json()\nconsole.log(`Найдено ${meta.total} шаблонов`)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdoc-templates?limit=10&filter[active]=Y', {\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n  },\n})\n\nconst { success, data, meta } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `success` | boolean | Всегда `true` при успехе |\n| `data` | array | Массив шаблонов |\n| `data[].id` | number | Идентификатор шаблона |\n| `data[].name` | string | Название |\n| `data[].active` | string | Доступность: `Y` \u002F `N` |\n| `data[].code` | string \\| null | Системный код шаблона |\n| `data[].region` | string | Регион |\n| `data[].sort` | number | Порядок в списке |\n| `data[].createTime` | string | Дата создания (ISO 8601) |\n| `data[].updateTime` | string | Дата изменения (ISO 8601) |\n| `data[].createdBy` | number | Идентификатор создавшего сотрудника |\n| `data[].updatedBy` | number \\| null | Идентификатор изменившего сотрудника |\n| `data[].moduleId` | string | Модуль-источник шаблона |\n| `data[].fileId` | number | Идентификатор файла на Диске |\n| `data[].bodyType` | string | Формат тела документа |\n| `data[].numeratorId` | number | Идентификатор нумератора |\n| `data[].withStamps` | string | Печати и подписи: `Y` \u002F `N` |\n| `data[].productsTableVariant` | string | Вариант таблицы товаров в документе |\n| `data[].isDeleted` | boolean | Помечен ли шаблон удалённым |\n| `data[].isDefault` | string | Шаблон по умолчанию: `Y` \u002F `N` |\n| `data[].users` | array | Идентификаторы сотрудников, которым доступен шаблон |\n| `data[].download` | string | Адрес скачивания документа |\n| `data[].downloadMachine` | string | Адрес скачивания для программного доступа |\n| `meta.total` | number | Общее количество записей, соответствующих фильтру |\n| `meta.hasMore` | boolean | Есть ли ещё записи за пределами `limit` |\n\nПолная схема полей шаблона — [Поля шаблона](.\u002Ffields.md).\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": [\n    {\n      \"id\": 209,\n      \"active\": \"Y\",\n      \"name\": \"Шаблон договора\",\n      \"code\": null,\n      \"region\": \"ru\",\n      \"sort\": 500,\n      \"createTime\": \"2026-05-12T09:03:38.000Z\",\n      \"updateTime\": \"2026-05-12T09:03:38.000Z\",\n      \"createdBy\": 1,\n      \"updatedBy\": null,\n      \"moduleId\": \"rest\",\n      \"fileId\": 9175,\n      \"bodyType\": \"Bitrix\\\\DocumentGenerator\\\\Body\\\\Docx\",\n      \"numeratorId\": 1,\n      \"withStamps\": \"N\",\n      \"productsTableVariant\": \"\",\n      \"isDeleted\": false,\n      \"isDefault\": \"N\",\n      \"users\": [\"U1\"],\n      \"download\": \"\u002Fbitrix\u002Fservices\u002Fmain\u002Fajax.php?action=documentgenerator.api.template.download&SITE_ID=s1&id=209\",\n      \"downloadMachine\": \"https:\u002F\u002F\u003Cportal>\u002Frest\u002F1\u002F\u003Ctoken>\u002Fdocumentgenerator.api.template.download\u002F?token=\u003Ctoken>\"\n    },\n    {\n      \"id\": 211,\n      \"active\": \"Y\",\n      \"name\": \"Шаблон счёта\",\n      \"code\": null,\n      \"region\": \"ru\",\n      \"sort\": 500,\n      \"createTime\": \"2026-05-12T09:04:38.000Z\",\n      \"updateTime\": \"2026-05-12T09:04:38.000Z\",\n      \"createdBy\": 1,\n      \"updatedBy\": null,\n      \"moduleId\": \"rest\",\n      \"fileId\": 5901,\n      \"bodyType\": \"Bitrix\\\\DocumentGenerator\\\\Body\\\\Docx\",\n      \"numeratorId\": 1,\n      \"withStamps\": \"N\",\n      \"productsTableVariant\": \"\",\n      \"isDeleted\": false,\n      \"isDefault\": \"N\",\n      \"users\": [\"U1\"],\n      \"download\": \"\u002Fbitrix\u002Fservices\u002Fmain\u002Fajax.php?action=documentgenerator.api.template.download&SITE_ID=s1&id=211\",\n      \"downloadMachine\": \"https:\u002F\u002F\u003Cportal>\u002Frest\u002F1\u002F\u003Ctoken>\u002Fdocumentgenerator.api.template.download\u002F?token=\u003Ctoken>\"\n    }\n  ],\n  \"meta\": {\n    \"total\": 2,\n    \"hasMore\": false\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n400 — фильтр по несуществующему полю. Сообщение перечисляет доступные для фильтрации поля:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"UNKNOWN_FILTER_FIELD\",\n    \"message\": \"Unknown filter field 'bogusField' for entity 'doc-templates'. Available: id, name, numeratorId, region, code, moduleId, active, bodyType, withStamps, sort, users, fileId, file, createdBy, updatedBy, isDeleted, createTime, updateTime, provider, download, downloadMachine, providers\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `UNKNOWN_FILTER_FIELD` | Фильтр по несуществующему полю. Сообщение перечисляет доступные поля |\n| 403 | `SCOPE_DENIED` | Ключу не хватает скоупа `documentgenerator` |\n| 401 | `TOKEN_MISSING` | У ключа нет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n**Сортировка по несуществующему полю.** Параметр `order` по полю, которого нет, не вызывает ошибку — запрос отрабатывает со статусом `200`, а неизвестное поле сортировки пропускается.\n\n**Строковая сортировка — побайтовая.** Сортировка по строковым полям (`name`, `region`) сравнивает строки побайтово, без учёта локали и регистра, поэтому порядок кириллицы и смешанного регистра может отличаться от привычного «человеческого». Числовые (`id`, `sort`) и датовременные (`createTime`, `updateTime`) поля сортируются корректно. Пустые значения (`null`\u002Fпустая строка) всегда идут в конце.\n\n## Смотрите также\n\n- [Получить шаблон](\u002Fdocs\u002Fentities\u002Fdoc-templates\u002Fget)\n- [Поиск шаблонов](\u002Fdocs\u002Fentities\u002Fdoc-templates\u002Fsearch)\n- [Поля шаблона](\u002Fdocs\u002Fentities\u002Fdoc-templates\u002Ffields)\n- [Синтаксис фильтрации](\u002Fdocs\u002Ffiltering)\n","\n## Получить шаблон\n\n`GET \u002Fv1\u002Fdoc-templates\u002F:id`\n\nВозвращает один шаблон документа по идентификатору.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | Описание |\n|----------|-----|:-----:|---------|\n| `id` (path) | number | да | Идентификатор шаблона |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdoc-templates\u002F209\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdoc-templates\u002F209\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdoc-templates\u002F209', {\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n  },\n})\n\nconst { success, data } = await res.json()\nconsole.log('Шаблон:', data.name)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdoc-templates\u002F209', {\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n  },\n})\n\nconst { success, data } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `success` | boolean | Всегда `true` при успехе |\n| `data` | object | Объект шаблона |\n| `data.id` | number | Идентификатор шаблона |\n| `data.name` | string | Название |\n| `data.region` | string | Регион |\n| `data.code` | string \\| null | Системный код шаблона |\n| `data.active` | string | Доступность: `Y` \u002F `N` |\n| `data.moduleId` | string | Модуль-источник шаблона |\n| `data.numeratorId` | number | Идентификатор нумератора |\n| `data.withStamps` | string | Печати и подписи: `Y` \u002F `N` |\n| `data.sort` | number | Порядок в списке |\n| `data.users` | object | Сопоставление идентификаторов сотрудников, которым доступен шаблон |\n| `data.providers` | object | Поставщики данных шаблона |\n| `data.isDeleted` | boolean | Помечен ли шаблон удалённым |\n| `data.createTime` | string | Дата создания (ISO 8601) |\n| `data.updateTime` | string | Дата изменения (ISO 8601) |\n| `data.download` | string | Адрес скачивания документа |\n| `data.downloadMachine` | string | Адрес скачивания для программного доступа |\n\nПолная схема полей шаблона — [Поля шаблона](.\u002Ffields.md).\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": 209,\n    \"name\": \"Шаблон договора\",\n    \"region\": \"ru\",\n    \"code\": null,\n    \"download\": \"\u002Fbitrix\u002Fservices\u002Fmain\u002Fajax.php?action=documentgenerator.api.template.download&SITE_ID=s1&id=209\",\n    \"active\": \"Y\",\n    \"moduleId\": \"rest\",\n    \"numeratorId\": 1,\n    \"withStamps\": \"N\",\n    \"providers\": {\n      \"bitrix\\\\documentgenerator\\\\dataprovider\\\\rest\": \"bitrix\\\\documentgenerator\\\\dataprovider\\\\rest\"\n    },\n    \"users\": {\n      \"U1\": \"U1\"\n    },\n    \"isDeleted\": false,\n    \"sort\": 500,\n    \"createTime\": \"2026-05-12T09:03:38.000Z\",\n    \"updateTime\": \"2026-05-12T09:03:38.000Z\",\n    \"downloadMachine\": \"https:\u002F\u002F\u003Cportal>\u002Frest\u002F1\u002F\u003Ctoken>\u002Fdocumentgenerator.api.template.download\u002F?token=\u003Ctoken>\"\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n404 — шаблон не найден:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"ENTITY_NOT_FOUND\",\n    \"message\": \"Шаблон не найден\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 404 | `ENTITY_NOT_FOUND` | Шаблона с указанным `id` нет (сообщение «Шаблон не найден») |\n| 403 | `SCOPE_DENIED` | Ключу не хватает скоупа `documentgenerator` |\n| 401 | `TOKEN_MISSING` | У ключа нет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Смотрите также\n\n- [Список шаблонов](\u002Fdocs\u002Fentities\u002Fdoc-templates\u002Flist)\n- [Обновить шаблон](\u002Fdocs\u002Fentities\u002Fdoc-templates\u002Fupdate)\n- [Поля шаблона](\u002Fdocs\u002Fentities\u002Fdoc-templates\u002Ffields)\n","\n## Обновить шаблон\n\n`PATCH \u002Fv1\u002Fdoc-templates\u002F:id`\n\nЧастично обновляет шаблон документа. Передавайте плоско в корне JSON только те поля, которые меняете, — остальные значения сохраняются.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | Описание |\n|----------|-----|:-----:|---------|\n| `id` (path) | number | да | Идентификатор шаблона |\n\n## Поля запроса (body)\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `name` | string | Название шаблона |\n| `numeratorId` | number | ID нумератора, который присваивает документам порядковые номера |\n| `region` | string | Код региона шаблона, например `ru` или `by` |\n| `code` | string | Системный код шаблона для привязки в коде приложения |\n| `active` | string | Доступность шаблона: `Y` — включён, `N` — выключен |\n| `withStamps` | string | Печать факсимиле и штампов: `Y` — добавляются, `N` — нет |\n| `sort` | number | Порядок шаблона в списке: чем меньше значение, тем выше |\n| `users` | array | Идентификаторы сотрудников, которым доступен шаблон. Список: `GET \u002Fv1\u002Fusers` |\n\nПоля только для чтения (`id`, `createTime`, `updateTime`, `isDeleted`, `download`, `downloadMachine`, `providers`, `provider`) в теле запроса не принимаются.\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X PATCH \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdoc-templates\u002F209\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"name\": \"Шаблон договора (ред.)\"\n  }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X PATCH \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdoc-templates\u002F209\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"name\": \"Шаблон договора (ред.)\"\n  }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdoc-templates\u002F209', {\n  method: 'PATCH',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    name: 'Шаблон договора (ред.)',\n  }),\n})\n\nconst { success, data } = await res.json()\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdoc-templates\u002F209', {\n  method: 'PATCH',\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    name: 'Шаблон договора (ред.)',\n  }),\n})\n\nconst { success, data } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `success` | boolean | Всегда `true` при успехе |\n| `data` | object | Обновлённый шаблон целиком |\n| `data.id` | number | Идентификатор шаблона |\n| `data.name` | string | Название |\n| `data.region` | string | Регион |\n| `data.code` | string \\| null | Системный код шаблона |\n| `data.active` | string | Доступность: `Y` \u002F `N` |\n| `data.moduleId` | string | Модуль-источник шаблона |\n| `data.numeratorId` | number | Идентификатор нумератора |\n| `data.withStamps` | string | Печати и подписи: `Y` \u002F `N` |\n| `data.sort` | number | Порядок в списке |\n| `data.users` | object | Сопоставление идентификаторов сотрудников, которым доступен шаблон |\n| `data.providers` | object | Поставщики данных шаблона |\n| `data.isDeleted` | boolean | Помечен ли шаблон удалённым |\n| `data.createTime` | string | Дата создания (ISO 8601) |\n| `data.updateTime` | string | Дата изменения (ISO 8601) |\n| `data.download` | string | Адрес скачивания документа |\n| `data.downloadMachine` | string | Адрес скачивания для программного доступа |\n\nПолная схема полей шаблона — [Поля шаблона](.\u002Ffields.md).\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": 209,\n    \"name\": \"Шаблон договора (ред.)\",\n    \"region\": \"ru\",\n    \"code\": null,\n    \"download\": \"\u002Fbitrix\u002Fservices\u002Fmain\u002Fajax.php?action=documentgenerator.api.template.download&SITE_ID=s1&id=209&ts=0\",\n    \"active\": \"Y\",\n    \"moduleId\": \"rest\",\n    \"numeratorId\": 1,\n    \"withStamps\": \"N\",\n    \"providers\": {\n      \"bitrix\\\\documentgenerator\\\\dataprovider\\\\rest\": \"bitrix\\\\documentgenerator\\\\dataprovider\\\\rest\"\n    },\n    \"users\": {\n      \"U1\": \"U1\"\n    },\n    \"isDeleted\": false,\n    \"sort\": 500,\n    \"createTime\": \"2026-05-12T09:03:38.000Z\",\n    \"updateTime\": \"2026-05-25T10:00:11.000Z\",\n    \"downloadMachine\": \"https:\u002F\u002F\u003Cportal>\u002Frest\u002F1\u002F\u003Ctoken>\u002Fdocumentgenerator.api.template.download\u002F?token=\u003Ctoken>\"\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n404 — шаблон не найден:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"ENTITY_NOT_FOUND\",\n    \"message\": \"Шаблон не найден\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 404 | `ENTITY_NOT_FOUND` | Шаблона с указанным `id` нет (сообщение «Шаблон не найден») |\n| 403 | `SCOPE_DENIED` | Ключу не хватает скоупа `documentgenerator` |\n| 401 | `TOKEN_MISSING` | У ключа нет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Смотрите также\n\n- [Получить шаблон](\u002Fdocs\u002Fentities\u002Fdoc-templates\u002Fget)\n- [Создать шаблон](\u002Fdocs\u002Fentities\u002Fdoc-templates\u002Fcreate)\n- [Поля шаблона](\u002Fdocs\u002Fentities\u002Fdoc-templates\u002Ffields)\n","\n## Удалить шаблон\n\n`DELETE \u002Fv1\u002Fdoc-templates\u002F:id`\n\nУдаляет шаблон документа по идентификатору. Восстановить удалённый шаблон через API нельзя — при необходимости создайте новый.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | Описание |\n|----------|-----|:-----:|---------|\n| `id` (path) | number | да | Идентификатор шаблона |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X DELETE \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdoc-templates\u002F209\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X DELETE \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdoc-templates\u002F209\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdoc-templates\u002F209', {\n  method: 'DELETE',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n  },\n})\n\nif (res.status === 204) {\n  console.log('Шаблон удалён')\n}\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdoc-templates\u002F209', {\n  method: 'DELETE',\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n  },\n})\n\nif (res.status === 204) {\n  console.log('Шаблон удалён')\n}\n```\n\n## Ответ\n\nПри успешном удалении возвращается HTTP-статус `204 No Content` с пустым телом. Признак успеха — код ответа, не содержимое.\n\n## Пример ответа\n\n```http\nHTTP\u002F1.1 204 No Content\n```\n\n## Пример ответа при ошибке\n\n404 — шаблон не найден:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"ENTITY_NOT_FOUND\",\n    \"message\": \"Шаблон не найден\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 404 | `ENTITY_NOT_FOUND` | Шаблона с указанным `id` нет (в том числе повторное удаление) |\n| 403 | `SCOPE_DENIED` | Ключу не хватает скоупа `documentgenerator` |\n| 401 | `TOKEN_MISSING` | У ключа нет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Смотрите также\n\n- [Получить шаблон](\u002Fdocs\u002Fentities\u002Fdoc-templates\u002Fget)\n- [Список шаблонов](\u002Fdocs\u002Fentities\u002Fdoc-templates\u002Flist)\n- [Создать шаблон](\u002Fdocs\u002Fentities\u002Fdoc-templates\u002Fcreate)\n","\n## Поиск шаблонов\n\n`POST \u002Fv1\u002Fdoc-templates\u002Fsearch`\n\nВозвращает шаблоны документов портала по фильтру, переданному в теле запроса. Поиск рассчитан на большие выборки с разбиением по датам. Для выборок до 5000 записей используйте `GET \u002Fv1\u002Fdoc-templates` с параметрами в строке запроса.\n\n## Поля запроса (body)\n\n| Поле | Тип | По умолч. | Описание |\n|------|-----|-----------|---------|\n| `filter` | object | — | Фильтрация по полям шаблона. Список полей — `GET \u002Fv1\u002Fdoc-templates\u002Ffields`.\u003Cbr>[Синтаксис фильтрации](\u002Fdocs\u002Ffiltering). Пример: `{\"filter\": {\"active\": \"Y\"}}` |\n| `select` | string[] | — | Выборка полей: `[\"id\", \"name\", \"region\"]` |\n| `sort` | object | — | Сортировка по полю: `{\"sort\": {\"id\": \"desc\"}}` |\n| `limit` | number | `50` | Количество записей (до 5000) |\n| `offset` | number | `0` | Смещение для пагинации |\n| `autoWindow` | boolean | `true` | Разбиение выборки по датам при фильтре с полями `createTime` \u002F `updateTime`. Передайте `false`, чтобы отключить разбиение |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdoc-templates\u002Fsearch\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"filter\": { \"region\": \"ru\", \"active\": \"Y\" },\n    \"limit\": 10,\n    \"select\": [\"id\", \"name\", \"region\", \"active\"]\n  }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdoc-templates\u002Fsearch\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"filter\": { \"region\": \"ru\", \"active\": \"Y\" },\n    \"limit\": 10,\n    \"select\": [\"id\", \"name\", \"region\", \"active\"]\n  }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdoc-templates\u002Fsearch', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    filter: { region: 'ru', active: 'Y' },\n    limit: 10,\n    select: ['id', 'name', 'region', 'active'],\n  }),\n})\n\nconst { success, data, meta } = await res.json()\nconsole.log(`Найдено ${meta.total} шаблонов`)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdoc-templates\u002Fsearch', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    filter: { region: 'ru', active: 'Y' },\n    limit: 10,\n    select: ['id', 'name', 'region', 'active'],\n  }),\n})\n\nconst { success, data, meta } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `success` | boolean | Всегда `true` при успехе |\n| `data` | array | Массив шаблонов |\n| `data[].id` | number | Идентификатор шаблона |\n| `data[].name` | string | Название |\n| `data[].active` | string | Доступность: `Y` \u002F `N` |\n| `data[].code` | string \\| null | Системный код шаблона |\n| `data[].region` | string | Регион |\n| `data[].sort` | number | Порядок в списке |\n| `data[].createTime` | string | Дата создания (ISO 8601) |\n| `data[].updateTime` | string | Дата изменения (ISO 8601) |\n| `data[].createdBy` | number | Идентификатор создавшего сотрудника |\n| `data[].updatedBy` | number \\| null | Идентификатор изменившего сотрудника |\n| `data[].moduleId` | string | Модуль-источник шаблона |\n| `data[].fileId` | number | Идентификатор файла на Диске |\n| `data[].bodyType` | string | Формат тела документа |\n| `data[].numeratorId` | number | Идентификатор нумератора |\n| `data[].withStamps` | string | Печати и подписи: `Y` \u002F `N` |\n| `data[].productsTableVariant` | string | Вариант таблицы товаров в документе |\n| `data[].isDeleted` | boolean | Помечен ли шаблон удалённым |\n| `data[].isDefault` | string | Шаблон по умолчанию: `Y` \u002F `N` |\n| `data[].users` | array | Идентификаторы сотрудников, которым доступен шаблон |\n| `data[].download` | string | Адрес скачивания документа |\n| `data[].downloadMachine` | string | Адрес скачивания для программного доступа |\n| `meta.total` | number | Количество записей, соответствующих фильтру |\n| `meta.hasMore` | boolean | Есть ли ещё записи за пределами `limit` |\n| `meta.durationMs` | number | Время выполнения запроса на стороне сервера, миллисекунды |\n| `meta.autoWindowed` | boolean | Присутствует, когда выборка разбита по датам |\n| `meta.windowCount` | number | Количество подзапросов при разбиении по датам |\n\nПолная схема полей шаблона — [Поля шаблона](.\u002Ffields.md).\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": [\n    {\n      \"id\": 209,\n      \"active\": \"Y\",\n      \"name\": \"Шаблон договора\",\n      \"code\": null,\n      \"region\": \"ru\",\n      \"sort\": 500,\n      \"createTime\": \"2026-05-12T09:03:38.000Z\",\n      \"updateTime\": \"2026-05-12T09:03:38.000Z\",\n      \"createdBy\": 1,\n      \"updatedBy\": null,\n      \"moduleId\": \"rest\",\n      \"fileId\": 9175,\n      \"bodyType\": \"Bitrix\\\\DocumentGenerator\\\\Body\\\\Docx\",\n      \"numeratorId\": 1,\n      \"withStamps\": \"N\",\n      \"productsTableVariant\": \"\",\n      \"isDeleted\": false,\n      \"isDefault\": \"N\",\n      \"users\": [\"U1\"],\n      \"download\": \"\u002Fbitrix\u002Fservices\u002Fmain\u002Fajax.php?action=documentgenerator.api.template.download&SITE_ID=s1&id=209\",\n      \"downloadMachine\": \"https:\u002F\u002F\u003Cportal>\u002Frest\u002F1\u002F\u003Ctoken>\u002Fdocumentgenerator.api.template.download\u002F?token=\u003Ctoken>\"\n    },\n    {\n      \"id\": 211,\n      \"active\": \"Y\",\n      \"name\": \"Шаблон счёта\",\n      \"code\": null,\n      \"region\": \"ru\",\n      \"sort\": 500,\n      \"createTime\": \"2026-05-12T09:04:38.000Z\",\n      \"updateTime\": \"2026-05-12T09:04:38.000Z\",\n      \"createdBy\": 1,\n      \"updatedBy\": null,\n      \"moduleId\": \"rest\",\n      \"fileId\": 5901,\n      \"bodyType\": \"Bitrix\\\\DocumentGenerator\\\\Body\\\\Docx\",\n      \"numeratorId\": 1,\n      \"withStamps\": \"N\",\n      \"productsTableVariant\": \"\",\n      \"isDeleted\": false,\n      \"isDefault\": \"N\",\n      \"users\": [\"U1\"],\n      \"download\": \"\u002Fbitrix\u002Fservices\u002Fmain\u002Fajax.php?action=documentgenerator.api.template.download&SITE_ID=s1&id=211\",\n      \"downloadMachine\": \"https:\u002F\u002F\u003Cportal>\u002Frest\u002F1\u002F\u003Ctoken>\u002Fdocumentgenerator.api.template.download\u002F?token=\u003Ctoken>\"\n    }\n  ],\n  \"meta\": {\n    \"total\": 2,\n    \"hasMore\": false,\n    \"durationMs\": 799\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n400 — фильтр по несуществующему полю. Сообщение перечисляет доступные для фильтрации поля:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"UNKNOWN_FILTER_FIELD\",\n    \"message\": \"Unknown filter field 'bogusField' for entity 'doc-templates'. Available: id, name, numeratorId, region, code, moduleId, active, bodyType, withStamps, sort, users, fileId, file, createdBy, updatedBy, isDeleted, createTime, updateTime, provider, download, downloadMachine, providers\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `UNKNOWN_FILTER_FIELD` | Фильтр по несуществующему полю. Сообщение перечисляет доступные поля |\n| 400 | `UNKNOWN_SORT_FIELD` | Сортировка по несуществующему полю в `sort`. Сообщение перечисляет доступные поля |\n| 403 | `SCOPE_DENIED` | Ключу не хватает скоупа `documentgenerator` |\n| 401 | `TOKEN_MISSING` | У ключа нет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n**Сортировка и постраничная выборка — на стороне Вайбкод.** `sort` (`{\"sort\": {\"поле\": \"asc|desc\"}}`) и `offset`\u002F`limit` применяются на стороне Вайбкод: набор вытягивается полностью, сортируется и режется по запрошенному окну. `total` и `hasMore` считаются от собранного набора. Автоматическое разбиение по датам (`autoWindowed`\u002F`windowCount`) для этой сущности **не применяется** — `autoWindow` игнорируется, а `offset` работает и вместе с фильтром по `createTime`\u002F`updateTime`.\n\n**Строковая сортировка — побайтовая.** Сортировка по строковым полям (`name`, `region`) сравнивает строки побайтово, без учёта локали и регистра. Числовые (`id`, `sort`) и датовременные (`createTime`, `updateTime`) поля сортируются корректно. Пустые значения (`null`\u002Fпустая строка) всегда идут в конце.\n\n## Смотрите также\n\n- [Список шаблонов](\u002Fdocs\u002Fentities\u002Fdoc-templates\u002Flist)\n- [Поля шаблона](\u002Fdocs\u002Fentities\u002Fdoc-templates\u002Ffields)\n- [Синтаксис фильтрации](\u002Fdocs\u002Ffiltering)\n","\n## Поля шаблона\n\n`GET \u002Fv1\u002Fdoc-templates\u002Ffields`\n\nВозвращает полную схему полей шаблона документа: имя поля, тип, признак «только для чтения» и обязательность при создании. Поля помечены ★ — обязательны в теле запроса при создании шаблона.\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdoc-templates\u002Ffields\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdoc-templates\u002Ffields\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdoc-templates\u002Ffields', {\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n  },\n})\n\nconst { success, data } = await res.json()\nconsole.log('Всего полей:', Object.keys(data.fields).length)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdoc-templates\u002Ffields', {\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n  },\n})\n\nconst { success, data } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Битрикс24 | Тип | RO | Описание |\n|------|----------|-----|:--:|---------|\n| `id` | `id` | number | да | ID шаблона |\n| `name` | `name` | string | | ★ Название шаблона |\n| `numeratorId` | `numeratorId` | number | | ★ ID нумератора, который присваивает документам порядковые номера |\n| `region` | `region` | string | | ★ Код региона шаблона, например `ru` или `by` |\n| `code` | `code` | string \\| null | | Системный код шаблона для привязки в коде приложения. `null`, если код не задан |\n| `moduleId` | `moduleId` | string | | Идентификатор модуля-владельца шаблона |\n| `active` | `active` | string | | Доступность шаблона: `Y` — включён, `N` — выключен |\n| `bodyType` | `bodyType` | string | | Формат тела документа, например `DOCX` |\n| `withStamps` | `withStamps` | string | | Печать факсимиле и штампов: `Y` — добавляются, `N` — нет |\n| `sort` | `sort` | number | | Порядок шаблона в списке: чем меньше значение, тем выше |\n| `users` | `users` | array | | Идентификаторы сотрудников, которым доступен шаблон. Список: `GET \u002Fv1\u002Fusers` |\n| `fileId` | `fileId` | number | | ID файла на Диске. Загрузка через `POST \u002Fv1\u002Ffiles\u002Fupload` |\n| `file` | `file` | string | | Содержимое .docx в base64, принимается при создании |\n| `createdBy` | `createdBy` | number | да | Идентификатор создавшего сотрудника |\n| `updatedBy` | `updatedBy` | number \\| null | да | Идентификатор изменившего сотрудника. `null`, если шаблон не изменялся |\n| `isDeleted` | `isDeleted` | boolean | да | Шаблон помечен как удалённый |\n| `createTime` | `createTime` | datetime | да | Дата создания |\n| `updateTime` | `updateTime` | datetime | да | Дата изменения |\n| `download` | `download` | string | да | Ссылка для скачивания исходного файла шаблона |\n| `downloadMachine` | `downloadMachine` | string | да | Ссылка для скачивания файла по машинному доступу без авторизации в браузере |\n| `providers` | `providers` | object | да | Перечень доступных поставщиков хранилищ с их настройками |\n\n★ — поля `name`, `numeratorId`, `region` обязательны в теле запроса при создании шаблона.\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"fields\": {\n      \"id\": { \"type\": \"number\", \"readonly\": true },\n      \"name\": { \"type\": \"string\", \"readonly\": false, \"required\": true },\n      \"numeratorId\": { \"type\": \"number\", \"readonly\": false, \"required\": true },\n      \"region\": { \"type\": \"string\", \"readonly\": false, \"required\": true },\n      \"code\": { \"type\": \"string\", \"readonly\": false },\n      \"moduleId\": { \"type\": \"string\", \"readonly\": false },\n      \"active\": { \"type\": \"string\", \"readonly\": false },\n      \"bodyType\": { \"type\": \"string\", \"readonly\": false },\n      \"withStamps\": { \"type\": \"string\", \"readonly\": false },\n      \"sort\": { \"type\": \"number\", \"readonly\": false },\n      \"users\": { \"type\": \"array\", \"readonly\": false },\n      \"fileId\": { \"type\": \"number\", \"readonly\": false },\n      \"file\": { \"type\": \"string\", \"readonly\": false },\n      \"createdBy\": { \"type\": \"number\", \"readonly\": true },\n      \"updatedBy\": { \"type\": \"number\", \"readonly\": true },\n      \"isDeleted\": { \"type\": \"boolean\", \"readonly\": true },\n      \"createTime\": { \"type\": \"datetime\", \"readonly\": true },\n      \"updateTime\": { \"type\": \"datetime\", \"readonly\": true },\n      \"download\": { \"type\": \"string\", \"readonly\": true },\n      \"downloadMachine\": { \"type\": \"string\", \"readonly\": true },\n      \"providers\": { \"type\": \"object\", \"readonly\": true }\n    }\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n403 — у ключа нет нужного скоупа:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"SCOPE_DENIED\",\n    \"message\": \"This endpoint requires 'documentgenerator' scope\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 403 | `SCOPE_DENIED` | API-ключу не хватает скоупа `documentgenerator` |\n| 401 | `TOKEN_MISSING` | у ключа нет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Смотрите также\n\n- [Создать шаблон](\u002Fdocs\u002Fentities\u002Fdoc-templates\u002Fcreate)\n- [Список шаблонов](\u002Fdocs\u002Fentities\u002Fdoc-templates\u002Flist)\n","\n## Агрегация шаблонов документов\n\n`POST \u002Fv1\u002Fdoc-templates\u002Faggregate`\n\nПодсчёт количества и числовые агрегации (сумма, среднее, минимум, максимум) по шаблонам документов с фильтрацией и группировкой.\n\n**Стандартные поля:**\n\n- `sort` — индекс сортировки, единственное числовое поле, для которого `sum`\u002F`avg`\u002F`min`\u002F`max` имеют смысл\n- `numeratorId` — нумератор, число, работает в числовых функциях и в `groupBy`\n- `fileId` — файл шаблона на Диске, число, работает в числовых функциях и в `groupBy`\n- `region` — регион шаблона, строка, только для `groupBy`\n- `moduleId` — модуль-владелец, строка, только для `groupBy`\n- `active` — активность, строка, только для `groupBy`\n\nФункции `sum`\u002F`avg`\u002F`min`\u002F`max` принимают только числовые поля — `sort`, `numeratorId`, `fileId`. Для строкового поля в числовой функции возвращается `400 INVALID_PARAMS`. Группировать `groupBy` можно по любому полю из списка выше.\n\n## Поля запроса (body)\n\n| Параметр | Тип | Обяз. | Описание |\n|----------|-----|:-----:|---------|\n| `aggregate` | array | нет | Массив агрегаций. Каждый элемент: `{ \"field\": \"sort\", \"function\": \"sum\" }`. Функции: `count`, `sum`, `avg`, `min`, `max`. Для `count` поле — `\"*\"`. Без массива — только `count` |\n| `filter` | object | нет | Фильтрация по полям `GET \u002Fv1\u002Fdoc-templates\u002Ffields`. [Синтаксис фильтрации](\u002Fdocs\u002Ffiltering) |\n| `groupBy` | string \\| string[] | нет | Поле или массив полей для группировки (максимум 5). Допустимые значения — из списка выше |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdoc-templates\u002Faggregate\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"aggregate\": [\n      { \"field\": \"sort\", \"function\": \"sum\" },\n      { \"field\": \"sort\", \"function\": \"avg\" }\n    ],\n    \"groupBy\": \"region\"\n  }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdoc-templates\u002Faggregate\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"aggregate\": [\n      { \"field\": \"sort\", \"function\": \"sum\" },\n      { \"field\": \"sort\", \"function\": \"avg\" }\n    ],\n    \"groupBy\": \"region\"\n  }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdoc-templates\u002Faggregate', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    aggregate: [\n      { field: 'sort', function: 'sum' },\n      { field: 'sort', function: 'avg' },\n    ],\n    groupBy: 'region',\n  }),\n})\n\nconst { success, data } = await res.json()\nconsole.log('Всего шаблонов:', data.count)\nconsole.log('По регионам:', data.groups)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fdoc-templates\u002Faggregate', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    aggregate: [\n      { field: 'sort', function: 'sum' },\n      { field: 'sort', function: 'avg' },\n    ],\n    groupBy: 'region',\n  }),\n})\n\nconst { success, data } = await res.json()\n```\n\n> Для группировки по нескольким полям передайте массив: `\"groupBy\": [\"region\", \"active\"]` (максимум 5).\n\n## Другие сценарии\n\nПодсчёт записей — `count` с полем `\"*\"`, самый быстрый запрос без выгрузки шаблонов. Без массива `aggregate` результат тот же:\n\n```json\n{ \"aggregate\": [{ \"field\": \"*\", \"function\": \"count\" }] }\n```\n\nРазбивка по двум полям сразу — сколько шаблонов в каждом сочетании региона и активности:\n\n```json\n{ \"groupBy\": [\"region\", \"active\"] }\n```\n\nКоличество шаблонов одного региона — `count` с фильтром, записи не выгружаются:\n\n```json\n{ \"filter\": { \"region\": \"ru\" } }\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `success` | boolean | Всегда `true` при успехе |\n| `data.count` | number | Общее количество шаблонов под фильтр |\n| `data.aggregates` | object | Результаты числовых агрегаций: `{ \"sort\": { \"sum\": 1650, \"avg\": 275 } }`. Пустой объект, если массив `aggregate` не передан |\n| `data.groups` | array | Группы, только при `groupBy`. Каждый элемент: поля группировки + `count` + `aggregates` |\n| `data.meta.totalRecords` | number | Общее количество записей под фильтр |\n| `data.meta.recordsProcessed` | number | Сколько записей обработано для числовых агрегаций. При запросе без числовых функций равно `0` — записи не выгружаются |\n| `data.meta.truncated` | boolean | `true`, если под фильтр попало больше 5000 записей |\n| `data.meta.groupTotal` | number | Количество групп, только при `groupBy` |\n| `data.meta.groupsTruncated` | boolean | `true`, если групп оказалось больше предела выдачи. Только при `groupBy` |\n\n## Пример ответа\n\nОтвет на основной запрос (`sum` и `avg` по `sort` с `groupBy: \"region\"`):\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"count\": 6,\n    \"aggregates\": {\n      \"sort\": { \"sum\": 1650, \"avg\": 275 }\n    },\n    \"groups\": [\n      {\n        \"region\": \"ru\",\n        \"count\": 3,\n        \"aggregates\": { \"sort\": { \"sum\": 600, \"avg\": 200 } }\n      },\n      {\n        \"region\": \"by\",\n        \"count\": 2,\n        \"aggregates\": { \"sort\": { \"sum\": 900, \"avg\": 450 } }\n      },\n      {\n        \"region\": \"kz\",\n        \"count\": 1,\n        \"aggregates\": { \"sort\": { \"sum\": 150, \"avg\": 150 } }\n      }\n    ],\n    \"meta\": {\n      \"totalRecords\": 6,\n      \"recordsProcessed\": 6,\n      \"truncated\": false,\n      \"groupTotal\": 3,\n      \"groupsTruncated\": false\n    }\n  }\n}\n```\n\nБез `groupBy` поля `data.groups`, `data.meta.groupTotal` и `data.meta.groupsTruncated` в ответе отсутствуют.\n\n## Пример ответа при ошибке\n\n400 — несуществующее поле. Сообщение перечисляет доступные поля:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"INVALID_PARAMS\",\n    \"message\": \"Field 'bogus' not found. Available numeric fields: sort, numeratorId, fileId, region, moduleId, active.\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `INVALID_PARAMS` | Некорректное имя функции или несуществующее поле — сообщение перечисляет доступные поля |\n| 400 | `INVALID_PARAMS` | Строковое поле (`region`, `moduleId`, `active`) в `sum`\u002F`avg`\u002F`min`\u002F`max` — сообщение называет тип поля |\n| 400 | `INVALID_PARAMS` | `groupBy` по полю вне списка, зарезервированное слово (`count`, `aggregates`, `meta`, `groups`) или больше 5 полей в `groupBy` |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `documentgenerator` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n**`count` vs числовые функции.** `count` считается одним вызовом в Битрикс24 на любом объёме данных, записи при этом не выгружаются и `meta.recordsProcessed` равно `0`. Функции `sum`\u002F`avg`\u002F`min`\u002F`max` подгружают записи постранично (максимум 5000) и считают на стороне Вайбкод — если под фильтр попадает больше 5000 записей, `meta.truncated` будет `true`, агрегация выполнится по первым 5000. Для точных счётчиков на больших выборках используйте `count` или сужайте фильтр.\n\n**Числовое агрегирование — по одному полю.** Осмысленную сумму или среднее даёт только `sort`. Поля `numeratorId` и `fileId` тоже числовые и принимаются в `sum`\u002F`avg`\u002F`min`\u002F`max`, но это идентификаторы — их агрегируют для группировки, а не для подсчёта суммы. Остальные поля строковые и работают только в `groupBy`.\n\n## Смотрите также\n\n- [Список шаблонов](\u002Fdocs\u002Fentities\u002Fdoc-templates\u002Flist)\n- [Поиск шаблонов](\u002Fdocs\u002Fentities\u002Fdoc-templates\u002Fsearch)\n- [Поля шаблона](\u002Fdocs\u002Fentities\u002Fdoc-templates\u002Ffields)\n- [Синтаксис фильтрации](\u002Fdocs\u002Ffiltering)\n- [Лимиты и оптимизация](\u002Fdocs\u002Foptimization)\n"]