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

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

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

В платформе 1С для решения этой задачи предусмотрен метод ПроверитьВывод() объекта ТабличныйДокумент. Разберем подробнее, как устроен этот механизм, как правильно формировать массив областей и почему метод может возвращать неверный результат.

Принцип работы метода ПроверитьВывод()

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

Результат = ТабличныйДокумент.ПроверитьВывод(МассивОбластей);

В качестве параметра передается массив (или фиксированный массив), содержащий объекты типа ОбластьТабличногоДокумента. Метод возвращает значение Истина, если все области из массива помещаются на текущей странице, и Ложь, если происходит разрыв страницы.

Алгоритм проверки вывода строки и подвала

Рассмотрим распространенную ситуацию: при выводе каждой строки таблицы нужно проверять, поместится ли на текущий лист сама строка данных и прилегающий к ней подвал (или примечание). Если они не влезают, то подвал выводится на текущем листе, выполняется перенос страницы, затем выводятся заголовок и шапка новой таблицы, и только после этого печатается строка данных.

Проанализируем пример кода для реализации такой логики:


ВыводимыеОбласти = Новый Массив;
ПодвалВыведен = Ложь;

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

КонецЦикла;

Почему ПроверитьВывод() работает некорректно: главные причины

На практике программисты часто сталкиваются с ситуацией, когда метод ПроверитьВывод() ложно возвращает Истина (или Ложь), из-за чего подвал уходит на следующую страницу или страницы переносятся хаотично. Выясним основные причины такого поведения:

  1. Неустановленная ориентация страницы и параметры печати. Это наиболее частая ошибка. Метод рассчитывает геометрию страницы исходя из текущих настроек печатной формы. Если документ должен печататься в альбомной ориентации (Ландшафт), но свойство ОриентацияСтраницы не было задано программно перед первым вызовом ПроверитьВывод(), платформа выполняет расчет по умолчанию (в книжной ориентации). В результате разрывы страниц рассчитываются неверно.
  2. Зависимость от системного принтера. Метод запрашивает параметры непечатаемых полей у драйвера принтера по умолчанию, установленного в ОС (или на сервере 1С). Если принтер отсутствует или некорректно передает размеры полей, расчет высоты страницы может расходиться с реальной печатью.
  3. Изменение параметров страницы после вызова проверки. Установку свойств ПолеСверху, ПолеСнизу, АвтоМасштаб и ОриентацияСтраницы необходимо выполнять strictly до начала проверки и вывода областей в табличный документ.
  4. Использование автовысоты строк. Если в ячейках включена автовысота и длинный текст переносится по словам, платформа не всегда может точно вычислить итоговую высоту несформированной ячейки до ее фактического рендеринга.

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


// Настройку параметров страницы нужно выполнять ДО вызова ПроверитьВывод()
ТабличныйДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
ТабличныйДокумент.АвтоМасштаб = Истина;
ТабличныйДокумент.ПолеСверху = 10;
ТабличныйДокумент.ПолеСнизу = 10;

Штатный способ повтора шапки при печати

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

Рассмотрим, как задействовать этот механизм:


// Выводим шапку один раз
ТабличныйДокумент.Вывести(ОбластьШапка);

// Указываем платформе, какие строки нужно повторять на каждом новом листе
ТабличныйДокумент.ПовторятьПриПечатиСтроки = ТабличныйДокумент.Область(1, , ОбластьШапка.Высота, );

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

Альтернативный метод: проверка через КоличествоСтраниц()

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


Черновик = Новый ТабличныйДокумент;
Черновик.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;

// Копируем уже сформированный контент во временный документ
Черновик.Вывести(ТабличныйДокумент);

СтраницДо = Черновик.КоличествоСтраниц();

// Пробно выводим проверяемые области в черновик
Черновик.Вывести(ОбластьДанные);
Черновик.Вывести(ОбластьПодвал);

СтраницПосле = Черновик.КоличествоСтраниц();

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

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

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

← На главную