Использование функции «Печать шаблонов» для генерации договоров поставки и закупки

В сценариях цепочки поставок или торговли часто требуется быстро сформировать стандартизированный «Договор поставки и закупки» и динамически заполнить его содержимым на основе данных о покупателе, продавце и позициях товара. Ниже на упрощённом примере «Контракт» показано, как настроить и использовать функцию «Печать шаблонов»: сопоставить данные с заполнителями в шаблоне договора и автоматически сгенерировать итоговый документ.


1. Контекст и обзор структуры данных

В примере используются следующие основные коллекции (прочие поля опущены как несущественные):

  • parties: хранит информацию о стороне A/стороне B (организации или физлица): название/имя, адрес, контактное лицо, телефон и т. д.
  • contracts: хранит записи конкретных контрактов: номер договора, внешние ключи покупателя/продавца, сведения о подписантах, даты начала/окончания, банковские реквизиты и т. д.
  • contract_line_items: хранит позиции по договору (наименование товара, спецификация, количество, цена за единицу, дата поставки и т. д.)

template_print-2025-11-01-16-34-04

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

2. Подготовка

2.1 Подготовка плагина

Обратите внимание: «Печать шаблонов» — коммерческий плагин, его нужно приобрести и активировать перед тем, как выполнять операции печати.

template_print-2025-11-01-17-31-51

Проверьте, что плагин активирован:

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

template_print-2025-11-01-17-32-09

template_print-2025-11-01-17-32-30

2.2 Создание коллекций

Создайте коллекцию контрагентов, коллекцию контрактов и коллекцию позиций, описанные выше (выберите ключевые поля).

Коллекция contracts

Категория поляОтображаемое имя поляИмя поляИнтерфейс поля
Поля PK и FK
IDidЦелое число
ID покупателяbuyer_idЦелое число
ID продавцаseller_idЦелое число
Поля связи
Позиции договораcontract_itemsОдин ко многим
Покупатель (сторона A)buyerМногие к одному
Продавец (сторона B)sellerМногие к одному
Общие поля
Номер договораcontract_noОднострочный текст
Дата начала поставкиstart_dateДата и время (с часовым поясом)
Дата окончания поставкиend_dateДата и время (с часовым поясом)
Доля аванса (%)deposit_ratioПроцент
Дней оплаты после поставкиpayment_days_afterЦелое число
Имя получателя (банковский счёт)bank_account_nameОднострочный текст
Название банкаbank_nameОднострочный текст
Номер счёта получателяbank_account_numberОднострочный текст
Общая суммаtotal_amountЧисло
Коды валютcurrency_codesОдиночный выбор
Доля остатка (%)balance_ratioПроцент
Дней оплаты остатка после поставкиbalance_days_afterЦелое число
Место поставкиdelivery_placeДлинный текст
ФИО подписанта стороны Aparty_a_signatory_nameОднострочный текст
Должность подписанта стороны Aparty_a_signatory_titleОднострочный текст
ФИО подписанта стороны Bparty_b_signatory_nameОднострочный текст
Должность подписанта стороны Bparty_b_signatory_titleОднострочный текст
Системные поля
Время созданияcreatedAtВремя создания
Создано пользователемcreatedByСоздано пользователем
Время обновленияupdatedAtВремя обновления
Последнее обновление пользователемupdatedByПоследнее обновление пользователем

Коллекция parties

Категория поляОтображаемое имя поляИмя поляИнтерфейс поля
Поля PK и FK
IDidЦелое число
Общие поля
Наименование стороныparty_nameОднострочный текст
АдресaddressОднострочный текст
Контактное лицоcontact_personОднострочный текст
Контактный телефонcontact_phoneТелефон
ДолжностьpositionОднострочный текст
Электронная почтаemailЭлектронная почта
Веб-сайтwebsiteURL-адрес
Системные поля
Время созданияcreatedAtВремя создания
Создано пользователемcreatedByСоздано пользователем
Время обновленияupdatedAtВремя обновления
Последнее обновление пользователемupdatedByПоследнее обновление пользователем

Коллекция contract_line_items

Категория поляОтображаемое имя поляИмя поляИнтерфейс поля
Поля PK и FK
IDidЦелое число
ID договораcontract_idЦелое число
Поля связи
ДоговорcontractМногие к одному
Общие поля
Наименование товараproduct_nameОднострочный текст
Спецификация / модельspecОднострочный текст
КоличествоquantityЦелое число
Цена за единицуunit_priceЧисло
Общая суммаtotal_amountЧисло
Дата поставкиdelivery_dateДата и время (с часовым поясом)
ПримечаниеremarkДлинный текст
Системные поля
Время созданияcreatedAtВремя создания
Создано пользователемcreatedByСоздано пользователем
Время обновленияupdatedAtВремя обновления
Последнее обновление пользователемupdatedByПоследнее обновление пользователем

2.3 Настройка интерфейса

Введите примерные данные:

template_print-2025-11-01-17-32-59

template_print-2025-11-01-17-33-11

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

template_print-2025-11-01-17-33-21

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

template_print-2025-11-01-17-33-33

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

template_print-2025-11-01-17-33-45

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

template_print-2025-11-01-17-33-57

template_print-2025-11-01-17-34-08

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

template_print-2025-11-01-17-35-19

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 Базовые переменные и заполнение свойств связанных объектов

Заполнение базовых полей:

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

template_print-2025-11-01-17-31-11

template_print-2025-11-01-17-30-51

