Вход | Регистрация

1С:Предприятие :: 1С:Предприятие 8 общая

Как правильно удалять из коллекции в цикле

Как правильно удалять из коллекции в цикле
Я
   Virus32BioScan
 
09.09.18 - 06:27
//Имеем два ПоляСписка: СписокРегистров и СписокВыбранных;

//Грузим в СписокРегистров все регистры:
Процедура НачалоРаботы_ЗагрузкаРегистров()
    Для каждого Регистр из Метаданные.РегистрыСведений Цикл
        СписокРегистров.Добавить(Регистр,Регистр.Представление(),ЛОЖЬ,БиблиотекаКартинок.РегистрСведений);
    КонецЦикла;
    
    Для каждого Регистр из Метаданные.РегистрыБухгалтерии Цикл
        СписокРегистров.Добавить(Регистр,Регистр.Представление(),ЛОЖЬ,БиблиотекаКартинок.РегистрБухгалтерии);
    КонецЦикла;
    
    Для каждого Регистр из Метаданные.РегистрыНакопления Цикл
        СписокРегистров.Добавить(Регистр,Регистр.Представление(),ЛОЖЬ,БиблиотекаКартинок.РегистрНакопления);
    КонецЦикла;
    
    Для каждого Регистр из Метаданные.РегистрыРасчета Цикл
        СписокРегистров.Добавить(Регистр,Регистр.Представление(),ЛОЖЬ,БиблиотекаКартинок.РегистрРасчета);
    КонецЦикла;
КонецПроцедуры
//Загрузило 184 Элемента

//Существует следующая проблема в работе
Процедура ПеремещениеЭлемента(ПолеСпискаОткуда, ПолеСпискаКуда, Цикличность, ЭлементСписка = Неопределено)
    Если Цикличность и ЭлементСписка = Неопределено Тогда
        Для каждого ЦиклТекСтр из ПолеСпискаОткуда Цикл
            ПолеСпискаКуда.Добавить(ЦиклТекСтр.Значение,ЦиклТекСтр.Представление,ЦиклТекСтр.Пометка,ЦиклТекСтр.Картинка);
            ПолеСпискаОткуда.Удалить(ЦиклТекСтр);    
        КонецЦикла;
    ИначеЕсли НЕ Цикличность и ЭлементСписка <> Неопределено Тогда
        ПолеСпискаКуда.Добавить(ЭлементСписка.Значение,ЭлементСписка.Представление,ЭлементСписка.Пометка,ЭлементСписка.Картинка);
        ПолеСпискаОткуда.Удалить(ЭлементСписка);
    Иначе
        Сообщить("Ошибка!");
    КонецЕсли
КонецПроцедуры
//при использовании перекидывает 92 а не все элементы списка

//при повторном использовании 46, след 23
//Не могу понять в чем причина ошибки
 
 
   Cool_Profi
 
1 - 09.09.18 - 06:45
Сначала перемещай, запоминай, что переместил, потом вторым циклом удаляй из Откуда
   Virus32BioScan
 
2 - 09.09.18 - 09:19
вы знаете Cool_Profi, решил попробовать по вашей наводке (Спасибо большое за совет) закомментировал строку  //ПолеСпискаОткуда.Удалить(ЦиклТекСтр); 

И все
все 184 элемента перелетели махом.. Хотя вопрос остается открытым, я все еще не могу понять почему так произошло? То ли автор кода криворук, то ли 1с болеет
   hhhh
 
3 - 09.09.18 - 09:23
(2) ну миллион раз уже обсуждали. Уже не смешно. Когда перебираете коллекцию, нельзя удалять из нее элементы, собьется.
   Лефмихалыч
 
4 - 09.09.18 - 09:26
сначала перекинь, потом удаляй отдельным циклом. Или задом наоборот обходи.
   МимохожийОднако
 
5 - 09.09.18 - 10:09
(2) "1С сырая" ))
   Virus32BioScan
 
6 - 09.09.18 - 11:36
hhhh не понимаю вашего негодования, я вот негодую из-за не отлаженного механизма 1С. я не первый и не последний кто задастся этим вопросом.
Спасибо всем кто помог советом. вопрос закрыть
   Лефмихалыч
 
7 - 09.09.18 - 13:02
(6) с 1С все в порядке, дело в тебе - у тебя опыта два понедельника. Проблема из сабжа возникает на любой платформе и на любом языке. Это по сути первое, с чем сталкивается студент при изучении массивов.
   Sasha_H
 
8 - 09.09.18 - 13:07
   Virus32BioScan
 
9 - 09.09.18 - 20:15
Sasha_H, спасибо за полезный ссыль
   Virus32BioScan
 
10 - 09.09.18 - 20:26
Лефмихалыч затестить нужно ваш совет. я понимаю что опыта пока нет. я, конечно же, не эксперт но есть ощущение что это так работать не должно, если образно то это корова которая без ног и передвигается на сосках с пометкой ходит да и ладно. Хотя круто было бы если все таки объяснили следствием чего так выходит
 
 Рекламное место пустует
   Virus32BioScan
 
11 - 09.09.18 - 20:42
немного вникнув в вопрос воспользуюсь советом обойти в обратном порядке
   Лефмихалыч
 
12 - 09.09.18 - 22:53
(10) сельскохозяйственные свои эти фантазмы оставь. Обход массива в обратном порядке ради выборочного удаления - это реальное ПЕРВОЕ, что проходят при изучении массивов (ну, или, там, - коллекций). На первом курсе или даже на информатике в школе
   hhhh
 
13 - 09.09.18 - 23:46
(10) например, 3 элемента в таблице, ты обходишь массив, сначала первый элемент. Тут даешь команду удалить, первый элемент удаляется.

происходит сдвиг второй элемент переходит на место первого, третий на место второго.

Тут ты переходишь к следующему элементу, следующий элемент №2, по факту это тот элемент, который до удаления был третьим. А который был второй элемент получается у тебя выпадает. То есть уже у тебя не 184 элемента получается, а 183.
   Virus32BioScan
 
14 - 10.09.18 - 04:14
hhhh спасибо за разъяснение, осознал это, присмотревшись в поведение процедуры. Лефмихалыч я вот и пишу сюда всякие глупости по незнанию, вроде как выполняю задачу любого форума (Пометки задавать умные вопросы не обнаружил). повторюсь я не первый..
   Сияющий в темноте
 
15 - 10.09.18 - 09:21
Коллекция IEnumVariant,запоминает не текущий элемент,а позицию от начала
   bolobol
 
16 - 10.09.18 - 09:37
Зачем очищать коллекцию построчно? Судя по коду - копируется всё, и удаляется всё. Команда Очистить после цикла выполнит ту же работу, цикл будет прямой и работа быстрей.
   Сияющий в темноте
 
17 - 10.09.18 - 09:38
При работе с классическим Enum,мы ставим Next в конце,а если что то удалили,то не ставим.
Но в 1с Next вызывается неявно при работе цикла,поэтому,идет перескок.
Мы можем смело перебирать массив вручную при движении вперед,просто не увеличивая счетчик при удалении.
   Мыш
 
18 - 10.09.18 - 10:08
// обратный обход коллекции

Для Счетчик=1-Коллекция.Количество() По 0 Цикл
ЭлементКоллекции=Коллекция[-Счетчик];
КонецЦикла;

Список тем форума
Рекламное место пустует  Рекламное место пустует
Закон Брукера: Даже маленькая практика стоит большой теории.
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует