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

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

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

Способ 1: Интерактивная настройка в пользовательском режиме

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

Выполним следующие шаги:

  1. Сформируем нужный отчет на экране.
  2. Перейдем в режим редактирования табличного документа. Для этого в главном меню выберем пункт Таблица — Вид — Редактирование.
  3. Выделим мышкой строки, которые составляют шапку нашего отчета (нажмем на номера строк в левой части таблицы).
  4. Зайдем в меню Таблица — Настройки печати — Повторять на каждом листе.

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

Способ 2: Программная установка в табличном документе

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

Предположим, у нас есть переменная ТабДок (объект типа ТабличныйДокумент). Нам нужно передать в указанное свойство область строк, которые должны дублироваться. Разберем на примере:


// Определяем область, которую нужно повторять (например, первые 3 строки)
ОбластьШапки = ТабДок.Область(1, , 3, );
// Назначаем эту область для повторения при печати
ТабДок.ПовторятьПриПечатиСтроки = ОбластьШапки;

Важно понимать: свойству ПовторятьПриПечатиСтроки нужно присваивать именно объект типа ОбластьЯчеекТабличногоДокумента. Попытка передать туда просто число или строку приведет к ошибке выполнения кода. Если в вашем макете шапка имеет имя, например, "ШапкаТаблицы", то код можно сделать более гибким и надежным:


ОбластьДляПовтора = ТабДок.Область("Шапка");
ТабДок.ПовторятьПриПечатиСтроки = ТабДок.Область(ОбластьДляПовтора.Верх, , ОбластьДляПовтора.Низ, );

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

Способ 3: Реализация в Системе компоновки данных (СКД)

Большинство современных отчетов строятся с использованием СКД. Здесь ситуация немного сложнее, так как 1С формирует табличный документ автоматически. Чтобы вмешаться в этот процесс, нам нужно использовать модуль объекта отчета и процедуру ПриКомпоновкеРезультата.

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


Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
    
    // Отключаем стандартный вывод, чтобы управлять процессом вручную
    СтандартнаяОбработка = Ложь;
    
    // Инициализируем схему и настройки
    СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    Настройки = КомпоновщикНастроек.ПолучитьНастройки();
    
    // Подготавливаем макет компоновки
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
    
    // Запускаем процессор компоновки
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
    
    // Выводим результат в табличный документ
    Результат = ЭлементыФормы.Результат; // Для обычных форм или ДокументРезультат для управляемых
    Результат.Очистить();
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(Результат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
    // А теперь устанавливаем повторение строк
    // Если в отчете установлена фиксация сверху, используем ее как ориентир
    Если Результат.ФиксацияСверху > 0 Тогда
        Результат.ПовторятьПриПечатиСтроки = Результат.Область(1, , Результат.ФиксацияСверху, );
    КонецЕсли;

КонецПроцедуры

В данном примере мы использовали свойство ФиксацияСверху. Если в настройках СКД (вкладка "Другие настройки") указан параметр "Фиксация в таблице", то программа автоматически определит количество строк шапки. Мы просто транслируем эту настройку в параметры печати.

Повторение колонок для широких отчетов

Иногда отчеты бывают настолько широкими (например, расчетные ведомости), что они не помещаются на один лист по горизонтали. В этом случае нам нужно, чтобы на каждом листе повторялись первые колонки (например, ФИО сотрудника или артикул товара). Для этого по аналогии со строками используется свойство ПовторятьПриПечатиКолонки.

Рассмотрим пример установки повторения первой и второй колонок:

ТабДок.ПовторятьПриПечатиКолонки = ТабДок.Область(, 1, , 2);

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

Важные нюансы и рекомендации

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

1. Объединенные ячейки.

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

2. Метод ПроверитьВывод().

Если вы формируете отчет полностью вручную в цикле, хорошей практикой считается использование метода ПроверитьВывод(). Это позволяет заранее узнать, поместится ли очередная секция (например, строка данных вместе с подвалом) на текущую страницу. Если не помещается, можно программно вставить разрыв страницы ВывестиВертикальныйРазделительСтраниц(), и тогда ваша настроенная шапка автоматически появится на новом листе.

3. Очистка документа.

Помните, что метод Результат.Очистить() полностью сбрасывает все параметры табличного документа, включая настройки печати. Поэтому установку свойства ПовторятьПриПечатиСтроки всегда нужно выполнять после того, как документ был очищен и в него были выведены данные (или хотя бы после очистки перед основным выводом).

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

← На главную