Как настроить разрыв страниц при печати HTML-документов из 1С:Предприятие 8.3

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

При разработке печатных форм в 1С программисты часто прибегают к использованию HTML-шаблонов. Это удобный инструмент, позволяющий быстро сверстать сложный и красивый документ. Однако при выводе таких документов на печать разработчики часто сталкиваются с неприятной особенностью: разметка разрыва страниц (например, свойство page-break-before), которая идеально работает в стандартных браузерах Chrome или Edge, напрочь игнорируется платформой 1С. В результате многостраничный документ выводится «сплошняком» на одном листе или разрывается в случайных местах.

В этой статье мы подробно разберем, почему возникает эта проблема, как на это повлиял переход платформы на новый движок отображения HTML и какие существуют практические способы решения этой задачи.

Выясняем причину: особенности работы встроенного WebKit в 1С

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

Проанализируем две главные технические причины, по которым разрывы страниц перестают работать при печати непосредственно из 1С:

  1. Перехват процесса печати платформой. Когда мы вызываем печать через стандартное меню 1С («Файл — Печать») или используем программный метод defaultView.print(), платформа перехватывает управление и преобразует HTML во внутренний формат для передачи системному принтеру. В этот момент специфические стили для печати (такие как правила @media print, селекторы @page, свойства page-break-before, page-break-after) могут просто игнорироваться или некорректно интерпретироваться контейнером 1С.
  2. Ограничения блочной верстки в WebKit. Сам по себе движок WebKit очень чувствителен к структуре DOM-дерева. Разрывы страниц гарантированно перестают работать, если элементы разрыва или их родительские контейнеры используют определенные CSS-свойства. К ним относятся современные технологии разметки, такие как Flexbox (display: flex) и Grid (display: grid), абсолютное позиционирование (position: absolute), обтекание элементов (float), а также скрытие или автоматический скролл контейнеров (overflow: hidden / overflow: auto).

Разберем детально четыре проверенных способа решения этой проблемы — от простой корректировки стилей до кардинального изменения логики вывода документов.

Способ 1. Печать через дефолтный браузер пользователя (Самый надежный метод)

Если вам необходимо гарантировать стопроцентную точность разметки, лучшим решением будет передать задачу печати системному браузеру пользователя (например, Google Chrome, Яндекс.Браузер или Microsoft Edge). Они корректно обрабатывают любые стандарты CSS.

Для реализации этого метода мы выгрузим сформированный HTML-код во временный файл, внедрим в него автовызов печати на JavaScript и откроем этот файл внешним приложением.

Рассмотрим по шагам программный код в 1С:


&НаКлиенте
Процедура НапечататьHTMLЧерезБраузер(Знач ИсходныйHTMLТекст)
    
    // Шаг 1. Внедряем JavaScript для автоматического вызова диалога печати
    СкриптАвтопечати = "
    |<script type=""text/javascript"">
    |    window.onload = function() {
    |        window.print();
    |        // Закрываем вкладку после отправки на печать (опционально)
    |        setTimeout(function(){ window.close(); }, 1000);
    |    }
    |</script>";
    
    // Вставляем скрипт перед закрывающим тегом body
    ИтоговыйHTML = СтрЗаменить(ИсходныйHTMLТекст, "</body>", СкриптАвтопечати + "</body>");
    
    // Шаг 2. Создаем временный файл на диске
    ИмяФайла = ПолучитьИмяВременногоФайла("html");
    
    // Шаг 3. Записываем текст в файл в кодировке UTF-8
    ТекстовыйДокумент = Новый ТекстовыйДокумент;
    ТекстовыйДокумент.УстановитьТекст(ИтоговыйHTML);
    ТекстовыйДокумент.Записать(ИмяФайла, КодировкаТекста.UTF8);
    
    // Шаг 4. Открываем файл в системном браузере по умолчанию
    ЗапуститьПриложение(ИмяФайла);
    
КонецПроцедуры

Преимущества метода: Пользователь получает привычное и удобное окно предпросмотра печати браузера, где работают все настройки масштабирования, полей и разрывов страниц. Данный метод полностью решает проблему искажения стилей контейнером 1С.

Способ 2. Использование современного CSS-синтаксиса и очистка разметки

Если печать должна происходить строго из встроенного поля 1С без открытия сторонних программ, нам необходимо адаптировать HTML-код под жесткие требования встроенного WebKit.

Во-первых, свойства семейства page-break-* (например, page-break-before: always) официально признаны устаревшими в стандартах CSS, хотя и поддерживаются браузерами для совместимости. Вместо них современные движки рендеринга требуют использования свойства break-before и break-after.

