Как реализовать повтор области табличного документа начиная со второй страницы

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

При формировании печатных форм, таких как многостраничные договоры или сложные отчеты, разработчики часто сталкиваются с ограничением стандартного механизма 1С. Свойство ПовторятьПриПечатиСтроки позволяет зафиксировать область строк, которая будет дублироваться на каждом листе, однако этот механизм всегда начинает работу с самой первой страницы. Если же по условиям задачи (например, в тексте договора) номер и дата документа должны появляться в верхней части листа только начиная со второго, стандартный функционал не подходит. Рассмотрим подробнее, какими способами можно обойти это ограничение и добиться нужного результата при выгрузке в ТабличныйДокумент или Word.

Способ 1. Программный контроль разбиения страниц через ПроверитьВывод

Этот метод является наиболее гибким и часто используемым при работе с ТабличныйДокумент. Суть заключается в том, что мы не полагаемся на автоматику платформы, а самостоятельно проверяем, поместится ли следующая порция данных на текущую страницу. Если данные не помещаются, мы принудительно выводим разделитель и нужную нам "шапку" для второй и последующих страниц.

Разберем алгоритм по шагам:

  1. Создаем массив областей, которые должны быть выведены совместно (например, текущая строка данных и подвал страницы).
  2. Перед выводом каждой строки вызываем метод ПроверитьВывод().
  3. Если метод возвращает Ложь, значит, место на листе закончилось. В этот момент мы выводим горизонтальный разделитель страниц и область, которую хотим повторять.
  4. Продолжаем вывод основных данных.

Проанализируем пример кода, реализующий эту логику:


// Подготовим массив для проверки вместимости данных на страницу
СтрокаСПодвалом = Новый Массив; 
СтрокаСПодвалом.Добавить(ОбластьДетальныхЗаписей); 
СтрокаСПодвалом.Добавить(ПодвалСтраницы); 

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

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

Важное примечание: Метод ПроверитьВывод() очень чувствителен к настройкам принтера. Чтобы расчет высоты страницы был точным, рекомендуется в свойствах табличного документа устанавливать Автомасштаб = Истина и следить за тем, чтобы на сервере, где выполняется код, был установлен драйвер хотя бы одного принтера (например, виртуального PDF-принтера).

Способ 2. Использование макетов типа ActiveDocument (Word)

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

Рассмотрим, как это работает через механизм ActiveDocument:

  1. В макете Word создается раздел, и в параметрах страницы включается опция "Особый колонтитул для первой страницы".
  2. Верхний колонтитул первой страницы оставляется пустым (или заполняется специфичными для начала договора данными).
  3. В верхний колонтитул основной части документа вставляется таблица с номером и датой договора.
  4. При заполнении документа из 1С через OLE-соединение или механизм закладок, Word будет автоматически дублировать таблицу из основного колонтитула на всех страницах, кроме первой.

Этот подход избавляет программиста от необходимости вручную высчитывать высоту строк и следить за разрывами страниц в коде 1С. В качестве основы реализации подойдёт пример печатной формы Word с заполнением колонтитулов и таблицы.

Способ 3. Метод программного изменения настроек печати "на лету"

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

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

Технические нюансы при выгрузке в Word

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

Выбор метода зависит от сложности структуры вашего договора. Для простых табличных отчетов идеально подходит Способ 1, а для юридически значимых документов со сложным форматированием лучше использовать Способ 2 с макетом ActiveDocument.

← На главную