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