При разработке отчетов на схеме компоновки данных (СКД) часто возникает задача зафиксировать шапку таблицы (верхние строки), чтобы при прокрутке отчета вниз заголовки колонок всегда оставались перед глазами пользователя. В стандартных механизмах СКД при использовании полностью автоматического вывода эта настройка иногда работает некорректно или «слетает», особенно если вы используете собственный (индивидуальный) макет оформления. В этой статье мы подробно разберем, почему так происходит, и рассмотрим проверенные практические способы решения этой проблемы как для обычных, так и для управляемых форм.
Когда мы пытаемся настроить фиксацию строк в автоматическом режиме, платформа «1С:Предприятие» берет управление выводом полностью на себя. В процессе формирования отчета итоговый ТабличныйДокумент (результат отчета) может несколько раз пересоздаваться, очищаться и заполняться заново. При этом настройки программной фиксации, заданные в начале генерации отчета, просто сбрасываются.
Ситуация осложняется, если в отчете присутствуют:
Для обхода этих ограничений мы применим программные методы управления выводом. Рассмотрим их пошагово.
Этот способ хорошо подходит, когда мы хотим заложить логику фиксации непосредственно в сам отчет, не привязываясь к конкретной форме. Мы переопределим стандартную обработку события ПриКомпоновкеРезультата в модуле отчета. Это позволит нам вмешаться в процесс генерации табличного документа на самом последнем этапе, когда структура данных уже построена.
Проанализируем следующий код, который необходимо разместить в модуле отчета:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
// Отключаем стандартный вывод платформы, чтобы полностью контролировать процесс
СтандартнаяОбработка = Ложь;
// Инициализируем компоновщик макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, ДанныеРасшифровки);
// Создаем процессор компоновки и инициализируем его данными
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки);
// Выводим результат в табличный документ
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
// Теперь, когда документ полностью сформирован, устанавливаем фиксацию строк и колонок
// Например, зафиксируем первые 3 строки сверху и 1 колонку слева
ДокументРезультат.ФиксацияСверху = 3;
ДокументРезультат.ФиксацияСлева = 1;
КонецПроцедуры
Важный нюанс: при таком подходе мы полностью берем на себя формирование макета. Метод хорош тем, что свойства ФиксацияСверху и ФиксацияСлева устанавливаются для уже готового, заполненного документа непосредственно перед тем, как он отобразится на экране пользователя. Для сокращения объема рутинного кода при программной компоновке отчета можно применить библиотеку СКДБилдер для программного создания СКД.
Если в вашем отчете используется форма (обычная или управляемая), то наиболее надежным решением будет установка фиксации непосредственно на форме после того, как отчет будет выведен на экран. Это позволяет избежать проблем с очисткой табличного документа платформой.
Разберем ситуацию, когда на форме отчета есть стандартная кнопка формирования. Переопределим ее действие и напишем код, который сначала компонует результат, а затем фиксирует нужные области элемента формы Результат:
Процедура ДействияФормыСформировать(Кнопка)
// Очищаем табличный документ перед формированием, чтобы избежать наложения данных
ЭлементыФормы.Результат.Очистить();
// Запускаем штатный механизм компоновки результата
СкомпоноватьРезультат(ЭлементыФормы.Результат);
// Задаем фиксацию верхних строк на элементе формы
ЭлементыФормы.Результат.ФиксацияСверху = 4; // число строк фиксации шапки
КонецПроцедуры
В управляемых формах для этих целей лучше использовать предназначенный для этого обработчик события таблицы. Мы можем использовать клиентское событие формы ПослеЗаполненияРезультата. Напишем в нем следующий код:
&НаКлиенте
Процедура ПослеЗаполненияРезультата(Результат)
// Устанавливаем фиксацию строк на клиенте, когда табличный документ уже полностью передан на форму
Результат.ФиксацияСверху = 3;
КонецПроцедуры
Использование этого обработчика гарантирует, что свойства фиксации будут применены к итоговому документу и не «слетят» из-за фонового выполнения или передачи контекста между сервером и клиентом. При необходимости изучить комплексные варианты переопределения логики отчетов можно использовать примеры программного формирования СКД и создания управляемых форм.
Раз уж мы затронули тему фиксации шапки таблицы при просмотре на экране, логично настроить ее автоматическое повторение при выводе отчета на печать. Чтобы при печати многостраничного отчета на каждом новом листе автоматически выводились заголовки колонок, мы можем использовать свойство ПовторятьПриПечатиСтроки нашего табличного документа.
Посмотрим на пример реализации этой полезной возможности в коде:
// Указываем область строк, которую необходимо дублировать на каждом печатном листе
// В данном примере мы повторяем вторую строку (шапку таблицы)
ДокументРезультат.ПовторятьПриПечатиСтроки = ДокументРезультат.Область("R2");
Обратите внимание, что в качестве параметра методу Область() передается адрес строки в формате "R" (Row). Например, если ваша шапка занимает со второй по третью строки, то конструкция будет выглядеть как ДокументРезультат.Область("R2:R3").
Если вы рисуете макет вручную на закладке «Макеты» в СКД, придерживайтесь следующих правил, чтобы избежать проблем с фиксацией:
ДокументРезультат.Области.ИмяВашейОбластиШапки.Низ. Это застрахует вас от сдвигов шапки из-за изменения количества параметров отчета в будущем.Применяя описанные подходы, вы сможете гибко управлять поведением шапки вашего отчета и сделаете работу пользователей с большими таблицами данных максимально комфортной и продуктивной.