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