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