|
Как правильно удалять из коллекции в цикле | ☑ | ||
---|---|---|---|---|
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 Цикл ЭлементКоллекции=Коллекция[-Счетчик]; КонецЦикла; |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |