База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как удалить строки из таблицы в цикле без пропуска подходящих строк?
- В этой теме 1 ответ, 2 участника, последнее обновление 11 часов, 21 минута назад сделано
Odin — Одинэсник.
-
АвторЗаписи
-
-
6 октября 2026 в 14:42 #38808
Для Каждого СтрокаТЗЗ Из ОсновнаяТаблица Цикл
если СтрокаТЗЗ.Задолжность = 0.01 Тогда
Номерстроки =СтрокаТЗЗ.НомерСтроки;
ПроверкаТаб = ЭтотОбъект.ОсновнаяТаблица;
//ТабСтр =ОсновнаяТаблица.Получить(Номерстроки — 1);
ПроверкаТаб.Удалить(Номерстроки — 1);
КонецЕсли;
КонецЦикла;Есть код который я сделал для своей обработки, при нажатии на кнопку она удаляет из таличной части строки, но почему то 2 строчики нне удоляется. из 90 строк удаляет 12 , а 2 нет
-
6 октября 2026 в 14:42 #38809
Проблема в том, что вы удаляете строки прямо внутри цикла
Для каждого. После удаления строки все последующие строки сдвигаются на одну позицию вверх, а цикл переходит к следующей строке и пропускает одну из них.Например:
1С (Код)123Строка 1Строка 2 удалитьСтрока 3 после удаления становится строкой 2Цикл уже переходит дальше и строка 3 может быть пропущена. Особенно это заметно, если подходящие строки идут подряд.
Кроме того,
НомерСтрокиможет быть просто значением вашей колонки, а не текущим индексом строки в табличной части. Поэтому удалять поНомерСтроки - 1ненадёжно.Используйте обход табличной части с конца к началу:
1С (Код)123456789101112131415ПроверкаТаб = ЭтотОбъект.ОсновнаяТаблица;ИндексСтроки = ПроверкаТаб.Количество() - 1;Пока ИндексСтроки >= 0 ЦиклСтрокаТаблицы = ПроверкаТаб[ИндексСтроки];Если СтрокаТаблицы.Задолжность = 0.01 ТогдаПроверкаТаб.Удалить(СтрокаТаблицы);КонецЕсли;ИндексСтроки = ИндексСтроки - 1;КонецЦикла;Если у вас это реквизит формы, а не табличная часть объекта, обращение может быть таким:
1С (Код)1ПроверкаТаб = ОсновнаяТаблица;Полный вариант:
1С (Код)12345678910111213ИндексСтроки = ОсновнаяТаблица.Количество() - 1;Пока ИндексСтроки >= 0 ЦиклСтрокаТаблицы = ОсновнаяТаблица[ИндексСтроки];Если СтрокаТаблицы.Задолжность = 0.01 ТогдаОсновнаяТаблица.Удалить(СтрокаТаблицы);КонецЕсли;ИндексСтроки = ИндексСтроки - 1;КонецЦикла;Удаление с конца безопасно: если строка удаляется, это не влияет на уже проверенные строки выше.
Можно удалить и по индексу:
1С (Код)1ПроверкаТаб.Удалить(ИндексСтроки);Но для табличной части обычно понятнее и надёжнее передавать саму строку:
1С (Код)1ПроверкаТаб.Удалить(СтрокаТаблицы);Ваш исходный код:
1С (Код)123456789Для Каждого СтрокаТЗЗ Из ОсновнаяТаблица ЦиклЕсли СтрокаТЗЗ.Задолжность = 0.01 ТогдаНомерСтроки = СтрокаТЗЗ.НомерСтроки;ПроверкаТаб = ЭтотОбъект.ОсновнаяТаблица;ПроверкаТаб.Удалить(НомерСтроки - 1);КонецЕсли;КонецЦикла;лучше не использовать по двум причинам:
1. Строки удаляются во время перебора
Для каждого.
2. ИспользуетсяСтрокаТЗЗ.НомерСтроки, значение которого после удаления строк может уже не соответствовать текущему индексу табличной части.Если
Задолжностьможет содержать пустое значение, можно проверять так:1С (Код)123456Если Не ЗначениеЗаполнено(СтрокаТаблицы.Задолжность)ИЛИ СтрокаТаблицы.Задолжность = 0.01 ТогдаПроверкаТаб.Удалить(СтрокаТаблицы);КонецЕсли;Но для вашей задачи достаточно обратного цикла с условием
Задолжность = 0.01.
-
-
АвторЗаписи
- Для ответа в этой теме необходимо авторизоваться.