Дерево значений
Создал дерево значений, мне необходимо добавить Иерархический вид, например по Номенклатуре. В моем случае идет создание строк по типо родитель-поле-поле-поле, а нужно в виде родитель-поле, родитель-поле. Как можно правильно настроить дерево и где, чтобы можно было строить дерево в таком виде? Т.е. нужна группировка по определенному полю, в этой группе может быть несколько строк, но при этом можно создавать несколько групп различных
По теме из базы знаний
- Программное копирование узла/строки дерева значений на управляемой форме (УФ, ДанныеФормыДерево, ДанныеФормыЭлементДерева) в вариантах на клиенте и на сервере
- Загрузка JSON в дерево значений
- JSON -> Дерево значений
- Преобразование Структуры в Дерево значений и Дерева значений в Структуру. Управляемые формы
- Вывод условного оформления дерева значений или табличной части в эксель
Найденные решения
(1)
Во вложении демо-обработка с обычной формой
МоеДерево = Новый ДеревоЗначений;
МоеДерево.Колонки.Добавить("Номенклатура");
МоеДерево.Колонки.Добавить("ИмяРеквизита");
МоеДерево.Колонки.Добавить("ЗначениеРеквизита");
Для Каждого СтрТаблЗначений Из ТаблЗначений Цикл //перебираем строки таблицы из результата запроса
СтрокаРодитель = МоеДерево.Строки.Добавить(); //1-й уровень дерева
СтрокаРодитель.Номенклатура = СтрТаблЗначений.Номенклатура;
СтрокаПодчиненная = СтрокаРодитель.Строки.Добавить(); // 2 уровень дерева, добавляем строки подчиненные строке-родителю
СтрокаПодчиненная.Номенклатура = "-";
СтрокаПодчиненная.ИмяРеквизита = СтрТаблЗначений.Код;
СтрокаПодчиненная.ЗначениеРеквизита = СтрТаблЗначений.Наименование;
КонецЦикла;
ПоказатьВо вложении демо-обработка с обычной формой
Прикрепленные файлы:
тест.epf
Остальные ответы
В избранное
Подписаться на ответы
Сортировка:
Древо развёрнутое
Свернуть все
(1)
Во вложении демо-обработка с обычной формой
МоеДерево = Новый ДеревоЗначений;
МоеДерево.Колонки.Добавить("Номенклатура");
МоеДерево.Колонки.Добавить("ИмяРеквизита");
МоеДерево.Колонки.Добавить("ЗначениеРеквизита");
Для Каждого СтрТаблЗначений Из ТаблЗначений Цикл //перебираем строки таблицы из результата запроса
СтрокаРодитель = МоеДерево.Строки.Добавить(); //1-й уровень дерева
СтрокаРодитель.Номенклатура = СтрТаблЗначений.Номенклатура;
СтрокаПодчиненная = СтрокаРодитель.Строки.Добавить(); // 2 уровень дерева, добавляем строки подчиненные строке-родителю
СтрокаПодчиненная.Номенклатура = "-";
СтрокаПодчиненная.ИмяРеквизита = СтрТаблЗначений.Код;
СтрокаПодчиненная.ЗначениеРеквизита = СтрТаблЗначений.Наименование;
КонецЦикла;
ПоказатьВо вложении демо-обработка с обычной формой
Прикрепленные файлы:
тест.epf
Делайте программно. Это позволит избежать ограничений и условностей автоматически созданных деревьев, созданных, к примеру, из результата запроса.
- У дерева значений должна быть колонка с уникальными идентификаторами строк. Без него никак.
- Так же желательно иметь еще одну колонку, с глубиной уровня строки. Пригодится во многом, например - сл. пункт
- На различных уровнях вложенности часто нужно скрыть колонки. Тут хорошо работает условное оформление УФ. По значению в строке скрываете видимость колонки - в итоге у родителя видно наименование, а у подчиненных строк вместо наименования, в этой же колонке, можно показывать описание или дополнительную информацию
А в целом работа с ДЗ - тот еще гемор, поэтому в сложных коллекциях в для хранения значений используется обычная таблица значений, данные которой "красиво" отображаются на форме в отдельном объекте - дереве значений.
- У дерева значений должна быть колонка с уникальными идентификаторами строк. Без него никак.
- Так же желательно иметь еще одну колонку, с глубиной уровня строки. Пригодится во многом, например - сл. пункт
- На различных уровнях вложенности часто нужно скрыть колонки. Тут хорошо работает условное оформление УФ. По значению в строке скрываете видимость колонки - в итоге у родителя видно наименование, а у подчиненных строк вместо наименования, в этой же колонке, можно показывать описание или дополнительную информацию
А в целом работа с ДЗ - тот еще гемор, поэтому в сложных коллекциях в для хранения значений используется обычная таблица значений, данные которой "красиво" отображаются на форме в отдельном объекте - дереве значений.
&НаСервере
Процедура ПолучитьДеревоНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Родитель КАК Родитель,
| Номенклатура.Ссылка КАК Номенклатура
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ИТОГИ ПО
| Родитель";
ДеревоЗнач = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
ЗначениеВРеквизитФормы(ДеревоЗнач, "ДЗ");
КонецПроцедуры
&НаКлиенте
Процедура ПолучитьДерево(Команда)
ПолучитьДеревоНаСервере();
КонецПроцедуры
Показать
Вариант с рекурсией.
&НаКлиенте
Процедура СформироватьДерево(Команда)
СформироватьДеревоНаСервере();
КонецПроцедуры
&НаСервере
Процедура СформироватьДеревоНаСервере()
Запрос = Новый Запрос(
"ВЫБРАТЬ
| Т.Ссылка КАК Ссылка,
| Т.Родитель КАК Родитель
|ИЗ
| Справочник.Номенклатура КАК Т");
ТЗ = Запрос.Выполнить().Выгрузить();
ТЗ.Индексы.Добавить("Родитель");
ДобавитьСтрокиДереваРекурсивно(ТЗ, Дерево, Справочники.Номенклатура.ПустаяСсылка());
КонецПроцедуры
&НаСервере
Процедура ДобавитьСтрокиДереваРекурсивно(ТЗ, СтрокаДерева, Родитель)
МассивСтрок = ТЗ.НайтиСтроки(Новый Структура("Родитель", Родитель));
Строки = СтрокаДерева.ПолучитьЭлементы();
Для Каждого Стр Из МассивСтрок Цикл
НоваяСтрока = Строки.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, Стр);
ДобавитьСтрокиДереваРекурсивно(ТЗ, НоваяСтрока, Стр.Ссылка)
КонецЦикла;
КонецПроцедуры
Показать