1с дерево значений количество уровней

Обход дерева значений с рекурсией и с заранее известным количество вложенных уровней

1.
Есть некоторое ДеревоЗначений, одно из полей (колонок) которого — «Количество». «Листья» дерева заполнены значениями, «узлы» содержат 0 (количество звездочек обозначает глубину вложенности):
* 0
* * 0
* * * 10
* * * 5
* * * 10
* * 0
* * * 0
* * * * 7
Необходимо «обойти» дерево, записав в поле «Количество» узлов сумму полей «Количество» подчиненных записей, т.е. в итоге должно получиться:
* 32
* * 25
* * * 10
* * * 5
* * * 10
* * 7
* * * 7
* * * * 7

Как будет решаться задача:
1. Если известно, что в дереве значений всего три уровня вложенности
2. Если количество уровней вложенности не ограничено.

Я вот напилил два варианта для известных уровней, но что-то не совсем работает, что первый, что второй, подскажите где я накасячил, спасибо.

&НаСервере Процедура Отобразить1НаСервере(ТабДок) Дерево = Новый ДеревоЗначений; Дерево.Колонки.Добавить("Количество",Новый ОписаниеТипов("Число")); ПерваяСтрока = Дерево.Строки.Добавить(); ПерваяСтрока.Количество = 0; ПерваяВтораяСтрока = ПерваяСтрока.Строки.Добавить(); ПерваяВтораяСтрока.Количество = 0; ПерваяТретяяСтрока = ПерваяВтораяСтрока.Строки.Добавить(); ВтораяТретяяСтрока = ПерваяВтораяСтрока.Строки.Добавить(); ТретяяТретяяСтрока = ПерваяВтораяСтрока.Строки.Добавить(); ПерваяТретяяСтрока.Количество = 10; ВтораяТретяяСтрока.Количество = 5; ТретяяТретяяСтрока.Количество = 10; ВтораяВтораяСтрока = ПерваяСтрока.Строки.Добавить(); ВтораяВтораяСтрока.Количество = 0; ВтораяВтораяТретяяСтрока = ВтораяВтораяСтрока.Строки.Добавить(); ВтораяВтораяТретяяСтрока.Количество = 0; ВтораяВтораяЧетвертаяСтрока = ВтораяВтораяТретяяСтрока.Строки.Добавить(); ВтораяВтораяЧетвертаяСтрока.Количество = 7; Макет = РеквизитФормыВЗначение("Объект").ПолучитьМакет("Макет"); ОблШапка = Макет.ПолучитьОбласть("ОблШапка"); ТабДок.Вывести(ОблШапка); Уровень= -1; ПерваяСтрокаД = Дерево.Строки; //первый вариант известных вложенных уровней. // Первый уровень подчиненных Для Каждого ПерваяСтрокаД Из ПерваяСтрокаД Цикл ПерваяСтрокаД.Количество = ПерваяСтрокаД.Количество; ПерваяВтораяСтрокаД = ПерваяСтрокаД.Строки; // Второй уровень подчиненных Для Каждого ПерваяВтораяСтрокаД Из ПерваяВтораяСтрокаД Цикл ПерваяВтораяСтрокаД.Количество = ПерваяВтораяСтрокаД.Количество+ПерваяСтрокаД.Количество; ПерваяТретяяСтрока = ПерваяВтораяСтрокаД.Строки; КонецЦикла; // Третий уровень подчиненных Для Каждого ПерваяТретяяСтрока Из ПерваяТретяяСтрока Цикл ПерваяТретяяСтрока.Количество = ПерваяВтораяСтрокаД.Количество + ПерваяТретяяСтрока.Количество КонецЦикла; // Второй уровень подчиненных 2 Для Каждого ВтораяВтораяСтрокаД Из ПерваяВтораяСтрокаД Цикл ВтораяВтораяСтрокаД.Количество = ВтораяВтораяСтрокаД.Количество+ПерваяСтрокаД.Количество; ТретяяПерваяСтрокаД = ВтораяВтораяСтрокаД.Строки; КонецЦикла; // Третий уровень подчиненных 2 Для Каждого ТретяяПерваяСтрокаД Из ТретяяПерваяСтрокаД Цикл ТретяяПерваяСтрокаД.Количество = ВтораяВтораяСтрокаД.Количество+ТретяяПерваяСтрокаД.Количество; ЧетвертаяПерваяСтрокаД = ТретяяПерваяСтрокаД.Строки; КонецЦикла; // Четвертый уровень подчиненных 2 Для Каждого ЧетвертаяПерваяСтрокаД Из ЧетвертаяПерваяСтрокаД Цикл ЧетвертаяПерваяСтрокаД.Количество = ЧетвертаяПерваяСтрокаД.Количество+ТретяяПерваяСтрокаД.Количество; КонецЦикла; КонецЦикла; // Второй вариант известных вложенных уровней // тут получается следующее // а 32 нету :( //* * 25 //* * * 10 //* * * 5 //* * * 10 //* * 7 //* * * 7 //* * * * 7 Для каждого ПерваяСтрокаД из Дерево.Строки Цикл Для каждого ПерваяВтораяСтрокаД из ПерваяСтрокаД.Строки Цикл ПерваяСтрокаД.Количество = ПерваяСтрокаД.Количество + ПерваяВтораяСтрокаД.Количество Для Каждого ПерваяТретяяСтрокаД из ПерваяВтораяСтрокаД.Строки Цикл ПерваяВтораяСтрокаД.Количество = ПерваяВтораяСтрокаД.Количество+ПерваяТретяяСтрокаД.Количество; КонецЦикла; КонецЦикла; Для каждого ВтораяВтораяСтрокаД из ПерваяСтрокаД.Строки Цикл Для каждого ВтораяВтораяТретяяСтрокаД из ВтораяВтораяСтрокаД.Строки Цикл Для каждого ВтораяВтораяЧетвертаяСтрокаД из ВтораяВтораяТретяяСтрокаД.Строки Цикл ВтораяВтораяЧетвертаяСтрокаД.Количество = ВтораяВтораяЧетвертаяСтрокаД.Количество; ВтораяВтораяТретяяСтрокаД.Количество = ВтораяВтораяЧетвертаяСтрокаД.Количество; ВтораяВтораяСтрокаД.Количество = ВтораяВтораяТретяяСтрокаД.Количество; ПерваяСтрокаД.Количество = ПерваяВтораяСтрокаД.Количество+ВтораяВтораяЧетвертаяСтрокаД.Количество; КонецЦикла; КонецЦикла; КонецЦикла; КонецЦикла; ////////////////////////////////////////////////////////////­//////////////////////////////////////////////////////// ОблЭлемент = Макет.ПолучитьОбласть("ОблЭлемент"); //ОблЭлемент.Параметры.Количество = ВтораяВтораяСтрока.Количество+ПерваяВтораяСтрока.Количество; // //ТабДок.Вывести(ОблЭлемент); Для каждого СтрокаДереваЗначений из Дерево.Строки Цикл ВывестиСтрокуДерева(ОблЭлемент,Макет,ТабДок,СтрокаДереваЗначений,Уровень); КонецЦикла; КонецПроцедуры &НаКлиенте Процедура Отобразить1(Команда) Отобразить1НаСервере(Объект.ТабДок); КонецПроцедуры &НаСервере Функция ВывестиСтрокуДерева(ОблЭлемент,Макет,ТабДок,СтрокаДереваЗначений, Уровень) Для Каждого строкиД Из СтрокаДереваЗначений.Строки Цикл ОблЭлемент.Параметры.Количество = строкиД.Количество; ТабДок.Вывести(ОблЭлемент); ВывестиСтрокуДерева(ОблЭлемент,Макет,табДок,СтрокиД,Уровень+1); КонецЦикла; КонецФункции

Источник

Читайте также:  Зимний лес рисуем зимние деревья

Уровни Дерева Значений

Доброго времени суток.
Подскажите, как можно поставить ограничение на количество уровней в табличной части у дерева значений.
Т.е чтобы количество к примеру не превышало 2. До 2 дочернего уровня.
Пример:
Родитель
—Дочерний уровень 1
——Дочерний уровень 2 (Чтобы уже был недоступен)

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

Перенос дерева из «дерева спецификаций» в «технологичес
Необходимо в 1С8 занести в справочник все технологические операции. Для этого в справочнике.

Группировка В Запросе И Уровни Справочника
есть одноуровневый справочник Операторы, который уже разросся до неудобства, хотелось бы разделить.

Раскраска ячейки дерева значений
Привет всем. Есть дерево значений, расположенное на форме. В него програмно добавляются некоторые.

Процедура ПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель) Отказ = Родитель.Уровень() > 2; КонецПроцедуры
Процедура КонфигурационнаяЕдиница1ПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр) СтрокаТабличнойЧасти = Элементы.КонфигурационнаяЕдиница1.ТекущиеДанные; Если СтрокаТабличнойЧасти.Уровень() > 2 Тогда Отказ = Истина; Сообщить(СтрокаТабличнойЧасти.Уровень()); КонецЕсли; КонецПроцедуры

: Метод объекта не обнаружен (Уровень)
ЕСЛИ СтрокаТабличнойЧасти.Уровень() > 2 ТОГДА

ЦитатаСообщение от AleXadr999 Посмотреть сообщение

Я написал примерно. У вас валит ошибку потому что у верхнего элемента Родитель = Неопределено, а сл-но ни какого уровня нет. И зачем вам лишний код в виде получения текущих данных? У вас же уже есть родитель в параметрах.

Если Родитель <> Неопределено Тогда Если Родитель.Уровень() > 1 Тогда Отказ = Истина; КонецЕсли; КонецЕсли;

Источник

1С:Предприятие. Дерево значений. Обход дерева программными средствами

Объект конфигурации 1С:Предприятие «дерево значений» представляет собой набор значений любого типа, схожий с другим часто используемым объектом — таблицей значений. Аналогично таблице значений он содержит строки и столбцы. Отличие состоит в том, что строки дерева значений имеют иерархическую структуру, т.е. подчинены друг другу.

Читайте также:  К какому типу растений относится денежное дерево

Создание строки дерева верхнего уровня иерархии и запись информации:

Добавление подчиненной строки:

Поскольку дерево значений содержит несколько уровней иерархии, то для обхода его полного обхода будет недостаточно использования цикла Для каждого. Эту задачу можно решить двумя способами: Первый способ предполагает использование нескольких циклов Для каждого, вложенных друг в друга:

Для каждого Строка0 из Дерево.Строки Цикл
Сообщить (Строка0.Колонка);
Для каждого Строка1 из Строка0.Строки Цикл

КонецЦикла;
КонецЦикла;

Такой способ имеет один существенный недостаток — мы должны заранее знать количество уровней иерархии дерева значений, и это количество должно быть небольшим, иначе количество вложенных циклов будет чересчур велико. В случае, если заранее неизвестно количество уровней иерархии, необходимо использовать рекурсию, а механизм обхода оформить отдельной процедурой.

Процедура ОбходДерева(Элемент)
ПодчиненныйЭлемент=Элемент.Строки;
Для каждого Строка из ПодчиненныйЭлемент Цикл
Сообщить (Строка.Колонка);
ОбходДерева(Строка);
КонецЦикла;
КонецПроцедуры;

Первый раз эту процедуру нужно вызвать из основного модуля, передав туда строку верхнего уровня дерева значений в качестве первого параметра.

Для каждого Строка из Дерево.Строки Цикл
Сообщить (Строка.Колонка);
ОбходДерева(Строка);
КонецЦикла;

Добавить комментарий Отменить ответ

Теперь мы в соцсетях! Подписывайтесь, чтобы получать информацию о последних обновлениях или задать вопрос.

Источник

Оцените статью