09. Печатные формы (ШАБЛОН)
9.1. Общая концепция
Шаблоны (печатные формы) — это HTML-страницы, которые платформа заполняет данными из объекта (документа или коллекции) и отображает пользователю для печати.
Возможности шаблонов:
- Полный HTML/CSS (любой дизайн)
- Подстановка полей объекта:
{{Поле}} - Обход табличных частей:
{{ЦИКЛ ПО ИмяТЧ КАК Переменная}} - Условный вывод:
{{ЕСЛИ Условие}} - Вызов встроенных функций:
{{ФОРМАТ(Дата)}},{{ПРОПИСЬ(Сумма)}} - Доступ к глобальным константам:
{{Константы.Логотип_URL}}
9.2. Синтаксис объявления шаблона
ШАБЛОН ИмяШаблона
<html>
<head>
<meta charset="utf-8">
<title>{{Номер}}</title>
<style>
@page { size: A4; margin: 15mm; }
body { font-family: Arial, sans-serif; }
table { width: 100%; border-collapse: collapse; }
th, td { border: 1px solid #000; padding: 5px; }
</style>
</head>
<body>
<h1>Документ № {{Номер}}</h1>
<p>Дата: {{ФОРМАТ(Дата)}}</p>
{{ЦИКЛ ПО Товары КАК Т}}
<p>{{Т.Наименование}} - {{Т.Количество}} шт.</p>
{{КОНЕЦ}}
<p><strong>Итого: {{ФОРМАТ(ИтогоСумма)}} руб.</strong></p>
</body>
</html>
КОНЕЦ
Привязка шаблона к документу:
ДОКУМЕНТ ЗаказНаряд
# ... поля ...
ШАБЛОН ШаблонПечатьЗаказНаряда
# ...
КОНЕЦ
9.3. Базовые подстановки
Подстановка полей объекта:
ШАБЛОН ПростаяПечать
<html>
<body>
<h1>Документ № {{Номер}}</h1>
<p>Дата: {{Дата}}</p>
<p>Клиент: {{Клиент.Наименование}}</p>
<p>Сумма: {{ИтогоСумма}} руб.</p>
</body>
</html>
КОНЕЦ
Подстановка с обходом табличной части:
ШАБЛОН ПечатьСписком
<html>
<body>
<h2>Товары в заказе №{{Номер}}</h2>
<table border="1">
<th>№</th>
<th>Товар</th>
<th>Кол-во</th>
<th>Цена</th>
<th>Сумма</th>
{{ЦИКЛ ПО Товары КАК Т}}
<td>{{Т.номер}}</td>
<td>{{Т.Номенклатура.Наименование}}</td>
<td>{{Т.Количество}}</td>
<td>{{Т.Цена}}</td>
<td>{{Т.Сумма}}</td>
{{КОНЕЦ}}
</table>
<p><strong>Итого: {{ИтогоСумма}} руб.</strong></p>
</body>
</html>
КОНЕЦ
9.4. Встроенные функции в шаблонах
| Функция | Назначение | Пример | ||
|---|---|---|---|---|
| ФОРМАТ(дата) | Форматирование даты | {{ФОРМАТ(Дата)}} → 15.01.2024 | ||
| ФОРМАТ(число) | Форматирование числа | {{ФОРМАТ(Сумма)}} → 1 234.50 | ||
| ПРОПИСЬ(число) | Сумма прописью | {{ПРОПИСЬ(123.50)}} → Сто двадцать три рубля 50 копеек | ||
| ВЕРХНИЙ_РЕГИСТР(строка) НИЖНИЙ_РЕГИСТР(строка) |
Верхний регистр Нижний регистр |
{{ВЕРХНИЙ_РЕГИСТР(Наименование)}} {{НИЖНИЙ_РЕГИСТР(Наименование)}} |
9.5. Условный вывод
{{ЕСЛИ Условие}}
... HTML-код, если условие ИСТИНА ...
{{КОНЕЦ}}
Примеры условий:
<!-- Проверка на пустое значение -->
{{ЕСЛИ НЕ ПУСТО(Основание)}}
<p>Основание: {{Основание}}</p>
{{КОНЕЦ}}
<!-- Сравнение -->
{{ЕСЛИ ИтогоСумма > 100000}}
<p style="color: red;">Крупный заказ!</p>
{{КОНЕЦ}}
<!-- Проверка булева поля -->
{{ЕСЛИ ЭтоГруппа}}
<p>Это группа товаров</p>
{{КОНЕЦ}}
9.6. Работа с вложенными объектами
<!-- Доступ к полю связанного объекта -->
<p>Клиент: {{Клиент.Наименование}}</p>
<p>Телефон клиента: {{Клиент.Телефон}}</p>
<!-- Доступ к полю объекта из табличной части -->
{{ЦИКЛ ПО Товары КАК Т}}
{{Т.Номенклатура.Наименование}}</td>
{{Т.Номенклатура.Артикул}}</td>
{{Т.Количество}}</td>
{{КОНЕЦ}}
9.7. Особые возможности
Доступ к глобальным константам:
<img src="{{Константы.Логотип_URL}}">
<p>Основная организация: {{Константы.ОсновнаяОрганизация.Наименование}}</p>
Проверка на существование:
{{ЕСЛИ НЕ ПУСТО(Клиент.Телефон)}}
<p>Телефон: {{Клиент.Телефон}}</p>
{{КОНЕЦ}}
Вложенные условия:
{{ЕСЛИ ИтогоСумма > 100000}}
<p style="color: red;">КРУПНЫЙ ЗАКАЗ</p>
{{ЕСЛИ Клиент.СкидкаПроцент > 5}}
<p>Специальная скидка применена</p>
{{КОНЕЦ}}
{{КОНЕЦ}}
9.8. Часто задаваемые вопросы
Вопрос: Как добавить номер страницы?
Ответ: Используйте CSS:
@page {
@bottom-center {
content: "Страница " counter(page);
}
}
Вопрос: Как сделать альбомную ориентацию?
Ответ:
@page { size: A4 landscape; }
Вопрос: Можно ли использовать JavaScript в шаблоне?
Ответ: Да, можно, но при печати JS может не выполняться. Рекомендуется использовать только HTML/CSS.
Вопрос: Как получить доступ к фотографии/файлу?
Ответ: Поля типа ФАЙЛ или КАРТИНКА поддерживают загрузку сразу нескольких файлов, поэтому в системе они сохраняются как JSON-массив (например, ["/uploads/foto.png"]). Если вы вставите {{ПолеФото}} прямо в атрибут src, туда подставятся квадратные скобки и кавычки, из-за чего браузер не поймет ссылку и картинка сломается. Поэтому для картинок в печатных формах платформа специально извлекает первую ссылку из массива и создает удобные переменные с суффиксом _URL — например, {{Константы.Логотип_URL}}, в которых лежит чистый путь к файлу).
9.9. Полезные советы разработчику
- Всегда указывайте
meta charset="utf-8"для корректного отображения русских букв - Используйте
@pageдля настройки полей — принтеры любят стандартные поля - Тестируйте печать в разных браузерах — Chrome, Firefox, Edge дают разные результаты
- Для сложных макетов используйте таблицы — они лучше сохраняются при печати, чем Flexbox
- Не используйте слишком мелкие шрифты — стандартные документы печатаются в 10-12pt
- Добавляйте footer с датой печати — это помогает отслеживать, когда документ был распечатан
- Храните логотип и печать в системных константах — так их можно менять без правки шаблонов