Добрый день, подскажите пож-та пытаюсь удалить выделенные строки, например если удалить 1 сстроку, то все отлично, но если взять 2 строки выделить, то вторая выделенная строка остается, в чем проблема и по отладке в цикл заходит только 1 раз, если убираю удаление строк, то все как положено 2 раза.

```1c
    Для Каждого Элемент Из МассивВыделенныхСтрок Цикл
    текДанные = ТабЧастьДокумента.НайтиПоИдентификатору(Элемент);
    ТабЧастьДокумента.Удалить(текДанные);
    КонецЦикла;
```
---
Вам привели готовый правильный код в (4), если вы его не понимаете, то вот суть: определяете количество элементов в массиве и это количество раз удаляете первый элемент массива.

Другой (даже чуть-чуть более "правильный" методически) вариант в подобных случаях - удалять элементы "снизу вверх", от последнего к первому:

```1c
    МассивУдаляемыхСтрок = Элементы.ТабличнаяЧасть1.ВыделенныеСтроки;
    КоличествоСтрок = МассивУдаляемыхСтрок.Количество();
    Пока КоличествоСтрок > 0 Цикл
    НайденнаяСтрока = Объект.ТабличнаяЧасть1.НайтиПоИдентификатору(МассивУдаляемыхСтрок[КоличествоСтрок-1]);
    Объект.ТабличнаяЧасть1.Удалить(НайденнаяСтрока);
    КоличествоСтрок = КоличествоСтрок - 1;
    КонецЦикла;
```
---
если взять 2 строки выделить, то вторая выделенная строка остается, в чем проблема Проблема стара как мир 1С: при удалении текущей строки сбивается выборка.
и по отладке в цикл заходит только 1 раз, если убираю удаление строк, то все как положено 2 раза. Все правильно: зашли в цикл первый раз, удалили строку - ее больше не существует, из массива она тоже исчезла. Второго захода не будет - потому что второго элемента в массиве больше нет.
---
как обойти данное по правильному?
---
Вам привели готовый правильный код в (4), если вы его не понимаете, то вот суть: определяете количество элементов в массиве и это количество раз удаляете первый элемент массива.

Другой (даже чуть-чуть более "правильный" методически) вариант в подобных случаях - удалять элементы "снизу вверх", от последнего к первому:

```1c
    МассивУдаляемыхСтрок = Элементы.ТабличнаяЧасть1.ВыделенныеСтроки;
    КоличествоСтрок = МассивУдаляемыхСтрок.Количество();
    Пока КоличествоСтрок > 0 Цикл
    НайденнаяСтрока = Объект.ТабличнаяЧасть1.НайтиПоИдентификатору(МассивУдаляемыхСтрок[КоличествоСтрок-1]);
    Объект.ТабличнаяЧасть1.Удалить(НайденнаяСтрока);
    КоличествоСтрок = КоличествоСтрок - 1;
    КонецЦикла;
```
---
```1c
    МассивУдаляемыхСтрок = Элементы.ТабличнаяЧасть1.ВыделенныеСтроки;
    КоличествоСтрок = МассивУдаляемыхСтрок.Количество();
    Пока КоличествоСтрок > 0 Цикл
    НайденнаяСтрока = Объект.ТабличнаяЧасть1.НайтиПоИдентификатору(МассивУдаляемыхСтрок[КоличествоСтрок-1]);
    Объект.ТабличнаяЧасть1.Удалить(НайденнаяСтрока);
    КоличествоСтрок = КоличествоСтрок - 1;
    КонецЦикла;
```

Сразу напишу, что такой код не всегда будет работать. А именно когда сначала выделили строку 10, потом 2, потом 4. Поэтому перед удаление надо отсортировать строки по убыванию

```1c
    сз = Новый СписокЗначений;
    сз.ЗагрузитьЗначения(МассивУдаляемыхСтрок);
    сз.СортироватьПоЗначению(направлениеСортировки.Убыв);
```

А уже с СЗ и работать
---
а в массиве точно 2 эллемента?
---
да
---
Доброго времени суток!
Попробуйте так:

```1c
    МассивУдаляемыхСтрок = Элементы.ТабличнаяЧасть1.ВыделенныеСтроки;
    КоличествоСтрок = МассивУдаляемыхСтрок.Количество();
    Для Сч = 1 По КоличествоСтрок Цикл
    НайденнаяСтрока = Объект.ТабличнаяЧасть1.НайтиПоИдентификатору(МассивУдаляемыхСтрок[0]);
    Объект.ТабличнаяЧасть1.Удалить(НайденнаяСтрока);
    КонецЦикла;
```
---
```1c
    М = Элементы.ТабличнаяЧасть1.ВыделенныеСтроки;
    Для Ъ = -М.ВГраница() По 0 Цикл
    ТабличнаяЧасть1.Удалить(ТабличнаяЧасть1.НайтиПоИдентификатору(м[-Ъ]));
    КонецЦикла;
```
---
```1c
    М = Элементы.ТабличнаяЧасть.ВыделенныеСтроки;
    СЗ = Новый СписокЗначений;
    СЗ.ЗагрузитьЗначения(М);
    СЗ.СортироватьПоЗначению(НаправлениеСортировки.Убыв);
    Для Каждого Эл Из СЗ Цикл
    Объект.ТабличнаяЧасть.Удалить(Эл.Значение);
    КонецЦикла;
```
---
Спасибо! Помогло. Только нужно немного подкорректировать.
При повторном удаление идентификатор сдвигается относительно индекса....

```1c
    М = Элементы.ТабличнаяЧасть.ВыделенныеСтроки;
    СЗ = Новый СписокЗначений;
    СЗ.ЗагрузитьЗначения(М);
    СЗ.СортироватьПоЗначению(НаправлениеСортировки.Убыв);
    Для Каждого Эл Из СЗ Цикл
    ИндексСтроки = Объект.ТабличнаяЧасть.НайтиПоИдентификатору(Эл.Значение).НомерСтроки - 1;
    Объект.ТабличнаяЧасть.Удалить(ИндексСтроки);
    КонецЦикла;
```
---
Удаление выделенных строк через обратный массив, может будет кому полезно:

```1c
    &НаКлиенте
    Процедура ВернутьТовар(Команда)

    ВыделенныеСтроки = Элементы.ВыбранныеТовары.ВыделенныеСтроки;

    Если ВыделенныеСтроки.Количество() = 0 Тогда
    ПоказатьПредупреждение(, "Нет данных для возврата.");
    Возврат;
    КонецЕсли;

    ВыполнитьВозвратТоваров(ВыделенныеСтроки);

    КонецПроцедуры

    &НаКлиенте
    Процедура ВыполнитьВозвратТоваров(ВыделенныеСтрокиМассив)

    Для Индекс = -ВыделенныеСтрокиМассив.ВГраница() По 0 Цикл

    ИдентификаторСтроки = ВыделенныеСтрокиМассив[-Индекс];
    НайденнаяСтрока = ВыбранныеТовары.НайтиПоИдентификатору(ИдентификаторСтроки);

    ВыбранныеТовары.Удалить(НайденнаяСтрока);

    КонецЦикла;

    КонецПроцедуры
```