← Назад к вопросам
Удаление строк из таблицы значений в цикле
1.2 Junior🔥 171 комментариев
#Стандарты разработки
Условие
Дана таблица значений с колонкой "Количество". Напишите код, который удаляет все строки, где Количество = 0.
Важно: найдите правильный способ обхода таблицы с удалением строк (избежать ошибок при удалении в прямом цикле).
Подсказка
При удалении элемента в прямом цикле индексы смещаются, что приводит к пропуску элементов или ошибкам.
Варианты решения
- Обход в обратном порядке (от конца к началу)
- Использование метода НайтиСтроки() и удаление найденных
- Копирование нужных строк в новую таблицу
Комментарии (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 хорош при сложных условиях фильтрации.