Здравствуйте! Прошу помочь удалить строку в табличной части документа имеющего дерево значений. Делаю так,

```1c
    &НаСервере
    Процедура ДеревоНаСервере()
    ДеревоЗначений = РеквизитФормыВЗначение("ДеревоРасчетыРезерваОтпусков");
    СтрокиДереваНаСервере(ДеревоЗначений);
    КонецПроцедуры

    &НаСервере
    Процедура СтрокиДереваНаСервере(ДеревоЗначений)

    Для Каждого СтрокаДерева Из ДеревоЗначений.Строки Цикл

    НайдСтрока = ДеревоЗначений.Строки.Найти(Справочники.ИсточникиДоходов.Зарплата, "ИсточникДоходов");

    Если НЕ НайдСтрока = Неопределено Тогда
    ДеревоЗначений.Строки.Удалить(НайдСтрока);
    КонецЕсли;

    Если СтрокаДерева.Строки.Количество() > 0 Тогда
    СтрокиДереваНаСервере(СтрокаДерева);
    КонецЕсли;

    КонецЦикла;

    КонецПроцедуры
```

но выпадает ошибка:

Выполнение операции невозможно, т.к. строка была удалена.
{Документ.РасчетРезерваОтпусков.Форма.ФормаДокумента.Форма(1482)}: Если СтрокаДерева.Строки.Количество() > 0 Тогда
{Документ.РасчетРезерваОтпусков.Форма.ФормаДокумента.Форма(1483)}: СтрокиДереваНаСервере(СтрокаДерева);
{Документ.РасчетРезерваОтпусков.Форма.ФормаДокумента.Форма(1454)}: СтрокиДереваНаСервере(ДеревоЗначений);
{Документ.РасчетРезерваОтпусков.Форма.ФормаДокумента.Форма(1409)}: ДеревоНаСервере();

по причине:
Выполнение операции невозможно, т.к. строка была удалена.
---
Спасибо!
(16) Спасибо!

```1c
    &НаСервере
    Процедура СтрокиДереваНаСервере(ДеревоЗначений)

    ОтборСтрокКУдалению = Новый Структура("ИсточникДоходов", Справочники.ИсточникиДоходов.Зарплата);
    МассивСтрокКУдалению = ДеревоЗначений.Строки.НайтиСтроки(ОтборСтрокКУдалению, Истина);

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

    Если СтрокаДерева.Строки.Количество() > 0 Тогда
    СтрокиДереваНаСервере(СтрокаДерева);
    КонецЕсли;

    Попытка

    СтрокиДерева = ?(СтрокаДерева.Родитель = Неопределено,
    ДеревоЗначений.Строки,
    СтрокаДерева.Родитель.Строки);

    СтрокиДерева.Удалить(СтрокаДерева);

    Исключение
    КонецПопытки;

    КонецЦикла;
    ЗначениеВРеквизитФормы(ДеревоЗначений, "ДеревоРасчетыРезерваОтпусков");

    КонецПроцедуры
```
---
попробуй так

