← Назад к вопросам

Удаление строк из таблицы значений в цикле

1.2 Junior🔥 171 комментариев
#Стандарты разработки

Условие

Дана таблица значений с колонкой "Количество". Напишите код, который удаляет все строки, где Количество = 0.

Важно: найдите правильный способ обхода таблицы с удалением строк (избежать ошибок при удалении в прямом цикле).

Подсказка

При удалении элемента в прямом цикле индексы смещаются, что приводит к пропуску элементов или ошибкам.

Варианты решения

  1. Обход в обратном порядке (от конца к началу)
  2. Использование метода НайтиСтроки() и удаление найденных
  3. Копирование нужных строк в новую таблицу

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Решение: Удаление строк из таблицы значений в цикле

Способ 1: Обход в обратном порядке (рекомендуемый)

Процедура УдалитьСтрокиСНулевымКоличеством(ТаблицаЗначений)
    
    // Обходим таблицу от конца к началу
    Для Индекс = ТаблицаЗначений.Количество() - 1 По 0 Шаг -1 Цикл
        
        Строка = ТаблицаЗначений[Индекс];
        
        Если Строка.Количество = 0 Тогда
            ТаблицаЗначений.Удалить(Индекс);
        КонецЕсли;
        
    КонецЦикла;
    
КонецПроцедуры

Преимущества:

  • Простой и понятный код
  • Высокая производительность
  • При удалении строки индексы оставшихся не меняются

Способ 2: Использование НайтиСтроки()

Процедура УдалитьСтрокиСНулевымКоличеством2(ТаблицаЗначений)
    
    // Находим все строки с Количество = 0
    НайденныеСтроки = ТаблицаЗначений.НайтиСтроки(
        Новый Структура("Количество", 0)
    );
    
    // Удаляем найденные строки
    Для каждого НайденнаяСтрока Из НайденныеСтроки Цикл
        ТаблицаЗначений.Удалить(НайденнаяСтрока);
    КонецЦикла;
    
КонецПроцедуры

Преимущества:

  • Декларативный подход
  • Работает с условиями
  • Менее подвержена ошибкам

Способ 3: Копирование нужных строк в новую таблицу

Процедура УдалитьСтрокиСНулевымКоличеством3(ТаблицаЗначений)
    
    НоваяТаблица = ТаблицаЗначений.Скопировать(, ТаблицаЗначений.Колонки);
    НоваяТаблица.Очистить();
    
    // Копируем только нужные строки
    Для каждого Строка Из ТаблицаЗначений Цикл
        
        Если Строка.Количество <> 0 Тогда
            НовыеДанные = НоваяТаблица.Добавить();
            ЗаполнитьЗначенияСвойств(НовыеДанные, Строка);
        КонецЕсли;
        
    КонецЦикла;
    
    // Заменяем содержимое старой таблицы
    ТаблицаЗначений.Очистить();
    ДляКаждого Строка Из НоваяТаблица Цикл
        НоваяСтрока = ТаблицаЗначений.Добавить();
        ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка);
    КонецЦикла;
    
КонецПроцедуры

Способ 4: Фильтрация с условием

Процедура УдалитьСтрокиСНулевымКоличеством4(ТаблицаЗначений)
    
    Индекс = 0;
    
    Пока Индекс < ТаблицаЗначений.Количество() Цикл
        
        Если ТаблицаЗначений[Индекс].Количество = 0 Тогда
            ТаблицаЗначений.Удалить(Индекс);
        Иначе
            Индекс = Индекс + 1;
        КонецЕсли;
        
    КонецЦикла;
    
КонецПроцедуры

Сравнение методов

МетодСкоростьПростотаПроблемы
Обратный циклБыстроПростоНет
НайтиСтроки()БыстроСреднеНет
КопированиеМедленноСложноЗатраты памяти
Условный индексБыстроСложноТрудная логика

Правильный и неправильный код

// ❌ НЕПРАВИЛЬНО - ошибка при удалении
Для каждого Строка Из ТаблицаЗначений Цикл
    Если Строка.Количество = 0 Тогда
        ТаблицаЗначений.Удалить(Строка);
    КонецЕсли;
КонецЦикла;

// ✅ ПРАВИЛЬНО - обратный порядок
Для Индекс = ТаблицаЗначений.Количество() - 1 По 0 Шаг -1 Цикл
    Если ТаблицаЗначений[Индекс].Количество = 0 Тогда
        ТаблицаЗначений.Удалить(Индекс);
    КонецЕсли;
КонецЦикла;

// ✅ ПРАВИЛЬНО - НайтиСтроки()
НайденныеСтроки = ТаблицаЗначений.НайтиСтроки(
    Новый Структура("Количество", 0)
);
Для каждого Строка Из НайденныеСтроки Цикл
    ТаблицаЗначений.Удалить(Строка);
КонецЦикла;

Вывод

Рекомендуется использовать способ 1 (обратный цикл) — он самый быстрый, простой и надёжный. Способ 2 хорош при сложных условиях фильтрации.

Удаление строк из таблицы значений в цикле | PrepBro