четверг, 13 октября 2016 г.

УСЛОВНОЕ ОФОРМЛЕНИЕ ТАБЛИЦЫ УПРАВЛЯЕМОЙ ФОРМЫ

Динамический список – замечательный элемент управления, который предоставляет пользователю широкий спектр настроек, от всевозможных отборов до условного оформления. Но что делать, если в поставленной задаче использовать список невозможно, а заказчик отказывается принимать проект без возможности настройки условного оформления. В статье будет рассмотрено одно из возможных решений для таблицы формы.

Для решения задачи нам необходимо будет воспользоваться возможностями СКД по выводу результатов запроса в таблицу значений. Детально об этом можно почитать в статье «Создаем универсальный механизм отбора и сортировки для управляемых форм». Обработка также взята из стати и доработан функционал для условного оформления.
Идея следующая – берем условное оформление из настроек компоновщика настроек и копируем в объект «Условное оформление» нашей формы.
Для этого в модуле формы необходимо добавить следующий код:
// Процедуры для работы с условным оформлением

&НаСервере
Процедура ПерезаполнитьУФФормы()

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

    
УсловноеОформлениеКомпоновщика =КомпоновщикНастроек.Настройки.УсловноеОформление;

    Для каждого 
ЭлементУФ Из УсловноеОформлениеКомпоновщика.Элементы Цикл

        
ЭлементУсловногоОформления УсловноеОформление.Элементы.Добавить();
        
ЭлементУсловногоОформления.Использование ЭлементУФ.Использование;

        
// Заполняем поля к которым будет применятся условное оформление
        
СкопироватьПоляУсловногоОформления(ЭлементУсловногоОформления,ЭлементУФ);

        
// Заполняем отбор для условного офрмления
        
СкопироватьОтборУсловногоОформления(ЭлементУсловногоОформления,ЭлементУФ.Отбор);

        
// Заполняем элементы условного офрмления
        
СкопироватьЭлементОформления(ЭлементУсловногоОформленияЭлементУФ);

    КонецЦикла;

КонецПроцедуры 
// ПерезаполнитьУФФормы()

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

&НаСервере
Процедура СкопироватьОтборУсловногоОформления(ЭлементУсловногоОформления,ЭлементКомпоновщика)

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

КонецПроцедуры 
// СкопироватьОтборУсловногоОформления()

&НаСервере
Процедура СкопироватьЭлементОформления(ЭлементУсловногоОформления,ЭлементКомпоновщика)

    
ЭлементыОформления ЭлементКомпоновщика.Оформление.Элементы;

    Для каждого 
ЭлементОформления Из ЭлементыОформления Цикл
        Если 
ЭлементОформления.Использование Тогда
           
ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра(ЭлементОформления.Параметр,ЭлементОформления.Значение);
        КонецЕсли;
    КонецЦикла;

КонецПроцедуры 
// СкопироватьЭлементОформления()
Как видно из кода, мы просто выполняем перенос настроек условного оформления из компоновщика настроек в условное оформление формы.
Процедуру ПерезаполнитьУФФормы() необходимо вызывать каждый раз, когда пользователь изменяет условное оформление программы (в обработке это процедура-обработчик кнопки Процедура ОтборИСортировка(Команда)).
Недостатком метода является необходимость программного создания дополнительных условных оформлений, поскольку созданные с помощью конфигуратора будут затираться.


Пример вызова из модуля формы общего модуля:



&НаСервере
Процедура УстановитьУсловноеОформление()

   
ерпОбщегоНазначенияСервер.УстановитьУсловноеОформление(ЭтаФорма, КомпоновщикНастроекТаблицаТовары, "ТаблицаТовары", "ТаблицаТовары");

КонецПроцедуры

&НаСервере
Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки)

   
УстановитьУсловноеОформление();

КонецПроцедуры

&НаКлиенте
Процедура КомпоновщикНастроекТаблицаТоварыНастройкиУсловноеОформлениеПриИзменении(Элемент)

   
УстановитьУсловноеОформление();

КонецПроцедуры



Переносим в общий модуль:

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

Процедура СкопироватьОтборУсловногоОформления(ЭлементУсловногоОформления, ЭлементКомпоновщика, ИмяТаблицыОформления)

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

КонецПроцедуры
// СкопироватьОтборУсловногоОформления()

Процедура СкопироватьЭлементОформления(ЭлементУсловногоОформления, ЭлементКомпоновщика)

   
ЭлементыОформления = ЭлементКомпоновщика.Оформление.Элементы;

    Для каждого
ЭлементОформления Из ЭлементыОформления Цикл
        Если
ЭлементОформления.Использование Тогда
           
ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра(ЭлементОформления.Параметр, ЭлементОформления.Значение);
        КонецЕсли;
    КонецЦикла;

КонецПроцедуры
// СкопироватьЭлементОформления()

Процедура УстановитьУсловноеОформление(Форма, КомпоновщикНастроек, ИмяТаблицыОформления, ПрефиксИмениЭлементовФормы="") Экспорт

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

   
УсловноеОформлениеКомпоновщика = КомпоновщикНастроек.Настройки.УсловноеОформление;

    Для каждого
ЭлементУФ Из УсловноеОформлениеКомпоновщика.Элементы Цикл

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

       
// Заполняем поля к которым будет применятся условное оформление
       
СкопироватьПоляУсловногоОформления(ЭлементУсловногоОформления, ЭлементУФ, ИмяТаблицыОформления, ПрефиксИмениЭлементовФормы);

       
// Заполняем отбор для условного офрмления
       
СкопироватьОтборУсловногоОформления(ЭлементУсловногоОформления, ЭлементУФ.Отбор, ИмяТаблицыОформления);

       
// Заполняем элементы условного офрмления
       
СкопироватьЭлементОформления(ЭлементУсловногоОформления, ЭлементУФ);

    КонецЦикла;

КонецПроцедуры


2 комментария:

  1. Этот комментарий был удален администратором блога.

    ОтветитьУдалить
  2. Этот комментарий был удален администратором блога.

    ОтветитьУдалить