Имя: Пароль:
1C
1С v8
Работа с выборкой - глюк или нет?
0 hardsign
 
16.05.13
17:55
Выборка=Объект.ТабличнаяЧасть1.Выгрузить();
Для Каждого ЭлементВыборки из Выборка Цикл
ОтборЗаявки=Новый Структура();
ОтборЗаявки.Вставить("НомерОперации",ЭлементВыборки.НомерОперации);
Выборка2=Выборка.НайтиСтроки(ОтборЗаявки);
Для каждого ЭлементУдаления Из Выборка2 Цикл
Выборка.Удалить(ЭлементУдаления);
КонецЦикла;
КонецЦикла;

Задача, хоть она к глюку особого отношения не имеет - получить в отдельную выборку (выборка2) массив строк - который сгруппирован значением в "номероперации", провести с ними определенные действия (проверка правильности заполнения), и повторно не обрабатывать данный массив.

Так вот - если я удаляю массив строк из "Выборка", цикл начинает отсчет элементов со сместившейся позиции!! Т.е. пропускает часть строк выборки! В примере:

Выборка
0, Значение1
1, Значение1
2, Значение1
3, Значение2
4, Значение3

После прохода первого цикла я удаляю первые три индекса - т.е. Значение2 смещается на индекс 0. И цикл берет из выборки не строку со "Значение2", а строку со "Значение3" - которая теперь в выборка с индексом "1".

Получается "Для каждого", но "Не для каждого"?:)
1 France
 
16.05.13
17:57
есть такое понятие, как ссылка...
2 hardsign
 
16.05.13
18:01
(1) я не спрашиваю как решить задачу. Вопрос больше к отличию типов циклов - по идее, Цикл "Для каждого" должен пройти ВСЕ уникальные элементы коллекции.
Цикл, который направляешь по счетчику - тут вопросов нет, куда направил - то значение он и возьмет.
3 vicof
 
16.05.13
18:11
(2) Расшифрую (1): есть передача параметров по ссылке, есть по значению
4 Wern
 
16.05.13
18:12
Цикл для каждого это тот же самый цикл по счетчику, просто счетчик не задан явно.
5 hhhh
 
16.05.13
18:18
(2) ведь вам уже миллион раз говорили: нельзя удалять строки внутри цикла, индексы в таблице смещаются. А вы тупо год за годом наступаете на одни и те же грабли.
6 dauster
 
16.05.13
18:34
(0) Если очень хочется решить задачу именно так (хотя я бы выбрал другой путь), можно переписать на следующий код:

Выборка=Объект.ТабличнаяЧасть1.Выгрузить();
//Для Каждого ЭлементВыборки из Выборка Цикл
Пока Выборка.Количество() > 0 Цикл
   ЭлементВыборки = Выборка[0];
   ОтборЗаявки=Новый Структура();
   ОтборЗаявки.Вставить("НомерОперации",ЭлементВыборки.НомерОперации);
   Выборка2=Выборка.НайтиСтроки(ОтборЗаявки);
   Для каждого ЭлементУдаления Из Выборка2 Цикл
       Выборка.Удалить(ЭлементУдаления);
   КонецЦикла;
КонецЦикла;
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс