Условное оформление в управляемых формах




Для условного оформления в списках и формах
в обычном приложении использовалось событие ПриПолученииДанных() или ПриВыводеСтроки(),
где через "ячейку" в зависимости от данных строки устанавливали нужное свойство.
С приходом нового режима работы платформы возможности условного оформления расширились.
В данной статье разберем основные аспекты.

Итак начнем.

1. Условное оформление в упр. формах настраивается как в режиме конфигуратора, так и в режиме пользовательском.

— в конфигураторе условное оформление существует на уровне самой формы (как в формах объекта, так и списка):

В форме

 

В формах списка условное оформление существует и на уровне самого динамического списка:

 

2

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

— в пользовательском режиме настройки оформления доступны для динамических списков, все настройки оформления в форме документа необходимо выполнять в режиме конфигуратора. Для настройки переходим во все действия списка и выбираем настроить список:

 3

 

 2. Программная работа с условным оформлением (УО).

Начнем с того, что работа с УО доступна только:

&НаСервере

Для Добавления элемента УО в списке нужно обратится к списку и добавить элемент УО:

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

Для УО формы добавление происходит через прикладной объект УсловноеОформление:

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

Далее алгоритмы будут похожими. Для УО нам нужно задать условие отбора, задать значение свойства УО и добавить оформляемые поля.

// Создаем условие отбора
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоля); // имя поля
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; // либо задаем свой
//**** Значение для отбора
ЭлементОтбора.ПравоеЗначение = ЗначениеДляОтбора;
// следует заметить что правым значением может выступать ПолеКомпоновкиДанных формы или списка
ЭлементОтбора.ПравоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоля);
//****
ЭлементОтбора.Использование = Истина;

Значение свойства УО:

// Установка значения элемента УО
// Возможно обращение как по индексу так и установка через метод
//1.
Элемент = ЭлементОформления.Оформление.Элементы[0];
Элемент.Значение = Цвет;
//2.
ЭлементОформления.Оформление.УстановитьЗначениеПараметра(«ЦветФона», WebЦвета.СеребристоСерый);

Элемент.Использование = Истина;

Добавим поля оформления, если ничего не добавлять, то система применит оформления ко всей строке:

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

В качестве ИменПолей нужно передавать строковое представление ИМЕНИ реквизита.

3. Все настройки УО хранятся для каждого пользователя отдельно.

4. Пример.

Очень часто сталкивался с проблемой настройки свойства АвтоОтметкаНезаполненного в ТЧ  по условиюВ обычных формах все решалось в процедурах упомянутых выше, а здесь таких событий нет. А решается это все конечно при помощи УО. Заходим в форме объекта в Условное оформление и видим свойство — Отметка незаполненного. Ну а дальше настроииваем как надо.

4

 

Выводы:

     — Простое условное оформление пользователь может настроить и сам, если его научить :). Это будет сложно конечно, но возможно.

     — УО в табличной части можно задать в конфигураторе через УО формы.

     — Программная работа с УО требуется в случае сложного условия отбора, в таких случаях лучше создавать процедуру в общем модуле использования в различных документах и списках.

