Обход дерева значений
Доброго всем. Что-то никак не придумаю красивое решение.
Имеется дерево значений.
Нужно обойти его так, чтобы обработать информацию на самых нижних уровнях, затем на один уровень выше, потом еще на уровень выше и так до конца. Т.е. для приведенного примера нужно:
Обработать строки на третьем уровне: Ст1-1-1, Ст1-1-2 и Ст1-2-1.
Далее обработать все строки второго уровня: Ст1-1, Ст1-2, Ст2-1, Ст2-2 и Ст3-1
И в последнюю очередь все строки первого уровня: Ст1, С2, Ст3
Вот как такую рекурсию написать?
(2) Да ну. А мужики то и не знали.
+(1) А если очень хочется, можно сначала обычным обходом собрать дерево в массив массивов (по уровням), а после уже обработать.
(не вашим и не нашим) Можно запомнить порядок обхода элементов при рекурсии и после, в обратном цикле, — обработать
Функция Обрабошить(СтрокаДерева)
Для каждого Строка из СтрокаДерева.Строки Цикл
Обрабошить(Строка);
Строка.УгаУга = «ЫцЫц»;//вот тут код обработки делай после рекурсивного вызова
(8) Нормально можно рекурсией сделать (если конечно не 100500 строк.
Я бы еще добавил условие окончание рекурсии, что то в этом роде:
Процедура Обрабошить(СтрокаДерева) Если СтрокаДерева.Строки.Количество() = 0 Тогда Возврат; КонецЕсли; .
Но порядок в рекурсии конечно будет не такой как ты хотел, но подчиненные узлы обработаются раньше своих родителей.
(10) Сделать чтобы подчиненные узлы обрабатывались раньше родительских у меня не составляе трудностей.
Я бы тогда сделал массив.
Обошел бы рекурсией и записал в массив
Ссылку на строку и уровень в структуру. Потом в двойном вложенном цикле обошел по номерам уровней. Всё очень просто.
Рекурсий 1 — нижние строки:
Для Каждого Подчиненный Из Подчиненные Цикл
Если Подчиненный.ЭтоГруппа Тогда
Иначе
Если Подчиненный.Строки.Количество() = 0 Тогда
Подчиненный.Заказать = Подчиненный.РекомендуетсяЗаказать;
Подчиненный.СуммаВес = Подчиненный.Заказать * Подчиненный.ВесЕдиница;
КонецЕсли;
КОнецЕсли;
УстановитьАвторасчетЗаказа(Подчиненный,УстановитьРасчет);
КонецЦикла;
Рекурсия 2 — итоги по звеньям дерева на основании более нижних:
Для Каждого Подчиненный Из Подчиненные Цикл
Если Подчиненный.Строки.Количество() = 0 Тогда
Продолжить;
КонецЕсли;
Подчиненный.Заказать = Подчиненный.Строки.Итог(«Заказать»);
Подчиненный.РекомендуетсяЗаказать = Подчиненный.Строки.Итог(«РекомендуетсяЗаказать»);
(18) За что? По сабжу ничего. Простой рекурсией не решить. в (7) и (17) обработка узлов от конца к корню, а не по уровням.
(20) Сам разуй, а лучше пройдись отладчиком, обработка дерева в (0) будет след:
Ст1-1-1
Ст1-1-2
Ст1-1
Ст1-2-1
Ст1-2
Ст1
Ст2-1
Ст2-2
С2
Ст3-1
Ст3
А надо:
Ст1-1-1
Ст1-1-2
Ст1-2-1
Ст1-1
Ст1-2
Ст2-1
Ст2-2
Ст3-1
Ст1
Ст2
Ст3
(22) ептить. на какая разница. результат есть.
У автора элементарнейшая задача и не надо ее делать через зад.
(24) в дал две рабочих процедуры. рекурсии
Одна для просчета на нижних строка чо хоч.
Вторая как обратная — как раз для групп дерева делает итоги и расчеты. Причем по всем группам. любых уровней.
например мы что то в дереве посчитали, теперь хотим чтобы итоги были в группах. так как они автоматом в дереве никогда не будут.
а автора таже хрень: он что то там считает по строкам, потом хочет по группам получить итоги этих строк — больше чем 146 процентов.
(0) можно добавить какую-то колонку в дерево, в которую записывать уровень в строках, а потом юзать НайтиСтроки(, Истина), кторая выгребет все подчиненные. ТОлько для этого надо точно знать количество уровней.
Процедура УстановитьРазворотСтрок(ДеревоПодбора, ДеревоПодбораНаФорме, УровеньРазворотаДерева) Экспорт
Для Каждого СтрокаДерева0 Из ДеревоПодбора.Строки Цикл
Если СтрокаДерева0.Уровень() < ЛокальныйУровеньРазворота Тогда
Если НЕ ДеревоПодбораНаФорме.Развернут(СтрокаДерева0) И СтрокаДерева0.Строки.Количество() > 0 Тогда
ДеревоПодбораНаФорме.Развернуть(СтрокаДерева0, Истина);
КонецЕсли;
Иначе
Если ДеревоПодбораНаФорме.Развернут(СтрокаДерева0) И СтрокаДерева0.Строки.Количество() > 0 Тогда
ДеревоПодбораНаФорме.Свернуть(СтрокаДерева0);
КонецЕсли;
КонецЕсли;
УстановитьРазворотСтрок(СтрокаДерева0, ДеревоПодбораНаФорме, УровеньРазворотаДерева)
КонецЦикла;
Источник
1С 8.x : Как обойти, перебрать дерево значений?
17 правил для составления оптимального ЗАПРОСа к данным базы 1С 50
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ 1C и Google Maps 21
была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было реш COM-подключение к базе 7.7 из 8.2 1С 6
Если код выполняется на стороне клиента, то необходимо наличие базы 7.7 на локальной машине. Пример (На форме объекта присутствует реквизит Таблица(ТаблицаЗначений)): НаКлиенте Процедура Загрузки() ПутьКБазе=» D:ВашаБаза1с77″ ; Пользователь= Excel файл как Внешний источник данных 16
Подключимся и загрузим из файла Excel данные в таблицу значений 1С. Сделать теперь это очень просто. 1. В конфигурации добавляет новый объект метаданных типа » Внешние источники данных» и назовем его просто » Excel» . https://helpf.pro/uploads/img Google maps : вывод точек на карту и режим панорамы 8
В отличие от яндекс карт в GMaps можно использовать панорамы — за что им большой плюс! Надеюсь в яндексе прочитают этот пост и тоже когда-нибудь это сделают! Для клиента нужно было сделать вывод объектов на карту С возможностью просмотра панора Посмотреть все результаты поиска похожих
Еще в этой же категории
Примеры работы с Деревом значений в УП 11
Так как работа с ДеревомЗначений и ТаблицейЗначений в данном контексте практически не отличается, в примере будет использоваться ДеревоЗначений, все тоже самое за исключением иерархии применимо и к ТаблицеЗначений. Как известно, в платформе 1С 8.1 н Преобразование дерева значений в таблицу значений и обратно 6
Хочу поделиться с посетителями сайта своим подходом к преобразованию таблицы значений в дерево значений и обратно. Вообще, при разработке отраслевой задачи, была необходимость почти во всех документах, выводить информацию в виде дерева и хранить ее Как в дереве значений строку перекинуть в другой родитель? 5
Процедура ПереместитьСтрокуДерева(Дерево, ПеремещаемаяСтрока, НовыйРодитель, Уровень = 0) Если Уровень = 0 Тогда НоваяСтрока = НовыйРодитель.Строки.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрока, ПеремещаемаяСтрока); ПереместитьСтрокуДерева(Де Как Свернуть, Развернуть узлы Дерева значений на форме? 4
Как программно свернуть/развернуть дерево значений на управляемой форме? Желательно НаКлиенте. КоллекцияЭлементовДерева=ДеревоНоменклатуры.ПолучитьЭлементы(); //Свернуть дерево Для Каждого Строка Из КоллекцияЭлементовДерева Цикл ИдентификаторСт ДеревоЗначений в ТекстовыйДокумент 3
// Выводит данные ДереваЗначений в ТекстовыйДокумент, пригодный к рассмотрению в отладчике, окне сообщений и показу. // // Параметры: // рВетка — дерево значений, подлежащее выводу. Может иметь почти любую глубину иерархии, количество и тип ко Посмотреть все в категории Работа с Деревом Значений
Источник
Обход дерева значений в 1С с удалением строк
Дерево значений весьма специфичный тип данных в 1С. По сути это таже самая таблица значений но которая имеет свойства иерархичности (древовидности). Соответственно обход дереве не такая и тривиальная задача как кажется на первый взгляд. Ведь нужно обходить древо рекурсивно.
В одной из задач мне понадобилось обойти дерево и удалить из него строки с пустыми значениями. Так как я не особо часто работал с деревом значений, то я принялся реализовывать эту задачу в упор, просто обходя дерево и удаляя строки, однако в таком случае меня ждал провал. При удалении строки из дерева, количество элементов меняется, соответственно индекс обхода цикла сбивается и остаются не удаленные строки. К сожалению я не сразу понял, это и уйму времени потратил на поиск верного решения. Ниже привожу работающий у меня код. На уникальность не претендую, обход дерева значений рекурсивно нашел в интернете и переделал на свой лад.
&НаСервере Процедура склад_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка) //Вставить содержимое обработчика ДеревоЗнач = РеквизитФормыВЗначение("ДеревоВыбора"); ОбходДереваДетально(ДеревоЗнач); ЗначениеВРеквизитФормы(ДеревоЗнач, "ДеревоВыбора"); КонецПроцедуры //Рекурсивная процедура &НаСервере Процедура ОбходДереваДетально(ПереданноеДер) Тз = Новый Массив; Для Каждого СтрПолученногоДерева Из ПереданноеДер.Строки Цикл СтрПолученногоДерева.Маркируемый = СтрПолученногоДерева.Характеристика.ор_МаркируемыйТовар; Если СтрПолученногоДерева.Строки.Количество()>0 Тогда ОбходДереваДетально(СтрПолученногоДерева); Иначе Если СтрПолученногоДерева.Остаток = 0 Тогда Тз.Добавить(СтрПолученногоДерева); КонецЕсли; КонецЕсли; КонецЦикла; Для Каждого строкаКУдалению Из Тз Цикл ПереданноеДер.Строки.Удалить(строкаКУдалению); КонецЦикла; Тз.Очистить(); КонецПроцедуры
Думаю по коду и так все понятно. Все операции производим на сервере, а потому получаем значения реквизита формы. Передаем на сервер. Там обходим и строки к удалению помещаем в пустой массив. Дальше обходим массив и удаляем строки из нашего дерева. Следующим шагом перемещаем значение дерева опять на форму.
Источник
Как обойти, перебрать дерево значений?
17 правил для составления оптимального ЗАПРОСа к данным базы 1С 50
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ 1C и Google Maps 21
была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было реш 1С 7.x : Как получить курсы валют с сайта НБУ http://www.bank.gov.ua/ за любую дату ? 6
Функция ПолучитьТаблицуКурсовНБУ(ДатаКурса, Ежедневно = 1) // если в качестве второго параметра указать число отличное от 1 — получем валюты, которые котируются на ежемесячной основе Перем Reader, Url, Точки, HtmlTab, Строк, Р, НомСтроки, НомЯче COM-подключение к базе 7.7 из 8.2 1С 6
Если код выполняется на стороне клиента, то необходимо наличие базы 7.7 на локальной машине. Пример (На форме объекта присутствует реквизит Таблица(ТаблицаЗначений)): НаКлиенте Процедура Загрузки() ПутьКБазе=» D:ВашаБаза1с77″ ; Пользователь= Cодержимое указанного ниже веб-сайта в этом приложении блокируется. Aboutsecurity_1cv8c.exe 1
Проблема: После обновления на 1С:Бухгалтерию предприятия 3-й версии, при нажатии на закладку командного интерфейса 1С:предприятие, выскакивает ошибка: Aboutsecurity_1cv8c.exe или Aboutsecurity_1cv8.exe «Содержимое указанного ниже веб-узла в э Посмотреть все результаты поиска похожих
Еще в этой же категории
Примеры работы с Деревом значений в УП 11
Так как работа с ДеревомЗначений и ТаблицейЗначений в данном контексте практически не отличается, в примере будет использоваться ДеревоЗначений, все тоже самое за исключением иерархии применимо и к ТаблицеЗначений. Как известно, в платформе 1С 8.1 н Дерево значений в таблицу значений или в табличную часть и обратно 9
Для одной организации надо было реализовать документы, где вместо табличной части надо использовать дерево и все это на управляемых формах. Но дерево нельзя сохранить в базе в текущем виде. Пришлось использовать табличную часть документа для хранени Преобразование дерева значений в таблицу значений и обратно 6
Хочу поделиться с посетителями сайта своим подходом к преобразованию таблицы значений в дерево значений и обратно. Вообще, при разработке отраслевой задачи, была необходимость почти во всех документах, выводить информацию в виде дерева и хранить ее Как в дереве значений строку перекинуть в другой родитель? 5
Процедура ПереместитьСтрокуДерева(Дерево, ПеремещаемаяСтрока, НовыйРодитель, Уровень = 0) Если Уровень = 0 Тогда НоваяСтрока = НовыйРодитель.Строки.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрока, ПеремещаемаяСтрока); ПереместитьСтрокуДерева(Де Как Свернуть, Развернуть узлы Дерева значений на форме? 4
Как программно свернуть/развернуть дерево значений на управляемой форме? Желательно НаКлиенте. КоллекцияЭлементовДерева=ДеревоНоменклатуры.ПолучитьЭлементы(); //Свернуть дерево Для Каждого Строка Из КоллекцияЭлементовДерева Цикл ИдентификаторСт Посмотреть все в категории Работа с Деревом Значений
Источник