Розробка модуля генерації документів 1С-Бітрікс
Типова ситуація: оператор CRM витрачає 10 хвилин на формування рахунку в Word, копіюючи дані із замовлення — помиляється в ставці ПДВ, і документ іде клієнту. Або інтернет-магазин генерує сотні накладних на день через phpWord, а при зміні логотипу правити кожну. Законодавство вимагає правильної фіскалізації, помилка в реквізитах — штраф до 50 000 грн. Ми розробляємо модуль для Бітрікс, який системно вирішує ці проблеми: шаблони, змінні, версіонування, автоматична генерація за подіями.
Які проблеми вирішує автоматизація документів?
- Помилки в документах: не той ІПН, невірна сума, пропущена ставка ПДВ. Ручне введення призводить до 30% помилок. Автоматизація з модулем зменшує кількість помилок у документах в 5 разів: дані тягнуться безпосередньо із замовлення або угоди через провайдери.
- Повільна генерація: менеджер витрачає 5–10 хвилин на один документ. При 200 замовленнях на день це понад 30 годин роботи. При середній ставці менеджера 300 грн/год це економія до 9 000 грн на місяць. Наприклад, компанія з 10 менеджерами може заощадити до 30 000 грн на місяць на ручному формуванні документів. Автоматизація зводить генерацію до 200–500 мс на документ — в 100 разів швидше ручного формування.
- Неузгодженість шаблонів: у 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 компілюється в кеш — продуктивність на рівні ручної заміни, а підтримувати шаблони в 10 разів простіше. Детальніше — у документації 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. Конвертація — найболісніше місце. Порівняння способів:
Таблиця порівняння конвертерів PDF
| Конвертер | Якість | Швидкість | Вимоги | Вартість |
|---|---|---|---|---|
| LibreOffice headless | Відмінна | 1-2 сек | Встановлення на сервер | Безкоштовно |
| mPDF | Хороша | 0.5 сек | PHP-розширення | Безкоштовно |
| DocRaptor | Відмінна | 1-3 сек | Немає | від $0.01/док |
mPDF конвертує в 2 рази швидше за LibreOffice для простих HTML-шаблонів. Вибір конвертора — параметр в налаштуваннях модуля. За замовчуванням: 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 днів після здачі.
Орієнтовна вартість розробки модуля — від 30 000 грн.
Процес роботи
- Аналітика: вивчаємо бізнес-процеси та вимоги до документів.
- Проектування: архітектура модуля, схема змінних, вибір конвертерів.
- Розробка: реалізація модуля, створення шаблонів.
- Інтеграція: налаштування подій та автоматичної генерації.
- Тестування: до 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% проектів здаємо вчасно.
Замовте розробку модуля «під ключ» — вартість від 30 000 грн, термін від 12 днів. Оцініть проект безкоштовно — напишіть нам. Виключіть помилки в документах назавжди.







