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