Как программно управлять группировками динамического списка в 1С 8.3?

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

При работе с динамическими списками в 1С 8.3 часто возникает необходимость динамически отключать, включать или полностью переформировать группировки строк из программного кода. Однако разработчики сталкиваются с проблемой: группировки, заданные в конфигураторе на закладке настроек динамического списка, не всегда удается просто найти и изменить при обходе коллекции настроек компоновщика.

Рассмотрим подробно, почему это происходит и как правильно организовать управление группировками динамического списка через встроенный язык 1С.

Причины, по которым группировки отсутствуют в основной структуре настроек

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

  1. Загрузка пользовательских настроек. Если у динамического списка включено сохранение настроек пользователя, платформа при открытии формы автоматически восстанавливает сохраненный вариант из кеша, перекрывая исходную структуру настроек.
  2. Флаг «Включать в пользовательские настройки». Если в конфигураторе элемент был помечен как доступный для настройки пользователю, платформа перемещает его в коллекцию ПользовательскиеНастройки.Элементы.
  3. Использование предопределенной схемы. Предустановленные группировки хранятся в схеме компоновки данных динамического списка и применяются при инициализации контекста формы.

Программная настройка группировок на сервере

Если требуется гарантированно задать нужные группировки из кода (например, при открытии формы в процедуре ПриСозданииНаСервере), наиболее надежным подходом является очистка текущей структуры и программное добавление нужных группировок.

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


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

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

Обратите внимание: при программном добавлении элементов типа ПолеГруппировкиКомпоновкиДанных необходимо в обязательном порядке указывать свойство ТипДополнения = ТипДополненияПериодаКомпоновкиДанных.БезДополнения, иначе платформа может проигнорировать добавленное поле.

Поиск и изменение уже существующих группировок

Если группировка перенесена в состав пользовательских настроек, обращаться к ней следует через коллекцию пользовательских настроек компоновщика. В этом случае мы обходим коллекцию Список.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы, ищем элементы с типом ГруппировкаКомпоновкиДанных и меняем их свойство Использование.

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

Список.КомпоновщикНастроек.ФиксированныеНастройки.Структура

Особенности работы динамического списка с группировками

Проанализируем важные нюансы поведения динамических списков при включении группировок:

  1. Автоматическая смена режима отображения. Включение хотя бы одной группировки автоматически переводит динамический список из режима линейной таблицы в режим иерархического дерева.
  2. Управление начальным отображением. Раскрытием всех или только верхних уровней группировки при открытии формы можно управлять через свойство таблицы формы Элементы.Список.НачальноеОтображениеДерева (значения системного перечисления: РаскрыватьВсеУровни, РаскрыватьВерхнийУровень, НеРаскрывать).
  3. Влияние на производительность. Для корректного формирования иерархии платформ 1С выполняет дополнительные запросы к базе данных. Поля, по которым строятся группировки, должны быть проиндексированы в базе данных для предотвращения задержек при скроллинге.
← На главную