Почему при условном оформлении динамического списка правое значение «В списке» получается пустым?

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

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

Выясняем причину: разница между массивом и списком значений

В тексте запросов 1С или при установке отборов в некоторых элементах формы платформа умеет автоматически преобразовывать объект типа Массив в список значений. Однако механизмы Система компоновки данных (СКД), на которых базируется динамический список, работают строго с определенными типами данных.

Для вида сравнения ВидСравненияКомпоновкиДанных.ВСписке (а также ВидСравненияКомпоновкиДанных.ВИерархическомСписке) свойство ПравоеЗначение элемента отбора ожидают объект типа СписокЗначений или ФиксированныйСписокЗначений. Если передать туда обычный Массив, платформа не сможет его корректно привязать, в результате чего правое значение останется пустым, а условное оформление не применится.

Правильный способ программной установки условия «В списке»

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

Посмотрим на пример правильной настройки:


// Создаем новый элемент условного оформления
ЭлементОформления = Список.УсловноеОформление.Элементы.Добавить();

// Задаем оформляемые поля и параметры (например, цвет фона)
ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("Наименование");
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.СветлоЗеленый);

// Добавляем условие отбора
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Статус");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;

// Формируем СписокЗначений вместо Массива
СписокСтатусов = Новый СписокЗначений;
СписокСтатусов.ЗагрузитьЗначения(МассивНужныхСтатусов);

// Присваиваем сформированный список
ЭлементОтбора.ПравоеЗначение = СписокСтатусов;
ЭлементОтбора.Использование = Истина;

Где искать элементы условного оформления динамического списка

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

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