[Взрыв шаблона!] Новый способ программной настройки условного оформления


Условное оформление форм и списков это великолепная возможность их настройки по заданным условиям. Но существенным недостатком является трудоемкость написания и сопровождения программного кода. В публикации предлагается новый способ программной настройки условного оформления.

 

В "Файлах публикации" находится обработка, в которой есть весь необходимый код и примеры, рассматриваемые ниже. Обработка универсальная и не зависит от используемой конфигурации. Протестирована на платформе 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)

 

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

А теперь то же самое новым способом:

ОбъектНастройки = Обработки.НастройкаУсловногоОформления.Создать().Настроить(ЭтотОбъект.УсловноеОформление)

.Элемент("ТоварыСчетУчетаНДС")
.ГруппаИЛИ()
.Отбор("РассчитыватьСуммаВРознице",  "Равно", Истина)
.ГруппаИ()
.Отбор("Объект.НДСВключенВСтоимость", "Равно", Истина)
.Отбор("УчетАгентскогоНДС",  "Равно", Ложь)
.КонецГруппы()
.Отбор("ЭтоКомиссия",    "Равно", Истина)
.Отбор("Объект.ВидОперации",   "Равно", Перечисления.ВидыОперацийПоступлениеТоваровУслуг.ВПереработку)
.КонецГруппы()
.Оформление("Видимость", Ложь)

.Элемент("ТоварыЦенаВРознице")
.ГруппаИЛИ()
.ГруппаИ()
.Отбор("РассчитыватьСуммаВРознице", "Равно", Истина)
.Отбор("ТоварыСвернуты",  "Равно", Истина)
.Отбор("НТТ",    "Равно", Истина)
.КонецГруппы()
.Отбор("НТТ",     "Равно", Ложь)
.Отбор("РассчитыватьСуммаВРознице",  "Равно", Ложь)
.КонецГруппы()
.Оформление("Видимость", Ложь)

.Элемент("ТоварыСтавкаНДСВРознице")
.ГруппаИЛИ()
.Отбор("РазделениеПоСтавкамВРознице",  "Равно", Ложь)
.Отбор("НТТ",     "Равно", Ложь)
.Отбор("РассчитыватьСуммаВРознице",  "Равно", Ложь)
.КонецГруппы()
.Оформление("Видимость", Ложь)

.Элемент("ТоварыСуммаВРознице")
.ГруппаИЛИ()
.Отбор("РассчитыватьСуммаВРознице",  "Равно", Ложь)
.Отбор("НТТ",     "Равно", Ложь)
.КонецГруппы()
.Оформление("Видимость", Ложь)

.Элемент("ТоварыСтавкаНДС,
|ТоварыСуммаНДС,
|ТоварыВсего,
|ТоварыНомерГТД,
|ТоварыСтранаПроисхождения,
|ТоварыСпособУчетаНДС")
.Отбор("Объект.ВидОперации",    "Равно", Перечисления.ВидыОперацийПоступлениеТоваровУслуг.ВПереработку)
.Оформление("Видимость", Ложь)
Согласитесь, теперь стало гораздо понятнее и по наглядности сопоставимо с формой интерактивной настройки условного оформления.
 

Вывод

Использование нового способа программной настройки условного оформления позволяет писать лаконичный, структурированный и легкий для восприятия код.

 

Как это использовать у себя

  • Скачайте обработку
  • Встройте в конфигурацию или расширение с именем "НастройкаУсловногоОформления"
  • При необходимости создания программной настройки условного оформления, пишите:
ОбъектНастройки = Обработки.НастройкаУсловногоОформления.Создать().Настроить(ЭтотОбъект.УсловноеОформление)
// и далее как в примерах
 

Смотрите также

Эта и многие другие возможности входят в состав [ЕХТ] Фреймворк для расширений.

Попробуйте, гарантирую — Вам понравится!

4 Comments

  1. kalyaka

    Идея классная! Код действительно выглядит чище.

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

    ХочуКрасненького = Ложь;
    
    ЭтотОбъект.УсловноеОформление.Элементы.Очистить();
    ОбъектНастройки = РеквизитФормыВЗначение(«Объект»).Настроить(ЭтотОбъект.УсловноеОформление)
    .Элемент(«А, Б»)
    .Отбор(«ХочуКрасненького», «Равно», Ложь)
    .Оформление(«Видимость», Ложь)
    Reply
  2. Vladimir Litvinenko

    Бегло просматривая первые примеры показалось, что это описание штатных возможностей новой платформы. Даже обрадовался инженерной мысли разработчиков — не прошло и ста лет )) Потом вчитался…. увы нет. Не потому, что использовать нельзя, а потому, что в типовых конфигурациях такого подхода не увидим.

    Код действительно смотрится намного аккуратнее. Внутри обработки тоже несколько простых и аккуратно оформленных методов, которые можно использовать и развивать. Спасибо!

    Reply
  3. mszsuz

    (1) Да, некоторые параметры оформления платформа просто игнорирует, причем молча.

    (2) А может начнут и в типовых использовать — ну не враги же они сами себе, в конце концов? Пока примеры искал, видел даже кое-где #Область уже используют.

    Reply
  4. brr

    Текучий интерфейс рулит!

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *