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

Публикация № 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 616 02.12.19 10:34 Сейчас в теме
Идея классная! Код действительно выглядит чище.

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

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

(2) А может начнут и в типовых использовать - ну не враги же они сами себе, в конце концов? Пока примеры искал, видел даже кое-где #Область уже используют.
2. Vladimir Litvinenko 2406 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 105 23.12.19 13:06 Сейчас в теме
Крутой функционал!
А у меня есть обработка, которая полностью генерирует код создания условного оформления на основе настроенного в конфигураторе:
https://infostart.ru/public/1171297/
Теперь вот думаю, может дописать сразу генерацию кода в вашем формате))
6. Igor030370 187 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 Сейчас в теме
А если немного доработать, то и условие сравнения можно писать сокращенно, н-р:
ОбъектНастройки = Обработки.НастройкаУсловногоОформления.Создать().Настроить(ЭтотОбъект.УсловноеОформление)
	
.Элемент("ТоварыСчетУчетаНДС")
	.ГруппаИЛИ()
		.Отбор("РассчитыватьСуммаВРознице",		"=", Истина)
		.ГруппаИ()
			.Отбор("Объект.НДСВключенВСтоимость",	"=", Истина)
			.Отбор("УчетАгентскогоНДС",		"=", Ложь)
		.КонецГруппы()	
		.Отбор("ЭтоКомиссия",				"=", Истина)
		.Отбор("Объект.ВидОперации",			"=", Перечисления.ВидыОперацийПоступлениеТоваровУслуг.ВПереработку)
	.КонецГруппы()	
	.Оформление("Видимость", Ложь)
		
.Элемент("ТоварыЦенаВРознице")
	.ГруппаИЛИ()
		.ГруппаИ()
			.Отбор("РассчитыватьСуммаВРознице",	"=", Истина)
			.Отбор("ТоварыСвернуты",		"=", Истина)
			.Отбор("НТТ",				"=", Истина)
		.КонецГруппы()
		.Отбор("НТТ",					"=", Ложь)
		.Отбор("РассчитыватьСуммаВРознице",		"=", Ложь)
	.КонецГруппы()
	.Оформление("Видимость", Ложь)
	
.Элемент("ТоварыСтавкаНДСВРознице")	
	.ГруппаИЛИ()
		.Отбор("РазделениеПоСтавкамВРознице",		"=", Ложь)
		.Отбор("НТТ",					"=", Ложь)
		.Отбор("РассчитыватьСуммаВРознице",		"=", Ложь)
	.КонецГруппы()
	.Оформление("Видимость", Ложь)
		
.Элемент("ТоварыСуммаВРознице")	
	.ГруппаИЛИ()
		.Отбор("РассчитыватьСуммаВРознице",		"=", Ложь)			
		.Отбор("НТТ",					"=", Ложь)
	.КонецГруппы()
	.Оформление("Видимость", Ложь)
			
.Элемент("ТоварыСтавкаНДС, 
	 |ТоварыСуммаНДС, 
	 |ТоварыВсего, 
	 |ТоварыНомерГТД, 
	 |ТоварыСтранаПроисхождения, 
	 |ТоварыСпособУчетаНДС")	
	.Отбор("Объект.ВидОперации",				"=", Перечисления.ВидыОперацийПоступлениеТоваровУслуг.ВПереработку)			
	.Оформление("Видимость", Ложь)
Показать
Оставьте свое сообщение

См. также

Универсальная выгрузка/загрузка данных для отличающихся конфигураций (JSON, Такси+ОФ) Промо

Перенос данных из 1C8 в 1C8 Универсальные обработки Распределенная БД (УРИБ, УРБД) v8 1cv8.cf Абонемент ($m)

Простой перенос через JSON данных между двумя базами 1С (документов, справочников, ПВХ, ПВР, счетов). Аналогична произвольной выгрузке в типовой "Выгрузка/загрузка XML", но может использоваться для отличающихся конфигураций. Подходит для любых пар баз с любым интерфейсом (управляемый + обычный). Без настроек. Не требует идентичности конфигураций и платформ. При переносе типы данных сопоставляются по наименованиям метаданных, объекты и ссылки по UID.

1 стартмани

22.10.2014    206166    3122    ekaruk    183    

Загрузка данных из 1С МиниДеньги в 1С:Деньги 8, редакция 2.0

Обмен через XML Перенос данных из 1C8 в 1C8 v8 Домашние учет и финансы УУ Абонемент ($m)

Обработка для первоначальной загрузки данных (справочников и операций) в настольную программу 1С:Деньги 8, редакция 2.0 из файлы резервной копии мобильной программы 1С Миниденьги.

2 стартмани

01.10.2015    15405    14    Claus32    5    

Редактор чеков ККМ Розница 2.0 - 2.3

Обработка документов Кассовые операции Розничная торговля Кассовые операции Розничная торговля v8 Розница Розничная и сетевая торговля (FMCG) Рестораны, кафе и фаст-фуд БУ НУ Абонемент ($m)

Обработка чеков ККМ списком (редактирование, удаление, ...). Переформирование ОРП, связь чеков с ОРП. Редактирование времени КС. Редактирование суммы и времени выемки.

1 стартмани

06.08.2015    50247    475    Dima_    83    

Загрузка из Excel в 1С:Розница

Обработка документов Обработка справочников Загрузка и выгрузка в Excel Учет ТМЦ Учет ТМЦ v8 Розница Россия УУ Абонемент ($m)

Универсальная загрузка Excel файлов в 1С:Розница 2.0

1 стартмани

27.05.2015    15037    90    KarinaSV    7    

Автоматическая установка себестоимости номенклатуры для конфигурации Розница 2.0 (2.1) +Бонус, исправляем ошибки при настройке расписания запуска для внешних обработок в Рознице 2.0

Ценообразование, прайсы Обработка документов Розничная торговля Ценообразование, анализ цен Розничная торговля Ценообразование, анализ цен v8 Розница Розничная и сетевая торговля (FMCG) Россия УУ Абонемент ($m)

Обработка для автоматического создания документов Установка себестоимости, в случае если себестоимость не установлена на момент продажи. Помогает упростить установку себестоимости номенклатуры, если у вас в базе ведется учет по нескольким магазинам. Тестировалась на релизе 2.0.8.12 и 2.1.7.14. Подойдет для тех систем, где себестоимость номенклатуры одинакова для всех магазинов.

1 стартмани

31.03.2014    26923    38    sanches    15    

Выемка денежных средств из КассыККМ. Розница 2.0

Кассовые операции ККМ Кассовые операции v8 Розница УУ Абонемент ($m)

Уставшим от отсутствия ВыемкиДС после закрытия кассовой смены посвящается. Подключаемая обработка. Управляемый интерфейс.

1 стартмани

12.12.2012    76181    287    StepByStep    40