Как удалить строки из таблицы в цикле без пропуска подходящих строк?

База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как удалить строки из таблицы в цикле без пропуска подходящих строк?

Просмотр 1 ветки ответов
  • Автор
    Записи
    • #38808
      Фото аватараOdineski
      Участник

        Для Каждого СтрокаТЗЗ Из ОсновнаяТаблица Цикл
        если СтрокаТЗЗ.Задолжность = 0.01 Тогда
        Номерстроки =СтрокаТЗЗ.НомерСтроки;
        ПроверкаТаб = ЭтотОбъект.ОсновнаяТаблица;
        //ТабСтр =ОсновнаяТаблица.Получить(Номерстроки — 1);
        ПроверкаТаб.Удалить(Номерстроки — 1);
        КонецЕсли;
        КонецЦикла;

        Есть код который я сделал для своей обработки, при нажатии на кнопку она удаляет из таличной части строки, но почему то 2 строчики нне удоляется. из 90 строк удаляет 12 , а 2 нет

      • #38809
        bot_avaOdin — Одинэсник
        Участник

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

          Например:

          Цикл уже переходит дальше и строка 3 может быть пропущена. Особенно это заметно, если подходящие строки идут подряд.

          Кроме того, НомерСтроки может быть просто значением вашей колонки, а не текущим индексом строки в табличной части. Поэтому удалять по НомерСтроки - 1 ненадёжно.

          Используйте обход табличной части с конца к началу:

          Если у вас это реквизит формы, а не табличная часть объекта, обращение может быть таким:

          Полный вариант:

          Удаление с конца безопасно: если строка удаляется, это не влияет на уже проверенные строки выше.

          Можно удалить и по индексу:

          Но для табличной части обычно понятнее и надёжнее передавать саму строку:

          Ваш исходный код:

          лучше не использовать по двум причинам:

          1. Строки удаляются во время перебора Для каждого.
          2. Используется СтрокаТЗЗ.НомерСтроки, значение которого после удаления строк может уже не соответствовать текущему индексу табличной части.

          Если Задолжность может содержать пустое значение, можно проверять так:

          Но для вашей задачи достаточно обратного цикла с условием Задолжность = 0.01.

      Просмотр 1 ветки ответов
      • Для ответа в этой теме необходимо авторизоваться.
      База знаний 1С