ПредишенСледващото

На пръв поглед, задачата е доста тривиално - се темпо премине през всички редове, и заличава ненужно:

За I = 0 С TabChast.Kolichestvo () - 1 цикъл
Ако TabChast [Ь] След .Pometka
TabChast.Udalit (I);
ENDIF;
KonetsTsikla;

Но в действителност има цяла два проблема:

1) След всяко отстраняване линия всички индекси ред са изместени с един назад.

След отстраняване на аз-ти ред I + първо се броят I, и цикълът продължава, и на следващата итерация, ние ще процес има и + 1 ред (предишен I + 2ри).
По този начин, от една страна, променливата на цикъла престава да се съобразят с номера на реда, и второ, не обработват линия, следват изтрита!
Решението - в нарушение на препоръките на класическата програмиране, да се промени променливата на цикъла в тялото на цикъла:

За I = 0 С TabChast.Kolichestvo () - 1 цикъл
Ако TabChast [Ь] След .Pometka
TabChast.Udalit (I);
I = I-1;
ENDIF;
KonetsTsikla;

2) след всяко преместване линии общия брой редове се намалява с 1.

Изглежда, че е така, както трябва да бъде, какъв е проблемът? Един от проблемите е, че в началото на 1С цикъл веднъж и съхранява стойността на лимит итерация променлива (TabChast.Kolichestvo () - 1) и го преобразува всеки път, когато се завръщат в началото на цикъла. Когато се премахне цялата необходима линията и да стигнат до края на масата, повторения на цикъла ще продължат и ще летят грешка надвишава индекс на масив.
Разтворът - допълнително изпитване:

За I = 0 С TabChast.Kolichestvo () - 1 цикъл
Ако TabChast [Ь] След .Pometka
TabChast.Udalit (I);
I = I-1;
ENDIF;
Ако аз = TabChast.Kolichestvo () - 1 Тогава
прекъсване;
ENDIF;
KonetsTsikla;

Е, ако все още се притеснява да се върне 1 в брояча на променливата на цикъла, има опция с помощта на цикъла "дълги":

I = 0;
Докато аз<=ТабЧасть.Количество()-1 Цикл
Ако TabChast [Ь] След .Pometka
TabChast.Udalit (I);
в противен случай
I = I + 1;
ENDIF;
KonetsTsikla;

Подкрепете проекта - споделете линка, благодаря!