Вставить строки в новое Дерево Значений с такой же иерархией как в старом

1. user1856280 23.05.23 16:14 Сейчас в теме
Здравствуйте, у меня есть дерево значений у которого у некоторых строк стоит галочка "НеТиповой". Я отобрал строки таким образом

&НаСервере
Процедура ВотТакВот()
	
	Дерево = ПолучитьИзВременногоХранилища(АдресВоВременномХранилище);
		
	НовоеДерево = Дерево.Скопировать(); 
	НовоеДерево.Строки.Очистить();
				
	ПоехалиРекурсировать(Дерево, НовоеДерево);
			
    ЗначениеВРеквизитФормы(НовоеДерево,"РезультатСравнения");
	
КонецПроцедуры

&НаСервере
Процедура ПоехалиРекурсировать(Дерево, НовоеДерево)
		
	СтрокиДЗ = Дерево.Строки;
	
	ПараметрыПоиска = Новый Структура;
	ПараметрыПоиска.Вставить("НеТиповой", Истина);
	
	Для Каждого ТекСтр Из СтрокиДЗ Цикл				
		
		МассивНайденных = ТекСтр.Строки.НайтиСтроки(ПараметрыПоиска, Истина);
		
		// И проверку еще на последний элемент потом элемент
				
		Если МассивНайденных.Количество() <> 0 Тогда
						
			НоваяСтрока = НовоеДерево.Строки.Добавить(); 
			
			ЗаполнитьЗначенияСвойств(НоваяСтрока, ТекСтр);
									
		КонецЕсли;
		
		ПоехалиРекурсировать(ТекСтр, НовоеДерево);
		
	КонецЦикла;
	
КонецПроцедуры
Показать


Как мне теперь постепенно вставлять строки (которые соответствуют отбору) в новое дерево при этом сохраняя структуру? (Нужны только ветви у которых есть галочка)
Первое фото это как выводится ДЗ сейчас, вторая это как я пытаюсь сделать но не получается(
Подскажите пожалуйста как это сделать
Прикрепленные файлы:
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
14. Sashares 35 23.05.23 19:33 Сейчас в теме
(1) Можно предложить немного другой вариант - использовать условное оформление.
Пример во вложении.

При открытии формы заполнится дерево.
Можно в дереве ставить флаги в колонке Флаг.
После этого нажать кнопку Отобрать - останутся только отмеченные строки и родители.
Прикрепленные файлы:
ТестОтбораДерева.epf
user1856280; +1 Ответить
2. Said-We 23.05.23 16:45 Сейчас в теме
(1) Добавь числовую колонку сумма, просчитай (Если НеТиповой истина, то 1 иначе 0 и + сумма вложенных строк) её и если при добавлении текущая сумма =0, то не добавляй строку в дерево.
user1856280; +1 Ответить
3. user1856280 23.05.23 16:50 Сейчас в теме
(2) а возможно ли как-то иначе не добавляя колонку? А постепенно выстраивать на основании первой
4. Said-We 23.05.23 17:02 Сейчас в теме
1С обходит дерево начиная с корневых уровней и на этом этапе знать что внутри невозможно.
Альтернативный вариант обходить дерево не по структуре вложенности, а по уровням, начиная с самых вложенных, но 1С так не умеет. В 1С есть объект строка и в ней есть коллекция строки.
Поэтому только, либо добавляя временную колонку, которую проще потом удалить. Либо создавать какие-то временные структуры, в которых что-то временно хранить и поиск есть там что-то или нет. Поиск это долго.
В 1С проще добавить колонку посчитать, удалить лишние строки и потом удалить лишнюю колонку. Если в новое дерево, то ... понятно что.
5. user1856280 23.05.23 17:07 Сейчас в теме
(4)Я ведь с помощью найти строки выясняю подходит мне или нет. Или я вас не так понял?)
6. Said-We 23.05.23 17:10 Сейчас в теме
(5)
Я ведь с помощью найти строки выясняю подходит мне или нет
Не надо ничего искать. У вас два раза рекурсия дерева. За первый проход считаем, за второй уже выясняем надо добавлять или нет.
Если МассивНайденных.Количество() <> 0 Тогда
А если таких строк пять, то добавите только одну?
Если вы не добавите родителя, то куда вы вложенные строки в галочкой будите добавлять?
Если вы всегда будите добавлять родителя, то чем будет отличаться новое дерево? Только строками самого нижнего уровня? И сколько раз надо запускать обработку?
7. soft_wind 23.05.23 17:24 Сейчас в теме
можно пойти другим путем (как обычно)
у вас же, уже есть процедура, которая как-то формирует ваше первое дерево!
доработайте ее что бы она могла формировать ДЗ с учетом отбора!

передаете в свою процедуру отбор, и при формировании/построении дерева проверяете элементы, если они
отвечают условиям отбора - добавляете в дерево, иначе пропускаете
10. user1856280 23.05.23 17:46 Сейчас в теме
(7) мне нужно первое дерево т.к. отборов может быть несколько. И чтобы оно формировплось 1 раз и я уже работал с копиями его
8. Said-We 23.05.23 17:34 Сейчас в теме
(7) Что делает отбор? Пусть у вас 10-ть уровней вложенности. На десятом где-то стоит галочка. Как узнать при проходе на пятом уровне, что на 10-м есть галочка или нет. Другими словами когда вы стоите на пятом уровне как вам узнать - текущую строку добавлять или нет? Или вы предлагаете на каждом проходе запускать вложенную рекурсию поиска. Рекурсия поиска в рекурсии добавления строк - зачем насиловать и без того медленную 1С, и зачем так сложно? :-)
9. soft_wind 23.05.23 17:46 Сейчас в теме
(8) идея - не старое дерево переделывать
а формировать новое с учетом условий отбора, в результате и получится ДЗ где все элементы типовые
11. Said-We 23.05.23 17:48 Сейчас в теме
(9)
идея - не старое дерево переделывать....
Не вижу разницы.
Добавили колонку. Посчитали её. Перенесли строки в новое дерево. Удалили колонку.
12. user1856280 23.05.23 18:13 Сейчас в теме
Ну то есть с тем что я сделал никуда дальше никак не уйти?)
13. Said-We 23.05.23 18:32 Сейчас в теме
(12)
Ну то есть с тем что я сделал никуда дальше никак не уйти?)
Поиск в цикле не айс.
Вы на каждом следующем уровне по факту одно и тоже ищете. Можно вообще ничего не искать. За один проход, а вы всё равно проходите рекурсией по дереву, проще просто посчитать. Не обязательно число может быть. Можно логического типа и удалить везде где ложь. Суть та же - разная реализация.
15. user1856280 23.05.23 20:21 Сейчас в теме
(13) тогда можете подробнее ваш вариант написать пожалуйста? 'Добавь числовую колонку сумма, просчитай (Если НеТиповой истина, то 1 иначе 0 и + сумма вложенных строк) её и если при добавлении текущая сумма =0, то не добавляй строку в дерево.'
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот