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

1. nat_stav 15.02.24 16:49 Сейчас в теме
Всем добрый день! Помогите, пожалуйста, кто разбирается, как удалить строку из дерева значений.

Пользователь на форме видит эти данные дерева. Туда выгружает запрос. И чтобы не добавлять условий в запрос (ну это план Б), хотелось бы поудалять строки, несоответствующие условию. Почему-то удаляет не все. Видимо что-то не правильно

СостоитВГруппеВыпуска = Ложь;

       Для Каждого СтрокаСписка Из ТЗ.Строки Цикл 
		
		ТекущаяГруппаВыпуска = СтрокаСписка.ГруппаВыпуска; 
		
		Для каждого СтрокаНомен из СтрокаСписка.Строки Цикл  
			

			ТекущаяНоменклатура = СтрокаНомен.Номенклатура; 			
			
			
			Для каждого СтрокаГруппы из ТекущаяГруппаВыпуска.Состав Цикл
				
				Если СтрокаГруппы.Номенклатура = ТекущаяНоменклатура Тогда  
						СостоитВГруппеВыпуска = Истина
				КонецЕсли;			
				
			КонецЦикла;   
			
			Если СостоитВГруппеВыпуска= Ложь Тогда             
				  
				СтрокаСписка.Строки.Удалить(СтрокаНомен);
				
			КонецЕсли; 
			СостоитВГруппеВыпуска = Ложь;
		КонецЦикла;
	КонецЦикла;
Показать
По теме из базы знаний
Найденные решения
10. Sashares 35 15.02.24 22:23 Сейчас в теме
(9) Как то так



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

Для Каждого СтрокаУдаления из МассивНаУдаление Цикл  
         
        СтрокаСписка.Строки.Удалить(СтрокаУдаления); 

    КонецЦикла;

            КонецЦикла; 
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. RustamZz 15.02.24 17:06 Сейчас в теме
(1) Нельзя внутри цикла удалять из коллекции обхода. Запишите эти строки в массив, по нему после цикла пройти и удалить.
Sashares; +1 Ответить
4. nat_stav 15.02.24 18:00 Сейчас в теме
(2)
мгм, спасибо, так ещё и думала, что это как-то странно
9. nat_stav 15.02.24 21:23 Сейчас в теме
(2)
В массив записать получилось. По крайней мере, 121 одна строка, и вроде те что нужно. Но удалять не получается. Если убрать условие с поиском строки, то просто выдает ошибку "Строка не не принадлежит коллекции"
	
		МассивНаУдаление = Новый Массив;
			
			Для Каждого СтрокаСписка Из ТЗ.Строки Цикл 
				
				ТекущаяГруппаВыпуска = СтрокаСписка.ГруппаВыпуска; 
				
				Для каждого СтрокаНомен из СтрокаСписка.Строки Цикл  
					
					
					ТекущаяНоменклатура = СтрокаНомен.Номенклатура; 	
					
					ПараметрыОтбора = Новый Структура;
					ПараметрыОтбора.Вставить("Номенклатура", ТекущаяНоменклатура);
					ПоискНоменклатуры = ТекущаяГруппаВыпуска.Состав.НайтиСтроки(ПараметрыОтбора);
					
					Если НЕ ЗначениеЗаполнено(ПоискНоменклатуры)Тогда
						МассивНаУдаление.Добавить(СтрокаНомен);
					КонецЕсли;				
				КонецЦикла;
			КонецЦикла; 
     
	
	
	Для Каждого СтрокаУдаления из МассивНаУдаление Цикл  
		   Для каждого СтрокаДерева из ТЗ.Строки Цикл
	//если не это условие, то просто ошибка (параметр №1, строка не принадлежит коллекции)		   
       Если СтрокаДерева.Строки.Найти(СтрокаУдаления) <> Неопределено Тогда
        СтрокаДерева.Строки.Удалить(СтрокаУдаления); 
	КонецЕсли;        

	      КонецЦикла;

	КонецЦикла;

Показать
10. Sashares 35 15.02.24 22:23 Сейчас в теме
(9) Как то так



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

Для Каждого СтрокаУдаления из МассивНаУдаление Цикл  
         
        СтрокаСписка.Строки.Удалить(СтрокаУдаления); 

    КонецЦикла;

            КонецЦикла; 
Показать
11. nat_stav 16.02.24 08:58 Сейчас в теме
(10) Доброе утро! Спасибо огромное! Сработало, строки удалились :`-)
3. user2033930 15.02.24 17:21 Сейчас в теме
Программная работа с деревом - это почти всегда рекурсия.
Ну или ставь условия в запросе.
И в коде твоём вообще дерево именуется ТЗ. Линейкой по рукам надо бить за такое.

А на самом деле - у тебя ошибка в построении циклов. У тебя переменная СостоитВГруппеВыпуска будет определяться только по последней строке.
5. nat_stav 15.02.24 18:06 Сейчас в теме
(3)
даааа, всё сложно. Я посмотрела уже подобные вопросы, видела объяснения о рекурсии, но это моё первое практическое столкновение с деревом. Может проще и в запросе добавить. Всё это добро было сделано внедренцами, поэтому линейкой их можно, да. У меня просто задача по желанию пользователей добавить колонку Номенклатура. Запрос там из 14 подзапоросов. Я добавила уже соединение, чтоб выбрать номенклатуру. А то что она выбирается вся решила после удалить.
6. user2033930 15.02.24 18:59 Сейчас в теме
(5) Поэтому прислушайся к Рустаму, он посоветовал самый правильный вариант.
Но есть нюанс - все равно придется использовать рекурсию, если количество уровней дерева не ограничено.
Если ограничено - да, можно использовать вложенные циклы. Неоптимально, криво, но будет работать. Пока количество уровней не увеличится.
nat_stav; +1 Ответить
7. nat_stav 15.02.24 19:14 Сейчас в теме
(6)
да там по сути два уровня сейчас
8. user2033930 15.02.24 19:15 Сейчас в теме
Оставьте свое сообщение

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