Как исправить рассинхронизацию группировок строк в настройках и вариантах отчетов СКД

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

При разработке или доработке отчетов на базе Системы компоновки данных (СКД) в управляемом интерфейсе программисты часто сталкиваются с неприятным эффектом: пользователь меняет порядок группировок в окне «Настройки», но при открытии окна «Изменить вариант» (через меню «Ещё») видит старую структуру. Или, что еще хуже, отчет формируется по одним правилам, а в интерфейсе отображаются другие. Разберем детально, почему это происходит и как обеспечить жесткую синхронизацию этих настроек.

Понимаем архитектуру уровней настроек СКД

Для начала проанализируем, как 1С работает с настройками «под капотом». В объекте КомпоновщикНастроек сосуществуют три различных слоя, которые могут конфликтовать между собой:

  1. Настройки (Settings): Это основной «каркас» отчета. Именно здесь определяется полная структура: дерево группировок, выбранные поля, иерархия. Когда мы заходим в «Ещё -> Изменить вариант», мы правим именно этот объект.
  2. Пользовательские настройки (UserSettings): Это облегченная версия настроек, предназначенная для быстрого доступа. Сюда выносятся конкретные отборы, параметры или отдельные группировки, чтобы пользователь мог менять их прямо на форме отчета, не погружаясь в дебри конструктора варианта.
  3. Фиксированные настройки: Параметры, которые жестко заданы программно и не подлежат изменению пользователем.

Выясним причину проблемы: рассинхронизация возникает тогда, когда связь между Settings и UserSettings обрывается. Каждая пользовательская настройка имеет свой уникальный идентификатор (ИдентификаторПользовательскойНастройки). Если в основном варианте (Settings) мы меняем порядок группировок, компоновщик должен обновить их и в пользовательском слое. В типовых конфигурациях (например, на базе БСП) это происходит автоматически через стандартные обработчики, но в самописных решениях или при переносе управляемых форм в старые конфигурации (как УТ 10.3) этот механизм может не срабатывать.

Решение 1: Проверка схемы компоновки данных

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

Разберем по шагам действия в конструкторе СКД:

  1. Откроем схему компоновки данных на закладке «Настройки».
  2. Выберем нужную группировку в дереве настроек.
  3. В нижней части окна найдем вкладку «Пользовательские настройки» (иконка с изображением человечка).
  4. Убедимся, что установлен флаг «Включать в пользовательские настройки».
  5. Установим режим редактирования «Обычный» или «Быстрый доступ».

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

Решение 2: Программная синхронизация в форме отчета

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

Для этого в модуле управляемой формы отчета проанализируем событие ПриЗагрузкеВариантаНаСервере или ПослеЗагрузкиВариантаНаСервере. Нам необходимо вызвать метод загрузки пользовательских настроек:


&НаСервере
Процедура ПослеЗагрузкиВариантаНаСервере(Настройки)
    // Синхронизируем пользовательские настройки с основным вариантом
    Отчет.КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки();
КонецПроцедуры

Этот метод берет актуальную структуру из КомпоновщикНастроек.Settings и обновляет КомпоновщикНастроек.UserSettings, сопоставляя их по идентификаторам. Если порядок группировок в Settings изменился, он будет корректно транслирован в пользовательское окно настроек.

Решение 3: Правильное формирование результата

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

Рассмотрим правильный алгоритм получения результирующих настроек:


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

Метод ПолучитьНастройки() является ключевым. Он выполняет «слияние» (мерж) всех слоев настроек. Если вы используете напрямую КомпоновщикНастроек.Settings, вы проигнорируете быстрые правки пользователя. Если используете только UserSettings, вы потеряете структуру группировок.

Решение 4: Очистка кэша пользовательских настроек

В управляемом интерфейсе 1С активно кеширует настройки пользователей. Если вы изменили структуру СКД (например, удалили или переименовали группировку в конфигураторе), старый «слепок» пользовательских настроек в базе данных может конфликтовать с новой структурой.

Проанализируем шаги для исправления ситуации «зависших» настроек:

После этой процедуры при открытии отчета 1С заново инициализирует КомпоновщикНастроек на основании актуальной схемы СКД, и рассинхронизация исчезнет.

Итоги и рекомендации

Мы разобрали, что рассинхронизация — это не «баг» платформы, а следствие разделения настроек на уровни. Для стабильной работы в доработанных конфигурациях вроде УТ 10.3 придерживайтесь следующих правил:

1. Всегда проверяйте наличие флага «Включать в пользовательские настройки» для группировок, порядок которых важен пользователю.

2. При использовании программного формирования отчета всегда вызывайте КомпоновщикНастроек.ПолучитьНастройки().

3. Если вы создаете форму отчета вручную, не забудьте прописать вызовы обновления пользовательских настроек при смене варианта или программном изменении структуры отчета.

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

← На главную