Условное оформление

mikaelangelm 70 1 1 3

Добавление условного оформления одной строкой в элементы формы: ДинамическийСписок, ТаблицаФормы - поддерживает добавление сравниваемого значения при виде сравнения ВСписке - создание/подбор (отборы будут дополнены) элемента отбора - замена (т.е. удаление и создание заново, в т.ч. отборы - удаление (без создания) - исключение ПравоеЗначение из отбора, но не удалять само оформление

// Устанавливает Элемент УсловноеОформление
// 1) создает ЭлементУО 		(УсловноеОформление.Элементы; 	если не ПустаяСтрока(Представление) - пробует подобрать существующий)
// 2) создает ЭлементОформления (ЭлементУО.Поля.Элементы; 		если ЭлементУО подобран - не создает)
// 3) создает ЭлементОтбора 	(ЭлементУО.Отбор.Элементы; 		пробует сначала подобрать существующий по ПутьКДаннымПоля и ВидСравнения=ВСписке - в таком случае дополняет ПравоеЗначение) 
// СДЕЛАНО вынесено в срксСерверныйОбщий из документ.ПеремещениеТоваров.Формы.ФормаДокумента
// Доступность: Сервер 
//
// Параметры:   
// Форма - ФормаКлиентскогоПриложения, Произвольный - Коллекция с реквизитом УсловноеОформление типа Тип("УсловноеОформлениеКомпоновкиДанных")
// Элемент - ТаблицаФормы
// Представление - Строка - произвольное человекочитаемое имя УсловноеОформление.Элементы[N].Имя
// Параметр - Строка - Имя параметра который нужно оформлять, напр. "ЦветФона", или "Шрифт"
// Значение - Произвольный - Значение которое нужно установить параметру, напр. Новый Шрифт(...) или Новый Цвет(...)
// ПутьКДаннымПоля - Строка - Путь к данным на форме для отбора по условию , напр. "Объект.Товары.Номенклатура"
// ВидСравнения - ВидСравненияКомпоновкиДанных
// ПравоеЗначение - Произвольный - данные с которыми сравнивать, напр. Справочники.Номенклатура.НайтиПОНаименованию("Пакет")
// Действие - Число - 0 = просто создать/подобрать (отборы будут дополнены), 1 = заменить (т.е. удалить и создать заново, в т.ч. отборы), 2 = удалить (и не создавать),
// 					  3 = исключить ПравоеЗначение из отбора, но не удалять само оформление. Нужно для удобной смены отборов
Процедура УстановитьЭлементУсловногоОформления(Форма, Элемент, Представление = "", Параметр = Неопределено, Значение = Неопределено, ПутьКДаннымПоля = Неопределено, ВидСравнения = Неопределено, Знач ПравоеЗначение = Неопределено, Действие = 0) Экспорт 
	
	//ОН = срксСерверныйОбщий;       
	//Если Форма = Неопределено Тогда // для исп. в форме, как рекомендуют разработчики https://its.1c.ru/db/v8std/content/710/hdoc 
	//	Форма = ЭтаФорма
	//КонецЕсли;
	
	// Инициализация параметров оформления и отбора
	Если ПутьКДаннымПоля = Неопределено ИЛИ Не СтрНайти(ПутьКДаннымПоля, Элемент.ПутьКДанным) Тогда
		ПутьКДаннымПоля = Элемент.ПутьКДанным + "." + ?(ЗначениеЗаполнено(ПутьКДаннымПоля), ПутьКДаннымПоля, "НомерСтроки")
	КонецЕсли;
	Если ВидСравнения = Неопределено Тогда
		ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке  
	ИначеЕсли ТипЗнч(ВидСравнения) = Тип("Строка") Тогда
		ВидСравнения = ВидСравненияКомпоновкиДанных[ВидСравнения]
	КонецЕсли;  
	Если ПравоеЗначение = Неопределено Тогда
		ПравоеЗначение = 1	
	КонецЕсли;
	
	Если Параметр = Неопределено Тогда
		Параметр = "ЦветФона";
		Значение = ЦветаСтиля.ЦветАктивности; 
	КонецЕсли; 
	Если Значение = Неопределено Тогда
		Значение = ЦветаСтиля.ЦветАктивности; 
	КонецЕсли;
	
	// Подбор/создание элемента условного оформления
	Если Не ПустаяСтрока(Представление) Тогда Для Каждого _ Из Форма.УсловноеОформление.Элементы Цикл Если _.Представление = Представление Тогда
		ЭлементУсловногоОформления	= _;    
		Если Действие > 0 Тогда 
			Если Действие < 3 Тогда
				Форма.УсловноеОформление.Элементы.Удалить(ЭлементУсловногоОформления); 
			ИначеЕсли Действие = 3 Тогда
				_ПравоеЗначение = ЭлементУсловногоОформления.Отбор.Элементы[0].ПравоеЗначение;	
				Если ТипЗнч(_ПравоеЗначение) = Тип("СписокЗначений") Тогда
					_НайденныйЭлемент = _ПравоеЗначение.НайтиПоЗначению(ПравоеЗначение);
					Если _НайденныйЭлемент <> Неопределено Тогда
					    _ПравоеЗначение.Удалить(_НайденныйЭлемент);
					КонецЕсли;
				КонецЕсли;
			КонецЕсли;
			Если Действие = 1 Тогда
				УстановитьЭлементУсловногоОформления(Элемент, Представление, параметр, Значение, ПутьКДаннымполя, ВидСравнения, ПравоеЗначение)	
			КонецЕсли;
			Возврат;
		КонецЕсли;
		ДобавитьОформление 			= Ложь; 
		Прервать;
	КонецЕсли КонецЦикла КонецЕсли;
	Если Действие > 1 Тогда
		Возврат
	КонецЕсли;
	Если ЭлементУсловногоОформления = Неопределено Тогда
		ЭлементУсловногоОформления 	= Форма.УсловноеОформление.Элементы.Добавить();  
		ЭлементУсловногоОформления.Представление = Представление;
		ДобавитьОформление 			= Истина;
	КонецЕсли;
	 
	// добавляет элемент к оформлению (напр. элементы.Товары)
	Если ДобавитьОформление Тогда
		ЭлементОформления 			= ЭлементУсловногоОформления.Поля.Элементы.Добавить();
		ЭлементОформления.Поле 		= Новый ПолеКомпоновкиДанных(Элемент.Имя);  
		ЭлементОформления.Использование = Истина;
	КонецЕсли;
	// добавляет отбор (напр. по номеру строки из списка)
	ДобавитьОтбор = Истина;
	Для Каждого _ Из ЭлементУсловногоОформления.Отбор.Элементы Цикл 
		Если строка(_.ЛевоеЗначение) = ПутьКДаннымПоля И
			 _.ВидСравнения	 = ВидСравнения И
			 ВидСравнения	 = ВидСравненияКомпоновкиДанных.ВСписке
		Тогда 
			Если _.ПравоеЗначение.НайтиПоЗначению(ПравоеЗначение) = Неопределено Тогда
		    	_.ПравоеЗначение 	= Массив(_.ПравоеЗначение, ПравоеЗначение);
			КонецЕсли;                                                              
			ДобавитьОтбор			= Ложь;
			Прервать;
		КонецЕсли;
	КонецЦикла;  
	Если ДобавитьОтбор Тогда  
		ЭлементОтбора				= ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
		ЭлементОтбора.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных(ПутьКДаннымПоля);
		ЭлементОтбора.ВидСравнения   = ВидСравнения;    
		ЭлементОтбора.ПравоеЗначение = ?(ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке И Не ТипЗнч(ПравоеЗначение) = Тип("СписокЗначений"), Массив(Новый СписокЗначений, ПравоеЗначение), ПравоеЗначение);
		ЭлементОтбора.Использование  = Истина; 
	КонецЕсли;

	ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра(Параметр, Значение);

	//ЭлементУсловногоОформления.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
	//ЭлементУсловногоОформления.ИдентификаторПользовательскойНастройки = "Предустановленный";
	//ЭлементУсловногоОформления.Представление = НСтр("en='By status color';ru='По цвету статуса '");
	//ЭлементУсловногоОформления.Использование = Истина; 
	
КонецПроцедуры
0

См. также

УстановитьУсловноеОформлениеДереваПодсистем (БСП)

ЗаполнитьУсловноеОформлениеСпискаФайлов (БСП)

ЗаполнитьУсловноеОформлениеСпискаПапок (БСП)

Новый элемент условного оформления

СнятьУсловноеОформлениеСпискаЗначений (БСП)

Программное добавление условного оформления документа

УстановитьУсловноеОформлениеСпискаСертификатов (БСП)

Условное оформление на обычных формах (ОФ)

ПредставлениеЭлементаУсловногоОформления (БСП)

УстановитьУсловноеОформлениеПоляДата (БСП)

Модератору