Прошу помощи с запросом который на большой файловой базе в х86 толстом клиенте выжирает все 4gb памяти которые выделяет операционная система и падает с ошибкой "Недостаточно памяти". Запрос строится по двум регистрам т.к. учет ведется без флажка "Вести учет товаров организаций в разрезе складов" и в регистре ТоварыОрганизаций просто не заполнена колонка "Склад".

Вот сам запрос:

```1c
    ЗапросОтрицательныеОстатки.Текст = "
    |ВЫБРАТЬ РАЗРЕШЕННЫЕ
    | ТоварыНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура,
    | СУММА(ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход - ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход) КАК ОтрицательныйОстаток,
    | ТоварыНаСкладахОстаткиИОбороты.Склад КАК Склад,
    | ТоварыОрганизацийОстаткиИОбороты.Организация КАК Организация
    |ИЗ
    | РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(, &ДатаРасчетаОстатков, Регистратор, , ) КАК ТоварыНаСкладахОстаткиИОбороты
    | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыОрганизаций.ОстаткиИОбороты(, &ДатаРасчетаОстатков, Регистратор, , ) КАК ТоварыОрганизацийОстаткиИОбороты
    | ПО ТоварыНаСкладахОстаткиИОбороты.Регистратор = ТоварыОрганизацийОстаткиИОбороты.Регистратор
    | И ТоварыНаСкладахОстаткиИОбороты.Номенклатура = ТоварыОрганизацийОстаткиИОбороты.Номенклатура
    | И ТоварыНаСкладахОстаткиИОбороты.ХарактеристикаНоменклатуры = ТоварыОрганизацийОстаткиИОбороты.ХарактеристикаНоменклатуры
    | И ТоварыНаСкладахОстаткиИОбороты.СерияНоменклатуры = ТоварыОрганизацийОстаткиИОбороты.СерияНоменклатуры
    |ГДЕ
    | ТоварыНаСкладахОстаткиИОбороты.Склад = &СкладПокупателя
    | И ТоварыОрганизацийОстаткиИОбороты.Организация = &ТекОрганизация
    |
    |СГРУППИРОВАТЬ ПО
    | ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
    | ТоварыНаСкладахОстаткиИОбороты.Склад,
    | ТоварыОрганизацийОстаткиИОбороты.Организация
    |
    |ИМЕЮЩИЕ
    | СУММА(ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход - ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход) < 0";
```

Очень надеюсь что ткнёте меня носом в то почему запрос выжирает всю память и как этого избежать.
---
условие ГДЕ убрать и перенести в параметры виртуальных таблиц регистров

```1c
    | РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(, &ДатаРасчетаОстатков, Регистратор, , Склад = &СкладПокупателя) КАК ТоварыНаСкладахОстаткиИОбороты
    | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыОрганизаций.ОстаткиИОбороты(, &ДатаРасчетаОстатков, Регистратор, , Организация = &ТекОрганизация) КАК ТоварыОрганизацийОстаткиИОбороты
```
---
условие ГДЕ убрать и перенести в параметры виртуальных таблиц регистров

```1c
    | РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(, &ДатаРасчетаОстатков, Регистратор, , Склад = &СкладПокупателя) КАК ТоварыНаСкладахОстаткиИОбороты
    | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыОрганизаций.ОстаткиИОбороты(, &ДатаРасчетаОстатков, Регистратор, , Организация = &ТекОрганизация) КАК ТоварыОрганизацийОстаткиИОбороты
```
---
Спасибо. Так запрос ест не более 1Гб и выполняется успешно.
А если мне нужно в параметры виртуальной таблицы добавить еще одно условие то строка будет выглядеть так: "Склад = &СкладПокупателя И Номенклатура В(&МассивНоменклатуры)"?
---
верно, но есть мнение, что
```1c
    Номенклатура В(&МассивНоменклатуры)
```
 в условии вирт.таблицы - не очень оптимальный вариант отбора
---
Закономерный вопрос: А как оптимальнее сформировать запрос по списку номенклатуры?
---
только тесты/замеры ответят на данный вопрос
---
Я наверно неправильно выразился.
Имел ввиду "какие варианты есть?".
Я их все проверю и здесь опубликую.
---
Добавлю к вышесказанному
1. Использовать более "легковесную" виртуальную таблицу Обороты вместо самой тяжелой ОстаткиИОбороты
2. Не видится большого смысла искать минусовые обороты в закрытых периодах. Начало выборки кажется можно ограничить датой запрета редактирования
3. Если верно, что интересуют минуса по ТоварыНаСкладах, ТоварыОрганизаций служит только для среза по организации и справки, и документы формируют движения только по одной организации, то запрос можно разбить на 2 подзапроса
- получить таблицу минусовых оборотов по складам, здесь в результате должно быть немного регистраторов
- и уже к этой таблице присоединять товары по организациям. в запросе кстати используется ЛЕВОЕ соединение, а если есть отбор, то более верным видится ВНУТРЕННЕЕ
т.е. сначала отобрать небольшой набор, а потом делать соединение. сейчас поскольку используется ИМЕЮЩИЕ сначала соединяются 2 немаленькие таблицы, потом значения группируются, вычисляются функции и только потом на значения функций накладывается отбор