← Назад к вопросам
Удаление строк из таблицы значений в цикле
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 хорош при сложных условиях фильтрации.
Похожие вопросы
- Поменять местами значения двух переменных без использования третьей
- Добавление строки в табличную часть документа
- Функция определения високосного года
- Обработчик ПередЗаписью с проверкой поля
- Суммирование количества строк табличной части
- Запрос на выборку товаров с остатком больше нуля
- Сортировка массива методом пузырька
- Получение списка всех открытых окон
- Избавиться от условного оператора Если
- Запрос: выбор номенклатур с ценами, оканчивающимися на 5
- Сумма и разность квадратов чисел
- Сравнение версий программы
- Декартово произведение таблиц в запросе
- Отчёт по прибыли на СКД
- Вывод всех дат в заданном интервале
- Подсчёт кораблей в игре Морской бой
- Вычисление количества дней товаров на складе
- Настройка прав доступа для групп пользователей
- Запрос суммы продаж по контрагентам за 30 дней
- Срез последних без использования виртуальной таблицы