```1c
    &НаСервере
    Процедура СтрокиДереваНаСервере(ДеревоЗначений)

    Для Каждого СтрокаДерева Из ДеревоЗначений.Строки Цикл

    НайдСтрока = ДеревоЗначений.Строки.Найти(Справочники.ИсточникиДоходов.Зарплата, "ИсточникДоходов");

    Если НЕ НайдСтрока = Неопределено Тогда
    ДеревоЗначений.Строки.Удалить(НайдСтрока);
    СтрокиДереваНаСервере(ДеревоЗначений);
    Возврат;
    КонецЕсли;

    Если СтрокаДерева.Строки.Количество() > 0 Тогда
    СтрокиДереваНаСервере(СтрокаДерева);
    КонецЕсли;

    КонецЦикла;

    КонецПроцедуры
```
---
Ошибка такая же, но теперь перебор строк остановился на первой найденной строке. :(
---
https://its.1c.ru/db/pubprogforbeginners/content/88/hdoc
Там конечно массив, но принцип тот же

UPD: Интересное название книги: 1С:Программирование для начинающих. Детям и родителям.
---
Сообщение было скрыто модератором.
---
Ну почему сразу "дичь"? Бегло посмотрел, неплохо написано вроде.
Но она для тех, кто не изучал программирование, с самых азов начинается
---
http://forum.infostart.ru/forum9/topic142471/message1466804/#message1466804
---
Спасибо!
(16) Спасибо!

```1c
    &НаСервере
    Процедура СтрокиДереваНаСервере(ДеревоЗначений)

    ОтборСтрокКУдалению = Новый Структура("ИсточникДоходов", Справочники.ИсточникиДоходов.Зарплата);
    МассивСтрокКУдалению = ДеревоЗначений.Строки.НайтиСтроки(ОтборСтрокКУдалению, Истина);

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

    Если СтрокаДерева.Строки.Количество() > 0 Тогда
    СтрокиДереваНаСервере(СтрокаДерева);
    КонецЕсли;

    Попытка

    СтрокиДерева = ?(СтрокаДерева.Родитель = Неопределено,
    ДеревоЗначений.Строки,
    СтрокаДерева.Родитель.Строки);

    СтрокиДерева.Удалить(СтрокаДерева);

    Исключение
    КонецПопытки;

    КонецЦикла;
    ЗначениеВРеквизитФормы(ДеревоЗначений, "ДеревоРасчетыРезерваОтпусков");

    КонецПроцедуры
```
---
А если наоборот так:

```1c
    &НаСервере
    Процедура СтрокиДереваНаСервере(ДеревоЗначений)

    Для Каждого СтрокаДерева Из ДеревоЗначений.Строки Цикл
    Если СтрокаДерева.Строки.Количество() > 0 Тогда
    СтрокиДереваНаСервере(СтрокаДерева);
    КонецЕсли;

    НайдСтрока = ДеревоЗначений.Строки.Найти(Справочники.ИсточникиДоходов.Зарплата, "ИсточникДоходов");

    Если НЕ НайдСтрока = Неопределено Тогда
    ДеревоЗначений.Строки.Удалить(НайдСтрока);
    КонецЕсли;
    КонецЦикла;

    КонецПроцедуры
```
---
Ошибок нет, но в табличной части ничего не удаляется. :) Парадокс.
---
Не парадокс, дерево надо обратно загружать на клиент

ДеревоЗначений = РеквизитФормыВЗначение("ДеревоРасчетыРезерваОтпусков");
СтрокиДереваНаСервере(ДеревоЗначений);
ЗначениеВРеквизитФормы(ДеревоЗначений,"Объект.ДеревоРасчетыРезерваОтпусков");
---
О, еще две жертвы удаления элемента из итерируемой коллекции, одна даже с опытом.

Сколько уже копий сломано, сколько статей и постов на форумах написано... но нет, опять. Как сварить яйцо в микроволновке?
---
А по существу сказать нечего?
---
Сообщение было скрыто модератором.
---
Я так и знал, что про фраза про "удаление элемента из итерируемой коллекции" пройдет мимо твоих... что там у тебя.
---
```1c
    &НаСервере
    Процедура СтрокиДереваНаСервере(ДеревоЗначений)

    СтрокиКУдалению = ДеревоЗначений.Строки.НайтиСтроки(Новый Структура("ИсточникДоходов", Справочники.ИсточникиДоходов.Зарплата), Истина);

    Для Каждого Стр ИЗ СтрокиКУдалению Цикл
    Попытка
    ДеревоЗначений.Строки.Удалить(Стр);
    Исключение
    КонецПопытки
    КонецЦикла

    КонецПроцедуры
```

Тяп-ляп вариант без рекурсии.

P.S. Можно сделать рекурсией без Попытка...Исключение, но тут уж сами и рекурсия, вероятно, будет медленнее работать. Не проверял.