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

Платформа: 1С: Предприятие 8
Дата: 
06/11/2010

На первый взгляд, задача довольно тривиальная – взял, прошелся в цикле по всем строкам, да и удалил ненужные:

Для i=0 По ТабЧасть.Количество()-1 Цикл
Если ТабЧасть [i].Пометка Тогда
ТабЧасть.Удалить(i);
КонецЕсли;
КонецЦикла;

Но на самом деле тут есть целых две проблемы:

1)После каждого удаления строки все индексы строк сдвигаются на 1 назад.

После удаления i-ой строки i+1-ая принимает номер i, а цикл то идет дальше, и на следующей итерации мы будем обрабатывать уже i+1 строку (бывшую i+2-ой).
Таким образом, во-первых, переменная цикла перестает соответствовать номеру строки, а во-вторых, не обрабатывается строка, следовавшая за удаляемой!
Решение проблемы – в нарушении рекомендаций классического программирования, в изменении переменной цикла в теле цикла:

Для i=0 По ТабЧасть.Количество()-1 Цикл
Если ТабЧасть [i].Пометка Тогда
ТабЧасть.Удалить(i);
i=i-1;
КонецЕсли;
КонецЦикла;

2)После каждого удаления строки общее количество строк уменьшается на 1.

Вроде бы так и должно быть, в чем же тогда проблема? А проблема в том, что в начале цикла 1С раз и навсегда запоминает значение предела итераций переменной (ТабЧасть.Количество()-1) и не пересчитывает его каждый раз при возврате в начало цикла. Когда мы удалим все нужные нам строки и дойдем до конца таблицы, итерации цикла продолжатся, и вылетит ошибка превышения индекса массива.
Решение проблемы – в дополнительной проверке:

Для i=0 По ТабЧасть.Количество()-1 Цикл
Если ТабЧасть [i].Пометка Тогда
ТабЧасть.Удалить(i);
i=i-1;
КонецЕсли;
Если i= ТабЧасть.Количество()-1 Тогда
Прервать;
КонецЕсли;
КонецЦикла;

Ну а если вас все же смущает возврат на 1 в счетчике переменной цикла, есть вот такой вариант с использованием цикла “Пока”:

i=0;
Пока i<=ТабЧасть.Количество()-1 Цикл
Если ТабЧасть [i].Пометка Тогда
ТабЧасть.Удалить(i);
Иначе
i=i+1;
КонецЕсли;
КонецЦикла;