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