Как зафиксировать верхние строки и шапку таблицы в макете отчета на СКД?

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

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

Выясняем причину: почему стандартная фиксация не всегда работает?

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

Ситуация осложняется, если в отчете присутствуют:

  1. Пользовательские отборы и параметры: если они выводятся в шапке отчета, реальное количество строк до начала таблицы меняется, и жестко заданное число строк фиксации начинает «резать» саму таблицу либо фиксирует пустые области.
  2. Объединенные ячейки: если в области фиксации присутствуют ячейки, объединенные по вертикали или горизонтали, пересекающие линию фиксации, платформа физически не сможет корректно зафиксировать строки и проигнорирует команду.
  3. Индивидуальный макет: при использовании собственного макета СКД стандартные алгоритмы определения начала таблицы могут давать сбой, поэтому требуется явное указание параметров в коде.

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

Способ 1. Программная фиксация при компоновке результата (в модуле отчета)

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

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


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

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

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

Способ 2. Установка фиксации через события формы (надежный вариант)

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

Для обычных форм:

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


Процедура ДействияФормыСформировать(Кнопка)
    
    // Очищаем табличный документ перед формированием, чтобы избежать наложения данных
    ЭлементыФормы.Результат.Очистить();
    
    // Запускаем штатный механизм компоновки результата
    СкомпоноватьРезультат(ЭлементыФормы.Результат);
    
    // Задаем фиксацию верхних строк на элементе формы
    ЭлементыФормы.Результат.ФиксацияСверху = 4; // число строк фиксации шапки
    
КонецПроцедуры

Для управляемых форм (платформа 1С 8.3):

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


&НаКлиенте
Процедура ПослеЗаполненияРезультата(Результат)
    
    // Устанавливаем фиксацию строк на клиенте, когда табличный документ уже полностью передан на форму
    Результат.ФиксацияСверху = 3;
    
КонецПроцедуры

Использование этого обработчика гарантирует, что свойства фиксации будут применены к итоговому документу и не «слетят» из-за фонового выполнения или передачи контекста между сервером и клиентом. При необходимости изучить комплексные варианты переопределения логики отчетов можно использовать примеры программного формирования СКД и создания управляемых форм.

Полезный лайфхак: повторение шапки на каждой странице при печати

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

Посмотрим на пример реализации этой полезной возможности в коде:


// Указываем область строк, которую необходимо дублировать на каждом печатном листе
// В данном примере мы повторяем вторую строку (шапку таблицы)
ДокументРезультат.ПовторятьПриПечатиСтроки = ДокументРезультат.Область("R2");

Обратите внимание, что в качестве параметра методу Область() передается адрес строки в формате "R" (Row). Например, если ваша шапка занимает со второй по третью строки, то конструкция будет выглядеть как ДокументРезультат.Область("R2:R3").

Рекомендации по работе с собственными макетами СКД

Если вы рисуете макет вручную на закладке «Макеты» в СКД, придерживайтесь следующих правил, чтобы избежать проблем с фиксацией:

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

← На главную