Я уже начинаю в бога верить.
вот код

```1c
    ПР_ДатаНачалаПериодаПоследняя = Дата(1,1,1);
    ТЧДок = СправочникОбъект.ПР_ПланированиеОтчетности;
    Для Каждого ТекОтчет из ТЧДок Цикл
    Если ТекОтчет.ДатаОтчетаПлановая >= ПР_РасчитатьПланОтгрузкиДо Тогда
    ТЧДок.Удалить(ТекОтчет)
    ИначеЕсли ТекОтчет.ДатаНачалаПериода > ПР_ДатаНачалаПериодаПоследняя Тогда
    ПР_ДатаНачалаПериодаПоследняя = ТекОтчет.ДатаНачалаПериода
    КонецЕсли
    КонецЦикла;

    ТЧДок = СправочникОбъект.ПР_ДанныеПоРеализацииОтчетность;
    Для Каждого ТекОтчет из ТЧДок Цикл
    Если ТекОтчет.ДатаОтчетаПлановая >= ПР_РасчитатьПланОтгрузкиДо Тогда
    ТЧДок.Удалить(ТекОтчет)
    КОнецЕсли;
    КонецЦикла;
```

По исходным данным гарантировано должны удалиться все строки этих табличных частей
то есть гарантировано "ТекОтчет.ДатаОтчетаПлановая >= ПР_РасчитатьПланОтгрузкиДо"
но у меня оба цикла просто проходят в два раза меньше итераций цем в исходных табличных частях,
я кеш удалил - не помогло, прямо чудо какое то
8 сторк в исходной ТЧ, остается 4
второй раз команду запускаю, никаких данных не меняю
4 исходных - остается 2 строчки
я своими глазами вижу - в два раза меньше итераций в циклах чем строк в ТЧ
как это возможно?
---
```1c
    Для Каждого ТекОтчет из ТЧДок Цикл
    Если ТекОтчет.ДатаОтчетаПлановая >= ПР_РасчитатьПланОтгрузкиДо Тогда
    ТЧДок.Удалить(ТекОтчет)
    КОнецЕсли;
    КонецЦикла;
```

вот тут ошибка. Нельзя вот так делать - удалять строку-итератор из ТЧ. Нужно сначала запомнить их в отдельной коллекции (напр. массиве), а потом уже удалять. В первом цикле такая же ошибка
---
```1c
    Для Каждого ТекОтчет из ТЧДок Цикл
    Если ТекОтчет.ДатаОтчетаПлановая >= ПР_РасчитатьПланОтгрузкиДо Тогда
    ТЧДок.Удалить(ТекОтчет)
    КОнецЕсли;
    КонецЦикла;
```

вот тут ошибка. Нельзя вот так делать - удалять строку-итератор из ТЧ. Нужно сначала запомнить их в отдельной коллекции (напр. массиве), а потом уже удалять. В первом цикле такая же ошибка
---
Почему нельзя? Чем аргументировано?
---
да похоже цикл по факту идет по индексу ТЧ, при удалении индекс смещается
и получается перескок строчек
---
Или задом наперед удалять как я помню?
---
возможно и так, но не пробовал. я вначале в массив их выбираю, а потом уже удаляю
---
Вообще не вижу смысла в создании промежуточного буфера. Главное просто после удаления не пытаться продолжать выполнять обработку строки а сразу перейти к следующей итерации.
---
в том то и фокус, текущий индекс строки ао циклу пять, - удаляем пятую строку
цикл перехидит к индекс + 1, а так как 5 строка удалена - на ее место переместилась шестая
она то и теряется в обходе
---
я лишь привел этот метод в качестве примера, которым сам пользуюсь. Можно так же пользовать и другие способы, с другим типом цикла. Например: МаксИндекс = ТЧ.Количество()-1; Для Сч=0 По МаксИндекс ... и далее уже по индексу работать.
---
Самый действенный в таком случае способ просто немного переопределить способ получения строки из тч и все.

```1c
    КоличествоЭлементов = ТЧДок.Количество();
    Для Индекс = 1 По КоличествоЭлементов Цикл
    Строка = ТЧДок[КоличествоЭлементов - Индекс];
    //....Выполняешь какие-то действия со строкой...//
    ТЧДок.Удалить(Строка);
    КонецЦикла;
```
---
Угу, а как КоличествоЭлементов в цикле оно же тоже меняется?
тут еще огород городить по преждевременному прерыванию цикла
---
Какой огород? Это типовой код... Точно такая же задача решается там, предварительная подготовка ТЧ, проверяют и удаляют лишние данные из ТЧ вплоть до полной очистки.
---
Тут обработка идет снизу вверх, по индексу. (9) Такой вариант тоже имеет место быть. Об этом коллега в (3) написал