3.2 Форматирование данных

Форматирование даты

В шаблонах часто нужно форматировать поля, особенно даты. Формат даты после прямой вставки обычно длинный (например Wed Jan 01 2025 00:00:00 GMT), поэтому его нужно привести к нужному виду.

Для полей даты используйте функцию formatD(), чтобы задать формат вывода:

{field_name:formatD(format_style)}

Пример:

Например, если исходное поле {d.created_at}, и дату нужно показать как 2025-01-01, измените поле так:

{d.created_at:formatD(YYYY-MM-DD)}  // Output: 2025-01-01

Часто используемые форматы даты:

  • YYYY — год (четыре цифры)
  • MM — месяц (две цифры)
  • DD — день (две цифры)
  • HH — час (24-часовой формат)
  • mm — минуты
  • ss — секунды

Пример 2:

{d.created_at:formatD(YYYY-MM-DD HH:mm:ss)}  // Output: 2025-01-01 14:30:00

Форматирование чисел

Предположим, в договоре есть поле суммы, например {d.total_amount}. Для форматирования чисел можно использовать функцию formatN(), задавая число знаков после запятой и разделитель тысяч.

Синтаксис:

{field_name:formatN(decimal_places, thousands_separator)}
  • decimal_places: количество знаков после запятой. Например, 2 означает два знака.
  • thousands_separator: использовать ли разделитель тысяч, обычно true или false.

Пример 1: сумма с разделителем тысяч и двумя знаками после запятой

{d.amount:formatN(2, true)}  // Output: 1,234.56

Это отформатирует d.amount с двумя знаками после запятой и добавит разделитель тысяч.

Пример 2: сумма как целое число без дробной части

{d.amount:formatN(0, true)}  // Output: 1,235

Это отформатирует d.amount как целое число и добавит разделитель тысяч.

Пример 3: два знака после запятой без разделителя тысяч

{d.amount:formatN(2, false)}  // Output: 1234.56

Здесь разделитель тысяч отключён, остаются только два знака после запятой.

Другие варианты форматирования суммы:

  • Символ валюты: используемая библиотека Carbone не предоставляет отдельный форматтер для символа валюты, но его можно добавить напрямую в данные или в шаблон. Например:
    {d.amount:formatN(2, true)} USD  // Output: 1,234.56 USD

Форматирование строк

Для строковых полей можно использовать :upperCase, чтобы управлять форматом текста, например регистром.

Синтаксис:

{field_name:upperCase:other_commands}

Частые варианты преобразования:

  • upperCase - перевод в верхний регистр
  • lowerCase - перевод в нижний регистр
  • upperCase:ucFirst - первая буква заглавная

Пример:

{d.party_a_signatory_name:upperCase}  // Output: JOHN DOE

3.3 Печать в цикле

Как печатать списки дочерних объектов (например, детали товаров)

Когда нужно вывести таблицу с несколькими подэлементами (например, деталями товаров), обычно используется печать в цикле. В этом случае система генерирует строку для каждого элемента списка, пока не обработает их все.

Предположим, у нас есть список товаров (например, contract_items), который содержит несколько объектов товара. У каждого объекта есть атрибуты, например название, спецификация, количество, цена за единицу, итоговая сумма и примечание.

Шаг 1: заполните поля в первой строке таблицы

Сначала в первой строке таблицы (не в заголовке) напрямую вставьте переменные шаблона. Эти переменные будут заменены соответствующими данными и показаны в результате.

Например, первая строка таблицы выглядит так:

Наименование товараСпецификация / модельКоличествоЦена за единицуОбщая суммаПримечание
{d.contract_items[i].product_name}{d.contract_items[i].spec}{d.contract_items[i].quantity}{d.contract_items[i].unit_price}{d.contract_items[i].total_amount}{d.contract_items[i].remark}

Здесь d.contract_items[i] означает i-й элемент в списке товаров, а i — индекс порядка текущего товара.

Шаг 2: измените индекс во второй строке

Далее во второй строке таблицы измените индекс поля на i+1 и заполните только первый атрибут. Это нужно для того, чтобы при циклической печати получить следующий элемент данных из списка и вывести его в следующей строке.

Например, вторая строка заполняется так:

Наименование товараСпецификация / модельКоличествоЦена за единицуОбщая суммаПримечание
{d.contract_items[i+1].product_name}

В этом примере [i] изменён на [i+1], поэтому берутся данные следующего товара в списке.

Шаг 3: автоматическая печать в цикле при рендере шаблона

Когда система обрабатывает этот шаблон, она работает по следующей логике:

  1. Первая строка будет заполнена в соответствии с полями, заданными в шаблоне.
  2. Затем система автоматически удалит вторую строку и начнёт извлекать данные из d.contract_items, циклически заполняя строки по формату таблицы, пока не будут выведены все позиции товара.

i в каждой строке будет увеличиваться, благодаря чему в каждой строке отображается информация о следующем товаре.


4. Загрузка и настройка шаблона договора

4.1 Загрузка шаблона

  1. Нажмите кнопку «Добавить шаблон» и укажите имя шаблона, например «Шаблон договора поставки и закупки».
  2. Загрузите подготовленный файл Word с договором (.docx), в котором уже есть все заполнители.

template_print-2025-11-01-17-36-06

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

template_print-2025-11-01-17-36-13

После этого закройте текущее всплывающее окно и нажмите «Скачать шаблон», чтобы получить итоговый сформированный шаблон.

Советы:

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

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