Дерево значений
Создал дерево значений, мне необходимо добавить Иерархический вид, например по Номенклатуре. В моем случае идет создание строк по типо родитель-поле-поле-поле, а нужно в виде родитель-поле, родитель-поле. Как можно правильно настроить дерево и где, чтобы можно было строить дерево в таком виде? Т.е. нужна группировка по определенному полю, в этой группе может быть несколько строк, но при этом можно создавать несколько групп различных
МоеДерево = Новый ДеревоЗначений; МоеДерево.Колонки.Добавить("Номенклатура"); МоеДерево.Колонки.Добавить("ИмяРеквизита"); МоеДерево.Колонки.Добавить("ЗначениеРеквизита"); Для Каждого СтрТаблЗначений Из ТаблЗначений Цикл //перебираем строки таблицы из результата запроса СтрокаРодитель = МоеДерево.Строки.Добавить(); //1-й уровень дерева СтрокаРодитель.Номенклатура = СтрТаблЗначений.Номенклатура; СтрокаПодчиненная = СтрокаРодитель.Строки.Добавить(); // 2 уровень дерева, добавляем строки подчиненные строке-родителю СтрокаПодчиненная.Номенклатура = "-"; СтрокаПодчиненная.ИмяРеквизита = СтрТаблЗначений.Код; СтрокаПодчиненная.ЗначениеРеквизита = СтрТаблЗначений.Наименование; КонецЦикла;
МоеДерево = Новый ДеревоЗначений; МоеДерево.Колонки.Добавить("Номенклатура"); МоеДерево.Колонки.Добавить("ИмяРеквизита"); МоеДерево.Колонки.Добавить("ЗначениеРеквизита"); Для Каждого СтрТаблЗначений Из ТаблЗначений Цикл //перебираем строки таблицы из результата запроса СтрокаРодитель = МоеДерево.Строки.Добавить(); //1-й уровень дерева СтрокаРодитель.Номенклатура = СтрТаблЗначений.Номенклатура; СтрокаПодчиненная = СтрокаРодитель.Строки.Добавить(); // 2 уровень дерева, добавляем строки подчиненные строке-родителю СтрокаПодчиненная.Номенклатура = "-"; СтрокаПодчиненная.ИмяРеквизита = СтрТаблЗначений.Код; СтрокаПодчиненная.ЗначениеРеквизита = СтрТаблЗначений.Наименование; КонецЦикла;
Делайте программно. Это позволит избежать ограничений и условностей автоматически созданных деревьев, созданных, к примеру, из результата запроса.
— У дерева значений должна быть колонка с уникальными идентификаторами строк. Без него никак.
— Так же желательно иметь еще одну колонку, с глубиной уровня строки. Пригодится во многом, например — сл. пункт
— На различных уровнях вложенности часто нужно скрыть колонки. Тут хорошо работает условное оформление УФ. По значению в строке скрываете видимость колонки — в итоге у родителя видно наименование, а у подчиненных строк вместо наименования, в этой же колонке, можно показывать описание или дополнительную информацию
А в целом работа с ДЗ — тот еще гемор, поэтому в сложных коллекциях в для хранения значений используется обычная таблица значений, данные которой «красиво» отображаются на форме в отдельном объекте — дереве значений.
&НаСервере Процедура ПолучитьДеревоНаСервере() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Номенклатура.Родитель КАК Родитель, | Номенклатура.Ссылка КАК Номенклатура |ИЗ | Справочник.Номенклатура КАК Номенклатура |ИТОГИ ПО | Родитель"; ДеревоЗнач = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией); ЗначениеВРеквизитФормы(ДеревоЗнач, "ДЗ"); КонецПроцедуры &НаКлиенте Процедура ПолучитьДерево(Команда) ПолучитьДеревоНаСервере(); КонецПроцедуры
&НаКлиенте Процедура СформироватьДерево(Команда) СформироватьДеревоНаСервере(); КонецПроцедуры &НаСервере Процедура СформироватьДеревоНаСервере() Запрос = Новый Запрос( "ВЫБРАТЬ | Т.Ссылка КАК Ссылка, | Т.Родитель КАК Родитель |ИЗ | Справочник.Номенклатура КАК Т"); ТЗ = Запрос.Выполнить().Выгрузить(); ТЗ.Индексы.Добавить("Родитель"); ДобавитьСтрокиДереваРекурсивно(ТЗ, Дерево, Справочники.Номенклатура.ПустаяСсылка()); КонецПроцедуры &НаСервере Процедура ДобавитьСтрокиДереваРекурсивно(ТЗ, СтрокаДерева, Родитель) МассивСтрок = ТЗ.НайтиСтроки(Новый Структура("Родитель", Родитель)); Строки = СтрокаДерева.ПолучитьЭлементы(); Для Каждого Стр Из МассивСтрок Цикл НоваяСтрока = Строки.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрока, Стр); ДобавитьСтрокиДереваРекурсивно(ТЗ, НоваяСтрока, Стр.Ссылка) КонецЦикла; КонецПроцедуры
Источник
УФ Дерево значений — скрыть строку
(4) Если во время применения условного оформления дерево развёрнуто, то не пропадут. Еще можно использовать параметр оформления «Отображать», тогда вместо строки «Группа 3» будет просто пустая строка.
(3) Вот поди просто так догадайся, что дерево целиком не подойдет, а нужно каждую колонку в отдельности добавить в оформляемые поля. В то время как для покраски дерево целиком подходит )
&НаКлиенте Процедура СкрытьСтроки(Команда) СкрытьСтрокиНаСервере(); КонецПроцедуры &НаСервере Процедура СкрытьСтрокиНаСервере() УсловноеОформление.Элементы.Очистить(); ЭлементУО = УсловноеОформление.Элементы.Добавить(); ЭлементУО.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь); ЭлементОтбора = ЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ДеревоЗначений.Скрыть"); ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ЭлементОтбора.ПравоеЗначение = Истина; Для Каждого КолонкаДерева Из Элементы.ДеревоЗначений.ПодчиненныеЭлементы Цикл ОформляемоеПоле = ЭлементУО.Поля.Элементы.Добавить(); ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(КолонкаДерева.Имя); КонецЦикла; КонецПроцедуры
(14)Колонки скрываются, если текущая строка не видимая.
Как вариант — делать текущей строкой одну из видимых строк.
Имхо, плохой вариант скрывать строки.
(9) Соглашусь. Потому что чует мое сердце, что вряд ли задача состоит только в визуальности. Думаю, что где-то там за кадром стоит задача работать с этим деревом, а не просто на него смотреть. Тем более, что непонятно, как поведут себя строки после сворачивания-разворачивания родителя «скрытой» строки.
Источник
Работа с деревом значений
Доброе утро, у кого-то уже день. Сразу сто раз извиняюсь за глупые вопросы.
Как в дереве значений добавить колонку?
Пишу так:
Если ПолучатьЦены Тогда
ДеревоОстатков.Колонки.Добавить(«Номенклатура»);
СтрокаНоменклатуры = ДеревоОстатков.Строки.Добавить();
Пока ПолучисьЦенушка.Следующий() Цикл
ЗаполнитьПоляСумм(СтрокаСклад, ПолучисьЦенушка, СписокЦенОстатков, КурсыВалют);
Выдает ошибку — «Ошибка при вызове метода контекста «Добавить»»
(0)Сделать то что хочешь?
Обычные управляемые формы?
Дерево будешь фомировать или это режим отображения табличного поля?
И в догонку вопрос, как скрыть колонку дерева значений? Пишу
ДеревоОстатков.ХарактеристикаСклад.Видимость — Ложь;
Тоже выдает ошибку, что поле не обнаружено.
У меня выборка по складам идет. Раньше задача стояла — показывать плановую цену, только той номенклатуре которая есть на складе. Теперь нужно чтобы цена выходила на все.
Поэтому условие — если остатка на складе нет — то добавляем колонку — номенклатура в ней выводим номенклатуру и рядом цену, а колонку «Склад» прячем.
(12) Хорошо — пусть не видимость. Тогда вернемся к первому вопросу. Как создать столбец, т.е. колонку.
ДеревоЗначений (ValueTree)
Свойства:
Колонки (Columns)
Строки (Rows)
ВыбратьСтроку (ChooseRow)
Скопировать (Copy)
Используется для доступа к свойствам и методам дерева значений в целом.
Объект, представляющий собой древовидную структуру, обладает сходной функциональностью с таблицей значений, а также обладает возможностью добавлять подчиненные строки к какой-либо строке дерева.
Внимание! В толстом клиенте (обычное приложение) передача значений данного типа с клиента на сервер и обратно приводит к возникновению исключения.
Сервер, толстый клиент, внешнее соединение.
Сериализуется. Данный объект может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту, определяется в пространстве имен . Имя типа XDTO: ValueTree
Пример:
ДеревоРезультатов = Новый ДеревоЗначений;
Для Каждого Колонка ИЗ ТаблицаРезультатов.Колонки Цикл
ДеревоРезультатов.Колонки.Добавить(Колонка.Имя);
КонецЦикла;
ДеревоЗначений, метод Скопировать
РезультатАнализаДанныхПоискАссоциаций, метод ВыгрузитьПравила
СтрокаДереваЗначений, метод Владелец
(15) На форме есть дерево значений — ОстаткиДляНовогоКлиента. В функции
Функция СоздатьКолонкиДереваОстатков(ТаблицаПоиска = Неопределено, ВсеТипыЦен = Ложь) Экспорт
ДеревоОстатков = Новый ДеревоЗначений;
МассивБазовыхТиповЦен = Новый Массив;
МассивРасчитываемыхЦен = Новый Массив;
СформироватьМассивБазовыхТиповЦен(ТаблицаПоиска, МассивБазовыхТиповЦен, МассивРасчитываемыхЦен, ВсеТипыЦен);
ДеревоОстатков.Колонки.Добавить(«ХарактеристикаСклад», Новый ОписаниеТипов(«СправочникСсылка.ХарактеристикиНоменклатуры,СправочникСсылка.Склады»));
//ДеревоОстатков.Колонки.Добавить(«Номенклатура», Новый ОписаниеТипов(«Строка»));
ДеревоОстатков.Колонки.Добавить(«ГВ», Новый ОписаниеТипов(«СправочникСсылка.ГодВыпуска»));
ДеревоОстатков.Колонки.Добавить(«МестоХранения» , Новый ОписаниеТипов(«Строка»));
ДеревоОстатков.Колонки.Добавить(«Общий» , Новый ОписаниеТипов(«Число», Новый КвалификаторыЧисла(15,3)));
ДеревоОстатков.Колонки.Добавить(«Свободный» , Новый ОписаниеТипов(«Число», Новый КвалификаторыЧисла(15,3)));
ДеревоОстатков.Колонки.Добавить(«СвободныйОжидаемый» , Новый ОписаниеТипов(«Число», Новый КвалификаторыЧисла(15,3)));
ДеревоОстатков.Колонки.Добавить(«ВРезерве» , Новый ОписаниеТипов(«Число», Новый КвалификаторыЧисла(15,3)));
// Тут колонки добавляются в том порядке в котором они идут в списке типов цен
Если МассивБазовыхТиповЦен.Количество() > 0 Тогда
// колонки для Каждого типа цены
Для Каждого Элемент Из МассивБазовыхТиповЦен Цикл
ПрефиксИмени = ОпределитьПрефиксИмениКолонки(ТаблицаПоиска, Элемент);
СоздатьКолонкиСуммДерево(ДеревоОстатков, ПрефиксИмени);
КонецЦикла;
Для Каждого Элемент Из МассивРасчитываемыхЦен Цикл
ПрефиксИмени = ОпределитьПрефиксИмениКолонки(ТаблицаПоиска, Элемент);
СоздатьКолонкиСуммДерево(ДеревоОстатков, ПрефиксИмени);
КонецЦикла;
Источник
Можно ли некоторые элементы дерева значений сделать не видимыми
Не смог понять по справке. Пытаюсь придумать где что хранить и как обрабатывать.
Дерево создал, часть элементов не имеют дочерних значений и по сути мне нужны для дальнейшей обработки, анализу так сказать.
Можно ли сделать их не видимыми?
Можно. Добавить колонку в которую проставить галочку «показывать/не показывать» и установить отбор.
Но сразу предупреждаю — вы не сможете добавить ни одной строчки, они сразу же будут скрываться по условиям отбора. Оно вам надо?
(2)Строго говоря строк добавлять не планирую, а вот с данными скрытых строк работать нужно будет, изменять их
Можно будет?
И еще — я хотел контекстное меню использовать на элементах формы, что то не увидел возможности добавить этот элемент
(14) Тема как называется? Так мы сейчас и до лечения геморроя доберемся. Ищи «Условное оформление управляемых форм», и крась что душе угодно.
ЭтотОбъект.УсловноеОформление.Элементы.Очистить(); // Видимость строк ЭлементУО = УсловноеОформление.Элементы.Добавить(); Отбор = ЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); //ГруппаОтбора.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаНе; //Отбор = ГруппаОтбораРейс.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Прог_Дерево.ТипСтрокиСостава"); Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно; Отбор.ПравоеЗначение = Новый ПолеКомпоновкиДанных("Перечисления.ТипыСтрокСоставаСпецификации.Материал"); // Видимость строк: ОтборГрузополучатель Для Каждого Элемент Из ЭтотОбъект.Элементы.Прог_Дерево.ПодчиненныеЭлементы Цикл ПолеУО = ЭлементУО.Поля.Элементы.Добавить(); ПолеУО.Поле = Новый ПолеКомпоновкиДанных(Элемент.Имя); КонецЦикла; ЭлементУО.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);
Источник