В "Файлах публикации" находится обработка, в которой есть весь необходимый код и примеры, рассматриваемые ниже. Обработка универсальная и не зависит от используемой конфигурации. Протестирована на платформе 1С:Предприятие 8.3 (8.3.13.1926).
Пример 1: Знакомство
Как нужно было делать раньше:
ЭлементОформления = ЭтотОбъект.УсловноеОформление.Элементы.Добавить();
ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("А");
ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("Б");
ОтборОформления = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборОформления.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ХочуКрасненького");
ОтборОформления.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборОформления.ПравоеЗначение = Истина;
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.Красный);
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Белый);
Как можно делать теперь:
ОбъектНастройки = РеквизитФормыВЗначение("Объект").Настроить(ЭтотОбъект.УсловноеОформление)
.Элемент("А, Б")
.Отбор("ХочуКрасненького", "Равно", Истина)
.Оформление("ЦветФона", WebЦвета.Красный)
.Оформление("ЦветТекста", WebЦвета.Белый)
Да! Этот код не только проходит проверку синтаксиса, но и работает)
Пример 2: Группы отборов
Разрешите мне не приводить типовой код, а сразу показать новый способ с группами отборов:
ОбъектНастройки = РеквизитФормыВЗначение("Объект").Настроить(ЭтотОбъект.УсловноеОформление)
.Элемент("ТЗПримечание")
.ГруппаИЛИ()
.Отбор("ТЗ.К1", "Равно", 0)
.Отбор("ТЗ.К2", "Равно", 0)
.КонецГруппы()
.Оформление("Текст", "К1 или К2 не заполнено");
// Какие-то доп.условия
Если ХочуКрасненького Тогда
ОбъектНастройки
.Оформление("ЦветТекста", WebЦвета.Красный);
КонецЕсли;
// Продолжение настройки
ОбъектНастройки
.Элемент("ТЗПримечание")
.ГруппаИ()
.Отбор("ТЗ.К1", "НеРавно", 0)
.Отбор("ТЗ.К2", "НеРавно", 0)
.Отбор("ТЗ.К1", "Меньше", Новый ПолеКомпоновкиДанных("ТЗ.К2"))
.КонецГруппы()
.Оформление("Текст", "К1 < К2");
В конце описания каждой группы отборов добавляется КонецГруппы(). Эта конструкция позволяет избавиться от использования промежуточных переменных. Примеры с вложенными группами отборов смотрите ниже, в Примере 3.
Также, в этом примере видно, что код настройки не обязательно должен быть монолитным. ОбъектНастройки сохраняет в себе уже сделанные изменения и, при необходимости, позволяет продолжить настройку.
Пример 3: Сравнение типового (с использованием БСП) и нового способа
Под спойлером — код из типовой конфигурации.
Типовая настройка условного оформления с использованием БСП (код из БП 3.0)
// ТоварыСчетУчетаНДС
ЭлементУО = УсловноеОформление.Элементы.Добавить();
КомпоновкаДанныхКлиентСервер.ДобавитьОформляемоеПоле(ЭлементУО.Поля, "ТоварыСчетУчетаНДС");
ГруппаОтбора1 = КомпоновкаДанныхКлиентСервер.ДобавитьГруппуОтбора(ЭлементУО.Отбор.Элементы, ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли);
ОбщегоНазначенияКлиентСервер.ДобавитьЭлементКомпоновки(ГруппаОтбора1,
"РассчитыватьСуммаВРознице", ВидСравненияКомпоновкиДанных.Равно, Истина);
ГруппаОтбора2 = КомпоновкаДанныхКлиентСервер.ДобавитьГруппуОтбора(ГруппаОтбора1.Элементы, ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ);
ОбщегоНазначенияКлиентСервер.ДобавитьЭлементКомпоновки(ГруппаОтбора2,
"Объект.НДСВключенВСтоимость", ВидСравненияКомпоновкиДанных.Равно, Истина);
ОбщегоНазначенияКлиентСервер.ДобавитьЭлементКомпоновки(ГруппаОтбора2,
"УчетАгентскогоНДС", ВидСравненияКомпоновкиДанных.Равно, Ложь);
ОбщегоНазначенияКлиентСервер.ДобавитьЭлементКомпоновки(ГруппаОтбора1,
"ЭтоКомиссия", ВидСравненияКомпоновкиДанных.Равно, Истина);
ОбщегоНазначенияКлиентСервер.ДобавитьЭлементКомпоновки(ГруппаОтбора1,
"Объект.ВидОперации", ВидСравненияКомпоновкиДанных.Равно, Перечисления.ВидыОперацийПоступлениеТоваровУслуг.ВПереработку);
ЭлементУО.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);
// ТоварыЦенаВРознице
ЭлементУО = УсловноеОформление.Элементы.Добавить();
КомпоновкаДанныхКлиентСервер.ДобавитьОформляемоеПоле(ЭлементУО.Поля, "ТоварыЦенаВРознице");
ГруппаОтбора1 = КомпоновкаДанныхКлиентСервер.ДобавитьГруппуОтбора(ЭлементУО.Отбор.Элементы, ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли);
ГруппаОтбора2 = КомпоновкаДанныхКлиентСервер.ДобавитьГруппуОтбора(ГруппаОтбора1.Элементы, ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ);
ОбщегоНазначенияКлиентСервер.ДобавитьЭлементКомпоновки(ГруппаОтбора2,
"РассчитыватьСуммаВРознице", ВидСравненияКомпоновкиДанных.Равно, Истина);
ОбщегоНазначенияКлиентСервер.ДобавитьЭлементКомпоновки(ГруппаОтбора2,
"ТоварыСвернуты", ВидСравненияКомпоновкиДанных.Равно, Истина);
ОбщегоНазначенияКлиентСервер.ДобавитьЭлементКомпоновки(ГруппаОтбора2,
"НТТ", ВидСравненияКомпоновкиДанных.Равно, Истина);
ОбщегоНазначенияКлиентСервер.ДобавитьЭлементКомпоновки(ГруппаОтбора1,
"НТТ", ВидСравненияКомпоновкиДанных.Равно, Ложь);
ОбщегоНазначенияКлиентСервер.ДобавитьЭлементКомпоновки(ГруппаОтбора1,
"РассчитыватьСуммаВРознице", ВидСравненияКомпоновкиДанных.Равно, Ложь);
ЭлементУО.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);
// ТоварыСтавкаНДСВРознице
ЭлементУО = УсловноеОформление.Элементы.Добавить();
КомпоновкаДанныхКлиентСервер.ДобавитьОформляемоеПоле(ЭлементУО.Поля, "ТоварыСтавкаНДСВРознице");
ГруппаОтбора1 = КомпоновкаДанныхКлиентСервер.ДобавитьГруппуОтбора(ЭлементУО.Отбор.Элементы, ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли);
ОбщегоНазначенияКлиентСервер.ДобавитьЭлементКомпоновки(ГруппаОтбора1,
"РазделениеПоСтавкамВРознице", ВидСравненияКомпоновкиДанных.Равно, Ложь);
ОбщегоНазначенияКлиентСервер.ДобавитьЭлементКомпоновки(ГруппаОтбора1,
"НТТ", ВидСравненияКомпоновкиДанных.Равно, Ложь);
ОбщегоНазначенияКлиентСервер.ДобавитьЭлементКомпоновки(ГруппаОтбора1,
"РассчитыватьСуммаВРознице", ВидСравненияКомпоновкиДанных.Равно, Ложь);
ЭлементУО.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);
// ТоварыСуммаВРознице
ЭлементУО = УсловноеОформление.Элементы.Добавить();
КомпоновкаДанныхКлиентСервер.ДобавитьОформляемоеПоле(ЭлементУО.Поля, "ТоварыСуммаВРознице");
ГруппаОтбора1 = КомпоновкаДанныхКлиентСервер.ДобавитьГруппуОтбора(ЭлементУО.Отбор.Элементы, ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли);
ОбщегоНазначенияКлиентСервер.ДобавитьЭлементКомпоновки(ГруппаОтбора1,
"РассчитыватьСуммаВРознице", ВидСравненияКомпоновкиДанных.Равно, Ложь);
ОбщегоНазначенияКлиентСервер.ДобавитьЭлементКомпоновки(ГруппаОтбора1,
"НТТ", ВидСравненияКомпоновкиДанных.Равно, Ложь);
ЭлементУО.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);
// ТоварыСтавкаНДС, ТоварыСуммаНДС, ТоварыВсего, ТоварыНомерГТД, ТоварыСтранаПроисхождения
ЭлементУО = УсловноеОформление.Элементы.Добавить();
КомпоновкаДанныхКлиентСервер.ДобавитьОформляемоеПоле(ЭлементУО.Поля, "ТоварыСтавкаНДС");
КомпоновкаДанныхКлиентСервер.ДобавитьОформляемоеПоле(ЭлементУО.Поля, "ТоварыСуммаНДС");
КомпоновкаДанныхКлиентСервер.ДобавитьОформляемоеПоле(ЭлементУО.Поля, "ТоварыВсего");
КомпоновкаДанныхКлиентСервер.ДобавитьОформляемоеПоле(ЭлементУО.Поля, "ТоварыНомерГТД");
КомпоновкаДанныхКлиентСервер.ДобавитьОформляемоеПоле(ЭлементУО.Поля, "ТоварыСтранаПроисхождения");
КомпоновкаДанныхКлиентСервер.ДобавитьОформляемоеПоле(ЭлементУО.Поля, "ТоварыСпособУчетаНДС");
ОбщегоНазначенияКлиентСервер.ДобавитьЭлементКомпоновки(ЭлементУО.Отбор,
"Объект.ВидОперации", ВидСравненияКомпоновкиДанных.Равно, Перечисления.ВидыОперацийПоступлениеТоваровУслуг.ВПереработку);
ЭлементУО.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);
Стена текста! Для того, чтобы написать свою программную настройку условного оформления нужно было найти пример в конфигурации, накопипастить оттуда нужные куски и исправить их под свои нужды.
А теперь то же самое новым способом:
ОбъектНастройки = Обработки.НастройкаУсловногоОформления.Создать().Настроить(ЭтотОбъект.УсловноеОформление)
.Элемент("ТоварыСчетУчетаНДС")
.ГруппаИЛИ()
.Отбор("РассчитыватьСуммаВРознице", "Равно", Истина)
.ГруппаИ()
.Отбор("Объект.НДСВключенВСтоимость", "Равно", Истина)
.Отбор("УчетАгентскогоНДС", "Равно", Ложь)
.КонецГруппы()
.Отбор("ЭтоКомиссия", "Равно", Истина)
.Отбор("Объект.ВидОперации", "Равно", Перечисления.ВидыОперацийПоступлениеТоваровУслуг.ВПереработку)
.КонецГруппы()
.Оформление("Видимость", Ложь)
.Элемент("ТоварыЦенаВРознице")
.ГруппаИЛИ()
.ГруппаИ()
.Отбор("РассчитыватьСуммаВРознице", "Равно", Истина)
.Отбор("ТоварыСвернуты", "Равно", Истина)
.Отбор("НТТ", "Равно", Истина)
.КонецГруппы()
.Отбор("НТТ", "Равно", Ложь)
.Отбор("РассчитыватьСуммаВРознице", "Равно", Ложь)
.КонецГруппы()
.Оформление("Видимость", Ложь)
.Элемент("ТоварыСтавкаНДСВРознице")
.ГруппаИЛИ()
.Отбор("РазделениеПоСтавкамВРознице", "Равно", Ложь)
.Отбор("НТТ", "Равно", Ложь)
.Отбор("РассчитыватьСуммаВРознице", "Равно", Ложь)
.КонецГруппы()
.Оформление("Видимость", Ложь)
.Элемент("ТоварыСуммаВРознице")
.ГруппаИЛИ()
.Отбор("РассчитыватьСуммаВРознице", "Равно", Ложь)
.Отбор("НТТ", "Равно", Ложь)
.КонецГруппы()
.Оформление("Видимость", Ложь)
.Элемент("ТоварыСтавкаНДС,
|ТоварыСуммаНДС,
|ТоварыВсего,
|ТоварыНомерГТД,
|ТоварыСтранаПроисхождения,
|ТоварыСпособУчетаНДС")
.Отбор("Объект.ВидОперации", "Равно", Перечисления.ВидыОперацийПоступлениеТоваровУслуг.ВПереработку)
.Оформление("Видимость", Ложь)
Согласитесь, теперь стало гораздо понятнее и по наглядности сопоставимо с формой интерактивной настройки условного оформления.
Вывод
Использование нового способа программной настройки условного оформления позволяет писать лаконичный, структурированный и легкий для восприятия код.
Как это использовать у себя
- Скачайте обработку
- Встройте в конфигурацию или расширение с именем "НастройкаУсловногоОформления"
- При необходимости создания программной настройки условного оформления, пишите:
ОбъектНастройки = Обработки.НастройкаУсловногоОформления.Создать().Настроить(ЭтотОбъект.УсловноеОформление)
// и далее как в примерах
Смотрите также
Эта и многие другие возможности входят в состав [ЕХТ] Фреймворк для расширений.
Попробуйте, гарантирую — Вам понравится!
Идея классная! Код действительно выглядит чище.
Что касается оформления полей формы, не связанных с таблицей, то есть ограничения платформы. По моему раньше, до какого-то релиза в платформе, вообще не было возможности влиять на оформление не табличных полей формы через УО. Теперь похоже можно, но не все настройки действуют, например следующее оформление не сработало:
Бегло просматривая первые примеры показалось, что это описание штатных возможностей новой платформы. Даже обрадовался инженерной мысли разработчиков — не прошло и ста лет )) Потом вчитался…. увы нет. Не потому, что использовать нельзя, а потому, что в типовых конфигурациях такого подхода не увидим.
Код действительно смотрится намного аккуратнее. Внутри обработки тоже несколько простых и аккуратно оформленных методов, которые можно использовать и развивать. Спасибо!
(1) Да, некоторые параметры оформления платформа просто игнорирует, причем молча.
(2) А может начнут и в типовых использовать — ну не враги же они сами себе, в конце концов? Пока примеры искал, видел даже кое-где #Область уже используют.
Текучий интерфейс рулит!