Как настроить отступы при печати HTML-документа из 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Рассмотрим распространенную проблему, с которой сталкиваются разработчики в 1С: необходимость распечатать многостраничный HTML-документ с заданными отступами (полями) без использования предварительного просмотра. На первый взгляд задача кажется простой. Многие пробуют использовать обращение к DOM-модели, например, через конструкцию Документ.body.style.marginTop = "40mm". Однако на практике выясним, что этот подход применяется только один раз — к первой странице документа. Если страниц несколько, форматирование ломается.

Также разработчики пытаются применять стандартные средства CSS, встраивая в тело документа правило @page { margin: 3cm 1cm 1cm 1.5cm; }. Но платформа 1С зачастую игнорирует эту синтаксическую конструкцию при прямой отправке на принтер. Проанализируем причину такого поведения и разберем по шагам рабочие альтернативные способы решения этой задачи.

Почему не работают стандартные стили отступов в 1С?

Выясним причину проблемы. Начиная с версии платформы 8.3.14, фирма 1С отказалась от компонента Internet Explorer для отрисовки поля HTML-документа и перевела платформу на использование встроенного движка WebKit (в частности, сборку WinCairo). Этот переход привел к ряду технических особенностей:

  1. Проблемы с правилом @page: Встроенный в платформу WebKit имеет известные ограничения при обработке CSS-правила @page и позиционировании элементов при разбивке на листы для печати.
  2. Потеря старых "хаков": Раньше разработчики могли программно изменять параметры страницы через ключи реестра Windows для Internet Explorer. Теперь этот механизм не работает.
  3. Ограничения предпросмотра: В новых версиях платформы (начиная с 8.3.15) в окне предварительного просмотра для HTML-документов стала некорректно работать интерактивная настройка параметров страницы — отступы либо не применяются, либо печать идет по самым краям листа.

Поскольку "в лоб" задачу решить в рамках объектов 1С не получается, рассмотрим несколько альтернативных вариантов вывода на печать.

Решение 1: Печать через COM-объект Microsoft Word

Если на клиентском компьютере установлен MS Office, мы можем программно сохранить HTML-код во временный файл, открыть его скрытно через COM-объект приложения Word, установить нужные параметры страницы и отправить на печать. Посмотрим на пример реализации данного подхода.


// Получаем HTML текст из поля документа
ТекстHTML = ПолеДокумента.Документ.body.outerHTML;

// Создаем и записываем временный файл
ФайлТекст = Новый ТекстовыйДокумент;
ФайлТекст.УстановитьТекст(ТекстHTML);
Путь = КаталогВременныхФайлов() + "htmltext_" + Формат(ТекущаяДата(), "ДФ=yyyyMMddHHmmss") + ".html";
ФайлТекст.Записать(Путь, КодировкаТекста.UTF8);

Попытка
    // Подключаемся к Word
    Word = Новый COMОбъект("Word.Application");
    ThisDocument = Word.Documents.Open(Путь);
    Word.Visible = Ложь; // Скрываем приложение
    
    // Настраиваем отступы (значения задаются в пунктах, 1 см ~ 28.35 пунктов)
    ThisDocument.PageSetup.TopMargin = 96;
    ThisDocument.PageSetup.RightMargin = 25;
    ThisDocument.PageSetup.LeftMargin = 25;
    ThisDocument.PageSetup.BottomMargin = 60;
    
    // Отправляем на печать (здесь можно добавить вызов метода PrintOut)
    // ThisDocument.PrintOut();
    
    Word.Visible = Истина; // Показываем результат (или закрываем документ)
Исключение
    // Обработка ошибки инициализации COM
КонецПопытки;

Недостатки метода: Как отмечают практики, при конвертации HTML в Word "на лету" могут слетать шрифты, CSS-стили и сложное выравнивание. Word пытается перерисовать веб-верстку в свой внутренний формат, что не всегда проходит гладко. Также этот метод медленный и требует установленного офисного пакета.

Решение 2: Использование консольного конвертера (например, wkhtmltopdf)

Разберем более надежный способ, который позволяет сохранить 100% исходного форматирования. Мы можем использовать бесплатные консольные утилиты для конвертации HTML в PDF. Самая популярная из них — wkhtmltopdf.

Алгоритм действий следующий:

  1. Сохраняем содержимое нашего ПолеHTMLДокумента во временный файл с расширением .html.
  2. Формируем строку запуска команды системы, вызывающую утилиту конвертации.
  3. В параметрах утилиты мы жестко передаем нужные нам отступы для всех страниц. Например: --margin-top 40mm --margin-bottom 20mm.
  4. Утилита генерирует PDF-файл, в котором идеально сохранены все стили CSS и шрифты.
  5. Полученный PDF-файл выводится на печать штатными средствами 1С (через открытие документа PDF или утилиты просмотра).

Этот способ лишен проблем с "поехавшей" версткой и гарантирует одинаковый результат на любых принтерах.

Решение 3: Печать через внешний браузер по умолчанию

Поскольку встроенный в платформу WebKit не всегда справляется с печатью, проанализируем ситуацию с точки зрения современных внешних браузеров (Chrome, Edge, Яндекс.Браузер). Их движки печати прекрасно распознают CSS-конструкцию @page.

Добавьте в ваш HTML-шаблон блок со стилями:


<style>
    @page {
        size: A4;
        margin: 30mm 25mm 25mm 25mm;
    }
    body {
        margin: 0;
    }
</style>

Затем сохраните текст во временный файл и вызовите открытие этого файла в операционной системе:


ПутьКФайлу = ПолучитьИмяВременногоФайла("html");
// ... запись текста HTML в файл ...
ЗапуститьПриложение(ПутьКФайлу);

Документ откроется в браузере пользователя, который установлен по умолчанию. При нажатии "Печать" браузер корректно применит заданные в @page отступы ко всем страницам документа.

Рекомендации от разработчиков платформы 1С

В завершение разберем методологическую сторону вопроса. Согласно стандартам разработки интерфейсов и отчетов фирмы 1С, объект ПолеHTMLДокумента изначально не предназначен для формирования строгих печатных форм, где критичен точный контроль над постраничным выводом.

Для задач, где необходимо управлять верхними, нижними полями, колонтитулами и масштабом на каждой странице, 1С настоятельно рекомендует генерировать классический ТабличныйДокумент. В табличном документе свойства страницы контролируются программно, предсказуемо и абсолютно одинаково работают на всех релизах платформы, не требуя сторонних конвертеров или вызова COM-объектов.

← На главную