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