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