Условное оформление таблицы управляемой формы




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

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

Идея следующая – берем условное оформление из настроек компоновщика настроек и копируем в объект «Условное оформление» нашей формы.

Для этого в модуле формы необходимо добавить следующий код:

 

// Процедуры для работы с условным оформлением

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

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

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

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

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

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

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

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

    КонецЦикла;

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

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


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

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

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

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

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

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

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

Как видно из кода, мы просто выполняем перенос настроек условного оформления из компоновщика настроек в условное оформление формы.

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

 

Приведем скриншоты настроек.

Основная таблица настроек

Основная таблица настроек

 

Отбор по одному условию

Отбор по одному условию

 

Отбор с иерархией

Отбор с иерархией

 

Результат или как выглядит таблица формы

Как выглядит таблица формы

 

Недостатком метода является необходимость программного создания дополнительных условных оформлений, поскольку созданные с помощью конфигуратора будут затираться.

 

Обработку можно запускать на конфигурациях «Управление торговлей, редакция 11.1» и «Управление торговлей для Украины, редакция 3.0»

статья написана по материалам сайта avtomat.biz

5 Comments

  1. dimk@a

    Спасибо, очень помогло. Отказались от использования динамических списков на форме, переделал все на таблицы формы… и какой же был ступор когда оказалось что у них нет условного оформления. Странная конечно концепция делать одно общее условное оформление на всю форму, но хоть так.

    Reply
  2. akomar

    Всегда пожалуйста. Я тоже сталкивался с проблемой УФ в таблицах значений и не совсем понимаю, почему 1С не сделает стандартный функционал, ведь порой динамический список не всегда подходит по производительности.

    Reply
  3. dimk@a

    Обнаружил ошибку — некорректно копируются группы в отборах. Надо так:

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

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

    Показать

    Reply
  4. GusevNA

    Автору респект — очень помогло! А уже начинал лопатить документацию 🙂

    Reply
  5. bacila

    тест

    Reply

Leave a Comment

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