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