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

mikaelangelm 58 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

Рекомендации

См. также

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

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

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

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

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

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

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

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

Подключение внешней обработки/отчета, пример оформления модуля объекта

Обновлятор-1С: групповое (пакетное) обновление и обслуживание всех баз за один раз

Комментарии

Модератору