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