Имя: Пароль:
1C
1С v8
Как правильно удалять из коллекции в цикле
,
0 Virus32BioScan
 
09.09.18
06:27
//Имеем два ПоляСписка: СписокРегистров и СписокВыбранных;
//Грузим в СписокРегистров все регистры:
Процедура НачалоРаботы_ЗагрузкаРегистров()
    Для каждого Регистр из Метаданные.РегистрыСведений Цикл
        СписокРегистров.Добавить(Регистр,Регистр.Представление(),ЛОЖЬ,БиблиотекаКартинок.РегистрСведений);
    КонецЦикла;
    
    Для каждого Регистр из Метаданные.РегистрыБухгалтерии Цикл
        СписокРегистров.Добавить(Регистр,Регистр.Представление(),ЛОЖЬ,БиблиотекаКартинок.РегистрБухгалтерии);
    КонецЦикла;
    
    Для каждого Регистр из Метаданные.РегистрыНакопления Цикл
        СписокРегистров.Добавить(Регистр,Регистр.Представление(),ЛОЖЬ,БиблиотекаКартинок.РегистрНакопления);
    КонецЦикла;
    
    Для каждого Регистр из Метаданные.РегистрыРасчета Цикл
        СписокРегистров.Добавить(Регистр,Регистр.Представление(),ЛОЖЬ,БиблиотекаКартинок.РегистрРасчета);
    КонецЦикла;
КонецПроцедуры
//Загрузило 184 Элемента
//Существует следующая проблема в работе
Процедура ПеремещениеЭлемента(ПолеСпискаОткуда, ПолеСпискаКуда, Цикличность, ЭлементСписка = Неопределено)
    Если Цикличность и ЭлементСписка = Неопределено Тогда
        Для каждого ЦиклТекСтр из ПолеСпискаОткуда Цикл
            ПолеСпискаКуда.Добавить(ЦиклТекСтр.Значение,ЦиклТекСтр.Представление,ЦиклТекСтр.Пометка,ЦиклТекСтр.Картинка);
            ПолеСпискаОткуда.Удалить(ЦиклТекСтр);    
        КонецЦикла;
    ИначеЕсли НЕ Цикличность и ЭлементСписка <> Неопределено Тогда
        ПолеСпискаКуда.Добавить(ЭлементСписка.Значение,ЭлементСписка.Представление,ЭлементСписка.Пометка,ЭлементСписка.Картинка);
        ПолеСпискаОткуда.Удалить(ЭлементСписка);
    Иначе
        Сообщить("Ошибка!");
    КонецЕсли
КонецПроцедуры
//при использовании перекидывает 92 а не все элементы списка
//при повторном использовании 46, след 23
//Не могу понять в чем причина ошибки
1 Cool_Profi
 
09.09.18
06:45
Сначала перемещай, запоминай, что переместил, потом вторым циклом удаляй из Откуда
2 Virus32BioScan
 
09.09.18
09:19
вы знаете Cool_Profi, решил попробовать по вашей наводке (Спасибо большое за совет) закомментировал строку  //ПолеСпискаОткуда.Удалить(ЦиклТекСтр);
И все
все 184 элемента перелетели махом.. Хотя вопрос остается открытым, я все еще не могу понять почему так произошло? То ли автор кода криворук, то ли 1с болеет
3 hhhh
 
09.09.18
09:23
(2) ну миллион раз уже обсуждали. Уже не смешно. Когда перебираете коллекцию, нельзя удалять из нее элементы, собьется.
4 Лефмихалыч
 
09.09.18
09:26
сначала перекинь, потом удаляй отдельным циклом. Или задом наоборот обходи.
5 Мимохожий Однако
 
09.09.18
10:09
(2) "1С сырая" ))
6 Virus32BioScan
 
09.09.18
11:36
hhhh не понимаю вашего негодования, я вот негодую из-за не отлаженного механизма 1С. я не первый и не последний кто задастся этим вопросом.
Спасибо всем кто помог советом. вопрос закрыть
7 Лефмихалыч
 
09.09.18
13:02
(6) с 1С все в порядке, дело в тебе - у тебя опыта два понедельника. Проблема из сабжа возникает на любой платформе и на любом языке. Это по сути первое, с чем сталкивается студент при изучении массивов.
8 Sasha_H
 
09.09.18
13:07
9 Virus32BioScan
 
09.09.18
20:15
Sasha_H, спасибо за полезный ссыль
10 Virus32BioScan
 
09.09.18
20:26
Лефмихалыч затестить нужно ваш совет. я понимаю что опыта пока нет. я, конечно же, не эксперт но есть ощущение что это так работать не должно, если образно то это корова которая без ног и передвигается на сосках с пометкой ходит да и ладно. Хотя круто было бы если все таки объяснили следствием чего так выходит
11 Virus32BioScan
 
09.09.18
20:42
немного вникнув в вопрос воспользуюсь советом обойти в обратном порядке
12 Лефмихалыч
 
09.09.18
22:53
(10) сельскохозяйственные свои эти фантазмы оставь. Обход массива в обратном порядке ради выборочного удаления - это реальное ПЕРВОЕ, что проходят при изучении массивов (ну, или, там, - коллекций). На первом курсе или даже на информатике в школе
13 hhhh
 
09.09.18
23:46
(10) например, 3 элемента в таблице, ты обходишь массив, сначала первый элемент. Тут даешь команду удалить, первый элемент удаляется.

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

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