3ERP

3ERP - простая и бесплатная программа для бухгалтерского и оперативного учёта в учреждениях сферы торговли и услуг, общественного питания, складского хранения, автосервиса, медицины, логистики, производства, управления работами и заявками, поддерживающая до 100 пользователей, на русском языке и полностью бесплатная для 1 пользователя. На сайт (скачать)

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 с датой печати — это помогает отслеживать, когда документ был распечатан
  • Храните логотип и печать в системных константах — так их можно менять без правки шаблонов
3540 | 0 | 3540 | 362 | 176 | 43