Кое-что важное об условном оформлении
Столкнулся с проблемой в условном оформлении динамического списка, которая дважды поставила меня в тупик. Но, слава богу, я догадался в чем проблема. Думаю, вам будет полезна эта информация.
Первое. Нельзя использовать поля реквизитов.
Я хотел сделать условный отбор по полю номенклатуры в списке номенклатуры. Но увы, нельзя использовать реквизит поля для условного оформления. Я это понял, когда попробовал сделать условное оформление вручную.
Поэтому пришлось менять запрос динамического списка:
&НаСервере Процедура M_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка) Маркер = "СправочникНоменклатура.Весовой КАК Весовой,"; СписокЗапасы.ТекстЗапроса = СтрЗаменить(СписокЗапасы.ТекстЗапроса, Маркер, Маркер + " СправочникНоменклатура.дор_МинМаксЗаполнено КАК дор_МинМаксЗаполнено, "); СписокЗапасы.УстановитьОбязательноеИспользование("дор_МинМаксЗаполнено", Истина); ЭлементОформления = УсловноеОформление.Элементы.Добавить(); ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СписокЗапасы.дор_МинМаксЗаполнено"); // имя поля ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; // либо задаем свой ЭлементОтбора.ПравоеЗначение = Ложь; ЭлементОтбора.Использование = Истина; Элемент = ЭлементОформления.Оформление.Элементы.Найти("ЦветФона"); Элемент.Значение = WebЦвета.СеребристоСерый; Элемент.Использование = Истина; ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить(); ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("Наименование"); ПолеОформления.Использование = Истина; КонецПроцедуры
Второе. Реквизит условного оформления должен иметь галочку «Использовать всегда»
Но и после этого у меня не заработало. Методом проб и ошибок я решил проблему, программно установив галочку «Использовать всегда» у своего реквизита процедурой УстановитьОбязательноеИспользование.
Так что условное оформление таит в себе много нюансов, друзья…
UPD 2023-05-29: однако есть способ, который позволяет обойти все эти сложности. Мне подсказал его читатель в комментириях, вот он:
//=== Оформление поля мин-макс ЭлементОформления = СписокЗапасы.КомпоновщикНастроек.ФиксированныеНастройки.УсловноеОформление.Элементы.Добавить(); Элемент = ЭлементОформления.Оформление.Элементы.Найти("ЦветФона"); Элемент.Значение = WebЦвета.СеребристоСерый; Элемент.Использование = Истина; ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ЭлементОтбора.Использование = Истина; ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Номенклатура.дор_МинМаксЗаполнено"); ЭлементОтбора.ПравоеЗначение = Ложь; ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить(); ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("Наименование"); ПолеОформления.Использование = Истина;
Здесь вместо условного оформления формы используется условное оформление фиксированных настроек компоновщика настроек списка. Неисповедимы пути 1Сные!
Среда: 3.0.3.147 Платформа: 8.3.20.1710
Все прекрасно работает…
Процедура M_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
ЭлементОформления = СписокЗапасы.КомпоновщикНастроек.ФиксированныеНастройки.УсловноеОформление.Элементы.Добавить();
Элемент = ЭлементОформления.Оформление.Элементы.Найти(«ЦветФона»);
Элемент.Значение = WebЦвета.СеребристоСерый;
Элемент.Использование = Истина;
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«Номенклатура.дор_МинМаксЗаполнено»);
ЭлементОтбора.ПравоеЗначение = Ложь;
ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных(«Наименование»);
ПолеОформления.Использование = Истина;
КонецПроцедуры
не работает в условном оформлении формы. Но если это работает в компоновщике настроек списка, отлично.