Вход | Регистрация
 
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 Цикл
ЭлементКоллекции=Коллекция[-Счетчик];
КонецЦикла;

Список тем форума
Рекламное место пустует  Рекламное место пустует
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует