Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебно-методическое пособие РЭИС.doc
Скачиваний:
4
Добавлен:
01.03.2025
Размер:
3.85 Mб
Скачать

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

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

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

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

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

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

дзОтделы = Новый ДеревоЗначений;

дзОтделы.Колонки.Добавить("Отдел");

дзОтделы.Колонки.Добавить("Руководитель");

Нов = дзОтделы.Строки.Добавить(); //индекс 0

Нов.Отдел = "Бухгалтерия";

Нов = дзОтделы.Строки.Добавить(); //индекс 1

Нов.Отдел = "Руководство";

//детализируем отдел "Бухгалтерия"

Нов = дзОтделы.Строки[0] .Строки.Добавить();

Нов.Отдел = "Расчет зарплаты";

Нов = дзОтделы.Строки[0].Строки.Добавить();

Нов.Отдел = "Основные средства";

//детализируем руководство

Нов = дзОтделы.Строки[1] .Строки.Добавить();

Нов.Отдел = "Высшее руководство";

Нов = дзОтделы.Строки[1].Строки.Добавить();

Нов.Отдел = "Отдел маркетинга";

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

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

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

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

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

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

КснецЦикла;

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

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

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

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

КонецЦикла;

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

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

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

отступ = "";

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

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

КонецЦикла;

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

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

КонецЦикла;

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

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

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

Бухгалтерия

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

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

Руководство

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

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

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