Разработка модуля печатных форм 1С-Битрикс
В Битрикс нет встроенного механизма генерации документов. Заказ можно распечатать через браузер, но это даёт неформатированную страницу без реквизитов, подписей и фирменного стиля. Юридически значимые документы — счёт, накладная, акт — приходится формировать вручную в бухгалтерии. Модуль печатных форм закрывает этот пробел: менеджер нажимает кнопку в заказе и получает PDF.
Какие документы нужны
Типичный набор для интернет-магазина:
- Счёт на оплату — реквизиты продавца и покупателя, таблица товаров, итоговая сумма прописью.
- Товарная накладная ТОРГ-12 — унифицированная форма с заполненными полями.
- Акт выполненных работ — для услуг.
- УПД — универсальный передаточный документ.
- Договор — с подстановкой данных покупателя и параметров заказа.
Набор документов и их шаблоны определяются под конкретный проект.
Два подхода к генерации PDF
Подход 1: HTML → PDF через mPDF или TCPDF. Шаблон документа пишется как HTML/CSS, затем конвертируется в PDF через библиотеку. Проще в редактировании шаблонов — дизайнер работает с обычным HTML. Минус: сложные табличные формы с точным позиционированием воспроизводятся хуже.
Подход 2: PhpSpreadsheet → XLSX/PDF. Шаблон документа — Excel-файл с ячейками и формулами. Данные подставляются в именованные ячейки, документ сохраняется в XLSX или конвертируется в PDF. Идеален для форм с точной табличной структурой (ТОРГ-12, УПД).
На практике чаще используется первый подход для счетов и актов, второй — для накладных.
Архитектура модуля
local/modules/vendor.printforms/
├── lib/
│ ├── DocumentFactory.php # Фабрика документов
│ ├── Template/
│ │ ├── BaseTemplate.php
│ │ ├── InvoiceTemplate.php # Счёт на оплату
│ │ └── Torg12Template.php # ТОРГ-12
│ ├── Renderer/
│ │ ├── MpdfRenderer.php
│ │ └── XlsxRenderer.php
│ └── AmountInWords.php # Сумма прописью
├── templates/ # HTML-шаблоны документов
└── admin/ # Страницы в административной части
Подстановка данных в документ
Данные для документа собираются из нескольких источников:
class InvoiceTemplate extends BaseTemplate
{
public function getData(int $orderId): array
{
$order = \Bitrix\Sale\Order::load($orderId);
$basket = $order->getBasket();
$propertyCollection = $order->getPropertyCollection();
$buyer = [
'name' => $propertyCollection->getPayerName()->getValue(),
'inn' => $propertyCollection->getItemByCode('INN')?->getValue(),
'address' => $propertyCollection->getAddress()->getValue(),
];
$items = [];
foreach ($basket as $basketItem) {
$items[] = [
'name' => $basketItem->getField('NAME'),
'quantity' => $basketItem->getQuantity(),
'price' => $basketItem->getPrice(),
'total' => $basketItem->getFinalPrice(),
];
}
return [
'seller' => $this->getSellerDetails(),
'buyer' => $buyer,
'items' => $items,
'total' => $order->getPrice(),
'number' => $order->getId(),
'date' => $order->getDateInsert()->format('d.m.Y'),
];
}
}
Реквизиты продавца берутся из настроек модуля, хранящихся в b_option.
Сумма прописью
Класс AmountInWords конвертирует числовую сумму в текст с учётом склонений: «Пятнадцать тысяч двести рублей 00 копеек». Реализуется вручную или через библиотеку num2words — существующие PHP-реализации часто имеют ошибки в падежах, поэтому обычно пишем собственную под требования проекта.
Кнопка в административном заказе
Кнопка «Распечатать» добавляется в интерфейс заказа через обработчик события OnSaleAdminOrderView или через глобальный административный меню-файл local/admin/vendor_printforms.php.
При нажатии открывается выпадающий список доступных документов. Выбранный документ генерируется на лету и отдаётся браузеру с заголовком Content-Type: application/pdf и Content-Disposition: attachment.
Хранение сгенерированных документов
Сгенерированные PDF можно сохранять в файловую систему (upload/printforms/{orderId}/) и прикреплять к заказу. Это позволяет:
- Повторно скачать ранее сгенерированный документ без пересоздания.
- Автоматически прикладывать счёт к письму об оплате заказа.
- Хранить историю версий документа (если реквизиты менялись).
Путь к файлу записывается в таблицу b_printform_document:
| Поле | Тип | Назначение |
|---|---|---|
| ID | int auto_increment | — |
| ORDER_ID | int | ID заказа |
| TYPE | varchar(50) | Тип документа (invoice, torg12, act) |
| FILE_PATH | varchar(512) | Путь к файлу |
| CREATED_BY | int | Кто сгенерировал |
| CREATED_AT | datetime | — |
Сроки разработки
| Масштаб | Состав | Срок |
|---|---|---|
| Базовый | 1–2 шаблона (счёт, акт), HTML→PDF, кнопка в заказе | 4–6 дней |
| Стандартный | + 3–5 шаблонов, ТОРГ-12 в XLSX, сохранение документов, вложение в email | 8–12 дней |
| Расширенный | + Редактор шаблонов в Admin UI, версионирование, пакетная генерация | 14–20 дней |







