На основании, Триггеры, Печатные формы


На основании

Позволяет создать один документ на основе другого с автоматическим переносом данных. Пользователь открывает карточку записи и видит кнопку «Создать на основании» — кликает и получает новый документ с уже заполненными полями.

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

Как настроить

Настройка находится в разделе «Структура» → сущность → кнопка «На основании».

Для каждой пары «источник → цель» задаётся:

  1. Источник — из какой сущности создаём (например, «Заявка»)
  2. Название кнопки — что увидит пользователь (например, «Создать заказ»)
  3. Маппинг полей — какое поле источника копируется в какое поле цели:
    • Поле «Клиент» (заявка) → Поле «Клиент» (заказ)
    • Поле «Сумма» (заявка) → Поле «Сумма» (заказ)
  4. Маппинг таблиц — какая табличная часть источника копируется в какую таблицу цели

Одна сущность может иметь несколько настроек «на основании» от разных источников.

Как это выглядит у пользователя

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


Триггеры

Автоматические действия, которые выполняются при определённых событиях с записью. Не требуют участия пользователя — срабатывают в фоне при сохранении.

События (когда срабатывает триггер)

Событие Когда
При создании Запись только что создана
При изменении Любое поле записи изменилось
При смене статуса Статус документа изменился (например, стал «Проведён»)
При изменении поля Изменилось конкретное поле (задаётся в настройке)

Условие (необязательно)

Триггер можно ограничить условием — он сработает только если поле равно / не равно / больше / меньше заданного значения. Например: срабатывать только если статус стал «Проведён», или только если сумма больше 100 000.

Действия (что делает триггер)

Действие Что происходит
Установить поле Записывает значение в поле записи. Можно использовать now для текущей даты/времени, или взять значение из другого поля
Изменить статус Переводит документ в нужный статус
Обновить связанную запись Обновляет поле в записи из связанного справочника (например, меняет остаток на складе)
Обновить записи по строкам таблицы Для каждой строки таблицы обновляет связанную запись
Создать запись Создаёт новую запись в указанной сущности

Уведомление пользователя

Если включить «Уведомить пользователя» — после срабатывания триггера пользователь увидит всплывающее сообщение с названием триггера и результатом.

Порядок выполнения

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

Пример

Сущность: Заказ
Событие: При смене статуса
Условие: Статус = Проведён
Действие: Установить поле «Дата проведения» = now
Уведомить: Да → «Заказ проведён и зафиксирован»

Печатные формы

Создание печатных документов (PDF или HTML) на основе данных записи. Пользователь открывает карточку и нажимает кнопку «Печать» — выбирает нужную форму и скачивает готовый документ.

Как настроить

Настройка в разделе «Структура» → сущность → кнопка «Печатные формы».

Для каждой формы задаётся:

Язык шаблонов (Jinja2)

Шаблоны используют синтаксис Jinja2 — популярный язык шаблонов, похожий на обычный HTML с вставками данных.

Вывод значения поля:

{{ client }}
{{ amount }}
{{ record.id }}
{{ record.status }}
{{ record.created_at }}

Для reference-полей значение автоматически резолвится в читаемое название. Сырой ID доступен через суффикс _raw:

{{ client }}
{{ client_raw }}

Для файлов и изображений доступны URL:

{% for img in photo %}
  <img src="{{ img.preview_url }}">
  <a href="{{ img.download_url }}">{{ img.name }}</a>
{% endfor %}

Табличные части доступны как список строк:

<table>
  <tbody>
    {% for row in positions %}
    <tr>
      <td>{{ row.name }}</td>
      <td>{{ row.qty }}</td>
      <td>{{ row.price }}</td>
      <td>{{ row.amount }}</td>
    </tr>
    {% endfor %}
  </tbody>
</table>

Условия и циклы:

{% if record.status == 'posted' %}
  <p>Документ проведён</p>
{% endif %}
{% for row in positions %}
  {{ loop.index }}. {{ row.name }}
{% endfor %}

Минимальный шаблон

<style>
  body { font-family: DejaVu Sans, sans-serif; font-size: 12pt; }
  table { width: 100%; border-collapse: collapse; }
  td, th { border: 1px solid #ccc; padding: 4px 8px; }
</style>

<h2>Заказ № {{ record.id }} от {{ record.created_at }}</h2>
<p>Клиент: {{ client }}</p>

<table>
  <thead>
    <tr>
      <th>Наименование</th>
      <th>Кол-во</th>
      <th>Цена</th>
      <th>Сумма</th>
    </tr>
  </thead>
  <tbody>
    {% for row in positions %}
    <tr>
      <td>{{ row.name }}</td>
      <td>{{ row.qty }}</td>
      <td>{{ row.price }}</td>
      <td>{{ row.amount }}</td>
    </tr>
    {% endfor %}
  </tbody>
</table>

<p><strong>Итого: {{ total }} ₽</strong></p>

Для корректного отображения кириллицы в PDF используется встроенный шрифт DejaVu Sans — указывайте его в CSS.


Платформа Уни · v0.9.9.8