Для примера размещу на форме реквизиты объекта Сумма_1, Сумма_2, реквизит формы Сумма_3. Также на форму вынесу динамический список документов Заказ клиента с наименованием Список_ЗаказыКлиентов. И покажу как программным образом установить условное оформление для данных элементов формы.
Задача будет разбиваться на несколько подзадач:
1) Раскрасить фон элемента Сумма_1 в красный цвет, если его значение равно числу 3;
2) Раскрасить фон элемента Сумма_2 в красный цвет, если его значение не равно значению реквизита Сумма_1;
3) Раскрасить фон элемента Сумма_3 в красный цвет, если его значение не равно значению реквизита Сумма_1, но не забываем, что Сумма_3 - это реквизит формы, а не реквизит объекта как Сумма_1 и Сумма_2;
4) Раскрасить фон строк заказов в голубой цвет при условии, что статус заказа не равно "К отгрузке", и склад равно "Основной склад";
5) Установить жирный шрифт текста в колонке "Сумма документа" для тех строк заказов, сумма которых превышает 1000;
6) Раскрасить фон строк заказов в красный цвет, если значение в колонке "Дата получения заказа клиентом" меньше, чем текущая дата. Данная подзадача содержит в себе некоторую сложность, которая заключается в том, что текущая дата - это не постоянная величина, и необходимо при каждом изменении текущей даты обновлять данное условие в условном оформлении. Я покажу как это можно сделать, используя обработчик ожидания. Для этого в динамическом списке заказов клиентов необходимо включить галку "Произвольный запрос" и в текст запроса добавить поле "ТекДата", которое будет представлять из себя параметр, в который будет устанавливаться текущая дата:
Далее в модуле формы добавляем следующий код:
В процедуре ПриСозданииНаСервере добавляем:
Список_ЗаказыКлиентов.Параметры.УстановитьЗначениеПараметра("ТекДата",ТекущаяДата()); // при создании формы сразу же устанавливаем параметр ТекДата
УстановитьУсловноеОформление();
В процедуре ПриОткрытии вызываем обработчик ожидания, который будет через каждые 30 секунд обновлять параметр ТекДата актуальным значением:
ПодключитьОбработчикОжидания("УстановитьТекущуюДатуВЗапросе",30);
Добавляем саму процедуру обработчика ожидания:
&НаКлиенте
Процедура УстановитьТекущуюДатуВЗапросе() Экспорт
Список_ЗаказыКлиентов.Параметры.УстановитьЗначениеПараметра("ТекДата",ТекущаяДата());
КонецПроцедуры
Добавляем саму процедуру условного оформления для всех вышеприведенных подзадач:
&НаСервере
Процедура УстановитьУсловноеОформление()
УсловноеОформление.Элементы.Очистить();
// 1) Оформляем фон элемента "Сумма_1" в красный цвет, при условии что Объект.Сумма_1 = 3
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Сумма_1.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Сумма_1");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = 3;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.Красный);
// 2) Оформляем фон элемента "Сумма_2" в красный цвет, при условии что Объект.Сумма_1 <> Объект.Сумма_2
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Сумма_2.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Сумма_1");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно;
ОтборЭлемента.ПравоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Сумма_2");
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.Красный);
// 3) Оформляем фон элемента "Сумма_3" в красный цвет, при условии что Объект.Сумма_1 <> Сумма_3
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Сумма_3.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Сумма_1");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно;
ОтборЭлемента.ПравоеЗначение = Новый ПолеКомпоновкиДанных("Сумма_3");
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.Красный);
// 4) Оформляем фон всех колонок в голубой цвет для всех строк, у которых Статус <> "К отгрузке" и Склад = "Основной склад"
// в данном примере дополнительно показывается как объединять несколько условий в группу "И"
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Список_ЗаказыКлиентов.Имя);
ГруппаОтбораЭлементовИ = Элемент.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
ГруппаОтбораЭлементовИ.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;
ОтборЭлемента = ГруппаОтбораЭлементовИ.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Список_ЗаказыКлиентов.Склад");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Справочники.Склады.НайтиПоКоду("00001"); //Основной склад
ОтборЭлемента = ГруппаОтбораЭлементовИ.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Список_ЗаказыКлиентов.Статус");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно;
ОтборЭлемента.ПравоеЗначение = Перечисления.СтатусыЗаказовКлиентов.КОтгрузке;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.Голубой);
// 5) Оформляем шрифт в жирный шрифт для колонки Сумма документа, при условии, что Сумма документа больше 1000
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Список_ЗаказыКлиентовСуммаДокумента.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Список_ЗаказыКлиентов.СуммаДокумента");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
ОтборЭлемента.ПравоеЗначение = 1000;
Элемент.Оформление.УстановитьЗначениеПараметра("Шрифт", Новый Шрифт(,,Истина)); // жирный шрифт
// 6) Оформляем фон всех колонок в красный цвет для всех строк, у которых Дата получения заказа клиентом меньше, чем текущая дата
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Список_ЗаказыКлиентов.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Список_ЗаказыКлиентов.ДатаПолученияЗаказаКлиентомОт");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Меньше;
ОтборЭлемента.ПравоеЗначение = Новый ПолеКомпоновкиДанных("Список_ЗаказыКлиентов.ТекДата");
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.Красный);
КонецПроцедуры
В итоге должно получиться следующим образом:
Есть один важный момент - все реквизиты, которые участвуют в условном оформлении, должны быть вынесены на форму. Например, если в 6-ой подзадаче не вынести на форму поле "Тек дата", то условное оформление не будет работать для данной подзадачи. Конечно, можно убрать видимость данного поля, используя соответствующее свойство данного элемента, но физически на форме этот элемент должен обязательно находиться.