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

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

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

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

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

Для обращения к колонтитулу используются следующие ключевые свойства:

  1. Выводить — булево значение, включающее отображение колонтитула при печати.
  2. НачальнаяСтраница — число, определяющее номер страницы, с которой колонтитул начинает выводиться. Установив значение 2, мы автоматически скрываем колонтитул на титульном листе.
  3. ТекстСлева, ТекстВЦентре, ТекстСправа — строки, содержащие статический текст и специальные теги платформы.
  4. Шрифт — объект типа Шрифт для управления размером и начертанием текста колонтитула.

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

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

Посмотрим на практический пример программной настройки верхнего колонтитула:


// ТабДок - формируемый ТабличныйДокумент
// НомерДокумента - строка с номером текущего документа

ТабДок.ВерхнийКолонтитул.Выводить = Истина;
ТабДок.ВерхнийКолонтитул.НачальнаяСтраница = 2;

// Выводим слева номер документа, а справа - номер страницы
ТабДок.ВерхнийКолонтитул.ТекстСлева = "Акт № " + НомерДокумента;
ТабДок.ВерхнийКолонтитул.ТекстСправа = "Страница [&НомерСтраницы] из [&СтраницВсего]";

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

Ограничения стандартных колонтитулов

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

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

Решение 2. Повторение строк шапки таблицы при печати

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

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


// Задаем строки 6 и 7 макета в качестве повторяющихся при переносе
ТабДок.ПовторятьПриПечатиСтроки = ТабДок.Область("R6:R7");

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

Решение 3. Ручной контроль переноса через ПроверитьВывод

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

  1. Создаем в макете отдельную область (например, «ШапкаВторойСтраницы») с параметрами НомерДокумента и НомерСтраницы.
  2. Инициализируем счетчик страниц значением 1.
  3. В цикле перед выводом каждой строки данных формируем массив из выводимой строки и подвала/следующей строки и передаем его в метод ТабДок.ПроверитьВывод(МассивПроверки).
  4. Если метод возвращает Ложь (области не помещаются на текущий лист бумаги):
    • вызываем метод ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
    • увеличиваем счетчик страниц на 1;
    • заполняем параметры области «ШапкаВторойСтраницы» текущим номером страницы и номером документа и выводим ее в документ;
    • выводим очередную строку данных.

Рассмотрим пример реализации такого алгоритма:


НомерТекущейСтраницы = 1;
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
ОбластьШапкаСтр2 = Макет.ПолучитьОбласть("ШапкаВторойСтраницы");

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

Подводные камни при расчете страниц

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

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