Шаблон — обычный документ Word (.docx) с метками Jinja2. Проще всего начать с готового: скачайте пример шаблона КП и поправьте под себя.
{{ obj.TITLE }}, {{ obj.OPPORTUNITY|money }}, пользовательские —
{{ obj.UF_CRM_1234567890 }}. Связанные объекты загружаются по точке:
{{ obj.COMPANY_ID.TITLE }}, {{ obj.CONTACT_ID.FULL_NAME }},
{{ obj.ASSIGNED_BY_ID.NAME }} {{ obj.ASSIGNED_BY_ID.LAST_NAME }},
{{ obj.COMPANY_ID.ASSIGNED_BY_ID.WORK_POSITION }}.
Связи: COMPANY_ID, CONTACT_ID, LEAD_ID, DEAL_ID, QUOTE_ID, ASSIGNED_BY_ID, CREATED_BY_ID, MODIFY_BY_ID.
{%tr for row in obj.productrows %}
{{ loop.index }} | {{ row.productName }} | {{ row.quantity|number }} {{ row.measureName }} | {{ row.price|money }} | {{ row.sum|money }}
{%tr endfor %}
Поля строки: productName, quantity, measureName, price, priceExclusive, priceNetto, priceBrutto,
discountRate, discountSum, taxRate, taxIncluded, sort; row.sum = цена × количество.
Карточка товара — row.product: NAME, CODE, MEASURE_NAME (единица товара: «кг»), MEASURE_TITLE, DETAIL_TEXT, PREVIEW_TEXT, DETAIL_PICTURE,
PREVIEW_PICTURE, свойства PROPERTY_101 (по ID) или PROPERTY_MORE_PHOTO (по коду),
SECTION — раздел каталога (NAME, CODE, DESCRIPTION, DEPTH, PARENT, PATH — цепочка от корня, ROOT — корневой).
Свойство типа «Деньги» — число ({{ row.product.PROPERTY_119|money }}). Если в строке вариация, пустые поля, раздел, картинки и свойства берутся у основного товара
(он же row.product.PARENT).
{%p for b in group_by_sections(obj.productrows) %}
{%p if b.type == "section" %}
{{ b.title }} ← заголовок; b.level = 1, 2, 3
{%p else %}
[таблица: {%tr for row in b.rows %} … {%tr endfor %}]
{%p endif %}
{%p endfor %}
Блок товаров: b.rows, b.section (раздел или пусто для товаров без раздела),
b.root — корневой раздел, например для разных таблиц в разных разделах:
{%p if b.root and b.root.NAME == "Оборудование" %}.
Сумма блока: {{ b.rows|sum(attribute="sum")|money }}.
{{ row.product.DETAIL_PICTURE|inline_image(Cm(3)) }} — ширина 3 см;
inline_image(Cm(3), Cm(4)) — вписать в рамку 3×4 см. Для свойства с несколькими картинками
берётся первая. PNG, JPEG, GIF (другие форматы конвертируются).
money — 1 820 ₽ (money("") без знака), number — 2,5,
amount_in_words — сумма прописью, date("d.m.Y") или date:"d.m.Y"
(d j m n Y y H i s, E — «января», F — «Январь»), lines — текст/HTML по строкам,
render_phones, render_emails, а также стандартные Jinja2:
default, upper, lower, round, sum, selectattr, groupby, join, length и др.
{%p … %} — управляет абзацем (весь абзац с меткой удаляется),
{%tr … %} — строкой таблицы, {%tc … %} — столбцом, {%r … %} — фрагментом текста.
Внутри {%p и {%tr нельзя символы } и %:
вместо {"a": 1} пишите dict(a=1), вместо "%.2f"|format(x) — x|money.
Набирайте каждую метку целиком за один раз: если исправлять её посередине, Word разрежет её на части и шаблон не загрузится. Ошибки синтаксиса показываются при загрузке.