Для решения задачи нам необходимо будет воспользоваться возможностями СКД по выводу результатов запроса в таблицу значений. Детально об этом можно почитать в статье «Создаем универсальный механизм отбора и сортировки для управляемых форм». Обработка также взята из стати и доработан функционал для условного оформления.
Идея следующая – берем условное оформление из настроек компоновщика настроек и копируем в объект «Условное оформление» нашей формы.
Для этого в модуле формы необходимо добавить следующий код:
// Процедуры для работы с условным оформлением
&НаСервере
Процедура ПерезаполнитьУФФормы()
УсловноеОформление.Элементы.Очистить();
УсловноеОформлениеКомпоновщика = КомпоновщикНастроек.Настройки.УсловноеОформление;
Для каждого ЭлементУФ Из УсловноеОформлениеКомпоновщика.Элементы Цикл
ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить();
ЭлементУсловногоОформления.Использование = ЭлементУФ.Использование;
// Заполняем поля к которым будет применятся условное оформление
СкопироватьПоляУсловногоОформления(ЭлементУсловногоОформления, ЭлементУФ);
// Заполняем отбор для условного офрмления
СкопироватьОтборУсловногоОформления(ЭлементУсловногоОформления, ЭлементУФ.Отбор);
// Заполняем элементы условного офрмления
СкопироватьЭлементОформления(ЭлементУсловногоОформления, ЭлементУФ);
КонецЦикла;
КонецПроцедуры // ПерезаполнитьУФФормы()
&НаСервере
Процедура СкопироватьПоляУсловногоОформления(ЭлементУсловногоОформления, ЭлементКомпоновщика)
ЭлементыПоля = ЭлементКомпоновщика.Поля.Элементы;
Если ЭлементыПоля.Количество() = 0 Тогда
ОформляемоеПоле = ЭлементУсловногоОформления.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("ТаблицаНоменклатуры");
ОформляемоеПоле.Использование = Истина;
Иначе
Для каждого ЭлементПоля Из ЭлементыПоля Цикл
ОформляемоеПоле = ЭлементУсловногоОформления.Поля.Элементы.Добавить();
ЗаполнитьЗначенияСвойств(ОформляемоеПоле, ЭлементПоля);
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(Строка(ЭлементПоля.Поле));
КонецЦикла;
КонецЕсли;
КонецПроцедуры // СкопироватьПоляУсловногоОформления()
&НаСервере
Процедура СкопироватьОтборУсловногоОформления(ЭлементУсловногоОформления, ЭлементКомпоновщика)
Для каждого ЭлементОтбора Из ЭлементКомпоновщика.Элементы Цикл
Если ТипЗнч(ЭлементОтбора) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных") Тогда
ГруппаОтбора = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
ЗаполнитьЗначенияСвойств(ГруппаОтбора, ЭлементОтбора);
СкопироватьОтборУсловногоОформления(ЭлементУсловногоОформления, ЭлементОтбора);
Иначе
НовыйЭлементОтбора = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЗаполнитьЗначенияСвойств(НовыйЭлементОтбора, ЭлементОтбора);
НовыйЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТаблицаНоменклатуры." + Строка(ЭлементОтбора.ЛевоеЗначение));
КонецЕсли;
КонецЦикла;
КонецПроцедуры // СкопироватьОтборУсловногоОформления()
&НаСервере
Процедура СкопироватьЭлементОформления(ЭлементУсловногоОформления, ЭлементКомпоновщика)
ЭлементыОформления = ЭлементКомпоновщика.Оформление.Элементы;
Для каждого ЭлементОформления Из ЭлементыОформления Цикл
Если ЭлементОформления.Использование Тогда
ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра(ЭлементОформления.Параметр, ЭлементОформления.Значение);
КонецЕсли;
КонецЦикла;
КонецПроцедуры // СкопироватьЭлементОформления()
Как видно из кода, мы просто выполняем перенос настроек условного оформления из компоновщика настроек в условное оформление формы.
Процедуру ПерезаполнитьУФФормы() необходимо вызывать каждый раз, когда пользователь изменяет условное оформление программы (в обработке это процедура-обработчик кнопки Процедура ОтборИСортировка(Команда)).
Приведем скриншоты настроек.
Основная таблица настроек
Отбор по одному условию
Отбор с иерархией
Результат или как выглядит таблица формы
Недостатком метода является необходимость программного создания дополнительных условных оформлений, поскольку созданные с помощью конфигуратора будут затираться.
Обработку можно запускать на конфигурациях «Управление торговлей, редакция 11.1» и «Управление торговлей для Украины, редакция 3.0»
статья написана по материалам сайта avtomat.biz