Условное оформление с группировкой в 1С

Сегодня рассмотрим такую задачу: нам нужно на форме программно установить условное оформление, при этом объединив условия в логические группы.

Постановка

Для примера, предположим, что у нас есть список контрагентов. Каждый контрагент имеет заполненные поля Задолженность и Уровень риска. Задолженность отражает текущий уровень дебиторской задолженности (в рублях) перед нашей компанией. Уровень риска (варианты: Низкий, Средний, Высокий), в свою очередь, отражает уровень риска проведения сделок с данным контрагентом. Требуется выделить красным те из них, которые имеют задолженность свыше 1 миллиона рублей, либо чей уровень риска оценивается как Высокий.

Визуальная настройка

Для начала попытаемся решить задачу с помощью визуальной настройки условного оформления. Для этого выбираем интересующую форму и открываем ссылку УсловноеОформление в Конфигураторе. Задаём Отбор, Оформление и выбираем Оформляемые поля.

Обратите внимание, что условия сгруппированы в Группу ИЛИ. Таким образом, оформление подключится при наступлении любого из указанных событий.

Настройка завершена. Проверяем результат.

Всё прошло успешно. «Проблемные» контрагенты подсвечены красным цветом.

Программная настройка

Теперь реализуем такую же функциональность, используя программный интерфейс.

Позаимствуем код из Библиотеки стандартных подсистем (для компактности публикации я вырезал комментарии):

&НаКлиентеНаСервереБезКонтекста
Функция НайтиЭлементОтбораПоПредставлению(КоллекцияЭлементов, Представление) Экспорт
	
	ВозвращаемоеЗначение = Неопределено;
	
	Для каждого ЭлементОтбора Из КоллекцияЭлементов Цикл
		Если ЭлементОтбора.Представление = Представление Тогда
			ВозвращаемоеЗначение = ЭлементОтбора;
			Прервать;
		КонецЕсли;
	КонецЦикла;
	
	Возврат ВозвращаемоеЗначение
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция СоздатьГруппуЭлементовОтбора(Знач КоллекцияЭлементов, Представление, ТипГруппы) Экспорт
	
	Если ТипЗнч(КоллекцияЭлементов) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных") Тогда
		КоллекцияЭлементов = КоллекцияЭлементов.Элементы;
	КонецЕсли;
	
	ГруппаЭлементовОтбора = НайтиЭлементОтбораПоПредставлению(КоллекцияЭлементов, Представление);
	Если ГруппаЭлементовОтбора = Неопределено Тогда
		ГруппаЭлементовОтбора = КоллекцияЭлементов.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
	Иначе
		ГруппаЭлементовОтбора.Элементы.Очистить();
	КонецЕсли;
	
	ГруппаЭлементовОтбора.Представление    = Представление;
	ГруппаЭлементовОтбора.Применение       = ТипПримененияОтбораКомпоновкиДанных.Элементы;
	ГруппаЭлементовОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
	ГруппаЭлементовОтбора.ТипГруппы        = ТипГруппы;
	ГруппаЭлементовОтбора.Использование    = Истина;
	
	Возврат ГруппаЭлементовОтбора;
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ДобавитьОформляемоеПоле(КоллекцияОформляемыхПолей, ИмяПоля) Экспорт
	
	ПолеЭлемента 		= КоллекцияОформляемыхПолей.Элементы.Добавить();
	ПолеЭлемента.Поле 	= Новый ПолеКомпоновкиДанных(ИмяПоля);

	Возврат ПолеЭлемента;
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ДобавитьЭлементКомпоновки(ОбластьДобавления,
									Знач ИмяПоля,
									Знач ВидСравнения,
									Знач ПравоеЗначение = Неопределено,
									Знач Представление  = Неопределено,
									Знач Использование  = Неопределено,
									знач РежимОтображения = Неопределено,
									знач ИдентификаторПользовательскойНастройки = Неопределено) Экспорт
	
	Элемент = ОбластьДобавления.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	Элемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоля);
	Элемент.ВидСравнения = ВидСравнения;
	
	Если РежимОтображения = Неопределено Тогда
		Элемент.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
	Иначе
		Элемент.РежимОтображения = РежимОтображения;
	КонецЕсли;
	
	Если ПравоеЗначение <> Неопределено Тогда
		Элемент.ПравоеЗначение = ПравоеЗначение;
	КонецЕсли;
	
	Если Представление <> Неопределено Тогда
		Элемент.Представление = Представление;
	КонецЕсли;
	
	Если Использование <> Неопределено Тогда
		Элемент.Использование = Использование;
	КонецЕсли;
	
	Если ИдентификаторПользовательскойНастройки <> Неопределено Тогда
		Элемент.ИдентификаторПользовательскойНастройки = ИдентификаторПользовательскойНастройки;
	ИначеЕсли Элемент.РежимОтображения <> РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный Тогда
		Элемент.ИдентификаторПользовательскойНастройки = ИмяПоля;
	КонецЕсли;
	
	Возврат Элемент;
	
