Не работает условное оформление динамического списка 1с
Большинство тех, кто работал с СКД и созданием отчетов на СКД знает об условном оформлении не по наслышке. Изменить шрифт поля, цвет ячейки или представление в зависимости от значения в другом поле это уже вполне обыденная вещь.
Но вот с условным оформлением управляемых формы мы встречаемся реже. Хотя это не менее мощный, функциональный и нужный механизм.
Что же он из себя представляет. А все то же самое. По какому-либо условию мы можем настроить представления или свойства полей табличных элементов формы и они будут изменяться прямо налету.
Я говорю о полях динамических списков и табличных полей. Здесь из кода мы можем обратиться к отдельной колонке и установить свойства сразу для всей колонки, а вот установить свойства отдельного поля не можем.
Важно. Многие с этим сталкиваются и тратят впустую время. Условное оформление не работает для обычных полей формы (не табличных).
Где это может быть использовано помимо раскраски полей. Ну классический пример это представление видов в табличной части. Для бухгалтерии стандартно их может быть три. И обычно они выстраиваются в одном поле одно под другим. Поскольку в каждой строке может быть свой счет, то и состав аналитик может отличаться. И вообще если в каждой строке выводить по 3 аналитики, то это занимает очень много места. А зачем это делать если нам допустим где-то достаточно одного субконто, где-то двух.
Настройка свойствами формы
Рассмотрим на примере нами созданной табличной части в обработке.
Создадим обработку, куда добавим табличную часть с тремя реквизитами Субконто, а так же добавим реквизит КоличествоСубконто, которое будет указывать на количество субконто в строке.
Настройка условного оформления формы находится в свойствах формы на закладке Оформление.
Теперь наша задача указать программе, что при значении в строке поля КоличествоСубконто 1 должно отображаться только Субконто1, при значении 2: Субконото1 и Субконто2, при значении 3: Субконто1, Субконто2, Субконто3.
Для этого служит форма настройки условного оформления.
В колонке Оформляемые поля укажем поля Субконто1, Субконто2, Субконто3. Поскольку для каждого поля будет разное оформление, то заведем 3 строки.
Укажем, что оформлять будем свойство видимость.
А так же настроим условие при котором видимость будет выключаться.
Смотрим что получилось в предприятии. Добавим при этом строки в табличную часть и расставив значения количество субконто.
Как видно в разных строках отображается разное количество полей.
Настройка кодом
Помимо настройки с помощью свойств данную настройку можно произвести с помощью программного кода.
Если вы используете конфигурацию, построенную на , выглядеть это будет так (это относится ко всем типовым ):
ЭлементУО = УсловноеОформление.Элементы.Добавить();
КомпоновкаДанныхКлиентСервер.ДобавитьОформляемоеПоле(ЭлементУО.Поля, "ТабличнаяЧастьСубконто2");
ОбщегоНазначенияКлиентСервер.ДобавитьЭлементКомпоновки(ЭлементУО.Отбор,
"ТабличнаяЧастьКоличествоСубконто", ВидСравненияКомпоновкиДанных.Меньше, 2);
В случае, если БСП не используется код будет немного длиннее. Просто приведу типовые процедуры из того же БСП.
Функция ДобавитьОформляемоеПоле(КоллекцияОформляемыхПолей, ИмяПоля) Экспорт
ПолеЭлемента = КоллекцияОформляемыхПолей.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(ИмяПоля);
Функция ДобавитьЭлементКомпоновки(ОбластьДобавления,
Знач ИмяПоля,
Знач ВидСравнения,
Знач ПравоеЗначение = Неопределено,
Знач Представление = Неопределено,
Знач Использование = Неопределено,
знач РежимОтображения = Неопределено,
знач ИдентификаторПользовательскойНастройки = Неопределено) Экспорт
Элемент = ОбластьДобавления.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Элемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоля);
Элемент.ВидСравнения = ВидСравнения;
Если РежимОтображения = Неопределено Тогда
Элемент.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
Иначе
Элемент.РежимОтображения = РежимОтображения;
КонецЕсли;
Если ПравоеЗначение <> Неопределено Тогда
Элемент.ПравоеЗначение = ПравоеЗначение;
КонецЕсли;
Если Представление <> Неопределено Тогда
Элемент.Представление = Представление;
КонецЕсли;
Если Использование <> Неопределено Тогда
Элемент.Использование = Использование;
КонецЕсли;
// Важно: установка идентификатора должна выполняться
// в конце настройки элемента, иначе он будет скопирован
// в пользовательские настройки частично заполненным.
Если ИдентификаторПользовательскойНастройки <> Неопределено Тогда
Элемент.ИдентификаторПользовательскойНастройки = ИдентификаторПользовательскойНастройки;
ИначеЕсли Элемент.РежимОтображения <> РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный Тогда
Элемент.ИдентификаторПользовательскойНастройки = ИмяПоля;
КонецЕсли;
В данной публикации рассмотрим пример раскрашивания строк просроченных документов в журнале документов (динамическом списке) от текущей даты и текущего времени.
Наша задача – раскрасить розовым цветом строку, если Контрольный срок меньше Текущей даты с учетом того, что текущая дата постоянно меняется. То есть текущую дату надо считывать динамически, а не определять при первом открытии.
Использовать обработчик ожидания;
Программно настроить условное оформление динамического списка
Допустим, у нас есть документ «Умный заказ» с реквизитом «КонтрольныйСрок» и типом «Дата» (состав даты «Дата и время»):
И журнал документов «УмныйЗаказ» с графой «КонтрольныйСрок», соответствующей этому реквизиту:
Наша задача – раскрасить розовым цветом строку, если Контрольный срок меньше Текущей даты с учетом того, что текущая дата постоянно изменяется.
Создадим управляемую форму:
Теперь при создании на сервере мы вызовем процедуру раскрашивания строк «ОбновленияОтображенияПросрочкиНаСервере». И будем вызывать эту процедуру с заданной периодичностью.
У нас есть некоторая форма списка, например, элементов плана вида характеристик "ПраваПользователей" в конфигурации "Управление производственным предприятием" версии 1.3.
Форма, как Вы видите, управляемая. нам нужно оформить список таким образом, чтобы все строки групп элементов выделялись зеленым цветом. Приступим!
Пример
Оформление элементов управляемых форм выполняется с помощью условного оформления формы:
Для решения нашей задачи добавим элемент условного оформления со следующими настройками:
При последующем открытии формы строки групп плана видов характеристик должны быть выделены зеленым цветом. Но. этого не происходит!
Дело в том, что список элементов и групп плана видов характеристик отображается на форме с помощью объекта формы с типом "Динамический список". Динамические списки использут возможности системы компоновки данных, включая отборы и условное оформление. Последнее как-раз и определяет конечное оформление списка, игнорируя настройки условного оформления самой формы. Добавим аналогичные настройки условного оформления для динамического списка.
Единственное отличие - в список оформляемых полей нужно добавить все видимые поля списка, на которые должно распостраняться условное оформление.
Вывод
Часто слышал, что условное оформление на управляемых формах не всегда работает. В итоге выяснялось, что просто настройки делалишь для формы, а не для динамического списка.
Надеюсь статья кому-нибудь да сэкономит время при решении проблем с условным оформлением.
Делаю условное оформление (в конфигураторе, НЕ программно):
Использование = "Истина"
Оформление = "Видимость = Ложь"
Условие = "Объект.Реквизит1 Равно 'Перечисление.Перечисление1.Значение10'"
Оформляемые поля = "Элемент2"
Вопрос: почему не срабатывает УО, когда выбираю "Значение10" в поле "Элемент1"?
forbuk; Necytij; Рамзес; igee12; KirinaAS; Mechanik21; freeek; AKZARD; Rustavelli; klinval; CeHbKA; + 11 – Ответить
forbuk; Necytij; Рамзес; igee12; KirinaAS; Mechanik21; freeek; AKZARD; Rustavelli; klinval; CeHbKA; + 11 – Ответить
(3) Поручик, Спасибо, я так и предположил, но до последнего надеялся. Странно тока, почему тогда в списке выбора поля доступны все поля?
(3) Поручик, а я и не туда, долблюсь долблюсь, а оно не пашет, все как с табличными полями ранее делал для поля не табличного и тут засада))
значит по старинке нужно делать))
Условия задачи.
Есть два реквизита во внешней обработке:
- ПолеДоступностьюКоторогоНужноУправлять - Любой тип
- ПолеКотороеРулитДоступностьюДругогоПоля - Булево
Оба реквизита кинуты на форму.
Тыкая галочку у реквизита ПолеКотороеРулитДоступностьюДругогоПоля, ничего не происходит с полем ПолеДоступностьюКоторогоНужноУправлять, а хотелось бы чтобы оно меняло доступность.
Что тут может быть не так?
(12) spacecraft, условное никак у меня не получилось оно не отрабатывает, я предположил что это связано с тем когда форма создается, нет тех данных которые я указываю для сравнения.
(13) EMelihoff, так это же не так, условное форматирование задается на сервере, в контексте сервера значения есть в реквизитах (вернее доступны на сервере), да это и не важно, при описании условного оформления мы явно указываем какой реквизит нужно всегда сравнивать с неким заранее заданным значением и если сравнение проходит, то должно что-то происходить в оформлении, в частности мне нужно чтобы менялась Доступность поля в зависимости от значений другого поля
картина непонятная мне на самом деле, почему не пашет условное оформление, наверное мат часть плохо знаю
из формы документа РегламентнаяОперация БП 3.0.41
и тут же на тебе
(14) Brawler, у меня не работало, я сделал как написал, если ето-то даст ответ почему, буду признателен!
(1) doom2good, попробуйте программно, может увидите в чём косяк, я тоже делал УО и не получалось, сделал програмно, понял что в данном контектсе у меня не все данные и УО их не видит
(1) doom2good,
Учитесь читать справку, даже во встроенной есть
23. ОтметкаНезаполненного(MarkIncomplete) - отмечать ячейку как незаполненную - тип значения Булево;
24. Видимость(Visible) - Булево. Используется только для поля, расположенного в таблице (колонки);
25. Доступность(Enabled) - Булево. Используется только для поля, расположенного в таблице (колонки);
26. ТолькоПросмотр(ReadOnly) - Булево. Используется только для поля, расположенного в таблице (колонки);
27. Отображать(Show) - Булево. Использует только для поля, расположенного в таблице (колонки).
Почему может не работать условное оформление на управляемой форме
У нас есть некоторая форма списка, например, элементов плана вида характеристик "ПраваПользователей" в конфигурации "Управление производственным предприятием" версии 1.3.
Форма, как Вы видите, управляемая. нам нужно оформить список таким образом, чтобы все строки групп элементов выделялись зеленым цветом. Приступим!
Пример
Оформление элементов управляемых форм выполняется с помощью условного оформления формы:
Для решения нашей задачи добавим элемент условного оформления со следующими настройками:
При последующем открытии формы строки групп плана видов характеристик должны быть выделены зеленым цветом. Но. этого не происходит!
Дело в том, что список элементов и групп плана видов характеристик отображается на форме с помощью объекта формы с типом "Динамический список". Динамические списки использут возможности системы компоновки данных, включая отборы и условное оформление. Последнее как-раз и определяет конечное оформление списка, игнорируя настройки условного оформления самой формы. Добавим аналогичные настройки условного оформления для динамического списка.
Единственное отличие - в список оформляемых полей нужно добавить все видимые поля списка, на которые должно распостраняться условное оформление.
Вывод
Часто слышал, что условное оформление на управляемых формах не всегда работает. В итоге выяснялось, что просто настройки делалишь для формы, а не для динамического списка.
Надеюсь статья кому-нибудь да сэкономит время при решении проблем с условным оформлением.
Когда используете для вывода данных динамический список и произвольный запрос, то бывают ситуации когда надо указать параметр используемый в этом запросе. Ниже пример вывода данных регистра сведений в карточке клиента
Для вывода используется используется запрос:
Чтобы при открытии не отображалась информацию по другим клиентам, необходимо установить параметр динамического списка, сделаем это так:
Можно и просто настроить отбор через настройки, используя ЭлементОтбораКомпоновкиДанных
Похожие FAQ
Как заполнить табличную часть формы программно? 8
Нужно по кнопке Заполнить - сформировать данные для заполнения табличных частей и заполнить их. Форма имеет вид: Рядом с кнопкой Записать и закрыть добавлена кнопка Заполнить документ , код ее команды: // Код заполнения ТЧ НаСервере П 17 правил для составления оптимального ЗАПРОСа к данным базы 1С 44
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ 1C и Google Maps 21
была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было реш 1С 7.x : Как получить курсы валют с сайта НБУ http://www.bank.gov.ua/ за любую дату ? 6
Функция ПолучитьТаблицуКурсовНБУ(ДатаКурса, Ежедневно = 1) // если в качестве второго параметра указать число отличное от 1 - получем валюты, которые котируются на ежемесячной основе Перем Reader, Url, Точки, HtmlTab, Строк, Р, НомСтроки, НомЯче Cклонения по падежам 6
НаКлиенте Процедура Команда1(Команда) ФИО = " Иванов Иван Иванович" ; Падеж = 2; Пол = 1; Результат = СклонениеФИО(ФИО, Падеж, пол); Сообщить(Результат); КонецПроцедуры НаСервере Функция СклонениеФИО(ФИО, Падеж, пол) Результат = " " ; Посмотреть все результаты поиска похожих
Еще в этой же категории
Как обновить динамический список или реквизит на форме клиента? 22
Если вы, открыв форму справочника или документа, выполнили некоторое действие, код который должен изменить состояние данных в динамических списках или значение реквизита. Данные изменены, но в открытой форме осталось все как было, можно конечно закр Динамический список ~ Как на управляемой форме разместить список регистра сведений с отбором? 18
Решение рассмотрено для элемента справочника (Контрагент и регистр КонтактнаяИнформация) 1. Создание реквизита: Добавляем новый реквизит формы (. не путать с реквизитом справочника . ) с типом " ДинамическийСписок" В поле " Основная табли Форма ~ Программное создание таблицы значений с условным оформлением 12
Как создать на форме таблицу и сделать для нее подсветку содержимого колонки в строке по условию? Итак для начала нам надо добавить реквизиты в форму. Для этого у нас есть метод: ИзменитьРеквизиты(). Перед тем как его использовать мы сформируем ма Поле выбора ~ Заполнение списка значений в элементе поле выбора на форме 10
//Заполнение списка перебором данных // Элемент формы МетаданныеВыбор имеет тип - Произвольный, Использование - Режим выбора из Списка, кнопка списка Для Каждого Метаданное из Метаданные.РегламентныеЗадания Цикл ЭлементыФормы.МетаданныеВыбор.Спи Поле выбора ~ Как ограничить список выбора? 8
Ограничим список элементов, установив отбор в открываемой форме //Пример 1 Процедура СтатьяПДРНачалоВыбора(Элемент, СтандартнаяОбработка) ФормаВыбора = Справочники.ПрочиеДоходыИРасходы.ПолучитьФормуВыбора(, Элемент); ЭлементОтбораВидПДР = Форма Посмотреть все в категории Работа с Формой (Диалог) и её элементами
Для условного оформления в списках и формах
в обычном приложении использовалось событие ПриПолученииДанных() или ПриВыводеСтроки(),
где через "ячейку" в зависимости от данных строки устанавливали нужное свойство.
С приходом нового режима работы платформы возможности условного оформления расширились.
В данной статье разберем основные аспекты.
1. Условное оформление в упр. формах настраивается как в режиме конфигуратора, так и в режиме пользовательском.
— в конфигураторе условное оформление существует на уровне самой формы (как в формах объекта, так и списка):
В формах списка условное оформление существует и на уровне самого динамического списка:
Добавлять элементы условного оформления можно не прибегая к программированию, но конечно есть возможность и программного добавления элементов, который мы рассмотрим чуть ниже.
— в пользовательском режиме настройки оформления доступны для динамических списков, все настройки оформления в форме документа необходимо выполнять в режиме конфигуратора. Для настройки переходим во все действия списка и выбираем настроить список:
2. Программная работа с условным оформлением (УО).
Начнем с того, что работа с УО доступна только:
Для Добавления элемента УО в списке нужно обратится к списку и добавить элемент УО:
ЭлементОформления = Список . УсловноеОформление . Элементы . Добавить ();
Для УО формы добавление происходит через прикладной объект УсловноеОформление:
ЭлементУсловногоОформления = УсловноеОформление . Элементы . Добавить ();
Далее алгоритмы будут похожими. Для УО нам нужно задать условие отбора, задать значение свойства УО и добавить оформляемые поля.
// Создаем условие отбора
ЭлементОтбора = ЭлементОформления . Отбор . Элементы . Добавить ( Тип ( «ЭлементОтбораКомпоновкиДанных» ));
ЭлементОтбора . ЛевоеЗначение = Новый ПолеКомпоновкиДанных ( ИмяПоля ); // имя поля
ЭлементОтбора . ВидСравнения = ВидСравненияКомпоновкиДанных . Равно ; // либо задаем свой
//**** Значение для отбора
ЭлементОтбора . ПравоеЗначение = ЗначениеДляОтбора ;
// следует заметить что правым значением может выступать ПолеКомпоновкиДанных формы или списка
ЭлементОтбора . ПравоеЗначение = Новый ПолеКомпоновкиДанных ( ИмяПоля );
//****
ЭлементОтбора . Использование = Истина;
Значение свойства УО:
// Установка значения элемента УО
// Возможно обращение как по индексу так и установка через метод
//1.
Элемент = ЭлементОформления . Оформление . Элементы [ 0 ];
Элемент . Значение = Цвет ;
//2.
ЭлементОформления . Оформление . УстановитьЗначениеПараметра ( «ЦветФона» , WebЦвета . СеребристоСерый );
Элемент . Использование = Истина;
Добавим поля оформления, если ничего не добавлять, то система применит оформления ко всей строке:
// Создаем поля оформления
ПолеОформления = ЭлементОформления . Поля . Элементы . Добавить ();
ПолеОформления . Поле = Новый ПолеКомпоновкиДанных ( ПолеДляОформления );
ПолеОформления . Использование = Истина;
В качестве ИменПолей нужно передавать строковое представление ИМЕНИ реквизита.
3. Все настройки УО хранятся для каждого пользователя отдельно.
4. Пример.
Очень часто сталкивался с проблемой настройки свойства АвтоОтметкаНезаполненного в ТЧ по условию . В обычных формах все решалось в процедурах упомянутых выше, а здесь таких событий нет. А решается это все конечно при помощи УО. Заходим в форме объекта в Условное оформление и видим свойство — Отметка незаполненного. Ну а дальше настроииваем как надо.
Выводы:
— Простое условное оформление пользователь может настроить и сам, если его научить :). Это будет сложно конечно, но возможно.
— УО в табличной части можно задать в конфигураторе через УО формы.
— Программная работа с УО требуется в случае сложного условия отбора, в таких случаях лучше создавать процедуру в общем модуле использования в различных документах и списках.
Читайте также: