Как правильно использовать метод ПроверитьВывод() для контроля переноса строк и штампов на страницу в 1С?

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

При формировании сложных печатных форм часто возникает задача: разместить данные так, чтобы штамп или блок подписей гарантированно оставался на текущей странице либо аккуратно переносился на следующий лист без отрыва от предшествующих строк. Для этих целей платформа 1С предоставляет метод табличного документа ПроверитьВывод(). Однако разработчики нередко сталкиваются с ситуацией, когда метод возвращает Истина, а при формировании листа или экспорте в формат PDF данные разрываются некорректно.

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

Анализ типичных ошибок в алгоритме проверки

Посмотрим на типовой ошибочный фрагмент кода, где выполняется проверка и вывод областей:


Процедура ПроверитьВыводНаСтраницу(ПроверяемаяОбласть, ОбластьШтамп)
    МассивОбластей = Новый Массив;
    МассивОбластей.Добавить(ПроверяемаяОбласть);
    МассивОбластей.Добавить(ОбластьШтамп);
    
    Если Не ОсновноеТабличноеПоле.ПроверитьВывод(МассивОбластей) Тогда
        ВывестиШтампВКонцеСтраницы(ОбластьШтамп);
        ОсновноеТабличноеПоле.Вывести(ПроверяемаяОбласть);
        МассивОбластей.Очистить();
    КонецЕсли;
    
    ОсновноеТабличноеПоле.Вывести(ПроверяемаяОбласть);
КонецПроцедуры

В приведенном коде допущены две критические ошибки:

  1. Дублирование вывода: если условие Если Не ПроверитьВывод(...) выполняется, строка ПроверяемаяОбласть выводится внутри блока условия, а затем повторно выводится за пределами конструкции Если ... КонецЕсли. В результате данные задваиваются.
  2. Проверка незаполненных областей: метод ПроверитьВывод() рассчитывает физические размеры ячеек исходя из их содержимого и параметров форматирования. Если передать в метод область макета до заполнения ее параметров, расчет высоты будет выполнен по пустому шаблону, а не по реальному тексту.

Исправим структуру базовой проверки:


// ОбластьСтрока и ОбластьПодвал должны быть уже заполнены данными
МассивПроверки = Новый Массив;
МассивПроверки.Добавить(ОбластьСтрока);
МассивПроверки.Добавить(ОбластьПодвал);

Если Не ТабличныйДокумент.ПроверитьВывод(МассивПроверки) Тогда
    // Если вместе со штампом строка не помещается, принудительно переносим страницу
    ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;

ТабличныйДокумент.Вывести(ОбластьСтрока);

Как работает метод ПроверитьВывод()

Метод ПроверитьВывод() проверяет, поместятся ли переданные в него области на текущую страницу табличного документа с учетом уже выведенных ранее строк. Передавать в массив всю историю предыдущего вывода не требуется — метод анализирует текущее состояние документа и виртуально «примеряет» только переданные области.

Основные правила работы с методом:

  1. В массив передаются только те области, которые планируется вывести следующими.
  2. Параметры и текст в проверяемых областях должны быть полностью заполнены до вызова функции.
  3. Порядок добавления областей в массив должен строго соответствовать порядку их последующего вывода в документ.

Обязательная настройка параметров страницы

Метод ПроверитьВывод() рассчитывает доступное пространство листа на основании параметров страницы табличного документа. Если параметры не заданы явно в коде, платформа берет настройки по умолчанию из драйвера принтера, что приводит к расхождению разметки при сохранении в файл PDF.

Перед началом вывода данных всегда явно инициализируем параметры документа:


ТабличныйДокумент.РазмерСтраницы = "A4";
ТабличныйДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
ТабличныйДокумент.АвтоМасштаб = Ложь;
ТабличныйДокумент.МасштабПечати = 100;

// Установка полей (в миллиметрах)
ТабличныйДокумент.ПолеСлева = 10;
ТабличныйДокумент.ПолеСправа = 10;
ТабличныйДокумент.ПолеСверху = 10;
ТабличныйДокумент.ПолеСнизу = 10;

Важно: если включено свойство АвтоМасштаб = Истина, метод ПроверитьВывод() может давать неточные результаты, поскольку автоматическое масштабирование пересчитывает пропорции всей таблицы целиком уже после ее окончательного формирования.

Зависимость от принтера и серверного окружения

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

Рекомендации по настройке среды:

  1. В операционной системе должен быть установлен хотя бы один виртуальный принтер по умолчанию (например, Microsoft Print to PDF или системный PDF-принтер).
  2. На серверах под управлением Linux должна быть запущена служба печати (CUPS) и установлены стандартные пакеты шрифтов (шрифты семейства Liberation или Core Fonts от Microsoft), чтобы расчет ширины колонок совпадал с отображением в PDF.
  3. Вызов метода рекомендуется защищать конструкцией Попытка ... Исключение, чтобы избежать аварийного завершения фонового задания при сбоях подсистемы печати.

Варианты позиционирования штампа внизу листа

Попытка «добить» страницу пустыми строками через цикл с проверкой вывода часто накапливает погрешность высоты строк. Рассмотрим более надежные подходы.

Вариант 1. Использование нижнего колонтитула

Если штамп представляет собой фиксированный текст, номера страниц или реквизиты, наиболее стабильным решением является использование колонтитулов:


ТабличныйДокумент.НижнийКолонтитул.Выводить = Истина;
ТабличныйДокумент.НижнийКолонтитул.НачальнаяСтраница = 1;
ТабличныйДокумент.НижнийКолонтитул.ТекстЦентр = "Документ подписан электронной подписью";

Вариант 2. Контроль количества страниц через временный документ

Если требуется вывести сложную табличную секцию со штампом в самом конце документа и убедиться, что подписи не оторвутся на пустой лист, можно контролировать число страниц:


Функция ПомещаетсяНаСтраницу(ТабДок, МассивОбластей)
    Попытка
        Возврат ТабДок.ПроверитьВывод(МассивОбластей);
    Исключение
        // В случае отсутствия принтера или сбоя подсистемы печати
        Возврат Истина;
    КонецПопытки;
КонецФункции

Используя явную инициализацию свойств страницы, заполнение областей перед проверкой и корректную обработку условий, мы получаем предсказуемое разбиение на страницы, полностью совпадающее как при интерактивном просмотре, так и при экспорте в формат PDF.

← На главную