Перейти к содержанию

Удаление из коллекции внутри цикла по коллекции

Не рекомендуется удалять элементы из коллекции при выполнении обхода коллекции. Такое поведение, как правило, небезопасно и может приводить к неявным эффектам.

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

Соответственно не рекомендуется пользоваться итераторами "Для каждого ..." после добавления и удаления элементов коллекций, если итераторы инициированы до выполнения этих действий.

Для выполнения удаления элементов можно рекомендовать или использовать индексы, или запоминать предварительно в массиве элементы коллекции подлежащие удалению, а потом выполнять их удаление.

В текущем правиле анализируются любые коллекции 1С - Массивы, Структуры, Соответствия, Таблицы значений и т.п.

Пример небезопасного кода

Для Каждого Элемент Из Коллекция Цикл
    Коллекция.Очистить();
КонецЦикла;

Для Каждого Элемент Из Коллекция.Значения Цикл
    Коллекция.Значения.Удалить(Элемент);
    Коллекция.Значения.Удалить(ДругойЭлемент);
КонецЦикла;

См. также

Экранирование кода

// sonar:IllegalDeletionFromCollection:off
// sonar:IllegalDeletionFromCollection:on