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

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

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

    Для Каждого СтрокаСписка Из ТЗ.Строки Цикл

    ТекущаяГруппаВыпуска = СтрокаСписка.ГруппаВыпуска;

    Для каждого СтрокаНомен из СтрокаСписка.Строки Цикл

    ТекущаяНоменклатура = СтрокаНомен.Номенклатура;

    Для каждого СтрокаГруппы из ТекущаяГруппаВыпуска.Состав Цикл

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

    КонецЦикла;

    Если СостоитВГруппеВыпуска= Ложь Тогда

    СтрокаСписка.Строки.Удалить(СтрокаНомен);

    КонецЕсли;
    СостоитВГруппеВыпуска = Ложь;
    КонецЦикла;
    КонецЦикла;
```
---
Как то так

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

    Для каждого СтрокаНомен из СтрокаСписка.Строки Цикл

    ТекущаяНоменклатура = СтрокаНомен.Номенклатура;

    ПараметрыОтбора = Новый Структура;
    ПараметрыОтбора.Вставить("Номенклатура", ТекущаяНоменклатура);
    ПоискНоменклатуры = ТекущаяГруппаВыпуска.Состав.НайтиСтроки(ПараметрыОтбора);

    Если НЕ ЗначениеЗаполнено(ПоискНоменклатуры)Тогда
    МассивНаУдаление.Добавить(СтрокаНомен);
    КонецЕсли;
    КонецЦикла;

    Для Каждого СтрокаУдаления из МассивНаУдаление Цикл

    СтрокаСписка.Строки.Удалить(СтрокаУдаления);

    КонецЦикла;

    КонецЦикла;
```
---
Нельзя внутри цикла удалять из коллекции обхода. Запишите эти строки в массив, по нему после цикла пройти и удалить.
---
мгм, спасибо, так ещё и думала, что это как-то странно
---
В массив записать получилось. По крайней мере, 121 одна строка, и вроде те что нужно. Но удалять не получается. Если убрать условие с поиском строки, то просто выдает ошибку "Строка не не принадлежит коллекции"

```1c
    МассивНаУдаление = Новый Массив;

    Для Каждого СтрокаСписка Из ТЗ.Строки Цикл

    ТекущаяГруппаВыпуска = СтрокаСписка.ГруппаВыпуска;

    Для каждого СтрокаНомен из СтрокаСписка.Строки Цикл

    ТекущаяНоменклатура = СтрокаНомен.Номенклатура;

    ПараметрыОтбора = Новый Структура;
    ПараметрыОтбора.Вставить("Номенклатура", ТекущаяНоменклатура);
    ПоискНоменклатуры = ТекущаяГруппаВыпуска.Состав.НайтиСтроки(ПараметрыОтбора);

    Если НЕ ЗначениеЗаполнено(ПоискНоменклатуры)Тогда
    МассивНаУдаление.Добавить(СтрокаНомен);
    КонецЕсли;
    КонецЦикла;
    КонецЦикла;

    Для Каждого СтрокаУдаления из МассивНаУдаление Цикл
    Для каждого СтрокаДерева из ТЗ.Строки Цикл
    //если не это условие, то просто ошибка (параметр №1, строка не принадлежит коллекции)
    Если СтрокаДерева.Строки.Найти(СтрокаУдаления) <> Неопределено Тогда
    СтрокаДерева.Строки.Удалить(СтрокаУдаления);
    КонецЕсли;

    КонецЦикла;

    КонецЦикла;
```
---
Как то так

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

    Для каждого СтрокаНомен из СтрокаСписка.Строки Цикл

    ТекущаяНоменклатура = СтрокаНомен.Номенклатура;

    ПараметрыОтбора = Новый Структура;
    ПараметрыОтбора.Вставить("Номенклатура", ТекущаяНоменклатура);
    ПоискНоменклатуры = ТекущаяГруппаВыпуска.Состав.НайтиСтроки(ПараметрыОтбора);

    Если НЕ ЗначениеЗаполнено(ПоискНоменклатуры)Тогда
    МассивНаУдаление.Добавить(СтрокаНомен);
    КонецЕсли;
    КонецЦикла;

    Для Каждого СтрокаУдаления из МассивНаУдаление Цикл

    СтрокаСписка.Строки.Удалить(СтрокаУдаления);

    КонецЦикла;

    КонецЦикла;
```
---
Доброе утро! Спасибо огромное! Сработало, строки удалились :`-)
---
Программная работа с деревом - это почти всегда рекурсия.
Ну или ставь условия в запросе.
И в коде твоём вообще дерево именуется ТЗ. Линейкой по рукам надо бить за такое.

А на самом деле - у тебя ошибка в построении циклов. У тебя переменная СостоитВГруппеВыпуска будет определяться только по последней строке.
---
даааа, всё сложно. Я посмотрела уже подобные вопросы, видела объяснения о рекурсии, но это моё первое практическое столкновение с деревом. Может проще и в запросе добавить. Всё это добро было сделано внедренцами, поэтому линейкой их можно, да. У меня просто задача по желанию пользователей добавить колонку Номенклатура. Запрос там из 14 подзапоросов. Я добавила уже соединение, чтоб выбрать номенклатуру. А то что она выбирается вся решила после удалить.
---
Поэтому прислушайся к Рустаму, он посоветовал самый правильный вариант.
Но есть нюанс - все равно придется использовать рекурсию, если количество уровней дерева не ограничено.
Если ограничено - да, можно использовать вложенные циклы. Неоптимально, криво, но будет работать. Пока количество уровней не увеличится.
---
да там по сути два уровня сейчас
---
Это временно.