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