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

Добавил admin | Дерево значений | Понедельник 5 октября 2009 0:48

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

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

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

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

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

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

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

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

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

//1-й вариант: обход строк 1-го уровня

Для Каждого стр Из дзОтделы Цикл

	Сообщить(стр.Отдел);

КснецЦикла;

 

//2-й вариант (индексация строк начинается с 0)

Для н = 0 По дзОтделы.Строки.Количество()-1 Цикл

	стр = дзОтделы.Строки[н];

	Сообщить(стр);

КснецЦикла;

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

Процедура ПоказатьПодчиневные (СтрокаДерева,Уровень=0)

	Для Каждого стр Из СтрокаДерева.Строки Цикл

		отступ = "";

		Для н = 1 По Уровень Цикл

			отступ = отступ + " ";

		КонецЦикла;

		Сообщить(отступ + стр.Отдел);

		ПоказатьПодчиненные(стр,Уровень+1);

	КонецЦикла;

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

ПоказатьПодчиненные(дзОтделы);

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

Бухгалтерия

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

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

Руководство

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

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

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