При формировании печатных форм и печатных отчетов часто возникает задача: корректно разбить документ на страницы, чтобы строки таблицы не обрывались в произвольном месте. Например, требуется гарантировать, чтобы блок данных выводился вместе с подвалом таблицы, а при переносе на новый лист вверху страницы автоматически выводилась шапка.
В платформе 1С для решения этой задачи предусмотрен метод ПроверитьВывод() объекта ТабличныйДокумент. Разберем подробнее, как устроен этот механизм, как правильно формировать массив областей и почему метод может возвращать неверный результат.
Метод ПроверитьВывод() проверяет, уместится ли переданный массив областей макета на текущем листе табличного документа с учетом уже выведенных секций и настроек печати. Синтаксис метода следующий:
Результат = ТабличныйДокумент.ПроверитьВывод(МассивОбластей);
В качестве параметра передается массив (или фиксированный массив), содержащий объекты типа ОбластьТабличногоДокумента. Метод возвращает значение Истина, если все области из массива помещаются на текущей странице, и Ложь, если происходит разрыв страницы.
Рассмотрим распространенную ситуацию: при выводе каждой строки таблицы нужно проверять, поместится ли на текущий лист сама строка данных и прилегающий к ней подвал (или примечание). Если они не влезают, то подвал выводится на текущем листе, выполняется перенос страницы, затем выводятся заголовок и шапка новой таблицы, и только после этого печатается строка данных.
Проанализируем пример кода для реализации такой логики:
ВыводимыеОбласти = Новый Массив;
ПодвалВыведен = Ложь;
Для Каждого СтрокаДанных Из ТЗДанные Цикл
// Заполняем области данными
ОбластьДанные.Параметры.Заполнить(СтрокаДанных);
ВыводимыеОбласти.Очистить();
ВыводимыеОбласти.Добавить(ОбластьДанные);
// Если подвал еще не выводился, добавляем его в проверку
Если Не ПодвалВыведен Тогда
ВыводимыеОбласти.Добавить(ОбластьПодвал);
КонецЕсли;
// Проверяем, помещаются ли области на текущую страницу
Если Не ТабличныйДокумент.ПроверитьВывод(ВыводимыеОбласти) Тогда
// Если места недостаточно, выводим подвал на текущей странице
Если Не ПодвалВыведен Тогда
ТабличныйДокумент.Вывести(ОбластьПодвал);
ПодвалВыведен = Истина;
КонецЕсли;
// Выполняем разрыв страницы и печатаем повторные шапки
ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
ТабличныйДокумент.Вывести(ОбластьШапка);
КонецЕсли;
// Выводим саму строку данных
ТабличныйДокумент.Вывести(ОбластьДанные);
КонецЦикла;
На практике программисты часто сталкиваются с ситуацией, когда метод ПроверитьВывод() ложно возвращает Истина (или Ложь), из-за чего подвал уходит на следующую страницу или страницы переносятся хаотично. Выясним основные причины такого поведения:
Ландшафт), но свойство ОриентацияСтраницы не было задано программно перед первым вызовом ПроверитьВывод(), платформа выполняет расчет по умолчанию (в книжной ориентации). В результате разрывы страниц рассчитываются неверно.ПолеСверху, ПолеСнизу, АвтоМасштаб и ОриентацияСтраницы необходимо выполнять strictly до начала проверки и вывода областей в табличный документ.Обязательно настраивайте параметры страницы перед циклом вывода:
// Настройку параметров страницы нужно выполнять ДО вызова ПроверитьВывод()
ТабличныйДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
ТабличныйДокумент.АвтоМасштаб = Истина;
ТабличныйДокумент.ПолеСверху = 10;
ТабличныйДокумент.ПолеСнизу = 10;
Если задача заключается только в том, чтобы шапка таблицы автоматически повторялась вверху каждого нового листа, писать ручную проверку через ПроверитьВывод() не обязательно. В объекте ТабличныйДокумент предусмотрено специальное свойство ПовторятьПриПечатиСтроки.
Рассмотрим, как задействовать этот механизм:
// Выводим шапку один раз
ТабличныйДокумент.Вывести(ОбластьШапка);
// Указываем платформе, какие строки нужно повторять на каждом новом листе
ТабличныйДокумент.ПовторятьПриПечатиСтроки = ТабличныйДокумент.Область(1, , ОбластьШапка.Высота, );
При использовании этого свойства платформа 1С автоматически зарезервирует место вверху каждого следующего листа и повторит указанные строки без ручного вмешательства в цикл формирования отчета.
В сложных макетах, когда метод ПроверитьВывод() не дает нужной точности, применяют алгоритм с двумя табличными документами (черновик и чистовик). Смысл метода заключается в выводе проверяемой области во временный табличный документ и анализе изменения свойства КоличествоСтраниц():
Черновик = Новый ТабличныйДокумент;
Черновик.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
// Копируем уже сформированный контент во временный документ
Черновик.Вывести(ТабличныйДокумент);
СтраницДо = Черновик.КоличествоСтраниц();
// Пробно выводим проверяемые области в черновик
Черновик.Вывести(ОбластьДанные);
Черновик.Вывести(ОбластьПодвал);
СтраницПосле = Черновик.КоличествоСтраниц();
Если СтраницПосле > СтраницДо Тогда
// Добавление областей привело к созданию новой страницы
// Выполняем перенос и вывод шапки в основной документ
ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
ТабличныйДокумент.Вывести(ОбластьШапка);
КонецЕсли;
ТабличныйДокумент.Вывести(ОбластьДанные);
Подводя итог: при корректной настройке параметров страницы (ориентация, поля, масштаб) метод ПроверитьВывод() является надежным и быстрым инструментом для управления версткой печатных форм в 1С.