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

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 339 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 Сейчас в теме
Вариант с рекурсией.
&НаКлиенте
Процедура СформироватьДерево(Команда)
	СформироватьДеревоНаСервере();
КонецПроцедуры

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

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

Разработчик 1С
Москва
зарплата от 200 000 руб. до 300 000 руб.
Полный день

Программист 1С (удаленно)
Самара
зарплата от 230 000 руб. до 230 000 руб.
Полный день

Руководитель группы разработки 1С
Москва
зарплата от 250 000 руб. до 250 000 руб.
Полный день

Специалист техподдержки
Санкт-Петербург
зарплата от 100 руб. до 150 руб.
Полный день