Подскажите как выбрать записи из регистра накоплений и удалить их, есть регистр взаиморасчеты, там измерение договор, в договоре есть реквизит организация, вот надо отобрать записи по этому поле и по регистратору и удалить их. Как правильно установить отбор по полю Договор.Организация
---
Сделал проще

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

    УдаляемыеЗаписи = Новый Массив;

    Для каждого Запись из НаборЗаписей цикл
    Если Запись.Договор.Организация = Объект.Организация тогда
    УдаляемыеЗаписи.Добавить(Запись);
    КонецЕсли;
    КонецЦикла;

    Для каждого УдаляемаяЗапись из УдаляемыеЗаписи цикл
    НаборЗаписей.Удалить(УдаляемаяЗапись);
    КонецЦИкла;
    НаборЗаписей.Записать();
```
---
Выбрать все движения с документами, у которых нужные организации в договоре и перезаписать наборами.
---
Запросом выбрать все регистраторы с такими движениями, потом в цикле ставить отбор по регистратору и удалять не нужные записи из набора.
---
регистратор и так один) надо добавить отбор по Организации из договора, договор это измерение в регистре
---
ну тогда прочитать текущий набор записей и циклом по нему пройти, удалить все с неправильной организацией, и записать набор.
---
ок понял) думал может есть что-то попроще уже)
---
Куда уже проще то :)..в консоли запросов даже такое можно сделать :)..
У меня например обработка давно написана для правки регистров справочников, и документов..по отборам..
---
ну хорошо, удалили... какие молодцы!!!
а потом какой-то пользователь взял и запусти перепроведение этих документов с вашим договором и организацией!!!

....вся ваша чистка накрылась медным тазом
---
да при чем тут пользователь, пользователь не имеет доступа к этим документам) это админская корректировка регистров) которая делает напрямую записи в регистр, конфигурация не стандартная)
---
Админ тоже пользователь.
Если движения в документе есть на форме, и форма управляемая, то это можно сделать проще - отобрать строки на форме, выделить их и удалить.
---
Сделал проще

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

    УдаляемыеЗаписи = Новый Массив;

    Для каждого Запись из НаборЗаписей цикл
    Если Запись.Договор.Организация = Объект.Организация тогда
    УдаляемыеЗаписи.Добавить(Запись);
    КонецЕсли;
    КонецЦикла;

    Для каждого УдаляемаяЗапись из УдаляемыеЗаписи цикл
    НаборЗаписей.Удалить(УдаляемаяЗапись);
    КонецЦИкла;
    НаборЗаписей.Записать();
```
---
Почему сразу нельзя удалить запись?

```1c
    УдаляемыеЗаписи.Добавить(Запись);
```

заменить на

```1c
    НаборЗаписей.Удалить(Запись);
```

Для чего нужен буферный массив?
---
потому что при прямом чтении таблицы строки удалять некорректно (в итоге не все строки будут проверены).

Нужно делать так:

```1c
    НаборЗаписей = РегистрыНакопления.ПрочиеРасчеты.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Регистратор.Установить(Объект.Операция);
    НаборЗаписей.Прочитать();

    Для Индекс = -НаборЗаписей.Количество() + 1 По 0 Цикл
    Если Не НаборЗаписей[-Индекс].РасчетныйДокумент.Организация = Объект.Организация Тогда
    НаборЗаписей.Удалить(-Индекс);
    КонецЕсли;
    КонецЦикла;

    НаборЗаписей.Записать();
```
---
при прямом чтении таблицы строки удалять некорректно (в итоге не все строки будут проверены) Это безусловно верно, сам недавно объяснял.

Вот только код для обработки таблицы вы предложили не самый удачный - в "отрицательных" индексах не сразу-то и разберешься...

Можно цикл "снизу вверх" проще и понятнее:

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

```1c
    "Выбрать
    *
    ИЗ
    Регистр.ИмяРегистра
    ГДЕ
    НЕ Договор.Организация В (&Организации)";

    Запрос.УстановитьПараметр("Организации", Организация);

    ТЗ = Запрос.Выполнить().Выгрузить();
    ТЗ.Индексы.Добавить("Регистратор");

    СписокРегистраторов = ТЗ.Скопировать(, "Регистратор");
    СписокРегистраторов.Свернуть("Регистратор");
    СписокРегистраторов = СписокРегистраторов.ВыгрузитьКолонку("Регистратор");

    Для Каждого Регистратор ИЗ СписокРегистраторов Цикл
    НЗ = Регистры.<ИмяРегистра>.СоздатьНаборЗаписей();
    НЗ.Отбор.Регистратор.Установить(Регистратор);
    Отбор = Новый Структура("Регистратор", Регистратор);
    НЗ.Загрузить(ТЗ.Скопировать(Отбор));
    НЗ.ОбменДанными.Загрузка = Истина;
    НЗ.Записать();
    КонецЦикла;
```

Сколько по времени займет?
---
Даже команда УстановитьИспользованиеИтогов не прошла - вылетела по ошибке SQL :-(
Ошибка СУБД. Microsoft SQL Server Native Client 11.0. Экземпляру компонента SQL Server Database Engine не удается получить ресурс LOCK в заданный момент времени. Запустите инструкцию повторно, когда число активных пользователей уменьшится. Попросите администратора баз данных проверить конфигурацию блокировки и памяти для данного экземпляра либо выполнить проверку давно выполняющихся транзакций. HRESULT=80040E14, SQLSrv: SQLSTATE=42000, Seventy=13, native=1204, line=1