Почему не работает фиксация колонок слева в отчете на СКД и как это исправить?

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

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

Причины сброса настроек фиксации

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

Способ 1: Отключение стандартной обработки вывода

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

Для этого в процедуре ПриКомпоновкеРезультата мы устанавливаем флаг СтандартнаяОбработка = Ложь. Рассмотрим пример реализации:


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

Способ 2: Использование обработчика ожидания

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

Разберем, как это реализовать:

  1. В модуле формы отчета создаем процедуру, которая будет устанавливать фиксацию.
  2. В процедуре ПриКомпоновкеРезультата или ПослеКомпоновкиРезультата подключаем вызов этой процедуры через ПодключитьОбработчикОжидания с интервалом, например, в 0.1 секунды.

// В модуле формы
&НаКлиенте
Процедура УстановитьФиксациюПослеФормирования(ИмяКоманды) Экспорт
    Элементы.Результат.ФиксацияСлева = 6;
    ОтключитьОбработчикОжидания("УстановитьФиксациюПослеФормирования");
КонецПроцедуры

// В модуле объекта или формы при завершении вывода
ПодключитьОбработчикОжидания("УстановитьФиксациюПослеФормирования", 0.1, Истина);

Рекомендации по оптимизации

Чтобы избежать конфликтов с отображением, проанализируйте следующие моменты:

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

← На главную