Имя: Пароль:
1C
 
Как правильно удалять элементы из массива в цикле?
0 jq
 
04.07.07
14:34
Пишу:

       Если ТипЗнч(ВыбСтрока) = Тип("Массив") Тогда
           КолвоЭлементов = ВыбСтрока.Количество();
           Индекс = 0;
           Для н = 1 По КолвоЭлементов Цикл
           
               Номенклатура     = ВыбСтрока[Индекс].Номенклатура;
               ЕдиницаИзмерения = ВыбСтрока[Индекс].ЕдиницаИзмерения;
               Цена             = ВыбСтрока[Индекс].Цена;
               Лимит            = ВыбСтрока[Индекс].Лимит;
               ВалютаЦены       = ВыбСтрока[Индекс].Валюта;
               Характеристика   = ВыбСтрока[Индекс].ХарактеристикаНоменклатуры;
               Склад            = ВыбСтрока[Индекс].Склад;
               Серия            = Справочники.СерииНоменклатуры.ПустаяСсылка();
               Качество         = ВыбСтрока[Индекс].Качество;
               
               ВыбСтрока.Удалить(Индекс);
               
               Индекс = Индекс + 1;
           КонецЦикла

После удаления выборка сбивается...
1 Terv
 
04.07.07
14:36

       Если ТипЗнч(ВыбСтрока) = Тип("Массив") Тогда
           КолвоЭлементов = ВыбСтрока.Количество();
           Индекс = 0;
           Для н = 1 По КолвоЭлементов Цикл
               Индекс = КолвоЭлементов - н;

               Номенклатура     = ВыбСтрока[Индекс].Номенклатура;
               ЕдиницаИзмерения = ВыбСтрока[Индекс].ЕдиницаИзмерения;
               Цена             = ВыбСтрока[Индекс].Цена;
               Лимит            = ВыбСтрока[Индекс].Лимит;
               ВалютаЦены       = ВыбСтрока[Индекс].Валюта;
               Характеристика   = ВыбСтрока[Индекс].ХарактеристикаНоменклатуры;
               Склад            = ВыбСтрока[Индекс].Склад;
               Серия            = Справочники.СерииНоменклатуры.ПустаяСсылка();
               Качество         = ВыбСтрока[Индекс].Качество;
               
               ВыбСтрока.Удалить(Индекс);
               
            КонецЦикла

2 Широкий
 
04.07.07
14:37
Если ТипЗнч(ВыбСтрока) = Тип("Массив") Тогда
           КолвоЭлементов = ВыбСтрока.Количество();
           Индекс = 0;
           Для н = 1 По КолвоЭлементов Цикл
           
               Номенклатура     = ВыбСтрока[Индекс].Номенклатура;
               ЕдиницаИзмерения = ВыбСтрока[Индекс].ЕдиницаИзмерения;
               Цена             = ВыбСтрока[Индекс].Цена;
               Лимит            = ВыбСтрока[Индекс].Лимит;
               ВалютаЦены       = ВыбСтрока[Индекс].Валюта;
               Характеристика   = ВыбСтрока[Индекс].ХарактеристикаНоменклатуры;
               Склад            = ВыбСтрока[Индекс].Склад;
               Серия            = Справочники.СерииНоменклатуры.ПустаяСсылка();
               Качество         = ВыбСтрока[Индекс].Качество;
               
               Индекс = Индекс + 1;
           КонецЦикла

           ВыбСтрока.Очистить();
3 AversDik2
 
04.07.07
14:39
Индекс = 0;
Пока Индекс < ВыбСтрока.Количество()-1 Цикл
           
 Если НужноУдалить Тогда              
   ВыбСтрока.Удалить(Индекс);
 Иначе
   Индекс = Индекс+1;
 КонецЕси;

КонецЦикла
4 jq
 
04.07.07
14:44
Так это получается выборка в обратном порядке???
5 Terv
 
04.07.07
14:45
(4) ессно или см. (3)
6 vs84
 
04.07.07
14:50
ОФФ: чем Вграница() хуже Количество()-1 ?
7 AversDik2
 
04.07.07
14:58
(6) Много функций надо помнить.
Вграница() есть только у Массива, зато Количество() есть у всех коллекций значений.
8 Lind
 
04.07.07
15:01
ЖКК

Удаление элементов коллекции в цикле
--------------------------------------------------------------------------------
При необходимости удаления некоторых элементов из какой-либо коллекции элементов, обладающей свойством неявного сдвига элементов при удалении (например, таблица значений, набор записей регистра и т.д.), необходимо использовать следующий алгоритм:

КолвоЭлементовКоллекции = Коллекция.Количество();
Для ОбратныйИндекс = 1 По КолвоЭлементовКоллекции Цикл
    ЭлементКоллекции = Коллекция[КолвоЭлементовКоллекции - ОбратныйИндекс];

    Если <Условие> Тогда
         Коллекция.Удалить(ЭлементКоллекции);
    КонецЕсли;

КонецЦикла;


Где Коллекция – обрабатываемая коллекция элементов.
9 vde69
 
04.07.07
16:50
предложу екзотический варинт (иногда применяю!!!):

МассивКУдалению = Новый Массив();
Для Каждого эл из ТЗ Цикл
    Если <Условие> Тогда
         МассивКУдалению.Добавить(Эл);
    КонецЕсли;
КонецЦикла;

Для Каждого эл из МассивКУдалению Цикл
    ТЗ.Удалить(эл);
КонецЦикла;
10 TormozIT
 
гуру
04.07.07
17:59
(9) На самом деле самый читаемый вариант. Я за него, хотя (8) применяю в большинстве случаев =)
11 Terv
 
04.07.07
18:08
(10) делов вкуса, мне (9) глаза режет ... считаю, что самый читаемый и красивый, это (8) , хотя и есть более быстрые, применяю его...
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.