Дерево значений

1. yispepotri 07.12.21 09:37 Сейчас в теме
Создал дерево значений, мне необходимо добавить Иерархический вид, например по Номенклатуре. В моем случае идет создание строк по типо родитель-поле-поле-поле, а нужно в виде родитель-поле, родитель-поле. Как можно правильно настроить дерево и где, чтобы можно было строить дерево в таком виде? Т.е. нужна группировка по определенному полю, в этой группе может быть несколько строк, но при этом можно создавать несколько групп различных
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
6. user790708 07.12.21 15:47 Сейчас в теме +0.3 $m
(1)

МоеДерево = Новый ДеревоЗначений;
МоеДерево.Колонки.Добавить("Номенклатура");
МоеДерево.Колонки.Добавить("ИмяРеквизита");
МоеДерево.Колонки.Добавить("ЗначениеРеквизита");

Для Каждого СтрТаблЗначений Из ТаблЗначений Цикл //перебираем строки таблицы из результата запроса
	
	СтрокаРодитель = МоеДерево.Строки.Добавить(); //1-й уровень дерева
	СтрокаРодитель.Номенклатура = СтрТаблЗначений.Номенклатура;
		
				
	СтрокаПодчиненная = СтрокаРодитель.Строки.Добавить(); // 2 уровень дерева, добавляем строки подчиненные строке-родителю
			
	СтрокаПодчиненная.Номенклатура = "-";
	СтрокаПодчиненная.ИмяРеквизита = СтрТаблЗначений.Код;
	СтрокаПодчиненная.ЗначениеРеквизита = СтрТаблЗначений.Наименование;
						
			
КонецЦикла;	 
Показать

Во вложении демо-обработка с обычной формой
Прикрепленные файлы:
тест.epf
Остальные ответы
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
6. user790708 07.12.21 15:47 Сейчас в теме +0.3 $m
(1)

МоеДерево = Новый ДеревоЗначений;
МоеДерево.Колонки.Добавить("Номенклатура");
МоеДерево.Колонки.Добавить("ИмяРеквизита");
МоеДерево.Колонки.Добавить("ЗначениеРеквизита");

Для Каждого СтрТаблЗначений Из ТаблЗначений Цикл //перебираем строки таблицы из результата запроса
	
	СтрокаРодитель = МоеДерево.Строки.Добавить(); //1-й уровень дерева
	СтрокаРодитель.Номенклатура = СтрТаблЗначений.Номенклатура;
		
				
	СтрокаПодчиненная = СтрокаРодитель.Строки.Добавить(); // 2 уровень дерева, добавляем строки подчиненные строке-родителю
			
	СтрокаПодчиненная.Номенклатура = "-";
	СтрокаПодчиненная.ИмяРеквизита = СтрТаблЗначений.Код;
	СтрокаПодчиненная.ЗначениеРеквизита = СтрТаблЗначений.Наименование;
						
			
КонецЦикла;	 
Показать

Во вложении демо-обработка с обычной формой
Прикрепленные файлы:
тест.epf
2. acces969 344 07.12.21 09:54 Сейчас в теме
Делайте программно. Это позволит избежать ограничений и условностей автоматически созданных деревьев, созданных, к примеру, из результата запроса.
- У дерева значений должна быть колонка с уникальными идентификаторами строк. Без него никак.
- Так же желательно иметь еще одну колонку, с глубиной уровня строки. Пригодится во многом, например - сл. пункт
- На различных уровнях вложенности часто нужно скрыть колонки. Тут хорошо работает условное оформление УФ. По значению в строке скрываете видимость колонки - в итоге у родителя видно наименование, а у подчиненных строк вместо наименования, в этой же колонке, можно показывать описание или дополнительную информацию

А в целом работа с ДЗ - тот еще гемор, поэтому в сложных коллекциях в для хранения значений используется обычная таблица значений, данные которой "красиво" отображаются на форме в отдельном объекте - дереве значений.
3. yispepotri 07.12.21 10:04 Сейчас в теме
(2)если не сложно, было бы не плохо в виде кода. Не особо работал с деревом
4. JohnGalt 57 07.12.21 14:42 Сейчас в теме
Я думаю лучше подойдет отчет на СКД, если не планируется заполнение дерева в таком виде
5. DimaShustov 10 07.12.21 15:43 Сейчас в теме
&НаСервере
Процедура ПолучитьДеревоНаСервере()

      Запрос = Новый Запрос;
      Запрос.Текст =

            "ВЫБРАТЬ

            |     Номенклатура.Родитель КАК Родитель,
            |     Номенклатура.Ссылка КАК Номенклатура
            |ИЗ
            |     Справочник.Номенклатура КАК Номенклатура
            |ИТОГИ ПО
            |     Родитель";

	ДеревоЗнач = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);

    ЗначениеВРеквизитФормы(ДеревоЗнач, "ДЗ");

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

&НаКлиенте
  Процедура ПолучитьДерево(Команда)
	  ПолучитьДеревоНаСервере();
  КонецПроцедуры
Показать
Sangvinor; +1 Ответить
7. SlavaKron 07.12.21 17:10 Сейчас в теме
Вариант с рекурсией.
&НаКлиенте
Процедура СформироватьДерево(Команда)
	СформироватьДеревоНаСервере();
КонецПроцедуры

&НаСервере
Процедура СформироватьДеревоНаСервере()
	
	Запрос = Новый Запрос(
	"ВЫБРАТЬ
	|	Т.Ссылка КАК Ссылка,
	|	Т.Родитель КАК Родитель
	|ИЗ
	|	Справочник.Номенклатура КАК Т");
	
	ТЗ = Запрос.Выполнить().Выгрузить();
	ТЗ.Индексы.Добавить("Родитель");
	ДобавитьСтрокиДереваРекурсивно(ТЗ, Дерево, Справочники.Номенклатура.ПустаяСсылка());
	
КонецПроцедуры

&НаСервере
Процедура ДобавитьСтрокиДереваРекурсивно(ТЗ, СтрокаДерева, Родитель)
	
	МассивСтрок = ТЗ.НайтиСтроки(Новый Структура("Родитель", Родитель));
	Строки = СтрокаДерева.ПолучитьЭлементы();
	Для Каждого Стр Из МассивСтрок Цикл
		НоваяСтрока = Строки.Добавить();
		ЗаполнитьЗначенияСвойств(НоваяСтрока, Стр);
		
		ДобавитьСтрокиДереваРекурсивно(ТЗ, НоваяСтрока, Стр.Ссылка)
	КонецЦикла;
	
КонецПроцедуры
Показать
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот