Привет всем.
Сделал небольшой запрос что бы удалить версии объектов помеченых на удаление.

```1c
    х = 0;
    Пока х < ЭтаФорма.Количество Цикл

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | Номенклатура.Ссылка
    |ИЗ
    | Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    | Номенклатура.ПометкаУдаления";

    РезультатЗапроса = Запрос.Выполнить();

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

    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    Сообщить(ВыборкаДетальныеЗаписи.Ссылка);

    Запрос1 = Новый Запрос;
    Запрос1.Текст =
    "ВЫБРАТЬ
    | ВерсииОбъектов.Объект
    |ИЗ
    | РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов
    |ГДЕ
    | ВерсииОбъектов.Объект = &Объект";

    Запрос1.УстановитьПараметр("Объект", ВыборкаДетальныеЗаписи.Ссылка);

    РезультатЗапроса1 = Запрос1.Выполнить();

    ВыборкаДетальныеЗаписи1 = РезультатЗапроса1.Выбрать();

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

    Запись.Прочитать();
    Запись.Записать();
    КонецЦикла;

    КонецЦикла;
    х = х + 1;
    КонецЦикла;
```

Очень долго думает и выдает недостаточно памяти.
Я же выбираю только одну номенклатуру
В Регистере сведений всего 2 записи
---
вот так

```1c
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ ПЕРВЫЕ 10
    | Номенклатура.Ссылка
    |ИЗ
    | Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    | Номенклатура.ПометкаУдаления";

    РезультатЗапроса = Запрос.Выполнить();

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

    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    Запрос1 = Новый Запрос;
    Запрос1.Текст =
    "ВЫБРАТЬ
    | ВерсииОбъектов.Объект
    |ИЗ
    | РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов
    |ГДЕ
    | ВерсииОбъектов.Объект = &Объект";

    Запрос1.УстановитьПараметр("Объект", ВыборкаДетальныеЗаписи.Ссылка);

    РезультатЗапроса1 = Запрос1.Выполнить();

    ВыборкаДетальныеЗаписи1 = РезультатЗапроса1.Выбрать();

    Пока ВыборкаДетальныеЗаписи1.Следующий() Цикл
    Сообщить(ВыборкаДетальныеЗаписи1.Объект);
    Запись = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей();
    Запись.Отбор.Объект.Установить(ВыборкаДетальныеЗаписи1.Объект);
    Запись.Записать();
    КонецЦикла;

    КонецЦикла;
```
---
Сделал иначе:

```1c
    х=0;
    Пока х<ЭтаФорма.Количество Цикл
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ ПЕРВЫЕ 1
    | ВерсииОбъектов.Объект
    |ИЗ
    | РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов
    |ГДЕ
    | ВерсииОбъектов.Объект.ПометкаУдаления";

    РезультатЗапроса = Запрос.Выполнить();

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

    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    Запрос1 = Новый Запрос;
    Запрос1.Текст =
    "ВЫБРАТЬ
    | ВерсииОбъектов.Объект
    |ИЗ
    | РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов
    |ГДЕ
    | ВерсииОбъектов.Объект = &Объект";

    Запрос1.УстановитьПараметр("Объект", ВыборкаДетальныеЗаписи.Объект);

    РезультатЗапроса1 = Запрос1.Выполнить();

    ВыборкаДетальныеЗаписи1 = РезультатЗапроса1.Выбрать();

    Пока ВыборкаДетальныеЗаписи1.Следующий() Цикл
    Сообщить(ВыборкаДетальныеЗаписи1.Объект);
    Запись = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей();
    Запись.Отбор.Объект.Установить(ВыборкаДетальныеЗаписи1.Объект);
    Запись.Записать();
    КонецЦикла;

    КонецЦикла;
    х=х+1;
    КонецЦикла;
```

Долговато, но зато для памяти оптимизировано и чистит от помеченных на удаление, для дальнейшего удаления объектов помеченых на удаление
---
Очень долго думает и выдает недостаточно памяти.
Я же выбираю только одну номенклатуру
В Регистере сведений всего 2 записиЭто потому, что 1С - ни разу не СУБД, и не пользуется даже SQL-ми ништяками, к которым подключена, а тупо выбирает все данные по схеме все-ко-всему на сервер, и начинает эту гору перелопачивать в соответствии с условием запроса.
Отсюда и вылет по памяти.
И у вас не "всего две строчки в РС" в таком случае, а весь РС "Версии" в памяти и в обработке.
Ну а далее уже расписали.
---
Виснет на строчке:

```1c
    Запись.Прочитать();
```
---
циклы точно нужно убирать - переделать в один запрос: номенклатура с левым соединением РС версий.
---
Эта строчка непонятна

```1c
    ЗаполнитьЗначенияСвойств(Запись, ВыборкаДетальныеЗаписи1);
```

Если запись это набор, то какие свойства вы у него заполняете?
м.б. будет лучше как-то так:

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

    Запись.Прочитать();
    Запись.Удалить();
```
---
Точнее, так:

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

    Запись.Прочитать();
    Если Запись.Выбран() Тогда
    Запись.Удалить();
    КонецЕсли
```
---
```1c
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | Номенклатура.Ссылка
    |ИЗ
    | Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    | Номенклатура.ПометкаУдаления";

    РезультатЗапроса = Запрос.Выполнить();

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

    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    //Сообщить(ВыборкаДетальныеЗаписи.Ссылка);

    Запрос1 = Новый Запрос;
    Запрос1.Текст =
    "ВЫБРАТЬ
    | ВерсииОбъектов.Объект
    |ИЗ
    | РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов
    |ГДЕ
    | ВерсииОбъектов.Объект = &Объект";

    Запрос1.УстановитьПараметр("Объект", ВыборкаДетальныеЗаписи.Ссылка);

    РезультатЗапроса1 = Запрос1.Выполнить();

    ВыборкаДетальныеЗаписи1 = РезультатЗапроса1.Выбрать();

    Пока ВыборкаДетальныеЗаписи1.Следующий() Цикл
    Сообщить(ВыборкаДетальныеЗаписи1.Объект);
    Запись = РегистрыСведений.ВерсииОбъектов.СоздатьМенеджерЗаписи();
    Запись.Прочитать();
    Если Запись.Выбран() Тогда
    Запись.Удалить();
    КонецЕсли;
    КонецЦикла;

    КонецЦикла;
```

Виснуть перестало, но не удаляет из регистра записи...
---
у вас ничего не выбирается, либо прочитайте внимательнее как в (6), либо оставьте первоначальный вариант и вместо ЗаполнитьЗначенияСвойств, напишите Запись.Отбор.Объект.Установить(ВыборкаДетальныеЗаписи1.Объект);

ну и циклы конечно убирать нужно, на большом объеме все это будет работать очень долго, если вообще будет
---
Если я циклы уберу, то пишет ошибку "Недостаточно памяти"
Запись.Отбор работает только на НаборЗаписей.
---
ну в том то и дело либо используйте НаборЗаписей и Отбор, либо МенеджерЗаписи и ЗаполнитьЗначенияСвойств.

а памяти недостаточно - значит запрос соединяете неправильно
---
ну и надеюсь вы на копии экспериментируете... а то отладка записи в РС рисковая операция, весь регистр очистить запросто...
---
На тестовой конечно)

(11)Запрос:

```1c
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ ПЕРВЫЕ 10
    | Номенклатура.Ссылка
    |ИЗ
    | Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    | Номенклатура.ПометкаУдаления";

    РезультатЗапроса = Запрос.Выполнить();

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

    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    Запрос1 = Новый Запрос;
    Запрос1.Текст =
    "ВЫБРАТЬ
    | ВерсииОбъектов.Объект
    |ИЗ
    | РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов
    |ГДЕ
    | ВерсииОбъектов.Объект = &Объект";

    Запрос1.УстановитьПараметр("Объект", ВыборкаДетальныеЗаписи.Ссылка);

    РезультатЗапроса1 = Запрос1.Выполнить();

    ВыборкаДетальныеЗаписи1 = РезультатЗапроса1.Выбрать();

    Пока ВыборкаДетальныеЗаписи1.Следующий() Цикл
    Сообщить(ВыборкаДетальныеЗаписи1.Объект);
    Запись = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей();
    ЗаполнитьЗначенияСвойств(Запись.Отбор, ВыборкаДетальныеЗаписи1);
    Запись.Прочитать();
    Если Запись.Выбран() Тогда
    Запись.Удалить();
    КонецЕсли;
    КонецЦикла;

    КонецЦикла;
```

Виснет на строке Запись.Прочитать();
и выдает потом:
{ВнешняяОбработка.ЧистимВерсииОбъектов.Форма.Форма.Форма(39)}: Ошибка при вызове метода контекста (Прочитать)
  Запись.Прочитать();
по причине:
Недостаточно памяти для получения результата запроса к базе данных
---
вот так

```1c
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ ПЕРВЫЕ 10
    | Номенклатура.Ссылка
    |ИЗ
    | Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    | Номенклатура.ПометкаУдаления";

    РезультатЗапроса = Запрос.Выполнить();

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

    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    Запрос1 = Новый Запрос;
    Запрос1.Текст =
    "ВЫБРАТЬ
    | ВерсииОбъектов.Объект
    |ИЗ
    | РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов
    |ГДЕ
    | ВерсииОбъектов.Объект = &Объект";

    Запрос1.УстановитьПараметр("Объект", ВыборкаДетальныеЗаписи.Ссылка);

    РезультатЗапроса1 = Запрос1.Выполнить();

    ВыборкаДетальныеЗаписи1 = РезультатЗапроса1.Выбрать();

    Пока ВыборкаДетальныеЗаписи1.Следующий() Цикл
    Сообщить(ВыборкаДетальныеЗаписи1.Объект);
    Запись = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей();
    Запись.Отбор.Объект.Установить(ВыборкаДетальныеЗаписи1.Объект);
    Запись.Записать();
    КонецЦикла;

    КонецЦикла;
```
---
Спасибо, отбор не так поставил)
---
педант внутри меня плакал, надо убрать всю эту кашу

```1c
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | Номенклатура.Ссылка
    |ИЗ
    | Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    | Номенклатура.ПометкаУдаления";

    РезультатЗапроса = Запрос.Выполнить();

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

    Пока ВыборкаДетальныеЗаписи.Следующий() цикл

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

В отладке в условие не заходит, посмотрел записи пустые..
---
Чтобы удалял записи нужно проследить что все измерения регистра (в моём регистре ВерсииОбъекта это Объект и НомерВерсии) заполнены перед Запись.Прочитать();
У вас, как я понимаю НомерВерсии не заполнен, поэтому и ничего не читается, в запросе нужно ещё его выбирать
---
Номер версии стоит, 1,2,3,4...
---
в базе то он может и стоит, но у вас в запросе

```1c
    Запрос1 = Новый Запрос;
    Запрос1.Текст =
    "ВЫБРАТЬ
    | ВерсииОбъектов.Объект
    |ИЗ
    | РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов
    |ГДЕ
    | ВерсииОбъектов.Объект = &Объект";

    Запрос1.УстановитьПараметр("Объект", ВыборкаДетальныеЗаписи.Ссылка);
```

я его не вижу, надо добавить
---
Вложил скрин
---
Сделал иначе:

```1c
    х=0;
    Пока х<ЭтаФорма.Количество Цикл
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ ПЕРВЫЕ 1
    | ВерсииОбъектов.Объект
    |ИЗ
    | РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов
    |ГДЕ
    | ВерсииОбъектов.Объект.ПометкаУдаления";

    РезультатЗапроса = Запрос.Выполнить();

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

    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    Запрос1 = Новый Запрос;
    Запрос1.Текст =
    "ВЫБРАТЬ
    | ВерсииОбъектов.Объект
    |ИЗ
    | РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов
    |ГДЕ
    | ВерсииОбъектов.Объект = &Объект";

    Запрос1.УстановитьПараметр("Объект", ВыборкаДетальныеЗаписи.Объект);

    РезультатЗапроса1 = Запрос1.Выполнить();

    ВыборкаДетальныеЗаписи1 = РезультатЗапроса1.Выбрать();

    Пока ВыборкаДетальныеЗаписи1.Следующий() Цикл
    Сообщить(ВыборкаДетальныеЗаписи1.Объект);
    Запись = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей();
    Запись.Отбор.Объект.Установить(ВыборкаДетальныеЗаписи1.Объект);
    Запись.Записать();
    КонецЦикла;

    КонецЦикла;
    х=х+1;
    КонецЦикла;
```

Долговато, но зато для памяти оптимизировано и чистит от помеченных на удаление, для дальнейшего удаления объектов помеченых на удаление
---
это порочная практика и кошмар 1С-сервера - запросы в цикле, какие бы они не казались вам "простыми".
Забудьте про это в 1С, и делайте впредь не запросы в цикле, а циклы по обработке результатов запросов.