Проанализируем правильную структуру CSS-стилей, которую необходимо поместить в секцию <head> вашего шаблона:


<head>
    <style>
        @media print {
            /* Сбрасываем влияние флексбоксов и флоатов у родительских элементов */
            html, body, .main-container {
                display: block !important;
                float: none !important;
                position: relative !important;
                overflow: visible !important;
                height: auto !important;
            }
            
            /* Создаем специальный класс для принудительного разрыва */
            .page-separator {
                display: block !important;
                clear: both !important;
                break-before: page !important; /* Современное свойство */
                page-break-before: always !important; /* Для обратной совместимости */
                height: 0 !important;
                margin: 0 !important;
                padding: 0 !important;
                border: none !important;
            }
        }
    </style>
</head>

В теле HTML-документа (в секции <body>) перед каждым новым логическим блоком, который должен начинаться с нового листа, мы вставляем пустой элемент с этим классом:


<body>
    <div class="main-container">
        <div class="document-block">
            <!-- Содержимое первой страницы -->
            <p>Это первая страница отчета...</p>
        </div>
        
        <!-- Элемент принудительного разрыва -->
        <div class="page-separator"></div>
        
        <div class="document-block">
            <!-- Содержимое второй страницы -->
            <p>Это вторая страница отчета...</p>
        </div>
    </div>
</body>

Важное правило: Проверьте, чтобы у блоков document-block или у общего контейнера main-container не было фиксированной высоты (свойство height), а также параметров display: flex или overflow: hidden, иначе WebKit проигнорирует разделитель.

Способ 3. Переход на стандартный табличный документ 1С (MXL)

Иногда политика безопасности предприятия запрещает запуск внешних приложений (метод ЗапуститьПриложение()) на рабочих станциях пользователей (например, при работе в терминальном сессионном режиме Citrix или веб-клиенте с ограниченными правами). В этом случае наиболее системным подходом является перенос логики макета из HTML в стандартный табличный документ 1С.

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

Рассмотрим пример формирования многостраничного документа в 1С:


&НаСервере
Функция СформироватьПечатнуюФорму()
    
    ТабДок = Новый ТабличныйДокумент;
    Макет = ПолучитьМакет("МакетПечатнойФормы");
    
    ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
    ОбластьСтрока    = Макет.ПолучитьОбласть("Строка");
    
    Для Счетчик = 1 По 25 Цикл
        
        // Если это не первая страница, принудительно добавляем разрыв страницы
        Если Счетчик > 1 Тогда
            ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
            // Альтернативный вариант разрыва:
            // ТабДок.НоваяСтраница();
        КонецЕсли;
        
        // Заполняем параметры области макета
        ОбластьЗаголовок.Параметры.НомерДокумента = Счетчик;
        ТабДок.Вывести(ОбластьЗаголовок);
        
        ОбластьСтрока.Параметры.ТекстДанных = "Данные страницы № " + Счетчик;
        ТабДок.Вывести(ОбластьСтрока);
        
    КонецЦикла;
    
    Возврат ТабДок;
    
КонецФункции

Использование методов ВывестиГоризонтальныйРазделительСтраниц() или НоваяСтраница() гарантирует, что при печати штатными средствами 1С каждый блок документов будет распечатан на отдельном физическом листе бумаги.

Способ 4. Конвертация в PDF на стороне сервера

Для крупных распределенных систем печать напрямую из HTML часто организуют через промежуточную генерацию PDF-документа на стороне сервера приложений. Существуют утилиты (например, популярный пакет wkhtmltopdf или запуск браузера Chrome в фоновом режиме headless chrome), которые принимают на вход HTML-файл и генерируют готовый PDF-документ.

Серверные утилиты рендеринга PDF-файлов безупречно обрабатывают CSS-правила разрывов страниц. На выходе сервер отдает готовый файл PDF, который 1С может показать пользователю во встроенном PDF-вьюере или сразу отправить на принтер с помощью внешних библиотек. Этот способ исключает любые искажения верстки у конечного пользователя, независимо от версии установленной у него платформы 1С или операционной системы.

Резюме

Мы проанализировали особенности работы встроенного движка WebKit в платформе 1С:Предприятие 8.3 и разобрали основные методы решения проблемы с разрывом страниц при печати HTML. Для быстрого исправления ситуации рекомендуется использовать Способ 1 (печать через системный браузер по умолчанию) или Способ 2 (тщательная адаптация стилей под требования WebKit с использованием свойства break-before: page). В долгосрочной перспективе для критически важных внутренних отчетов наиболее стабильным решением остается перевод логики на штатные табличные документы 1С (Способ 3).

← На главную