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

Публикация № 1161402

Разработка - Работа с интерфейсом

ЕХТ Условное оформление

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

 

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

 

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

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

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

Вывод

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

 

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

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

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

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

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

Скачать файлы

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

.epf 13,31Kb
01.12.19
39
.epf 13,31Kb 39 Скачать

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. kalyaka 611 02.12.19 10:34 Сейчас в теме
Идея классная! Код действительно выглядит чище.

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

ЭтотОбъект.УсловноеОформление.Элементы.Очистить();
ОбъектНастройки = РеквизитФормыВЗначение("Объект").Настроить(ЭтотОбъект.УсловноеОформление)
   .Элемент("А, Б")
      .Отбор("ХочуКрасненького", "Равно", Ложь)
      .Оформление("Видимость", Ложь)
3. mszsuz 238 02.12.19 11:48 Сейчас в теме
(1) Да, некоторые параметры оформления платформа просто игнорирует, причем молча.

(2) А может начнут и в типовых использовать - ну не враги же они сами себе, в конце концов? Пока примеры искал, видел даже кое-где #Область уже используют.
2. Vladimir Litvinenko 2397 02.12.19 11:22 Сейчас в теме
Бегло просматривая первые примеры показалось, что это описание штатных возможностей новой платформы. Даже обрадовался инженерной мысли разработчиков - не прошло и ста лет )) Потом вчитался.... увы нет. Не потому, что использовать нельзя, а потому, что в типовых конфигурациях такого подхода не увидим.

Код действительно смотрится намного аккуратнее. Внутри обработки тоже несколько простых и аккуратно оформленных методов, которые можно использовать и развивать. Спасибо!
cleaner_it; work.sable; +2 Ответить
4. brr 179 02.12.19 13:55 Сейчас в теме
Текучий интерфейс рулит!
8. Andry.Boris 58 10.02.20 18:34 Сейчас в теме
Интересное решение.
Решил проверить.
платформе 1С:Предприятие 8.3 (8.3.14.1976)


{Обработка.Обработка1.Форма.Форма.Форма(4)}: Метод объекта не обнаружен (Настроить)
ОбъектНастройки = РеквизитФормыВЗначение("Объект").Настроить(ЭтотОбъект.УсловноеОформление)

Проверку проходит дормально, а вот исполнение хромает.
Подскажите, что делаю не так.
5. XilDen 98 23.12.19 13:06 Сейчас в теме
Крутой функционал!
А у меня есть обработка, которая полностью генерирует код создания условного оформления на основе настроенного в конфигураторе:
https://infostart.ru/public/1171297/
Теперь вот думаю, может дописать сразу генерацию кода в вашем формате))
6. Igor030370 186 10.02.20 09:05 Сейчас в теме
Вот что это напоминает.
Оператор With... End With (Visual Basic)

Выполняет последовательность операторов, которые многократно ссылаются на единственный объект или структуру, чтобы операторы могли использовать упрощенный синтаксис доступ к членам объекта или структуры. При использовании структуры можно только считывать значения членов или вызвать методы. При попытке присвоения значений членам структуры, используемым в операторе With...End With, возникает ошибка.
Синтаксис
VB

With objectExpression
[ statements ]
End With

Когда-то давно "пописывал" на VB)))
purgin; user764477; +2 Ответить
7. user764477 10.02.20 14:07 Сейчас в теме
(6)Тоже напомнило. и да, мне не хватало With в 1с
9. mszsuz 238 10.02.20 18:43 Сейчас в теме
(8) В конце публикации есть описание "Как это использовать у себя"
10. ILM 238 16.02.20 13:28 Сейчас в теме
Ну это же так "важно" для бизнеса? Настройки оформления, как бизнес жил без этого и жить дальше будет? (это был сарказм).
11. user976948 17.02.20 14:33 Сейчас в теме
Здесь последовательность вызовов смотрится органично
12. mszsuz 238 21.09.20 12:42 Сейчас в теме
А если немного доработать, то и условие сравнения можно писать сокращенно, н-р:
ОбъектНастройки = Обработки.НастройкаУсловногоОформления.Создать().Настроить(ЭтотОбъект.УсловноеОформление)
	
.Элемент("ТоварыСчетУчетаНДС")
	.ГруппаИЛИ()
		.Отбор("РассчитыватьСуммаВРознице",		"=", Истина)
		.ГруппаИ()
			.Отбор("Объект.НДСВключенВСтоимость",	"=", Истина)
			.Отбор("УчетАгентскогоНДС",		"=", Ложь)
		.КонецГруппы()	
		.Отбор("ЭтоКомиссия",				"=", Истина)
		.Отбор("Объект.ВидОперации",			"=", Перечисления.ВидыОперацийПоступлениеТоваровУслуг.ВПереработку)
	.КонецГруппы()	
	.Оформление("Видимость", Ложь)
		
.Элемент("ТоварыЦенаВРознице")
	.ГруппаИЛИ()
		.ГруппаИ()
			.Отбор("РассчитыватьСуммаВРознице",	"=", Истина)
			.Отбор("ТоварыСвернуты",		"=", Истина)
			.Отбор("НТТ",				"=", Истина)
		.КонецГруппы()
		.Отбор("НТТ",					"=", Ложь)
		.Отбор("РассчитыватьСуммаВРознице",		"=", Ложь)
	.КонецГруппы()
	.Оформление("Видимость", Ложь)
	
.Элемент("ТоварыСтавкаНДСВРознице")	
	.ГруппаИЛИ()
		.Отбор("РазделениеПоСтавкамВРознице",		"=", Ложь)
		.Отбор("НТТ",					"=", Ложь)
		.Отбор("РассчитыватьСуммаВРознице",		"=", Ложь)
	.КонецГруппы()
	.Оформление("Видимость", Ложь)
		
.Элемент("ТоварыСуммаВРознице")	
	.ГруппаИЛИ()
		.Отбор("РассчитыватьСуммаВРознице",		"=", Ложь)			
		.Отбор("НТТ",					"=", Ложь)
	.КонецГруппы()
	.Оформление("Видимость", Ложь)
			
.Элемент("ТоварыСтавкаНДС, 
	 |ТоварыСуммаНДС, 
	 |ТоварыВсего, 
	 |ТоварыНомерГТД, 
	 |ТоварыСтранаПроисхождения, 
	 |ТоварыСпособУчетаНДС")	
	.Отбор("Объект.ВидОперации",				"=", Перечисления.ВидыОперацийПоступлениеТоваровУслуг.ВПереработку)			
	.Оформление("Видимость", Ложь)
Показать
Оставьте свое сообщение

См. также

Публикаций не найдено

Попробуйте расширить область поиска, проверьте поисковый запрос и повторите попытку.

Или закажите индивидуальную разработку вашего решения.

Создать заказ на разработку