Как вывести подвал печатной формы на каждом листе в конце страницы в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

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

Способ 1. Использование встроенных колонтитулов табличного документа

Самый простой и производительный способ вывести текстовую информацию (например, номера страниц, дату печати или простой текстовый подвал) внизу каждого листа — это использование механизма нижних колонтитулов. Этот метод не требует сложных расчетов высоты строк и работает полностью на уровне платформы «1С:Предприятие».

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

Рассмотрим пример программной настройки нижнего колонтитула:


// Настройка нижнего колонтитула для вывода номеров страниц внизу каждого листа
ТабДокумент.НижнийКолонтитул.Выводить = Истина;
ТабДокумент.НижнийКолонтитул.НачальнаяСтраница = 1; // выводить с первой страницы
ТабДокумент.НижнийКолонтитул.Шрифт = Новый Шрифт("Arial", 8, Истина, Ложь); // жирный шрифт размера 8

// Используем управляющие конструкции платформы для вывода номеров страниц
ТабДокумент.НижнийКолонтитул.ТекстСправа = "Страница [&НомерСтраницы] из [&СтраницВсего]";
ТабДокумент.НижнийКолонтитул.ТекстСлева = "ООО ""Торговая Компания""";

// Задаем высоту области колонтитула снизу в миллиметрах
ТабДокумент.РазмерКолонтитулаСнизу = 10; 

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

  1. [&НомерСтраницы] — порядковый номер текущего листа печатной формы.
  2. [&СтраницВсего] — общее количество листов в документе.
  3. [&Дата] — текущая дата формирования печатной формы.
  4. [&Время] — текущее время формирования.

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

Ограничения метода: Колонтитулы поддерживают только простой текст. Если вам нужно вывести внизу страницы сложную таблицу с рамками, картинками, штрихкодами или сеткой подписей должностных лиц, данный способ не подойдет.

Способ 2. Программный расчет и метод ПроверитьВывод()

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

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

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


// Получаем области из макета
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
ОбластьПодвалЛиста = Макет.ПолучитьОбласть("ПодвалЛиста");
ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");

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

// После окончания цикла обязательно выводим финальный подвал на последней странице
ТабДокумент.Вывести(ОбластьПодвалЛиста);

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

Способ 3. Прижим подвала к низу страницы («Сдвиг пустой областью»)

Чтобы подвал всегда находился у самого нижнего края страницы, независимо от того, сколько строк таблицы выведено на листе, мы можем применить алгоритм автоматического заполнения пустого пространства вспомогательными строками.

Для этого в макете создается вспомогательная пустая область минимальной высоты (например, в одну строку высотой 8-10 пунктов). Назовем ее ОбластьПустаяСтрока. Алгоритм работает следующим образом:


// Предположим, строки таблицы уже выведены.
// Теперь нам нужно "добить" страницу пустыми строками, чтобы подвал съехал в самый низ.

ОбластьПустаяСтрока = Макет.ПолучитьОбласть("ПустаяСтрока");
ОбластьПодвалЛиста = Макет.ПолучитьОбласть("ПодвалЛиста");

// Создаем массив, содержащий одну пустую строку и наш подвал
МассивПроверки = Новый Массив;
МассивПроверки.Добавить(ОбластьПустаяСтрока);
МассивПроверки.Добавить(ОбластьПодвалЛиста);

// В цикле проверяем, помещается ли пустая строка вместе с подвалом на текущую страницу
Пока ТабДокумент.ПроверитьВывод(МассивПроверки) Цикл
    // Пока помещаются, выводим пустую строку, сдвигая подвал все ниже и ниже
    ТабДокумент.Вывести(ОбластьПустаяСтрока);
КонецЦикла;

// Как только цикл завершился (следующая пустая строка вызвала бы перенос),
// мы выводим сам подвал. Он окажется идеально прижат к нижней границе листа.
ТабДокумент.Вывести(ОбластьПодвалЛиста);

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

Важные нюансы и подводные камни при работе с ПроверитьВывод()

Проектируя печатные формы с программным контролем разбиения страниц, обязательно учитывайте следующие технические особенности платформы 1С:

  1. Зависимость от установленного принтера. Метод ПроверитьВывод() выполняет расчеты размеров областей на основе драйвера принтера, который выбран по умолчанию в операционной системе (на сервере или у клиента). Если в операционной системе не установлено ни одного принтера, или служба печати зависла, вызов метода ПроверитьВывод() вызовет аварийное завершение работы программы (исключение).
  2. Безопасный вызов в типовых конфигурациях. Чтобы избежать падения программы при отсутствии принтеров, в типовых конфигурациях и библиотеке стандартных подсистем (БСП) проверку вывода оборачивают в безопасные функции. Рекомендуется использовать встроенную функцию БСП:
    ФормированиеПечатныхФорм.ПроверитьВыводТабличногоДокумента(ТабДокумент, ВыводимыеОбласти).
    Внутри этой функции код обернут в блок Попытка... Исключение, что гарантирует стабильную работу системы в любых условиях.
  3. Разница выполнения на клиенте и сервере. Печать часто формируется на стороне сервера приложений 1С. Помните, что список доступных принтеров и их настройки по умолчанию на сервере могут кардинально отличаться от настроек на компьютере пользователя. Для максимально точной работы метода перед проверкой вывода рекомендуется явным образом задавать параметры страницы табличного документа, например, имя принтера или ключ параметров печати (ТабДокумент.КлючПараметровПечати = "ПараметрыПечати_СчетНаОплату").
  4. Проблема «висячего подвала». Всегда закладывайте проверку вывода связки «последняя строка таблицы + подвал». Если вся таблица поместится на страницу, а подвал будет перенесен на следующий лист в гордом одиночестве, документ будет выглядеть непрофессионально. Проверяя вывод последней строки вместе с подвалом, вы гарантируете, что они перенесутся на новую страницу вместе.

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

← На главную