КонецФункции

Объявления этих функций можно найти здесь:

ОбщегоНазначенияКлиентСервер.СоздатьГруппуЭлементовОтбора();
КомпоновкаДанныхКлиентСервер.ДобавитьОформляемоеПоле();
ОбщегоНазначенияКлиентСервер.ДобавитьЭлементКомпоновки();

Если в Вашей конфигурации не используется БСП, Вы можете просто скопировать код выше.

Теперь переходим к самому главному. В процедуре ПриСозданииНаСервере() формы добавляем обработчик установки условного оформления.

Добавим элементы условного оформления:

ЭлементУО = УсловноеОформление.Элементы.Добавить();
ЭлементОтбораУО = ЭлементУО.Отбор.Элементы;

Создадим группу отбора ИЛИ:

ТипГруппыИли = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли;
ГруппаОтбора = СоздатьГруппуЭлементовОтбора(ЭлементОтбораУО, "Группа ИЛИ", ТипГруппыИли);

Определим список оформляемых полей:

ДобавитьОформляемоеПоле(ЭлементУО.Поля, "Наименование");
ДобавитьОформляемоеПоле(ЭлементУО.Поля, "Код");
ДобавитьОформляемоеПоле(ЭлементУО.Поля, "Задолженность");
ДобавитьОформляемоеПоле(ЭлементУО.Поля, "УровеньРиска");

Установим способ оформления:

ЭлементУО.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Красный);

И, наконец, включим условия в группу:

ВидСравненияБольше = ВидСравненияКомпоновкиДанных.Больше;
ВидСравненияРавно = ВидСравненияКомпоновкиДанных.Равно;
ИмяРеквизитаЗадолженность = "Список.Задолженность";
ДобавитьЭлементКомпоновки(ГруппаОтбора, ИмяРеквизитаЗадолженность, ВидСравненияБольше, 1000000, , Истина);
ИмяРеквизитаУровеньРиска = "Список.УровеньРиска";
ДобавитьЭлементКомпоновки(ГруппаОтбора, ИмяРеквизитаУровеньРиска, ВидСравненияРавно, Перечисления.УровниРиска.Высокий, , Истина);

Итоговый вариант обработчика:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	// Добавим элементы условного оформления.
	ЭлементУО = УсловноеОформление.Элементы.Добавить();
	ЭлементОтбораУО = ЭлементУО.Отбор.Элементы;
	// Добавление группы отбора.
	ТипГруппыИли = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли;
	ГруппаОтбора = СоздатьГруппуЭлементовОтбора(ЭлементОтбораУО, "Группа ИЛИ", ТипГруппыИли);
	// Определение оформляемых полей
	ДобавитьОформляемоеПоле(ЭлементУО.Поля, "Наименование");
	ДобавитьОформляемоеПоле(ЭлементУО.Поля, "Код");
	ДобавитьОформляемоеПоле(ЭлементУО.Поля, "Задолженность");
	ДобавитьОформляемоеПоле(ЭлементУО.Поля, "УровеньРиска");
	// Определение способа оформления.
	ЭлементУО.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Красный);
	// Добавление условий в группу.
	ВидСравненияБольше = ВидСравненияКомпоновкиДанных.Больше;
	ВидСравненияРавно = ВидСравненияКомпоновкиДанных.Равно;
	ИмяРеквизитаЗадолженность = "Список.Задолженность";
	ДобавитьЭлементКомпоновки(ГруппаОтбора, ИмяРеквизитаЗадолженность, ВидСравненияБольше, 1000000, , Истина);
	ИмяРеквизитаУровеньРиска = "Список.УровеньРиска";
	ДобавитьЭлементКомпоновки(ГруппаОтбора, ИмяРеквизитаУровеньРиска, ВидСравненияРавно, Перечисления.УровниРиска.Высокий, , Истина);
КонецПроцедуры

Снова проверяем результат:

УслованоеОформление_Результат2Результат совпадает с уже полученным ранее решением. Цель достигнута.

Добавить комментарий

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