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

Дерево значений — это объект для хранения временных наборов данных, возникающих при работе программы.

Работа с деревом значений напоминает работу с таблицей значений, за исключением того, что в дереве могут быть представлены иерархические данные (по аналогии с иерархическим справочником). Это достигается тем, что каждая строка дерева значений может иметь подчиненные строки, а те, в свою очередь, тоже могут иметь подчиненные строки и т.д.

Дерево значений предоставляет возможность обхода строк и подсчета итогов по всем строкам дерева или по текущему уровню иерархии.

Объект ДеревоЗначений имеет свойство Строки и Колонки, через которые осуществляется доступ к коллекции строк 1-го уровня и колонок дерева значений. У каждой строки дерева значения (т.е. объекта СтрокаДереваЗначений) есть свойство Строки, содержащее коллекцию подчиненных строк для данной строки дерева значений.

Следующий пример создает дерево значений и наполняет его данными:

 

дзОтделы = Новый ДеревоЗначений;
дзОтделы.Колонки.Добавить("Отдел");
дзОтделы.Колонки.Добавить("Руководитель");
Нов = дзОтделы.Строки.Добавить(); //индекс 0
Нов.Отдел = "Бухгалтерия";
Нов = дзОтделы.Строки.Добавить(); //индекс 1
Нов.Отдел = "Руководство";
 
//детализируем отдел "Бухгалтерия"
Нов = дзОтделы.Строки[0] .Строки.Добавить ();
Нов.Отдел = "Расчет зарплаты";
Нов = дзОтделы.Строки[0].Строки.Добавить();
Нов.Отдел = "Основные средства";
 
//детализируем руководство
Нов = дзОтделы.Строки[1] .Строки.Добавить ();
Нов.Отдел = "Высшее руководство";
Нов = дзОтделы.Строки[1].Строки.Добавить();
Нов.Отдел = "Отдел маркетинга";

 

Так же, как и с таблицей значений, можно создать полную копию дерева значений с помощью метода Скопировать:

 

НОваяОргСтруктура = ДзОтделы.Скопировать();

 

Обход строк реализуется с помощью конструкции «Для Каждого» или оператором [...]:

 

//1-й вариант: обход строк 1-го уровня
Для Каждого стр Из дзОтделы Цикл
	Сообщить(стр.Отдел);
КснецЦикла;
 
//2-й вариант (индексация строк начинается с 0)
Для н = 0 По дзОтделы.Строки.Количество()-1 Цикл
	стр = дзОтделы.Строки[н];
	Сообщить(стр);
КснецЦикла;

 

Следующая программа с помощью рекурсивной процедуры обходит все строки дерева значений, включая подчиненные:

 

Процедура ПоказатьПодчиневные (СтрокаДерева,Уровень=0)
	Для Каждого стр Из СтрокаДерева.Строки Цикл
		отступ = "";
		Для н = 1 По Уровень Цикл
			отступ = отступ + " ";
		КонецЦикла;
		Сообщить(отступ + стр.Отдел);
		ПоказатьПодчиненные(стр,Уровень+1);
	КонецЦикла;
КонецПроцедуры
ПоказатьПодчиненные(дзОтделы);

 

Результат работы программы:

 

Бухгалтерия

        Расчет зарплаты

        Основные средства

Руководство

        Выслше руководство

        Отдел маркетинга

 

Аналогично таблице значений, дерево значений позволяет искать значение с помощью метода Найти или искать сразу несколько строк методом НайтиСтроки. Принципы работы этих методов полностью идентичны рассмотренным выше для таблицы значений, за исключением последнего параметра БключатьПодчиненные. Если передать в него значение Истина, то поиск будет производиться в том числе и по подчиненным строкам, иначе — только по строкам текущего уровня.

  боль в спине