Как писать шаблоны

К шаблонам

Шаблон — обычный документ 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 и др.

Метки Word

{%p … %} — управляет абзацем (весь абзац с меткой удаляется), {%tr … %} — строкой таблицы, {%tc … %} — столбцом, {%r … %} — фрагментом текста. Внутри {%p и {%tr нельзя символы } и %: вместо {"a": 1} пишите dict(a=1), вместо "%.2f"|format(x) — x|money.

Набирайте каждую метку целиком за один раз: если исправлять её посередине, Word разрежет её на части и шаблон не загрузится. Ошибки синтаксиса показываются при загрузке.