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