Доброго времени суток. Есть обработка (ОФ) с заполнением таблицы значений на форме. При удалении строк через индекс в таблице остается 119 строк, при удалении через Таблица.Удалить(Строка) - 140. Количество строк до удаления в обоих случаях 163. Помогите, пожалуйста, разобраться, какой метод правильнее, и почему такая разница в количестве строк?
```1c
    Индекс = ТаблицаДБФ.Количество() - 1;
    Пока Индекс >= 0 Цикл

    Для Счетчик = 0 По ТаблицаДБФ.Количество() - 1 Цикл ////////ТаблицаДБФ - Табличная часть обработки

    Номенклатура = Справочники.Номенклатура.НайтиПоКоду(СокрЛП(ТаблицаДБФ[Индекс].КодНоменклатуры));

    Если Номенклатура.Пустая() Тогда

    Сообщить("Номенклатура с кодом " + СокрЛП(ТаблицаДБФ[Индекс].КодНоменклатуры) + " отсутствует.", СтатусСообщения.Внимание);
    ТаблицаДБФ.Удалить(Индекс);
    Прервать;

    КонецЕсли;

    КонецЦикла;

    Индекс = Индекс-1;

    КонецЦикла;

    ////////////////////////////////////////////////////////////­//////////////////////////////----------------------------------------------------------------------------------

    Для Каждого Строка Из ТаблицаДанных Цикл ///////////////////////ТаблицаДанных - Таблица значений , созданная программно

    Номенклатура = Справочники.Номенклатура.НайтиПоКоду(СокрЛП(СтрЗаменить(Строка.КодНоменклатуры, Символы.НПП, ")));

    Если Номенклатура.Пустая() Тогда

    Сообщить("Номенклатура с кодом " + СокрЛП(СтрЗаменить(Строка.КодНоменклатуры, Символы.НПП, ")) + " отсутствует.", СтатусСообщения.Внимание);
    ТаблицаДанных.Удалить(Строка);

    КонецЕсли;

    КонецЦикла;

    Для Каждого Строка Из ТаблицаДанных Цикл

    ЗаполнитьЗначенияСвойств(ТаблицаДБФ.Добавить(), Строка);

    КонецЦикла;
```
---
нельзя удалять строки при прямом обходе прямо в цикле, выборка сбивается, получится ерунда.
Правильно сначала собрать все удаляемые строки и потом уже удалить по ссылкам.
---
Правильно работает первый, второй не верно - потому что нельзя удалять в том же цикле, в котором обходите таблицу.
Для второго варианта надо помещать строки к удалению в отдельный массив, и потом в отдельном цикле удалять строки по данному массиву.
---
Первый вариант тоже кривой на самом деле.
цикл
Для Счетчик = 0 По ТаблицаДБФ.Количество() - 1 Цикл

не нужен тут
---
хотя и он неправильно удаление сделает

как вариант можно:

```1c
    новаяТабличка = ТаблицаДБФ.Скопировать();
    НоваяТабличка.Очистить();

    Для каждого строчки из ТаблицаДБФ Цикл
    Если Не Номенклатура.Пустая() Тогда
    НоваяСтрочка = НоваяТабличка.Добавить();
    НоваяСтрочка.Номенклатура = Строчки.Номенклатура;
    ...
    ...
    КонецЕсли;
    КонецЕсли;
```
---
Здравствуйте!
думаю второй метод более правильный, потому как при удалении через индекс, меняется индексация таблицы
и не факт что удаляется именно то что нужно
---
хотя и он неправильно удаление сделает

как вариант можно:

```1c
    новаяТабличка = ТаблицаДБФ.Скопировать();
    НоваяТабличка.Очистить();

    Для каждого строчки из ТаблицаДБФ Цикл
    Если Не Номенклатура.Пустая() Тогда
    НоваяСтрочка = НоваяТабличка.Добавить();
    НоваяСтрочка.Номенклатура = Строчки.Номенклатура;
    ...
    ...
    КонецЕсли;
    КонецЕсли;
```
---
Спасибо!
---
Правильно работает первый, второй не верно - потому что нельзя удалять в том же цикле, в котором обходите таблицу.
Для второго варианта надо помещать строки к удалению в отдельный массив, и потом в отдельном цикле удалять строки по данному массиву.
---
нельзя удалять строки при прямом обходе прямо в цикле, выборка сбивается, получится ерунда.
Правильно сначала собрать все удаляемые строки и потом уже удалить по ссылкам.
---
(4)
(2) Спасибо!
---
Первый вариант тоже кривой на самом деле.
цикл
Для Счетчик = 0 По ТаблицаДБФ.Количество() - 1 Цикл

не нужен тут
---
Согласен, Спасибо что поправили! Поэтому долго и работала обработка, что выполняла цикл из 163*163 строк.