Как изменить количество закрепленных колонок в отчете на СКД?

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

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

Способ 1. Настройка фиксации через Конструктор схемы компоновки данных

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

  1. Откроем Схему компоновки данных нашего отчета.
  2. Перейдем на закладку Настройки.
  3. Выберем в дереве настроек самый верхний элемент (Отчет) или конкретную группировку, для которой нужно настроить закрепление.
  4. В нижней части окна перейдем на вкладку Другие настройки.
  5. Найдем параметр Фиксация слева.

По умолчанию здесь установлено значение Авто. В этом режиме платформа самостоятельно анализирует структуру отчета и фиксирует все колонки, которые являются заголовками строк (группировками), расположенными слева от ресурсов. Чтобы принудительно установить количество колонок, мы можем выбрать числовое значение. Если нам нужно оставить только одну закрепленную колонку, установим значение 1. Если же мы хотим полностью убрать закрепление, следует выбрать значение 0 или Не фиксировать.

Способ 2. Программная фиксация в модуле объекта

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

Проанализируем следующий код:


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

КонецПроцедуры

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

Почему программный код может не работать?

Иногда возникают ситуации, когда мы добавили код в процедуру ПриКомпоновкеРезультата, поставили точку останова, но программа в нее даже не заходит. Выясним причины такого поведения:

  1. Наличие формы отчета: Если в отчете создана пользовательская форма, проверьте свойства самой формы. Если в поле РезультатОтчета (или аналогичном) указано имя реквизита табличного документа, платформа может использовать стандартные механизмы вывода, минуя обработчик модуля объекта в некоторых режимах.
  2. Самописные кнопки формирования: Это самая частая причина. Если на форме создана команда "Сформировать", которая вызывает собственный алгоритм вывода, стандартное событие ПриКомпоновкеРезультата не вызывается автоматически.
  3. Фоновое выполнение: В современных конфигурациях отчеты часто формируются в фоновом задании на сервере. В этом случае отладка требует подключения к серверным сеансам, иначе точка останова не сработает, хотя код выполняется.

Если отчет формируется через кастомную процедуру на форме (например, ВывестиОтчет()), нам необходимо явно вызвать метод компоновки внутри этой процедуры:


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

Нюансы работы с "Авто" фиксацией и кешем

Рассмотрим ситуацию, когда фиксация "залипла" и не меняется. Проанализируем роль кеша и метаданных. Иногда платформа запоминает настройки пользователя (пользовательские настройки), которые имеют приоритет над настройками разработчика. Если пользователь ранее настраивал вариант отчета и сохранил его, изменения в конфигураторе могут не примениться к существующему сеансу. В таком случае стоит попробовать сбросить настройки отчета к стандартным через меню "Все действия" -> "Установить стандартные настройки" в режиме 1С:Предприятие.

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

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

← На главную