Как настроить повторение шапки отчета на каждом листе при печати в 1С

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

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

Разберем причины такого поведения платформы и пошагово выясним, как правильно передавать область строк для корректной печати.

В чем причина ошибки при установке ПовторятьПриПечатиСтроки

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


ШапкаДляПовтора = ТабличныйДокумент.Область("R7C2:R7C5");
ТабличныйДокумент.ПовторятьПриПечатиСтроки = ШапкаДляПовтора;

В этом примере разработчик пытается выделить конкретный диапазон ячеек, соответствующий видимым колонкам шапки документа (со 2-й по 5-ю колонку 7-й строки). Однако свойство ПовторятьПриПечатиСтроки объекта ТабличныйДокумент предъявляет строгое требование к типу передаваемой области.

Свойство принимает объект типа ОбластьЯчеекТабличногоДокумента, но его свойство ТипОбласти обязательно должно иметь значение ТипОбластиЯчеекТабличногоДокумента.Строки. Когда в адресе указываются и строки, и колонки (например, "R7C2:R7C5"), создается область типа Прямоугольник. Платформа 1С не может применить прямоугольный блок ячеек в качестве сквозных строк листа, поэтому присвоение игнорируется, а свойство сохраняет исходное состояние.

Способы корректного задания сквозных строк

Для того чтобы свойство приняло область, необходимо передать строку или диапазон строк целиком, без явного ограничения по колонкам. Рассмотрим основные способы реализации этого механизма в коде.

  1. Использование строковой нотации строк:

    Если номер строки с шапкой известен заранее, достаточно указать только индекс строки с буквой R (Row):

    
    ШапкаДляПовтора = ЭлементыФормы.ПолеТабличногоДокументаРезультат.Область("R7");
    ЭлементыФормы.ПолеТабличногоДокументаРезультат.ПовторятьПриПечатиСтроки = ШапкаДляПовтора;
    

    Если шапка многострочная (например, занимает строки с 7-й по 9-ю включительно), диапазон указывается через двоеточие:

    ТабличныйДокумент.ПовторятьПриПечатиСтроки = ТабличныйДокумент.Область("R7:R9");
  2. Числовой вызов метода Область():

    Посмотрим на числовой вариант вызова метода Область(). Чтобы получить область строк целиком, параметры номеров колонок просто опускаются:

    
    // Для одной строки:
    ТабличныйДокумент.ПовторятьПриПечатиСтроки = ТабличныйДокумент.Область(7, , 7, );
    
    // Для диапазона строк:
    ТабличныйДокумент.ПовторятьПриПечатиСтроки = ТабличныйДокумент.Область(НачальнаяСтрока, , КонечнаяСтрока, );
    
  3. Использование именованных областей макета:

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

    
    ТабличныйДокумент.ПовторятьПриПечатиСтроки = ТабличныйДокумент.Области.ШапкаТаблицы;
    

    Важно: область должна принадлежать именно результирующему объекту ТабличныйДокумент, а не исходному объекту Макет.

Особенности работы в Универсальном отчете

В универсальных отчетах структура шапки динамическая: при изменении состава группировок, включении или отключении фильтров, а также при выводе заголовка отчета номер строки с шапкой сдвигается. Жестко прописанный адрес "R7" в таких условиях может начать указывать на пустую строку или строки параметров.

Разберем, как динамически найти нужную строку шапки перед назначением повтора при печати:

  1. Поиск по тексту заголовка колонки:

    Мы можем программно найти ячейку с известным текстом колонки (например, «Номенклатура» или «Количество») и получить номер её строки:

    
    НайденнаяОбласть = ТабличныйДокумент.НайтиТекст("Номенклатура");
    Если НайденнаяОбласть <> Неопределено Тогда
        ТабличныйДокумент.ПовторятьПриПечатиСтроки = ТабличныйДокумент.Область(НайденнаяОбласть.Верх, , НайденнаяОбласть.Низ, );
    КонецЕсли;
    
  2. Определение по экранной фиксации:

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

Важные нюансы применения сквозных строк

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

  1. Момент вызова в коде: Метод Очистить(), который часто вызывается в начале формирования отчета, полностью сбрасывает все параметры печати и сквозных строк. Назначение свойства ПовторятьПриПечатиСтроки необходимо выполнять строго после полного завершения вывода данных в документ.
  2. Разделение экранной фиксации и печати: Свойство ФиксацияСверху отвечает исключительно за закрепление строк на экране монитора при интерактивной прокрутке, а свойство ПовторятьПриПечатиСтроки — исключительно за постраничный вывод на принтер. Они независимы друг от друга.
  3. Интерактивная настройка: Задать повторение строк можно и без изменения программного кода: достаточно выделить нужную строку (или несколько строк) за серую панель номеров строк слева и выбрать пункт меню «Таблица» → «Настройки печати» → «Повторять на каждом листе». Если у формы отчета сохраняются параметры печати (заполнено свойство ИмяПараметровПечати), эта настройка сохранится для пользователя.
  4. Экспорт в сторонние форматы: При сохранении табличного документа средствами платформы в формат Excel (.xls или .xlsx) свойство ПовторятьПриПечатиСтроки автоматически транслируется в стандартные сквозные строки листа Excel.
← На главную