33 Comments

  1. KonstB
    Выводы:

    — Простое условное оформление пользователь может настроить и сам, если его научить :). Это будет сложно конечно, но возможно.

    Спасибо, КЭП! )

    Reply
  2. son_v

    Доброе время суток. А у меня вопрос к автору. Добавляю условное оформление в Настройку списка в конфигураторе (пример 2 пункта 1 статьи) дополнительно к типовым настройкам (формы списка документа Заказы покупателей и спр. Договоры контрагентов, Управление торговлей ред.11 платформа 8.2.17.169), а в режиме предприятия настройки не обновляются. Куда смотреть, что делать, к кому бежать? чистка кэша не помогает, да и не вариант.

    Reply
  3. AllexSoft

    (2) son_v, есть справочник настройки пользователей как то так, его можно открыть в режиме предприятия через справочник Пользователи.. ну и очистить настройки форм там надо

    Reply
  4. son_v

    (3) СПАСИБО!!!!!!!! Сами бы еще годами думали ))

    Reply
  5. Znef

    Спасибо, помогло. Только почему то работает только для Формы, а для таблицы или дерева нет.

    Reply
  6. psa247

    (5) Znef, скорее всего, у Вас более свежая платформа. У меня тоже такого нет

    Reply
  7. AllexSoft

    Условное оформление бывает только для формы! Оно включает и условное оформление всех элементов связанных с этой формой, в том числе и таблиц, дерева. Хотя для динамических списков оно может быть отдельно в динамическом списке, с ними сложнее.

    (6) psa247, от платформы не зависит, зависит от конфигурации.

    Reply
  8. psa247

    (7) AllexSoft, да, так и есть, спасибо за ответ. Уже кое-чего примитивное настроил на уровне конфы.

    для управления оформлением программно в динамическом списке вот так сделал:

    &НаСервере

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

    Для Каждого СтрокаДанных Из Объект.СписокКлиентов Цикл

    // Условное оформление — Номер первой строки

    СтрокаДанных.ВерсияППОтображение = ПолучитьНомерВерсииПП(СтрокаДанных.НоваяВерсия);

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

    //НовыйЭлементУсловногоОформления.ИдентификаторПользовательскойНастройки = «»Стр.НомерСтроки;

    НовыйЭлементУсловногоОформления.Представление = «СозданоПрограммно»;

    НовыйЭлементУсловногоОформления.Использование = Истина;

    ЭлементОтбора = НовыйЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));

    ЭлементОтбора.Использование = Истина;

    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«СписокКлиентов.НоваяВерсия»);

    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно;

    ЭлементОтбора.ПравоеЗначение = Новый ПолеКомпоновкиДанных(Справочники.ВерсияПП.ПустаяСсылка());

    КонецЦикла;

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

    &НаСервере

    Процедура ПриЧтенииНаСервере(ТекущийОбъект)

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

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

    &НаСервере

    Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)

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

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

    Reply
  9. AllexSoft

    (8) psa247, зачем?) чем не подошло условное оформление самого динамического списка ? если оно не обновляется нужно добавить какой нибудь реквизитик (колонку в дин список) сохранить, открыть и проверить условное оформление, потом удалить эту ненужную колонку

    Reply
  10. psa247

    (9) AllexSoft, нее, я часа три убил на то, что в толстом клиенте делается 3 минуты

    Reply
  11. AllexSoft

    (10) psa247, в УФ немного приловчится и в принципе многое проще чем в обычных формах. Ну правда дин. список очень очень сырой, как минимум из того что мне уже неоднократно было нужно это:

    1. невозможность вывести итоговую сумму в подвал дин. списка.

    2. нельзя использовать пакеты запросов в произвольном запросе дин. списка.

    Reply
  12. psa247

    1С — Недоступно, но всерьез ? ))

    Reply
  13. AllexSoft

    (12) psa247, ))) есть такое

    Reply
  14. Tapochki-tmn

    Спасибо, очень помогло.

    От себя добавлю, если вдруг кому пригодится:

    Надо было в таблице на форме сравнить две колонки.

    В одной колонке значения типа Справочник.ЦеновыеГруппы.

    Во второй колонке значения типа Строка.

    Сравнивать надо было наименование справочника первой колонки и строку из второй колонки.

    Через УсловноеОформление формы посмотрел — нельзя обратиться к свойствам поля, нету их.

    Создал в реквизитах у этой таблицы еще одно поле ЦеновыеГруппыНаименование, элемент в форме не создавал.

    Программно задал условие:

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

    Показать

    Не пинайте, если через Ж…

    Полдня искал как сделать нормально…

    Reply
  15. chmv

    Статья помогла

    Reply
  16. jaroslav.h
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    ЭлементОформления = Список.УсловноеОформление.Элементы.Добавить();
    ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить();
    ЭлементОтобора = ЭлементОформления.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
    ЭлементОтобора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«Абонимент»);
    ЭлементОтобора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ЭлементОтобора.ПравоеЗначение = Перечисления.Абонимент.Premium;
    ЭлементОформления.Оформление.УстановитьЗначениеПараметра(«ЦветТекста», WebЦвета.ЗеленаяЛужайка);
    ЭлементОтобора.Использование = Истина;
    
    ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
    ПолеОформления.Поле = Новый ПолеКомпоновкиДанных(«Абонимент»);
    ПолеОформления.Использование = Истина;
    
    КонецПроцедуры

    Показать

    скажите, мне нужно ЦветФона изменить, такой Параметр есть но если указываю ЦветФона то никакого результата, а вот когда указываю ЦветТекста то работает

    Reply
  17. Igor Igorevich

    Спасибо за статью. Ранее настраивал условное оформление на форме через свойство «Условное оформление» и не работало. И как всегда списал на глюк 1с.

    Но после прочтения статьи решил все перепроверить — и нашел ошибку в условии. Исправил и все заработало.

    1с — на высоте. А если у кого не работает, то будьте внимательны и ищите свои ошибки.

    Reply
  18. dklp

    подскажите, а можно ли в принципе применять условное оформление из внешней обработки к форме владельца.

    параметр ВладелецФормы на сервере выдает ошибку, а на клиенте условное оформление недоступно.

    заполняю из внешней обработки ТЧ документа, нужно для текста ячеек в одной колонке установить свойство: ГоризонтальноеПоложение — Право.

    может, у кого-нибудь есть идеи как это сделать?

    типовую Конфигурацию менять нельзя.

    Reply
  19. Nickon

    Понимал, что что-то такое есть на УФ. Даже процедуру написал. Но благодаря статье решилось все за 5 минут!

    Reply
  20. stranger_1

    (19) dklp, А если засунуть форму в расширение и в расширении сделать как нужно?

    Reply
  21. klaos

    1С:Предприятие 8.3 (8.3.9.1818), Розница, редакция 2.2 (2.2.4.33) , не могу найти Условное оформление.Есть ли оно там вообще?

    Reply
  22. Debugg3R

    На форме есть дерево значений. У дерева значений один из реквизитов — таблица значений. И вот для этой таблицы значений, которая для каждого элемента своя, не работает условное оформление.

    Либо я не понимаю как его настроить

    В отборе стоит «

    ДеревоНаФорме.ТаблицаЭлемента.ИмяРеквизита = ЗначениеРеквизита

    «.

    В оформлении стоит «

    ИмяЭлементаФормыРеквизитаТаблицыЭлемента

    »

    Грубо говоря, есть дерево задач, у каждой задачи список исполнителей в виде таблицы и нужно определённых исполнителей подсветить.

    Reply
  23. PCcomCat

    Вот это трюк в (9) с добавлением реквизита в динамический список! И работает же!

    Reply
  24. OksDallas

    Условное оформление на форме. Как в оформляемые поля полностью занести строку табличной части не перечисляя реквизиты табличной части?

    Reply
  25. t.v.s.

    (25) Добавить имя табличной части как оно есть на форме

    Reply
  26. OksDallas

    (26)Пробовала — не получилось.

    Reply
  27. t.v.s.

    (27) Код в студию

    Reply
  28. OksDallas

    .

    Reply
  29. Serge_ASB

    А если мне нужно оформить цвет фона в табличной части формы в одной колонке в зависимости от значения (значение — элемент справочника) , тогда как?

    Reply
  30. Ivanov_OM

    Спасибо

    Reply
  31. Sergey_1C_ttt

    Спасибо! Очень помогло быстро сделать.

    Reply
  32. sinto

    Добрый день. Интересует такая тема. В поле ТЧ на форме добавил сумму. Вычисляется она банальненько, как «строка.Цена*Строка.Количество». Так как в УФ нет таких обработчиков, как «ПриПолученииДанных» или «ПриВыводеСтроки» необходимо проделать следующее:

    1. собственно вычислить эту сумму для каждой строки для разных случаев, будь то изменение номенклатуры или цены или количества. Опять же изменение может быть отовсюду, как из строки ТЧ непосредственно, так и из внешних обработок заполнения. Поэтому — возможно ли вычислить сумму через настройку условного оформления, в идеале — непрограммно. Т.е. условно устанавливать текст ячейки равным сумме=цена*количество

    2. Показать такую сумму в подвале

    ут 11.4.6.188

    буду благодарен за вразумительный ответ

    Reply
  33. PLAstic

    Возможно, пропустил, но есть один нюанс при программном добавлении условного оформления.

    Реквизиты в условии УО указываются по пути через «Объект.ххх…», а в оформляемых полях УО — по имени элемента формы.

    Подробно описано здесь: https://its.1c.ru/db/pubv8devui/content/239/hdoc/_top/%D1%83%D1%81%D0%BB%D0­%BE%D0%B2%D0%BD%D0%BE%D0%B5%D0%BE%D1%84%D0%BE%D1%80%D0%BC%D0­%BB%D0%B5%D0%BD%D0%B8%D0%B5.%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D1%8B.%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C

    Reply

Leave a Comment

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