Как зафиксировать строки шапки в отчетах на СКД?

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

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

Почему стандартные настройки СКД не всегда работают?

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

Решение проблемы через программный вывод

Для гарантированной фиксации строк мы воспользуемся механизмом программного формирования отчета. Основная точка входа для таких задач — процедура ПриКомпоновкеРезультата в модуле объекта отчета. В этой процедуре мы получаем доступ к готовому объекту ТабличныйДокумент, который является результатом работы СКД.

Рассмотрим пошаговый алгоритм реализации:

  1. Отменяем стандартную обработку формирования в процедуре ПриКомпоновкеРезультата, чтобы полностью контролировать процесс вывода.
  2. Используем стандартные процессоры СКД (ПроцессорКомпоновкиДанных и ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент).
  3. После того как отчет полностью сформирован и выведен в табличный документ, принудительно задаем свойство ФиксацияСверху.

Пример программной реализации

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


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

Важные замечания по реализации

При использовании этого метода стоит учитывать несколько важных моментов:

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

← На главную