КОНСТРУКТОР
Печатные формы
Печатная форма — это шаблон документа на печать: счёт, накладная, акт, этикетка, прайс-лист. Шаблон описывается на HTML с подстановками (${...}), поэтому печатную форму можно оформить практически как угодно.
Печатные формы есть у справочников и документов. В мастере создания объекта шаг «Печатные формы» обязателен: без хотя бы одной формы объект создать нельзя (мастер скажет «Добавьте хотя бы одну печатную форму»).
# Открыть редактор
| Путь | Когда |
|---|---|
| Конструктор → объект → кнопка Печатные формы | В любой момент |
| Мастер создания объекта → шаг Печатные формы | При создании объекта |
| В рабочем интерфейсе: карточка записи → Печать | Чтобы напечатать конкретную запись |
# Экран редактора
┌───────────────────────┬──────────────────────────────────────────────────────┐
│ [Поиск форм...] │ [HTML] [JS Код] [CSS] [Описание] [Просмотр] │
│ [+ Новая форма] │ ┌──────────────────────────────────────────────────┐ │
│ ───────────────── │ │ <html> │ │
│ 📄 Счёт на оплату 1/2│ │ <body> │ │
│ 📄 Товарная накладная │ │ <h1>Счёт № ${Номер}</h1> │ │
│ │ │ ... │ │
│ │ └──────────────────────────────────────────────────┘ │
│ ├──────────────────────────────────────────────────────┤
│ │ Название: [Счёт на оплату] Формат:[A4] Ориент.:[Книжная]│
└───────────────────────┴──────────────────────────────────────────────────────┘# Левая панель
| Элемент | Что делает |
|---|---|
| Поиск форм... | Отбор по названию формы |
| Новая форма | Создаёт форму с именем «Новая форма» |
| Список форм | Слева — иконка, название и позиция вида 1/2 (номер формы из общего числа) |
| Меню формы (⋮) | Дублировать — копия с именем <имя>_Копия; Удалить — с подтверждением |
| Нет печатных форм / Ничего не найдено | Пустые состояния списка |
Меню ⋮ появляется при наведении на форму.
# Вкладки редактора
| Вкладка | Что редактируется |
|---|---|
| HTML | Основной шаблон печатной формы — HTML с плейсхолдерами ${...} |
| JS Код | JavaScript, который готовит дополнительные данные перед подстановкой |
| CSS | Стили; вставляются в <head> формы |
| Описание | Текстовое описание назначения формы (подсказка «Опишите назначение печатной формы…») |
| Просмотр | Предпросмотр в iframe. Если шаблон пуст — «Шаблон пуст. Напишите HTML в редакторе.» |
# Нижняя панель
| Настройка | Значения |
|---|---|
| Название | Имя формы; именно оно появляется в меню Печать у пользователя |
| Формат | A4, A3, Letter, Legal |
| Ориентация | Книжная, Альбомная |
# Если форма не выбрана
Показывается экран: «Выберите форму для редактирования или создайте новую.» с кнопкой Создать первую форму.
# Удаление
Диалог «Удаление печатной формы»: «Вы уверены, что хотите удалить эту печатную форму? Это действие нельзя отменить.» — кнопки Отмена и Удалить.
# Синтаксис шаблона
# Подстановка значений — ${...}
| Пример | Что подставится |
|---|---|
${Номер} | Значение реквизита шапки |
${Контрагент.Наименование} | Поле связанного объекта (через точку) |
${Товары.Цена} | Поле текущей строки табличной части (внутри цикла) |
${bankInfo.БИК} | Значение, которое вернул JS-код |
Правила:
- Путь идёт только по точкам. Записи вида
${stockByProduct[id]}не поддерживаются. - Пустое значение (
null,undefined, объект) выводится как пустая строка. - ISO-дата со временем автоматически форматируется по-русски:
29.05.2026, 12:00:00. - Вычислений внутри
${...}нет:${formatNumber(...)},${Цена + 1}и подобное выведут пустую строку. Всё сложное делайте в JS-коде.
# Условные блоки — data-if
<template data-if="Комментарий">
<p>Комментарий: ${Комментарий}</p>
</template>
<template data-if="!Комментарий">
<p>Комментарий не заполнен</p>
</template>Поддерживаются:
| Форма | Когда блок показывается |
|---|---|
data-if="Поле" | Значение непустое (не пустая строка, не 0, не false) |
data-if="!Поле" | Значение пустое |
data-if="Поле === 'значение'" | Равно строке (кавычки — строка) |
data-if="Поле !== 100" | Не равно числу (без кавычек — число) |
Чего нет: &&, ||, >, <, >=, <=, арифметика. Такой блок просто исчезнет. Сложные условия вычисляйте в JS-коде и проверяйте флаг:
<template data-if="isUrgent">
<p>Срочный платёж</p>
</template>// JS Код
const isUrgent = objectData.Сумма > 1000 && objectData.Статус === 'Оплачен';
return { isUrgent };# Циклы по табличным частям — data-forEach
<table>
<thead><tr><th>№</th><th>Товар</th><th>Кол-во</th><th>Цена</th><th>Сумма</th></tr></thead>
<tbody>
<template data-forEach="Товары">
<tr>
<td>${Товары.№}</td>
<td>${Товары.Номенклатура.Наименование}</td>
<td>${Товары.Количество}</td>
<td>${Товары.ЦенаФорм}</td>
<td>${Товары.СуммаФорм}</td>
</tr>
</template>
</tbody>
</table>| Правило | Что важно знать |
|---|---|
data-forEach принимает только имя табличной части объекта | Нельзя перебирать произвольные массивы |
| Пустая табличная часть | Блок удаляется целиком — строите заголовок таблицы вне <template> |
| Внутри цикла доступны и строки, и поля шапки | ${Номер} работает и внутри цикла |
| Специальных переменных строки нет | ${Товары._index} и подобное не существуют |
| Нумерация и форматирование | Делайте в JS-коде и возвращайте новые поля, как ${Товары.№} выше |
# JS-код: подготовка данных
JS-код (jsCode) выполняется перед подстановкой. Всё, что он вернёт через return { ... }, дополняет данные объекта и становится доступно в шаблоне.
// JS Код
const rows = (objectData.Товары || []).map((r, i) => ({
...r,
№: i + 1,
ЦенаФорм: (r.Цена || 0).toLocaleString('ru-RU', { minimumFractionDigits: 2, maximumFractionDigits: 2 }),
СуммаФорм: ((r.Количество || 0) * (r.Цена || 0)).toLocaleString('ru-RU', { minimumFractionDigits: 2 }),
}));
return { Товары: rows };Внутри JS-кода доступны objectData (данные записи) и formApi — с его помощью можно читать данные из системы. Часто используемые приёмы:
| Задача | Как |
|---|---|
| Нумерация строк | Вернуть массив строк с полем № |
| Форматирование чисел и дат | toLocaleString('ru-RU', …) в JS, подстановка готовой строки |
| Сумма прописью, QR/штрих-коды | Вычислить в JS-коде и вернуть готовую строку/HTML |
| Собственный список строк | Собрать готовые <tr>...</tr> в одну строку и подставить ${ordersHtml} |
Флаги для data-if | return { isUrgent, isBig } |
Устаревшее поле выбора данных из старых версий больше не используется — всю подготовку данных делайте в JS-коде.
# CSS
Стили из вкладки CSS вставляются в <head>. Советы для печати:
| Совет | Зачем |
|---|---|
Используйте mm, cm, pt, а не px | Точное положение на листе |
page-break-inside: avoid для <tr> | Строка не разорвётся между страницами |
page-break-before: always | Начать с новой страницы |
@media print { .no-print { display: none } } | Скрыть лишнее при печати |
| Задавайте конкретные шрифты | Одинаковый вид на разных компьютерах |
# Печать и экспорт
В карточке записи кнопка Печать открывает список печатных форм. В окне предпросмотра доступны:
| Кнопка | Что делает |
|---|---|
| Печать | Отправляет форму на принтер |
| Экспорт | Сохраняет форму в файл |
| Настройки | Ориентация, размер бумаги, поля |
Форматы экспорта:
| Формат | Что получается |
|---|---|
| Многостраничный PDF-файл | |
| DOCX | Документ Word |
| XLSX | Таблицы Excel (HTML-таблицы преобразуются в листы) |
| HTML | Готовый HTML-файл |
Подробнее о печати и экспорте списков — Печать и экспорт.
# Частые ошибки
| Ошибка | Что произойдёт |
|---|---|
Вычисления внутри ${...} | Пустая строка |
&&, >, < в data-if | Блок исчезает |
| Цикл по произвольному массиву | Нужно собирать HTML в JS-коде |
Заголовок таблицы внутри data-forEach | Исчезнет вместе с пустой табличной частью |
| Опечатка в имени поля | Пустая строка (ошибки не будет) |
