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