Условное оформление дерева значений на управляемой форме
Предположим, мы создали некую обработку, которая выполняет те или иные действия над каталогом товаров. При этом у пользователя должна быть возможность выбирать категории товаров, для которых будут применяться эти действия. Логичным выбором будет выведение на форму иерархического списка категорий, где пользователь сможет галочками выбирать необходимые категории. Если пользователь отмечает галочкой категорию верхнего уровня, то подразумевается, что все вложенные категории также будут обработаны. Логично будет закрыть вложенные строки для редактирования и как-то пометить их, чтобы пользователю было понятно, что они будут обработаны вместе с родительской категорией. Вот здесь нам и пригодится условное оформление.
Предлагаемая обработка демонстрирует управление доступностью отдельных строк в дереве значений (кстати, аналогичный метод можно использовать и для таблицы значений). Вот как это выглядит:
Работа с условным оформлением хорошо описана здесь:
Единственное, столкнулся с интересным нюансом. В отборе компоновки (который используется, чтобы нам оформить именно нужные строки) и в оформляемых полях (которые указывают колонки, которые мы будем оформлять) имена полей разные, хотя тип один и тот же — ПолеКомпоновкиДанных.
При отборе мы указываем путь к данным:
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ДеревоКаталог.Категория"); ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке; ЭлементОтбора.ПравоеЗначение = СписокОтб; ЭлементОтбора.Использование = Истина;
А в полях оформления мы указываем путь к полю формы:
ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить(); ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ДеревоКаталогКатегория"); ПолеОформления.Использование = Истина;
Протестировано на платформе 1С 8.3.11.3034
Источник
Вопрос по условному оформлению дерева на управляемой форме
Хочу установить условное оформление колонки дерева таким образом, чтоб вместо его значения выводилось значение из другой колонки.
Пытаюсь сделать так:
УО = ЭтаФорма.УсловноеОформление;
УО.Элементы.Очистить();
Оформляемоеполе = ЭлементУО.Поля.Элементы.Добавить(); // Поля таблицы для которых будет действовать оформление
Оформляемоеполе.Поле = Новый ПолеКомпоновкиДанных(«ДеревоНоменклатурыНоменклатураИзОблака»);
Оформляемоеполе.Использование = ИСТИНА;
ЭлементУО.Оформление.УстановитьЗначениеПараметра(«Текст», Новый ПолеКомпоновкиДанных(«ДеревоНоменклатурыНоменклатураИзОблакаСТР»));
По факту, если я меняю значение в колонке «НоменклатураИзОблакаСТР», то колонка «НоменклатураИзОблака» как была пустой, так и отображается.
ЧЯДНТ? Можно ли как-то вообще это сделать?
Условное оформление не предполагает изменение значений поля. Оформление меняет цвет, видимость, вывод и т.п.
А если
ЭлементУО.Оформление.УстановитьЗначениеПараметра(«Текст», Новый ПолеКомпоновкиДанных(«ДеревоНоменклатуры.НоменклатураИзОблакаСТР»));
(3) Вот точно — отбор не добавлял. Попробую.
(2) Тоже попробую вариант.
(4) Ага, я так и хотел.
Спасибо! Отпишусь, по результату.
Переделал:
ЭлементУО = УО.Элементы.Добавить();
Оформляемоеполе = ЭлементУО.Поля.Элементы.Добавить(); // Поля таблицы для которых будет действовать оформление
Оформляемоеполе.Поле = Новый ПолеКомпоновкиДанных(«ДеревоНоменклатурыНоменклатураИзОблака»);
Оформляемоеполе.Использование = ИСТИНА;
ЭлементОтбора = ЭлементУО.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»)); // отбор текущей строки таблицы
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«ДеревоНоменклатурыНоменклатураИзОблакаСТР»);
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Заполнено;
ЭлементУО.Оформление.УстановитьЗначениеПараметра(«Текст», Новый ПолеКомпоновкиДанных(«ДеревоНоменклатуры.НоменклатураИзОблакаСТР»));//ДеревоНоменклатуры.НоменклатураИзОблакаСТР»));
(6) ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«ДеревоНоменклатуры.НоменклатураИзОблакаСТР»);
Или просто .ЛевоеЗначение = Истина; .ПравоеЗначение = Истина
ЭлементОтбора = ЭлементУО.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»)); // отбор текущей строки таблицы
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.ЛевоеЗначение = Истина;//Новый ПолеКомпоновкиДанных(«ДеревоНоменклатурыНоменклатураИзОблакаСТР»);
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Истина;
ЭлементУО.Оформление.УстановитьЗначениеПараметра(«Текст», Новый ПолеКомпоновкиДанных(«ДеревоНоменклатуры.НоменклатураИзОблакаСТР»));
Тоже не хочет работать.
Что ещё можно попробовать?
(8) Попробуй в диалоге (свойства формы, закладка Оформление) накликать это УО, код пока убрать.
Если заработает, смотри в отладке что там.
у меня вот такое для ТЧ точно работает
УО = ЭтаФорма.УсловноеОформление;
УО.Элементы.Очистить();
ЭлементУО = УО.Элементы.Добавить();
Оформляемоеполе = ЭлементУО.Поля.Элементы.Добавить(); // Поля таблицы для которых будет действовать оформление
Оформляемоеполе.Поле = Новый ПолеКомпоновкиДанных(«ТабличнаяЧасть1Реквизит2»);
Оформляемоеполе.Использование = ИСТИНА;
ЭлементУО.Оформление.УстановитьЗначениеПараметра(«Текст», Новый ПолеКомпоновкиДанных(«Объект.ТабличнаяЧасть1.Реквизит1»));
ЭлОтбора = ЭлементУО.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
ЭлОтбора.Использование = Истина;
ЭлОтбора.ЛевоеЗначение = Истина;
ЭлОтбора.ПравоеЗначение= Истина;
(11) так там не ДС скорее всего, а ДанныеФормыДерево
(10) сравни элементы УО который ты в форме накликал, и который кодом заполняешь. Может даже где-то есть готовая обработка которая транслирует текущее УО в программный код)
(12) Мне достаточно так как сейчас работает. Ваш код, кстати, тоже попробовал, переделав под свой случай, но он тоже не заработал.
Источник
Условное оформление Дерева на УФ
Прошу помощи у специалистов по УФ. Сам таковым пока не являюсь. Хочется выделить строки дерева значений «ДеревоПлатежей», расположенного на форме. Строки с незаполненным значением колонки «ВидНалога» в дереве имеются. Не ругается, но и не оформляет ничего.
ЭлементОтбора = НовыйЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«ДеревоПлатежей.ВидНалога»);
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Заполнено;
ЭлементОтбора.Использование = Истина;
ЭлементЦветаОформления = НовыйЭлементУсловногоОформления.Оформление.Элементы.Найти(«TextColor»);
ЭлементЦветаОформления.Значение = Метаданные.ЭлементыСтиля.ОтметкаОтрицательногоВыполненияЗадачи.Значение;
ЭлементЦветаОформления.Использование = Истина;
КонецПроцедуры
(0) у тебя статичный набор критериев раскраски, зачем программно красить?
В свойствах ДС (самого, а не у элемента формы) установи что тебе и как раскрасить.
(1) Действительно, поля указать забыл. Добавил в конец
НовыйЭлемент = НовыйЭлементУсловногоОформления.Поля.Элементы.Добавить();
НовыйЭлемент.Поле = Новый ПолеКомпоновкиДанных(«ВидНалога»);
Вот тут наверное надо конкретный цвет указывать.
ЭлементЦветаОформления.Значение = Метаданные.ЭлементыСтиля.ОтметкаОтрицательногоВыполненияЗадачи.Значение;
(3). Реквизитом отчета, добавленного на форму является ДеревоЗначений, а не динамический список. Я не могу настроить его не программно.
Источник
Полезности | Дерево значений | Обычные формы |
Работая с таким объектом, как дерево значений, нужно было автоматизировать ряд функций и процедур, связанных с настройкой и оформлением дерева значений. Поскольку дерево значений формируется или заполняется программно, заранее неизвестно количество колонок, строк и уровней в дереве значений, потому в свойствах объекта нет возможности настройки формата колонок, настройки расположения колонок, установки определенной ширины колонок, нет возможности выделения числовых отрицательных значений в колонках и т. д. Также меня очень раздражала ситуация, когда дерево создается программно, все заголовки колонок отображаются слитно в соответствии с их наименованием в коде. В данной статье я попробовал собрать наиболее полезны методы «борьбы» с этими казусами. Примерно использование этих методов в каком нибудь отчете, будет выглядеть так, как показано на скриншоте ниже.
//////////////////////////////////////////////////////////////////////////////// // ПЕРЕМЕННЫЕ МОДУЛЯ Перем ТекущееДерево; // Функция возвращает дерево значений // Функция Получить_ДеревоЗначений() Запрос = Новый Запрос; Запрос.Текст = ""; РезультатЗапроса = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией); Возврат РезультатЗапроса; КонецФункции // Процедура - выполняет заполнение дерева значений // Процедура ЗаполнитьДеревоЗначений() // Очистить дерево перед заполнением ДеревоЗначений.Строки.Очистить(); // Выборка данных (запрос) ДеревоЗначений = Получить_ДеревоЗначений(); // Массив удаляемых колонок из дерева МассивУдаляемыхКолонок = Новый Массив; МассивУдаляемыхКолонок.Добавить("Колонка_1"); МассивУдаляемыхКолонок.Добавить("Колонка_2"); ОформитьДеревоЗначений(ДеревоЗначений, "Наименование", МассивУдаляемыхКолонок); КонецПроцедуры // Процедура - оформляет колонки дерева // Процедура ОформитьДеревоЗначений(Дерево, Наименование, МассивУдаляемыхКолонок = Неопределено) ТекущееДерево = Дерево; Если Наименование = "Наименование" Тогда Дерево.Колонки.Колонка_Имя.Заголовок = "Красивый заголовок с пробелами"; Дерево.Колонки.Колонка_Имя.Ширина = 15; // Удаляем ненужные колонки Если МассивУдаляемыхКолонок <> Неопределено Тогда Удалить_Колонки_ДеревоЗначений(МассивУдаляемыхКолонок, Дерево); КонецЕсли КонецЕсли; НастройкаФорматаКолонок(Дерево); НастройкаРасположенияКолонок(ДеревоЗначений, "ДеревоЗначений"); КонецПроцедуры // () // Процедура - выполняет настройкку формата колонок в дереве // Процедура НастройкаФорматаКолонок(СтрокаДерево) Дерево = ТекущееДерево; Строки = ТекущееДерево.Строки; Колонки = ТекущееДерево.Колонки; Для Каждого стр из Строки Цикл Для Каждого Колонка из Колонки Цикл Если ТипЗнч(стр[Колонка.Имя]) = Тип("Число") Тогда стр[Колонка.Имя] = Формат(стр[Колонка.Имя], "ЧДЦ=2"); КонецЕсли; КонецЦикла; НастройкаФорматаКолонок(стр); КонецЦикла; КонецПроцедуры // Процедура - выполняет настройкку расположения колонок в дереве // Процедура НастройкаРасположенияКолонок(Дерево, Наименование) Колонки = ТекущееДерево.Колонки; Для Каждого Колонка Из Колонки Цикл Тип_Число = Дерево.Колонки[Колонка.Имя].ТипЗначения.СодержитТип(Тип("Число")); Тип_Дата = Дерево.Колонки[Колонка.Имя].ТипЗначения.СодержитТип(Тип("Дата")); Если Тип_Число Или Тип_Дата Тогда Колонка.ГоризонтальноеПоложениеВШапке = ГоризонтальноеПоложение.Центр; Колонка.ГоризонтальноеПоложениеВКолонке = ГоризонтальноеПоложение.Центр; Колонка.ГоризонтальноеПоложениеВПодвале = ГоризонтальноеПоложение.Центр; КонецЕсли; КонецЦикла; КонецПроцедуры // Процедура выполняет удаление ненужных колонок из дерева значений // Процедура Удалить_Колонки_ДеревоЗначений(Массив, Дерево) Для Каждого Имя Из Массив Цикл Дерево.Колонки.Удалить(Имя); КонецЦикла; КонецПроцедуры Процедура ДеревоЗначенийПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки) // Раскраска дерева по уровнях Если ДанныеСтроки.Уровень() = 0 Тогда ОформлениеСтроки.ЦветФона = WebЦвета.Циан; ОформлениеСтроки.Шрифт = Новый Шрифт(,,Истина); ИначеЕсли ДанныеСтроки.Уровень() = 1 Тогда ОформлениеСтроки.ЦветФона = WebЦвета.ЦианСветлый; //ОформлениеСтроки.Шрифт = Новый Шрифт(,,Истина); КонецЕсли; // Виделим отрицательные значения в колонках Для Каждого Колонка Из Элемент.Колонки Цикл Если ТипЗнч(ДанныеСтроки[Колонка.Имя]) = Тип("Число") Тогда Если ДанныеСтроки[Колонка.Имя] < 0 Тогда ОформлениеСтроки.Ячейки[Колонка.Имя].ЦветТекста = WebЦвета.Красный; КонецЕсли; ДанныеСтроки[Колонка.Имя] = Формат(ДанныеСтроки[Колонка.Имя], "ЧДЦ=2"); КонецЕсли; КонецЦикла; КонецПроцедуры
Источник