Использование функции «Печать шаблонов» для генерации договоров поставки и закупки
В сценариях цепочки поставок или торговли часто требуется быстро сформировать стандартизированный «Договор поставки и закупки» и динамически заполнить его содержимым на основе данных о покупателе, продавце и позициях товара. Ниже на упрощённом примере «Контракт» показано, как настроить и использовать функцию «Печать шаблонов»: сопоставить данные с заполнителями в шаблоне договора и автоматически сгенерировать итоговый документ.
1. Контекст и обзор структуры данных
В примере используются следующие основные коллекции (прочие поля опущены как несущественные):
- parties: хранит информацию о стороне A/стороне B (организации или физлица): название/имя, адрес, контактное лицо, телефон и т. д.
- contracts: хранит записи конкретных контрактов: номер договора, внешние ключи покупателя/продавца, сведения о подписантах, даты начала/окончания, банковские реквизиты и т. д.
- contract_line_items: хранит позиции по договору (наименование товара, спецификация, количество, цена за единицу, дата поставки и т. д.)

Поскольку текущая система поддерживает печать только одной записи, мы будем нажимать кнопку «Печать» на странице «Детали контракта». Система автоматически получит запись contracts, а также связанные parties и другие данные и подставит их в документ Word или PDF.
2. Подготовка
2.1 Подготовка плагина
Обратите внимание: «Печать шаблонов» — коммерческий плагин, его нужно приобрести и активировать перед тем, как выполнять операции печати.

Проверьте, что плагин активирован:
На любой странице создайте блок деталей (например для users) и проверьте, что в настройках действий есть опция конфигурации шаблона:


2.2 Создание коллекций
Создайте коллекцию контрагентов, коллекцию контрактов и коллекцию позиций, описанные выше (выберите ключевые поля).
Коллекция contracts
Коллекция parties
Коллекция contract_line_items
2.3 Настройка интерфейса
Введите примерные данные:


Настройте правила связывания для автоматического расчёта общей суммы и остатка к оплате:

Создайте блок деталей, проверьте данные и включите действие «Печать шаблонов»:

2.4 Настройка плагина «Печать шаблонов»

Добавьте конфигурацию шаблона, например «Договор поставки и закупки»:


Далее перейдите на вкладку «Список полей», где отображаются все поля текущего объекта. После нажатия «Копировать» можно начинать заполнять шаблон.

2.5 Подготовка файла договора
Файл шаблона договора Word
Заранее подготовьте шаблон договора (файл .docx), например: SUPPLY AND PURCHASE CONTRACT.docx
В этом примере используется упрощённая версия «Договора поставки и закупки», которая содержит примерные заполнители:
{d.contract_no}: номер договора{d.buyer.party_name},{d.seller.party_name}: названия покупателя и продавца{d.total_amount}: общая сумма договора- и другие заполнители, например «контактное лицо», «адрес», «телефон» и т. д.
После этого можно копировать поля из коллекции и вставлять их в Word.
3. Руководство по переменным шаблона
3.1 Базовые переменные и заполнение свойств связанных объектов
Заполнение базовых полей:
Например, номер договора в верхней части документа или объект стороны, подписывающей договор. Нажмите «Копировать» и вставьте значение прямо в соответствующее поле договора.


3.2 Форматирование данных
Форматирование даты
В шаблонах часто нужно форматировать поля, особенно даты. Формат даты после прямой вставки обычно длинный (например Wed Jan 01 2025 00:00:00 GMT), поэтому его нужно привести к нужному виду.
Для полей даты используйте функцию formatD(), чтобы задать формат вывода:
Пример:
Например, если исходное поле {d.created_at}, и дату нужно показать как 2025-01-01, измените поле так:
Часто используемые форматы даты:
YYYY— год (четыре цифры)MM— месяц (две цифры)DD— день (две цифры)HH— час (24-часовой формат)mm— минутыss— секунды
Пример 2:
Форматирование чисел
Предположим, в договоре есть поле суммы, например {d.total_amount}. Для форматирования чисел можно использовать функцию formatN(), задавая число знаков после запятой и разделитель тысяч.
Синтаксис:
- decimal_places: количество знаков после запятой. Например,
2означает два знака. - thousands_separator: использовать ли разделитель тысяч, обычно
trueилиfalse.
Пример 1: сумма с разделителем тысяч и двумя знаками после запятой
Это отформатирует d.amount с двумя знаками после запятой и добавит разделитель тысяч.
Пример 2: сумма как целое число без дробной части
Это отформатирует d.amount как целое число и добавит разделитель тысяч.
Пример 3: два знака после запятой без разделителя тысяч
Здесь разделитель тысяч отключён, остаются только два знака после запятой.
Другие варианты форматирования суммы:
- Символ валюты: используемая библиотека Carbone не предоставляет отдельный форматтер для символа валюты, но его можно добавить напрямую в данные или в шаблон. Например:
Форматирование строк
Для строковых полей можно использовать :upperCase, чтобы управлять форматом текста, например регистром.
Синтаксис:
Частые варианты преобразования:
upperCase- перевод в верхний регистрlowerCase- перевод в нижний регистрupperCase:ucFirst- первая буква заглавная
Пример:
3.3 Печать в цикле
Как печатать списки дочерних объектов (например, детали товаров)
Когда нужно вывести таблицу с несколькими подэлементами (например, деталями товаров), обычно используется печать в цикле. В этом случае система генерирует строк у для каждого элемента списка, пока не обработает их все.
Предположим, у нас есть список товаров (например, contract_items), который содержит несколько объектов товара. У каждого объекта есть атрибуты, например название, спецификация, количество, цена за единицу, итоговая сумма и примечание.
Шаг 1: заполните поля в первой строке таблицы
Сначала в первой строке таблицы (не в заголовке) напрямую вставьте переменные шаблона. Эти переменные будут заменены соответствующими данными и показаны в результате.
Например, первая строка таблицы выглядит так:
Здесь d.contract_items[i] означает i-й элемент в списке товаров, а i — индекс порядка текущего товара.
Шаг 2: измените индекс во второй строке
Далее во второй строке таблицы измените индекс пол я на i+1 и заполните только первый атрибут. Это нужно для того, чтобы при циклической печати получить следующий элемент данных из списка и вывести его в следующей строке.
Например, вторая строка заполняется так:
В этом примере [i] изменён на [i+1], поэтому берутся данные следующего товара в списке.
Шаг 3: автоматическая печать в цикле при рендере шаблона
Когда система обрабатывает этот шаблон, она работает по следующей логике:
- Первая строка будет заполнена в соответствии с полями, заданными в шаблоне.
- Затем система автоматически удалит вторую строку и начнёт извлекать данные из
d.contract_items, циклически заполняя строки по формату таблицы, пока не будут выведены все позиции товара.
i в каждой строке будет увеличиваться, благодаря чему в каждой строке отображается информация о следующем товаре.
4. Загрузка и настройка шаблона договора
4.1 Загрузка шаблона
- Нажмите кнопку «Добавить шаблон» и укажите имя шаблона, например «Шаблон договора поставки и закупки».
- Загрузите подготовленный файл Word с договором (.docx), в котором уже есть все заполнители.

- После загрузки система добавит шаблон в список доступных шаблонов для последующего использования.
- Нажмите «Использовать», чтобы активировать шаблон.

После этого закройте текущее всплывающее окно и нажмите «Скачать шаблон», чтобы получить итоговый сформированный шаблон.
Советы:
- Если шаблон использует
.docили другой формат, может потребоваться конвертация в.docx(в зависимости от поддержки плагина). - В Word-файлах старайтесь не разбивать заполнители на несколько абзацев или текстовых блоков, чтобы избежать ошибок рендера.
С помощью функции «Печать шаблонов» можно заметно сократить повторяющиеся операции в работе с договорами, избежать ошибок ручного копирования и получить стандартизированный автоматизированный выпуск документов.

