Разработка модуля генерации документов 1С-Битрикс
Типичная ситуация: оператор CRM тратит 10 минут на формирование счета в Word, копируя данные из заказа — ошибается в ставке НДС, и документ уходит клиенту. Или интернет-магазин генерирует сотни накладных в день через phpWord, а при изменении логотипа править каждую. 54-ФЗ требует фискализации, ошибка в реквизитах — штраф до 50 000 рублей. Мы разрабатываем модуль для Битрикс, который системно решает эти проблемы: шаблоны, переменные, версионирование, автоматическая генерация по событиям.
Проблемы, которые решаем
- Ошибки в документах: не тот ИНН, неверная сумма, пропущенная ставка НДС. Ручной ввод приводит к 30% ошибок. Модуль исключает человеческий фактор: данные тянутся напрямую из заказа или сделки через провайдеры.
- Медленная генерация: менеджер тратит 5–10 минут на один документ. При 200 заказах в день это более 30 часов работы. Автоматизация сводит генерацию к 200–500 мс на документ.
- Несогласованность шаблонов: в Word-документах разных отделов разные шрифты, отступы, колонтитулы. Модуль централизует шаблоны с версионированием — изменения применяются сразу ко всем новым документам.
- Несоответствие требованиям: отсутствие обязательных полей (КПП, ОКТМО, QR-код для налоговой). Настройка переменных и валидация шаблонов исключают такие пропуски.
Как работает модуль генерации документов?
Модуль vendor.docgen использует четыре ORM-таблицы:
-
b_vendor_docgen_template— шаблоны документов: id, name, type (order/contract/act/offer), format (docx/pdf), template_file, variables_schema, version, is_active -
b_vendor_docgen_document— сгенерированные документы: id, template_id, entity_type, entity_id, file_id (вb_file), status, generated_at, generated_by -
b_vendor_docgen_variable— зарегистрированные переменные: name, source_class, description
Каждый шаблон содержит JSON-схему переменных — модуль валидирует, что все обязательные поля присутствуют.
Система переменных
Переменные обёрнуты в {{....}}. Подстановка выполняется через провайдеры данных, которые регистрируются в настройках модуля. Пример провайдера для заказа:
class OrderVariableProvider implements VariableProviderInterface
{
public function getVariables(int $entityId): array
{
$order = \Bitrix\Sale\Order::load($entityId);
$props = $order->getPropertyCollection();
return [
'ORDER_NUMBER' => $order->getField('ACCOUNT_NUMBER'),
'ORDER_DATE' => $order->getDateInsert()->format('d.m.Y'),
'ORDER_SUM' => number_format($order->getPrice(), 2, ',', ' '),
'ORDER_CURRENCY' => $order->getCurrency(),
'CLIENT_NAME' => $props->getPayerName(),
'CLIENT_INN' => $props->getUserProp('INN')?->getValue(),
'CLIENT_ADDRESS' => $props->getAddress(),
'ITEMS_TABLE' => $this->buildItemsTable($order->getBasket()),
];
}
}
Провайдеров можно писать под любые сущности: сделки CRM, лиды, пользовательские профили. Типовой шаблон содержит 20–30 переменных, модуль не ограничивает количество.
Почему Twig лучше простой замены?
Простая замена str_replace ломается при вложенных данных и таблицах. Twig даёт циклы, условия, фильтры. Пример HTML-шаблона:
<h1>Счет № {{ORDER_NUMBER}}</h1>
<table>
{% for item in ITEMS %}
<tr>
<td>{{ item.name }}</td>
<td>{{ item.quantity }}</td>
<td>{{ item.price|number_format(2, ',', ' ') }}</td>
</tr>
{% endfor %}
</table>
Twig компилируется в кэш — производительность на уровне ручной замены, а поддерживать шаблоны в десятки раз проще. Подробнее — в документации Twig и Wikipedia.
Как настроить шаблоны DOCX и HTML?
Для Word-шаблонов используем PhpWord с клонированием строк таблиц:
$templateProcessor = new \PhpOffice\PhpWord\TemplateProcessor($templatePath);
foreach ($variables as $name => $value) {
if (is_array($value)) {
$templateProcessor->cloneRow('ITEM_NAME', count($value));
foreach ($value as $i => $item) {
$templateProcessor->setValue("ITEM_NAME#{$i}", $item['name']);
$templateProcessor->setValue("ITEM_QTY#{$i}", $item['quantity']);
$templateProcessor->setValue("ITEM_PRICE#{$i}", $item['price']);
}
} else {
$templateProcessor->setValue($name, htmlspecialchars($value));
}
}
$outputPath = '/upload/vendor_docgen/' . uniqid() . '.docx';
$templateProcessor->saveAs($outputPath);
Как выбрать конвертер PDF?
DOCX генерируется быстро, но клиент часто хочет PDF. Конвертация — самое болезненное место. Сравнение способов:
| Конвертер | Качество | Скорость | Требования | Стоимость |
|---|---|---|---|---|
| LibreOffice headless | Отличное | 1-2 сек | Установка на сервер | Бесплатно |
| mPDF | Хорошее | 0.5 сек | PHP-расширение | Бесплатно |
| DocRaptor | Отличное | 1-3 сек | Нет | от $0.01/док |
Выбор конвертора — параметр в настройках модуля. По умолчанию: mPDF для HTML-шаблонов, LibreOffice для DOCX. Подробнее про mPDF и LibreOffice. О формате PDF читайте на Wikipedia.
HTML-шаблоны
Альтернатива Word — HTML с CSS. Проще поддерживать, нет проблем с кодировками. Шаблон хранится в b_vendor_docgen_template в поле html_template. Конвертация через Twig и mPDF:
$loader = new \Twig\Loader\ArrayLoader(['doc' => $template['HTML_TEMPLATE']]);
$twig = new \Twig\Environment($loader);
$html = $twig->render('doc', $variables);
$mpdf = new \Mpdf\Mpdf(['mode' => 'utf-8', 'format' => 'A4']);
$mpdf->WriteHTML($html);
$mpdf->Output($outputPath, 'F');
mPDF поддерживает колонтитулы, подписи, печати, QR-коды.
Как обеспечить безопасность и автоматизацию?
Хранение и доступ
Готовый файл сохраняется через \CFile::SaveFile() в таблицу b_file. Ссылка для скачивания — \CFile::GetPath(). В b_vendor_docgen_document хранятся метаданные. Права доступа: пользователь скачивает только свои документы, менеджеры CRM — документы своих сделок, администраторы — все.
Автоматическая генерация по событиям
Документ может формироваться при наступлении события:
AddEventHandler('sale', 'OnSaleOrderPaid', ['\Vendor\DocGen\EventHandler', 'onOrderPaid']);
class EventHandler
{
public static function onOrderPaid(\Bitrix\Main\Event $event): void
{
$orderId = $event->getParameter('id');
DocGenerator::generate('invoice', 'sale_order', $orderId);
}
}
Таким же образом можно вешать на закрытие сделки, регистрацию пользователя, загрузку товара.
Что входит в работу?
В результате вы получаете:
- Рабочий модуль с ORM-таблицами и инсталлятором.
- Набор шаблонов (3–5) для типовых документов.
- Документацию по провайдерам данных и расширению.
- Доступ к репозиторию с исходным кодом.
- 1 час онлайн-обучения сотрудников.
- Поддержку в течение 30 дней после сдачи.
Процесс работы
- Aналитика: изучаем бизнес-процессы и требования к документам.
- Проектирование: архитектура модуля, схема переменных, выбор конвертеров.
- Разработка: реализация модуля, создание шаблонов.
- Интеграция: настройка событий и автоматической генерации.
- Тестирование: до 3 итераций правок на вашем сервере.
- Деплой и обучение: передача документации, обучение сотрудников.
Ориентировочные сроки
| Этап | Срок |
|---|---|
| Архитектура, ORM-таблицы, инсталлятор | 1 день |
| Система переменных и провайдеры данных | 2 дня |
| Генерация DOCX (PhpWord) | 2 дня |
| Генерация PDF (mPDF или LibreOffice) | 1 день |
| HTML-шаблоны через Twig | 1 день |
| Хранение, доступ, скачивание | 1 день |
| Автоматическая генерация по событиям | 1 день |
| Административный интерфейс шаблонов | 2 дня |
| Тестирование | 1 день |
Итого: 12 рабочих дней. Сложная вёрстка документов с колонтитулами, подписями и печатями — +2 дня.
Типичные ошибки при внедрении
- Игнорирование валидации: если не проверять обязательные поля, может сгенерироваться документ с пустыми реквизитами. Наш модуль проверяет JSON-схему перед генерацией.
- Неправильный выбор конвертера: mPDF не поддерживает сложные таблицы с объединёнными ячейками — для таких случаев нужен LibreOffice. Мы помогаем выбрать оптимальный вариант.
-
Отсутствие кэширования: при каждом вызове модуль считывает шаблон из БД. Рекомендуем включить кэширование через
\Bitrix\Main\Data\Cache.
Опыт и гарантии
10+ лет в разработке на Битрикс, более 50 проектов по автоматизации документов. Работаем с шаблонами любого объёма — от простых счетов до многостраничных контрактов с QR-кодами и цифровыми подписями. Сертифицированные специалисты 1С-Битрикс. Соблюдаем сроки: 95% проектов сдаём вовремя. Свяжитесь с нами для обсуждения вашего проекта — получите чёткое ТЗ, сроки и индивидуальную стоимость. Закажите разработку модуля и исключите ошибки в документах навсегда.







