Как убрать колонтитул только на последней странице макета 1С

Программист 1С v8.3 (Обычные формы)
← На главную

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

Рассмотрим подробнее, почему стандартные средства не позволяют сделать это одной настройкой, и разберем проверенные способы реализации этой задачи программным путем.

Почему не работает стандартный механизм

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

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

Способ 1: Использование метода ПроверитьВывод() и ручное формирование страниц

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

  1. Создаем в макете область (например, с именем Колонтитул), которая будет выступать в роли нижнего колонтитула.
  2. В коде формирования печатной формы отключаем вывод системного колонтитула: ТабДок.НижнийКолонтитул.Выводить = Ложь;.
  3. В цикле вывода строк документа постоянно проверяем, помещается ли текущая строка вместе с областью колонтитула на текущую страницу.

Посмотрим на пример логики кода:


// Создаем массив для проверки вывода
МассивДляПроверки = Новый Массив;
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
ОбластьКолонтитул = Макет.ПолучитьОбласть("Колонтитул");

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

// После цикла выводим финальные данные (подписи), но НЕ выводим область колонтитула
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
ТабДок.Вывести(ОбластьПодвал);

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

Способ 2: Метод "двойного прохода"

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

Алгоритм действий следующий:

  1. Формируем табличный документ в памяти (без вывода на экран) со всеми данными.
  2. Используем метод ТабДок.КоличествоСтраниц(), чтобы узнать общее число листов.
  3. Начинаем повторное формирование документа. При выводе каждой страницы проверяем ее номер.
  4. Если текущий номер страницы меньше общего количества, выводим область-колонтитул. Если страница последняя — пропускаем вывод.

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

Способ 3: Управление через свойство ПовторятьПриПечатиСтроки

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

Рассмотрим подробнее этот алгоритм:

Этот способ проще в реализации, но требует осторожности: нужно точно понимать, в какой момент данные перейдут на финальный лист, чтобы вовремя отключить повторение строк.

Рекомендации по реализации

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

Также помните, что при ручном формировании колонтитулов вам может потребоваться программная нумерация страниц. Для этого в области колонтитула следует создать параметр (например, НомерСтраницы) и инкрементировать его при каждом вызове ВывестиГоризонтальныйРазделительСтраниц().

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

← На главную