Добрый день! Как сделать так, чтоб выбрать 4-5 строк и они сразу все удалились в таблице значений? В данный момент я выбираю 4-5 строк и удаляется по одной строке.

```1c
    &НаКлиенте
    Процедура Удалить(Команда)
    Для каждого Строка Из Реестр Цикл
    Если Строка.Выбран Тогда
    ЭтотОбъект.Реестр.Удалить(Строка);
    КонецЕсли;
    КонецЦикла;
    КонецПроцедуры
```
---
```1c
    Отбор = Новый Структура;
    Отбор.вставить("Выбран", Истина);
    СтрокиУдалить = Реестр.НайтиСтроки(Отбор);
    Пока СтрокиУдалить.Количество() > 0 Цикл
    Реестр.Удалить(СтрокиУдалить[0])
    СтрокиУдалить = Реестр.НайтиСтроки(Отбор);
    КонецЦикла
```

Для вашей задачи достаточно, такого не оптимизированного решения.
---
Правильно никак, неправильно - 1000 и 1 способ
---
Элементы.Реестр.ВыделенныеСтроки - это есть массив выделенных строк. Ну а с ним что хотите то и делайте.
---
И да скопировать с отбором и загрузить в форму.
---
Удаление идет построчно.
---
Ну вообще только построчно. Можно конечно поизвращаться с методом "Скопировать" у таблицы значений, но подозреваю, что платформа точно так же будет это делать в цикле и построчно.
---
Скопировать в ТЗ, удалить, загрузить из ТЗ. Непонятно чем не устроил построчный вариант?
---
Да должно удаляться, я щас выбрал 6 строк, с начало удалилось 3 строки потом 2 потом 1.
---
Ничего не понятно, по вашему коду не может удалиться одновременно 3 строки.

Может дело в том, что удаляются не все строки, тогда стоит попробовать обратный цикл, сделать обход не с первой строки, а с последней.
---
```1c
    Отбор = Новый Структура;
    Отбор.вставить("Выбран", Истина);
    СтрокиУдалить = Реестр.НайтиСтроки(Отбор);
    Пока СтрокиУдалить.Количество() > 0 Цикл
    Реестр.Удалить(СтрокиУдалить[0])
    СтрокиУдалить = Реестр.НайтиСтроки(Отбор);
    КонецЦикла
```

Для вашей задачи достаточно, такого не оптимизированного решения.
---
Ты меня понял, все получилось, работает как надо!
---
Более оптизированно

```1c
    Отбор = Новый Структура;
    Отбор.вставить("Выбран", Истина);
    СтрокиУдалить = Реестр.НайтиСтроки(Отбор);
    Генерируете тз где дублируете те же колонки типа

    тз = Реест.СкопироватьКолонки();
    Для Каждого Стр из СтрокиУдалить Цикл
    ЗаполнитьЗначенияСвойств(тз.НоваяСтрока, Стр);
    КонецЦИкла;

    Пока тз.Количество() > 0 Цикл
    Отбор = Новый Структура();
    Отбор.Вставить --все колонки из первой строки тз.
    СтрУ = Реест.НайтиСтроки(Отбор);
    Если СтрУ.Количество() > 0 Тогда
    Реестр.Удалить(СтрУ[0])
    тз.Удалить(тз[0])
    КонецЕсли;

    КонецЦикла
```
---
А чем он более оптимизирован?
---
в первом случае при большом массиве строк, поиск будет выполняться по всему массиву строку допустим в 1млн записей в которой выбрано 300 строчек на удаление будет выполняться поиск каждый раз. По всему миллиону по второму случаю, поиск будет выполняться 300 раз с ограничивающими условиями по каждой строке.
---
300 раз искать строку методом, который уже возвращает все строки?
Что первый случай, что второй - говнокод, будем честными.

Что именно мешает вам удалить сразу найденные строки?

```1c
    Отбор = Новый Структура;
    Отбор.вставить("Выбран", Истина);
    СтрокиУдалить = Реестр.НайтиСтроки(Отбор);

    Для Каждого Стр из СтрокиУдалить Цикл
    Реестр.Удалить(Стр);
    КонецЦИкла;
```
---
В найтиСтроки - у вас будет уже массив строк которые нужно удалить. Просто идете по массиву и удаляете строки в тз. Все. И две ТЗ не будет оптимизированней че одна ТЗ
---
(16) вы правы, но не правы
Из тч удаляют не из тз, запустите свой код
---
Тема закрыта