Имя: Пароль:
1C
 
Удаление строк в дереве
0 Trezvy
 
17.06.24
12:04
Добрый день!

Помогите удалить из дерева записи по условию. Дерево структурированное, вложений может быть много, поэтому использую рекурсию, но обрабатываются (удаляются) не все записи...

Процедура ОбойтиДеревоРекурсивноСтрокиДереваНаСервере(ДеревоЗначений)
	
	Для Каждого СтрокаДерева Из ДеревоЗначений.Строки Цикл
		
		ТекущаяСтрокаУдалена = Ложь;
		
		Если УсловиеУдаления  Тогда 
			ДеревоЗначений.Строки.Удалить(СтрокаДерева);
			ТекущаяСтрокаУдалена = Истина;
		КонецЕсли;	
		
		Если ТекущаяСтрокаУдалена = Ложь И СтрокаДерева.Строки.Количество() > 0 Тогда
			ОбойтиДеревоРекурсивноСтрокиДереваНаСервере(СтрокаДерева);
		КонецЕсли;
		
	КонецЦикла;
КонецПроцедуры


&НаСервере
Функция СкрытьПроцессыИЗадачи(ДеревоПроцессовИЗадач) Экспорт
	
ОбойтиДеревоРекурсивноСтрокиДереваНаСервере(ДеревоПроцессовИЗадач);
	
Возврат ДеревоПроцессовИЗадач;
1 Повелитель 1С
 
17.06.24
12:11
Когда обходишь коллекцию и сразу удаляешь из неё, ломается итератор. В общем случае нужно добавить строки в массив удаляемых, а потом удалить, либо обходить со своим итератором без "Для каждого".
2 Fedor-1971
 
17.06.24
12:20
1+ ДеревоПроцессовИЗадач - если это дерево формы, то там свои особенности обхода.
Сначала получаем элементы уровня 1 (примерно так: ДеревоПроцессовИЗадач.ПолучитьЭлементы() - точно не помню, посмотри в синтаксис-помощнике), потом спускаемся на следующий уровень у конкретного элемента уровня 1
3 Trezvy
 
17.06.24
13:47
(2) Это дерево значений вне формы, в форму оно загружается потом, после формирования.
4 Trezvy
 
17.06.24
13:54
(1) Хорошо, при обходе не удаляем строки, а создаем массив удаляемых строк. Как их потом удалить в дереве? Если родительская строка удаляется, подчиненная - если она не попадает по условию в удаляемые, должна "остаться в живых".

"Со своим итератором" - использовать свой счетчик строк?
5 Мультук
 
17.06.24
14:02
(4) Если родительская строка удаляется, подчиненная - если она не попадает по условию в удаляемые, должна "остаться в живых".


И как же она будет жить то?
Без родителя (Parent) -- сиротой?
Или вместо папы будет надпись "папа был, но он нас бросил!"
6 maxab72
 
17.06.24
14:08
(4) "Если родительская строка удаляется, подчиненная - если она не попадает по условию в удаляемые, должна "остаться в живых"." И к кому ее в подчинение ставить?
7 Trezvy
 
17.06.24
14:20
(6) (5) Да, верно. Получается, задача решения не имеет, с удалением родительской записи удаляются и дочерние.
Поудаляю тогда только строки без подчиненных, а родительские трогать не буду.