В последнее время стал очень долго отрабатывать запрос. Помогите оптимизировать :) Что-то в нем явно не так...

```1c
    ВЫБРАТЬ РАЗЛИЧНЫЕ
    СебестоимостьТоваров.АналитикаУчетаНоменклатуры.Номенклатура,
    ОсновнаяТаблица.Регистратор,
    ОсновнаяТаблица.ВидДвижения,
    ОсновнаяТаблица.НомерСтроки,
    ЕСТЬNULL(ОсновнаяТаблица.КоличествоПриход, 0) КАК КоличествоПриход,
    ЕСТЬNULL(ОсновнаяТаблица.СтоимостьПриход, 0) КАК СтоимостьПриход,
    ЕСТЬNULL(ОсновнаяТаблица.КоличествоРасход, 0) КАК КоличествоРасход,
    ЕСТЬNULL(ОсновнаяТаблица.ЦенаПриход, 0) КАК ЦенаПриход,
    СебестоимостьТоваров.Регистратор.Партнер.Ссылка,
    ОсновнаяТаблица.Период
    ИЗ
    РегистрНакопления.СебестоимостьТоваров КАК СебестоимостьТоваров
    ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РАЗЛИЧНЫЕ
    СебестоимостьТоваров.Период КАК Период,
    СебестоимостьТоваров.АналитикаУчетаНоменклатуры.Номенклатура КАК Номенклатура,
    СебестоимостьТоваров.Регистратор КАК Регистратор,
    СебестоимостьТоваров.НомерСтроки КАК НомерСтроки,
    СебестоимостьТоваров.ВидДвижения КАК ВидДвижения,
    СебестоимостьТоваров.Количество КАК КоличествоПриход,
    СебестоимостьТоваров.Стоимость КАК СтоимостьПриход,
    NULL КАК КоличествоРасход,
    NULL КАК СтоимостьРасход,
    ВЫБОР
    КОГДА СебестоимостьТоваров.Стоимость ЕСТЬ NULL
    ИЛИ СебестоимостьТоваров.Количество ЕСТЬ NULL
    ТОГДА 0
    ИНАЧЕ СебестоимостьТоваров.Стоимость / СебестоимостьТоваров.Количество
    КОНЕЦ КАК ЦенаПриход
    ИЗ
    РегистрНакопления.СебестоимостьТоваров КАК СебестоимостьТоваров
    ГДЕ
    СебестоимостьТоваров.ВидДвижения = &Приход
    И СебестоимостьТоваров.Период >= &ДатаНачалаПриход
    И СебестоимостьТоваров.Период <= &ДатаОкончанияПриход
    И (НЕ СебестоимостьТоваров.Регистратор ССЫЛКА Документ.ПеремещениеТоваров)
    И (НЕ СебестоимостьТоваров.Регистратор ССЫЛКА Документ.РаспределениеРасходовНаСебестоимостьТоваров)
    И (НЕ СебестоимостьТоваров.Регистратор ССЫЛКА Документ.РасчетСебестоимостиТоваров)

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
    СебестоимостьТоваров.Период,
    СебестоимостьТоваров.АналитикаУчетаНоменклатуры.Номенклатура,
    СебестоимостьТоваров.Регистратор,
    СебестоимостьТоваров.НомерСтроки,
    СебестоимостьТоваров.ВидДвижения,
    NULL,
    NULL,
    СебестоимостьТоваров.Количество,
    СебестоимостьТоваров.Стоимость,
    NULL
    ИЗ
    РегистрНакопления.СебестоимостьТоваров КАК СебестоимостьТоваров
    ГДЕ
    СебестоимостьТоваров.ВидДвижения = &Расход
    И СебестоимостьТоваров.Период >= &ДатаНачалаРасход
    И СебестоимостьТоваров.Период <= &ДатаОкончанияРасход
    И (НЕ СебестоимостьТоваров.Регистратор ССЫЛКА Документ.ПеремещениеТоваров)) КАК ОсновнаяТаблица
    ПО СебестоимостьТоваров.АналитикаУчетаНоменклатуры.Номенклатура = ОсновнаяТаблица.Номенклатура
    ГДЕ
    СебестоимостьТоваров.ВидДвижения = &Приход
    И (НЕ СебестоимостьТоваров.Регистратор ССЫЛКА Документ.ПеремещениеТоваров)
    И (НЕ СебестоимостьТоваров.Регистратор ССЫЛКА Документ.РаспределениеРасходовНаСебестоимостьТоваров)
    И (НЕ СебестоимостьТоваров.Регистратор ССЫЛКА Документ.РасчетСебестоимостиТоваров)
```
---
insurgut, попробуйте так

```1c
    ВЫБРАТЬ
    СебестоимостьТоваров.Период КАК Период,
    СебестоимостьТоваров.АналитикаУчетаНоменклатуры.Номенклатура КАК Номенклатура,
    СебестоимостьТоваров.Регистратор КАК Регистратор,
    СебестоимостьТоваров.Регистратор.Партнер КАК Партнер,
    СебестоимостьТоваров.ВидЗапасов.Поставщик КАК Поставщик,
    СебестоимостьТоваров.КоличествоПриход КАК КоличествоПриход,
    СебестоимостьТоваров.СтоимостьПриход КАК СтоимостьПриход,
    СебестоимостьТоваров.КоличествоРасход КАК КоличествоРасход,
    СебестоимостьТоваров.СтоимостьРасход КАК СтоимостьРасход,
    ВЫБОР
    КОГДА СебестоимостьТоваров.КоличествоПриход = 0
    И СебестоимостьТоваров.СтоимостьПриход = 0
    ТОГДА &Расход
    КОГДА СебестоимостьТоваров.КоличествоРасход = 0
    И СебестоимостьТоваров.СтоимостьРасход = 0
    ТОГДА &Приход
    КОНЕЦ КАК ВидДвижения,
    ВЫБОР
    КОГДА СебестоимостьТоваров.КоличествоПриход = 0
    И СебестоимостьТоваров.СтоимостьПриход = 0
    ТОГДА 0
    ИНАЧЕ СебестоимостьТоваров.СтоимостьПриход / СебестоимостьТоваров.КоличествоПриход
    КОНЕЦ КАК ЦенаПриход
    ПОМЕСТИТЬ ВТ_СебестоимостьТоваров
    ИЗ
    РегистрНакопления.СебестоимостьТоваров.Обороты(&ДатаНачалаПриход, &ДатаОкончанияПриход, Регистратор, ) КАК СебестоимостьТоваров
    ГДЕ
    (НЕ СебестоимостьТоваров.Регистратор ССЫЛКА Документ.ПеремещениеТоваров)
    И (НЕ СебестоимостьТоваров.Регистратор ССЫЛКА Документ.РаспределениеРасходовНаСебестоимостьТоваров)
    И (НЕ СебестоимостьТоваров.Регистратор ССЫЛКА Документ.РасчетСебестоимостиТоваров)
    ;

    ////////////////////////////////////////////////////////////­///////////////////
    ВЫБРАТЬ РАЗЛИЧНЫЕ
    ВТ_СебестоимостьТоваров.Номенклатура,
    ВТ_СебестоимостьТоваров.Поставщик
    ПОМЕСТИТЬ ВТ_ТоварыПоставщиков
    ИЗ
    ВТ_СебестоимостьТоваров КАК ВТ_СебестоимостьТоваров
    ГДЕ
    ВТ_СебестоимостьТоваров.ВидДвижения = &Приход
    ;

    ////////////////////////////////////////////////////////////­///////////////////
    ВЫБРАТЬ
    ВТ_ТоварыПоставщиков.Номенклатура,
    ВТ_ТоварыПоставщиков.Поставщик,
    ОсновнаяТаблица.Период,
    ОсновнаяТаблица.Регистратор,
    ОсновнаяТаблица.Партнер,
    ОсновнаяТаблица.ВидДвижения,
    ОсновнаяТаблица.КоличествоПриход,
    ОсновнаяТаблица.СтоимостьПриход,
    ОсновнаяТаблица.КоличествоРасход,
    ОсновнаяТаблица.СтоимостьРасход,
    ОсновнаяТаблица.ЦенаПриход
    ИЗ
    ВТ_ТоварыПоставщиков КАК ВТ_ТоварыПоставщиков
    ЛЕВОЕ СОЕДИНЕНИЕ ВТ_СебестоимостьТоваров КАК ОсновнаяТаблица
    ПО ВТ_ТоварыПоставщиков.Номенклатура = ОсновнаяТаблица.Номенклатура
    И ВТ_ТоварыПоставщиков.Поставщик = ОсновнаяТаблица.Поставщик
```
---
insurgut, Избавьтесь от "ВЫБРАТЬ РАЗЛИЧНЫЕ".
---
insurgut,
http://kb.1c.ru/articleView.jsp?id=44 в помощь )
Ну и профайлер, как самый точный инструмент )
---
Добавил бонус :)
---
а попробуй условия поставить в параметры виртуальной таблицы
---
для начала попробуйте использовать виртуальные таблицы регистра вместо реальных, например, Обороты с периодичностью Запись или Регистратор. и не забудьте указать параметры виртуальных таблиц, в первую очередь хотя бы период.

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

```1c
    ВЫБОР
    КОГДА СебестоимостьТоваров.ВидДвижения = &Приход ТОГДА
    СебестоимостьТоваров.Количество
    ИНАЧЕ 0
    КОНЕЦ КАК КоличествоПриход,
```
---
что-то вроде этого должно получиться:

```1c
    ВЫБРАТЬ РАЗЛИЧНЫЕ
    СебестоимостьТоваров.АналитикаУчетаНоменклатуры.Номенклатура,
    ОсновнаяТаблица.Регистратор,
    ОсновнаяТаблица.ВидДвижения,
    ОсновнаяТаблица.НомерСтроки,
    ЕСТЬNULL(ОсновнаяТаблица.КоличествоПриход, 0) КАК КоличествоПриход,
    ЕСТЬNULL(ОсновнаяТаблица.СтоимостьПриход, 0) КАК СтоимостьПриход,
    ЕСТЬNULL(ОсновнаяТаблица.КоличествоРасход, 0) КАК КоличествоРасход,
    ЕСТЬNULL(ОсновнаяТаблица.ЦенаПриход, 0) КАК ЦенаПриход,
    СебестоимостьТоваров.Регистратор.Партнер.Ссылка,
    ОсновнаяТаблица.Период
    ИЗ
    РегистрНакопления.СебестоимостьТоваров.Обороты(&ДатаНачалаПриход, &ДатаОкончанияПриход, Регистратор, ) КАК СебестоимостьТоваров
    ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РАЗЛИЧНЫЕ
    СебестоимостьТоваров.Период КАК Период,
    СебестоимостьТоваров.АналитикаУчетаНоменклатуры.Номенклатура КАК Номенклатура,
    СебестоимостьТоваров.Регистратор КАК Регистратор,
    СебестоимостьТоваров.НомерСтроки КАК НомерСтроки,
    СебестоимостьТоваров.ВидДвижения КАК ВидДвижения,
    ВЫБОР
    КОГДА СебестоимостьТоваров.ВидДвижения = &Приход
    ТОГДА СебестоимостьТоваров.Количество
    ИНАЧЕ 0
    КОНЕЦ КАК КоличествоПриход,
    ВЫБОР
    КОГДА СебестоимостьТоваров.ВидДвижения = &Приход
    ТОГДА СебестоимостьТоваров.Стоимость
    ИНАЧЕ 0
    КОНЕЦ КАК СтоимостьПриход,
    ВЫБОР
    КОГДА СебестоимостьТоваров.ВидДвижения = &Расход
    ТОГДА СебестоимостьТоваров.Количество
    ИНАЧЕ 0
    КОНЕЦ КАК КоличествоРасход,
    ВЫБОР
    КОГДА СебестоимостьТоваров.ВидДвижения = &Расход
    ТОГДА СебестоимостьТоваров.Стоимость
    ИНАЧЕ 0
    КОНЕЦ КАК СтоимостьРасход,
    ВЫБОР
    КОГДА СебестоимостьТоваров.ВидДвижения = &Расход
    ИЛИ СебестоимостьТоваров.Стоимость ЕСТЬ NULL
    ИЛИ СебестоимостьТоваров.Количество ЕСТЬ NULL
    ТОГДА 0
    ИНАЧЕ СебестоимостьТоваров.Стоимость / СебестоимостьТоваров.Количество
    КОНЕЦ КАК ЦенаПриход
    ИЗ
    РегистрНакопления.СебестоимостьТоваров.Обороты(&ДатаНачалаПриход, &ДатаОкончанияПриход, Регистратор, ) КАК СебестоимостьТоваров
    ГДЕ
    (НЕ СебестоимостьТоваров.Регистратор ССЫЛКА Документ.ПеремещениеТоваров)
    И (НЕ СебестоимостьТоваров.Регистратор ССЫЛКА Документ.РаспределениеРасходовНаСебестоимостьТоваров)
    И (НЕ СебестоимостьТоваров.Регистратор ССЫЛКА Документ.РасчетСебестоимостиТоваров)) КАК ОсновнаяТаблица
    ПО СебестоимостьТоваров.АналитикаУчетаНоменклатуры.Номенклатура = ОсновнаяТаблица.Номенклатура
    ГДЕ
    СебестоимостьТоваров.ВидДвижения = &Приход
    И (НЕ СебестоимостьТоваров.Регистратор ССЫЛКА Документ.ПеремещениеТоваров)
    И (НЕ СебестоимостьТоваров.Регистратор ССЫЛКА Документ.РаспределениеРасходовНаСебестоимостьТоваров)
    И (НЕ СебестоимостьТоваров.Регистратор ССЫЛКА Документ.РасчетСебестоимостиТоваров)
```

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

Во-первых, сделайте выборку данных через виртуальные таблицы, на примере первой таблицы:

```1c
    | ВЫБРАТЬ РАЗЛИЧНЫЕ
    | СебестоимостьТоваров.АналитикаУчетаНоменклатуры.Номенклатура,
    | ...................
    | СебестоимостьТоваров.Регистратор.Партнер.Ссылка
    |
    |ИЗ
    | РегистрНакопления.СебестоимостьТоваров.Обороты(,,Регистратор, {"Перечень измерений регистра для наложения условий (для СКД или построителя отчета)"}) КАК СебестоимостьТоваровОборот
```

Во-вторых, выборки в соединении тоже надо делать через виртуальные таблицы.
---
Конфигурация УТ 11.1.2.10
---
Уточню, в оборотном регистре вида движения нету. Как понимаю определять его условием надо, что-то вроде "СуммаПриход > 0 Тогда приход"
---
insurgut, так и надо. Только для пущей правильности следует проверять так:

```1c
    ВЫБОР КОГДА ИмяТаблицы.КоличествоПриход - ИмяТаблицы.КоличествоРасход > 0 ТОГДА // для прихода
    ВЫБОР КОГДА ИмяТаблицы.КоличествоРасход - ИмяТаблицы.КоличествоПриход > 0 ТОГДА // для расхода
```

т.к. в некоторых регистрах приход отражается как расход с минусом и наоборот.
---
согласен, вида движения нет, как и НомерСтроки.
с учетом всех предыдущих постов предлагаю такой вариант. подойдет, если НомерСтроки не критичен.

```1c
    ВЫБРАТЬ РАЗЛИЧНЫЕ
    СебестоимостьТоваров.Период КАК Период,
    СебестоимостьТоваров.АналитикаУчетаНоменклатуры.Номенклатура КАК Номенклатура,
    СебестоимостьТоваров.Регистратор КАК Регистратор,
    СебестоимостьТоваров.Регистратор.Партнер КАК Партнер,
    СебестоимостьТоваров.КоличествоПриход КАК КоличествоПриход,
    СебестоимостьТоваров.СтоимостьПриход КАК СтоимостьПриход,
    СебестоимостьТоваров.КоличествоРасход КАК КоличествоРасход,
    СебестоимостьТоваров.СтоимостьРасход КАК СтоимостьРасход,
    ВЫБОР
    КОГДА СебестоимостьТоваров.КоличествоПриход = 0
    И СебестоимостьТоваров.СтоимостьПриход = 0
    ТОГДА &Расход
    КОГДА СебестоимостьТоваров.КоличествоРасход = 0
    И СебестоимостьТоваров.СтоимостьРасход = 0
    ТОГДА &Приход
    КОНЕЦ КАК ВидДвижения
    ПОМЕСТИТЬ ВТ_СебестоимостьТоваров
    ИЗ
    РегистрНакопления.СебестоимостьТоваров.Обороты(&ДатаНачалаПриход, &ДатаОкончанияПриход, Регистратор, ) КАК СебестоимостьТоваров
    ГДЕ
    (НЕ СебестоимостьТоваров.Регистратор ССЫЛКА Документ.ПеремещениеТоваров)
    И (НЕ СебестоимостьТоваров.Регистратор ССЫЛКА Документ.РаспределениеРасходовНаСебестоимостьТоваров)
    И (НЕ СебестоимостьТоваров.Регистратор ССЫЛКА Документ.РасчетСебестоимостиТоваров)
    ;

    ////////////////////////////////////////////////////////////­///////////////////
    ВЫБРАТЬ РАЗЛИЧНЫЕ
    ВТ_СебестоимостьТоваров.Номенклатура,
    ОсновнаяТаблица.Регистратор,
    ОсновнаяТаблица.ВидДвижения,
    ЕСТЬNULL(ОсновнаяТаблица.КоличествоПриход, 0) КАК КоличествоПриход,
    ЕСТЬNULL(ОсновнаяТаблица.СтоимостьПриход, 0) КАК СтоимостьПриход,
    ЕСТЬNULL(ОсновнаяТаблица.КоличествоРасход, 0) КАК КоличествоРасход,
    ЕСТЬNULL(ОсновнаяТаблица.ЦенаПриход, 0) КАК ЦенаПриход,
    ВТ_СебестоимостьТоваров.Партнер КАК Партнер,
    ОсновнаяТаблица.Период
    ИЗ
    ВТ_СебестоимостьТоваров КАК ВТ_СебестоимостьТоваров
    ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РАЗЛИЧНЫЕ
    ВТ_СебестоимостьТоваров.Период КАК Период,
    ВТ_СебестоимостьТоваров.Номенклатура КАК Номенклатура,
    ВТ_СебестоимостьТоваров.Регистратор КАК Регистратор,
    ВТ_СебестоимостьТоваров.ВидДвижения КАК ВидДвижения,
    ВТ_СебестоимостьТоваров.КоличествоПриход КАК КоличествоПриход,
    ВТ_СебестоимостьТоваров.СтоимостьПриход КАК СтоимостьПриход,
    ВТ_СебестоимостьТоваров.КоличествоРасход КАК КоличествоРасход,
    ВТ_СебестоимостьТоваров.СтоимостьРасход КАК СтоимостьРасход,
    ВЫБОР
    КОГДА ВТ_СебестоимостьТоваров.СтоимостьПриход ЕСТЬ NULL
    ИЛИ ВТ_СебестоимостьТоваров.КоличествоПриход ЕСТЬ NULL
    ИЛИ ВТ_СебестоимостьТоваров.КоличествоПриход = 0
    ТОГДА 0
    ИНАЧЕ ВТ_СебестоимостьТоваров.СтоимостьПриход / ВТ_СебестоимостьТоваров.КоличествоПриход
    КОНЕЦ КАК ЦенаПриход
    ИЗ
    ВТ_СебестоимостьТоваров КАК ВТ_СебестоимостьТоваров) КАК ОсновнаяТаблица
    ПО ВТ_СебестоимостьТоваров.Номенклатура = ОсновнаяТаблица.Номенклатура
    ГДЕ
    ВТ_СебестоимостьТоваров.ВидДвижения = &Приход
```
---
Lord_Michael, можно еще вложенный запрос на пакет заменить, должно быстрее работать в пакетном.
---
Uncore, не, вообще ничего не надо) никаких пакетов) я ж не всматривался в запрос) во вложенном только расчет цены остался. можно сделать его сразу во временной и соединять временную саму с собой) а пустая наверно потому, что еще на NULL во временной проверять нужно. нет под рукой конфы, а разворачивать влом. как-то так должно получиться:

```1c
    ВЫБРАТЬ РАЗЛИЧНЫЕ
    СебестоимостьТоваров.Период КАК Период,
    СебестоимостьТоваров.АналитикаУчетаНоменклатуры.Номенклатура КАК Номенклатура,
    СебестоимостьТоваров.Регистратор КАК Регистратор,
    СебестоимостьТоваров.Регистратор.Партнер КАК Партнер,
    СебестоимостьТоваров.КоличествоПриход КАК КоличествоПриход,
    СебестоимостьТоваров.СтоимостьПриход КАК СтоимостьПриход,
    СебестоимостьТоваров.КоличествоРасход КАК КоличествоРасход,
    СебестоимостьТоваров.СтоимостьРасход КАК СтоимостьРасход,
    ВЫБОР
    КОГДА (СебестоимостьТоваров.КоличествоПриход = 0
    И СебестоимостьТоваров.СтоимостьПриход = 0)
    ИЛИ (СебестоимостьТоваров.КоличествоПриход = ЕСТЬ NULL
    И СебестоимостьТоваров.СтоимостьПриход = ЕСТЬ NULL)
    ТОГДА &Расход
    КОГДА (СебестоимостьТоваров.КоличествоРасход = 0
    И СебестоимостьТоваров.СтоимостьРасход = 0)
    ИЛИ (СебестоимостьТоваров.КоличествоРасход = ЕСТЬ NULL
    И СебестоимостьТоваров.СтоимостьРасход = ЕСТЬ NULL)
    ТОГДА &Приход
    КОНЕЦ КАК ВидДвижения,
    ВЫБОР
    КОГДА СебестоимостьТоваров.СтоимостьПриход ЕСТЬ NULL
    ИЛИ СебестоимостьТоваров.КоличествоПриход ЕСТЬ NULL
    ИЛИ СебестоимостьТоваров.КоличествоПриход = 0
    ТОГДА 0
    ИНАЧЕ СебестоимостьТоваров.СтоимостьПриход / СебестоимостьТоваров.КоличествоПриход
    КОНЕЦ КАК ЦенаПриход
    ПОМЕСТИТЬ ВТ_СебестоимостьТоваров
    ИЗ
    РегистрНакопления.СебестоимостьТоваров.Обороты(&ДатаНачалаПриход, &ДатаОкончанияПриход, Регистратор, ) КАК СебестоимостьТоваров
    ГДЕ
    (НЕ СебестоимостьТоваров.Регистратор ССЫЛКА Документ.ПеремещениеТоваров)
    И (НЕ СебестоимостьТоваров.Регистратор ССЫЛКА Документ.РаспределениеРасходовНаСебестоимостьТоваров)
    И (НЕ СебестоимостьТоваров.Регистратор ССЫЛКА Документ.РасчетСебестоимостиТоваров)
    ;

    ////////////////////////////////////////////////////////////­///////////////////
    ВЫБРАТЬ РАЗЛИЧНЫЕ
    ВТ_СебестоимостьТоваров.Номенклатура,
    ОсновнаяТаблица.Регистратор,
    ОсновнаяТаблица.ВидДвижения,
    ОсновнаяТаблица.НомерСтроки,
    ЕСТЬNULL(ОсновнаяТаблица.КоличествоПриход, 0) КАК КоличествоПриход,
    ЕСТЬNULL(ОсновнаяТаблица.СтоимостьПриход, 0) КАК СтоимостьПриход,
    ЕСТЬNULL(ОсновнаяТаблица.КоличествоРасход, 0) КАК КоличествоРасход,
    ЕСТЬNULL(ОсновнаяТаблица.ЦенаПриход, 0) КАК ЦенаПриход,
    ВТ_СебестоимостьТоваров.Партнер КАК Партнер,
    ОсновнаяТаблица.Период
    ИЗ
    ВТ_СебестоимостьТоваров КАК ВТ_СебестоимостьТоваров
    ЛЕВОЕ СОЕДИНЕНИЕ ВТ_СебестоимостьТоваров КАК ОсновнаяТаблица
    ПО ВТ_СебестоимостьТоваров.Номенклатура = ОсновнаяТаблица.Номенклатура
    ГДЕ
    ВТ_СебестоимостьТоваров.ВидДвижения = &Приход
```

если опять будет пусто, то нужно проверить правильно или нет ВидДвижения во временной определяется. сделайте выборку в консоли только временной таблицы, чтобы посмотреть результат. ну и да, РАЗЛИЧНЫЕ не всегда адекватно себя ведет)
---
, результат запроса остается предательски пустым :)

Если не накладываю условие по партнеру, то изначальный запрос выдает 257 517 строк за 205 секунд, а твой - 116 793 строк за 16 секунд.

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

```1c
    ВЫБРАТЬ РАЗЛИЧНЫЕ
    СебестоимостьТоваров.Период КАК Период,
    СебестоимостьТоваров.АналитикаУчетаНоменклатуры.Номенклатура КАК Номенклатура,
    СебестоимостьТоваров.Регистратор КАК Регистратор,
    СебестоимостьТоваров.Регистратор.Партнер КАК Партнер,
    СебестоимостьТоваров.КоличествоПриход КАК КоличествоПриход,
    СебестоимостьТоваров.СтоимостьПриход КАК СтоимостьПриход,
    СебестоимостьТоваров.КоличествоРасход КАК КоличествоРасход,
    СебестоимостьТоваров.СтоимостьРасход КАК СтоимостьРасход,
    ВЫБОР
    КОГДА СебестоимостьТоваров.КоличествоПриход = 0
    И СебестоимостьТоваров.СтоимостьПриход = 0
    ТОГДА &Расход
    КОГДА СебестоимостьТоваров.КоличествоРасход = 0
    И СебестоимостьТоваров.СтоимостьРасход = 0
    ТОГДА &Приход
    КОНЕЦ КАК ВидДвижения,
    ВЫБОР
    КОГДА СебестоимостьТоваров.КоличествоПриход = 0
    ТОГДА 0
    ИНАЧЕ СебестоимостьТоваров.СтоимостьПриход / СебестоимостьТоваров.КоличествоПриход
    КОНЕЦ КАК ЦенаПриход
    ПОМЕСТИТЬ ВТ_СебестоимостьТоваров
    ИЗ
    РегистрНакопления.СебестоимостьТоваров.Обороты(&ДатаНачалаПриход, &ДатаОкончанияПриход, Регистратор, ) КАК СебестоимостьТоваров
    ГДЕ
    (НЕ СебестоимостьТоваров.Регистратор ССЫЛКА Документ.ПеремещениеТоваров)
    И (НЕ СебестоимостьТоваров.Регистратор ССЫЛКА Документ.РаспределениеРасходовНаСебестоимостьТоваров)
    И (НЕ СебестоимостьТоваров.Регистратор ССЫЛКА Документ.РасчетСебестоимостиТоваров)
```

попробуй только эту часть в консоли прогнать. что в результат упадет?
если глюки, то попробуй без РАЗЛИЧНЫЕ
---
insurgut, ПериодСекунда,день??? как уменьшать?
---
ben19791010, я думаю, он имел в виду НачалоПериода и КонецПериода, то есть входящие параметры)
---
Lord_Michael, отработало быстро, но результат пустой по сравнению со старым запросом :) Буду смотреть.
---
Кажется разреза организации сильно не хватает :) Потому что по одной организации у нас может быть приход, а по другой расход. Если свернуть - то корректно расход и приход не определить :)
---
Мне кажется вместе с регистратором нужно брать период секунда
а ветку ГДЕ - лучше назначить в параметрах виртуальной таблицы.. назначите параметры, будет возможность выбрать период секунда)
---
Дурной запрос. В исходном виде я получаю результат:
Изолента ПВХ 15мм (рул.20м) бел. AVIORA Отчет о розничных продажах ИПУТ-000228 от 09.10.2014 20:17:47 Расход 1 ООО "Энергопром"

И это при том, что в самом ОРП нигде ссылки на партнера Энегопром (исходный поставщик товара) - нету.

Единственный вариант зацепиться за поставщика - ключ ВидЗапасов Собственный товар; Поставщик: ООО "Энергопром"

Однако он будет верным для передачи от одной организации к другой. Когда же другая будет продавать этот товар, то ключ будет уже таким:
Собственный товар; Поставщик: Водолей ООО
---
insurgut, ну дык, вы просили оптимизировать) а за логику никто не просил отвечать) так-то результат достигнут - 16 секунд против 205)))
озвучьте цель запроса: какой отчет вы хотите получить? что к чему должно соотноситься? пока что я вижу, что вы хотите для каждого товара по поставщику вывести набор движений. предложенный мной запрос этому вроде бы соответствует. я не спец в УТ11, хотя и приходится работать, поэтому спрогнозировать результат не представляю возможным без более подробного описания.
---
Lord_Michael, сколько товаров определенного поставщика было получено и продано. Все это с учетом передач между своими организациями (интеркомпани).
---
insurgut, попробуйте так

```1c
    ВЫБРАТЬ
    СебестоимостьТоваров.Период КАК Период,
    СебестоимостьТоваров.АналитикаУчетаНоменклатуры.Номенклатура КАК Номенклатура,
    СебестоимостьТоваров.Регистратор КАК Регистратор,
    СебестоимостьТоваров.Регистратор.Партнер КАК Партнер,
    СебестоимостьТоваров.ВидЗапасов.Поставщик КАК Поставщик,
    СебестоимостьТоваров.КоличествоПриход КАК КоличествоПриход,
    СебестоимостьТоваров.СтоимостьПриход КАК СтоимостьПриход,
    СебестоимостьТоваров.КоличествоРасход КАК КоличествоРасход,
    СебестоимостьТоваров.СтоимостьРасход КАК СтоимостьРасход,
    ВЫБОР
    КОГДА СебестоимостьТоваров.КоличествоПриход = 0
    И СебестоимостьТоваров.СтоимостьПриход = 0
    ТОГДА &Расход
    КОГДА СебестоимостьТоваров.КоличествоРасход = 0
    И СебестоимостьТоваров.СтоимостьРасход = 0
    ТОГДА &Приход
    КОНЕЦ КАК ВидДвижения,
    ВЫБОР
    КОГДА СебестоимостьТоваров.КоличествоПриход = 0
    И СебестоимостьТоваров.СтоимостьПриход = 0
    ТОГДА 0
    ИНАЧЕ СебестоимостьТоваров.СтоимостьПриход / СебестоимостьТоваров.КоличествоПриход
    КОНЕЦ КАК ЦенаПриход
    ПОМЕСТИТЬ ВТ_СебестоимостьТоваров
    ИЗ
    РегистрНакопления.СебестоимостьТоваров.Обороты(&ДатаНачалаПриход, &ДатаОкончанияПриход, Регистратор, ) КАК СебестоимостьТоваров
    ГДЕ
    (НЕ СебестоимостьТоваров.Регистратор ССЫЛКА Документ.ПеремещениеТоваров)
    И (НЕ СебестоимостьТоваров.Регистратор ССЫЛКА Документ.РаспределениеРасходовНаСебестоимостьТоваров)
    И (НЕ СебестоимостьТоваров.Регистратор ССЫЛКА Документ.РасчетСебестоимостиТоваров)
    ;

    ////////////////////////////////////////////////////////////­///////////////////
    ВЫБРАТЬ РАЗЛИЧНЫЕ
    ВТ_СебестоимостьТоваров.Номенклатура,
    ВТ_СебестоимостьТоваров.Поставщик
    ПОМЕСТИТЬ ВТ_ТоварыПоставщиков
    ИЗ
    ВТ_СебестоимостьТоваров КАК ВТ_СебестоимостьТоваров
    ГДЕ
    ВТ_СебестоимостьТоваров.ВидДвижения = &Приход
    ;

    ////////////////////////////////////////////////////////////­///////////////////
    ВЫБРАТЬ
    ВТ_ТоварыПоставщиков.Номенклатура,
    ВТ_ТоварыПоставщиков.Поставщик,
    ОсновнаяТаблица.Период,
    ОсновнаяТаблица.Регистратор,
    ОсновнаяТаблица.Партнер,
    ОсновнаяТаблица.ВидДвижения,
    ОсновнаяТаблица.КоличествоПриход,
    ОсновнаяТаблица.СтоимостьПриход,
    ОсновнаяТаблица.КоличествоРасход,
    ОсновнаяТаблица.СтоимостьРасход,
    ОсновнаяТаблица.ЦенаПриход
    ИЗ
    ВТ_ТоварыПоставщиков КАК ВТ_ТоварыПоставщиков
    ЛЕВОЕ СОЕДИНЕНИЕ ВТ_СебестоимостьТоваров КАК ОсновнаяТаблица
    ПО ВТ_ТоварыПоставщиков.Номенклатура = ОсновнаяТаблица.Номенклатура
    И ВТ_ТоварыПоставщиков.Поставщик = ОсновнаяТаблица.Поставщик
```
---
, огромное спасибо за помощь! Все получилось!
---
Lord_Michael, вот индексирование в виртуальных таблицах еще бы добавить... по полям Номенклатура , Поставщик
иначе толку не будет..

+
    ВЫБОР
        КОГДА СебестоимостьТоваров.КоличествоПриход = 0
            И СебестоимостьТоваров.СтоимостьПриход = 0
            ТОГДА &Расход
        КОГДА СебестоимостьТоваров.КоличествоРасход = 0
            И СебестоимостьТоваров.СтоимостьРасход = 0
            ТОГДА &Приход
    КОНЕЦ КАК ВидДвижения,
вот от этого избавиться.. я понимаю что все хочется универсально, но лишний выбор в запросе - лишние тормоза.. по цене тоже самое.. лучше рассчитать кодом

+ вообще это делается не через ВТ.. а через условие ИМЕЮЩИЕ МояТаблица.ВидДвижения = &Приход

и все будет ОК, без всяких ВТ
+ &Приход заменить на ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
&Расход заменить на ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)

+ Если делать через ИМЕЮЩИЕ то и выкрутасы с ВидомДвижения не надо
---
AllexSoft, по индексам - да, согласен)

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

+ вообще это делается не через ВТ.. а через условие ИМЕЮЩИЕ МояТаблица.ВидДвижения = &Приход

проблема в том, что в виртуальной таблице Обороты нет ВидаДвижения, поэтому приходится извращаться. а рассчитать кодом не лучше. это придется вне запроса в цикле при выводе делать. вы уверены, что так быстрей будет?

+ вообще это делается не через ВТ.. а через условие ИМЕЮЩИЕ МояТаблица.ВидДвижения = &Приход
ГДЕ - условие над каждой записью группировки
ИМЕЮЩИЕ - условие над результатом группировки
в запросе есть группировки? если группировать, то да, вы будете правы.

+ &Приход заменить на ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
&Расход заменить на ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
отчасти согласен - запрос более логичен и удобочитаем. но эта запись означает, что каждый раз при обработке очередной записи регистра будет вычисляться значение, а это медленней, чем готовое значение передать параметром, единожды его вычислив вне запроса.

+ Если делать через ИМЕЮЩИЕ то и выкрутасы с ВидомДвижения не надо
опять же, подойдет только при работе с реальной таблицей регистра, а не с виртуальной Остатки. и при условии использования группировок.

почему же не использовать группировки? потому что группируется результат запроса. то есть для каждой записи будет проверяться условие. здесь же мы сразу выбираем различные в отдельную таблицу. в общем можно спорить долго. результат будет зависеть от конкретных данных. ваш вариант тоже имеет место быть. но хотелось бы его увидеть для конструктивного обсуждения.
---
Lord_Michael, а рассчитать кодом не лучше. это придется вне запроса в цикле при выводе делать. вы уверены, что так быстрей будет?
а он скорее всего вне запроса все равно циклом обрабатывает результат..как я понял он результат этого запроса пишет в какой то регистр.. так что кодом в данном случае будет быстрее
ГДЕ - условие над каждой записью группировки
ИМЕЮЩИЕ - условие над результатом группировки
в запросе есть группировки? если группировать, то да, вы будете правы.
смысл предложения по ИМЕЮЩИЕ как раз есть в том чтобы в основном запросе сгруппировать то что надо и избавиться от ВТ, а на результат группировки наложить условие через ИМЕЮЩИЕ

но эта запись означает, что каждый раз при обработке очередной записи регистра будет вычисляться значение, а это медленней, чем готовое значение передать параметром, единожды его вычислив вне запроса.
вполне вероятно, тут не могу сказать, это надо пожалуй спросить гуру MS SQL как там что происходит. Но сдается мне что ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход) будет вычислено один раз в 1С:Сервере на этапе конвертации из запроса 1С в запрос к субд.. ведь MS SQL не знает как вычислять подобные предопределенные системные значения

хотелось бы его увидеть для конструктивного обсуждения.
ща напишу) придется прочитать ветку сначала чтобы понять что запрос далает
---
, нет, ничего не обрабатывается. В том вся и "прелесть", что все делается на СКД безо всякой пост-обработки. В окончательном варианте запрос принял вид:

```1c
    ВЫБРАТЬ РАЗЛИЧНЫЕ
    СебестоимостьТоваров.Период КАК Период,
    СебестоимостьТоваров.Организация КАК Организация,
    СебестоимостьТоваров.НомерСтроки КАК НомерСтроки,
    СебестоимостьТоваров.АналитикаУчетаНоменклатуры,
    СебестоимостьТоваров.Регистратор КАК Регистратор,
    СебестоимостьТоваров.ВидЗапасов КАК ВидЗапасов,
    СебестоимостьТоваров.КоличествоПриход КАК КоличествоПриход,
    СебестоимостьТоваров.СтоимостьПриход КАК СтоимостьПриход,
    СебестоимостьТоваров.КоличествоРасход КАК КоличествоРасход,
    СебестоимостьТоваров.СтоимостьРасход КАК СтоимостьРасход,
    ВЫБОР
    КОГДА СебестоимостьТоваров.КоличествоПриход = 0
    ТОГДА ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
    КОГДА СебестоимостьТоваров.КоличествоРасход = 0
    ТОГДА ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
    КОНЕЦ КАК ВидДвижения,
    ВЫБОР
    КОГДА СебестоимостьТоваров.СтоимостьПриход ЕСТЬ NULL
    ИЛИ СебестоимостьТоваров.КоличествоПриход ЕСТЬ NULL
    ИЛИ СебестоимостьТоваров.КоличествоПриход = 0
    ТОГДА 0
    ИНАЧЕ СебестоимостьТоваров.СтоимостьПриход / СебестоимостьТоваров.КоличествоПриход
    КОНЕЦ КАК ЦенаПриход
    ПОМЕСТИТЬ ВТ_СебестоимостьТоваров
    ИЗ
    РегистрНакопления.СебестоимостьТоваров.Обороты(&ДатаНачалаПриход, &ДатаОкончанияПриход, Запись, ) КАК СебестоимостьТоваров
    ГДЕ
    НЕ СебестоимостьТоваров.Регистратор ССЫЛКА Документ.ПеремещениеТоваров
    И НЕ СебестоимостьТоваров.Регистратор ССЫЛКА Документ.РаспределениеРасходовНаСебестоимостьТоваров
    И НЕ СебестоимостьТоваров.Регистратор ССЫЛКА Документ.РасчетСебестоимостиТоваров
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ РАЗЛИЧНЫЕ
    ОсновнаяТаблица.Организация КАК Организация,
    ВТ_СебестоимостьТоваров.АналитикаУчетаНоменклатуры.Номенклатура КАК Номенклатура,
    ОсновнаяТаблица.Регистратор,
    ВЫБОР
    КОГДА ОсновнаяТаблица.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
    ТОГДА ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
    ИНАЧЕ ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
    КОНЕЦ КАК ВидДвижения,
    ОсновнаяТаблица.НомерСтроки,
    ЕСТЬNULL(ОсновнаяТаблица.КоличествоПриход, 0) КАК КоличествоПриход,
    ЕСТЬNULL(ОсновнаяТаблица.СтоимостьПриход, 0) КАК СтоимостьПриход,
    ЕСТЬNULL(ОсновнаяТаблица.КоличествоРасход, 0) КАК КоличествоРасход,
    ЕСТЬNULL(ОсновнаяТаблица.ЦенаПриход, 0) КАК ЦенаПриход,
    ВТ_СебестоимостьТоваров.ВидЗапасов.Поставщик КАК Поставщик,
    ОсновнаяТаблица.Период
    ИЗ
    ВТ_СебестоимостьТоваров КАК ВТ_СебестоимостьТоваров
    ЛЕВОЕ СОЕДИНЕНИЕ ВТ_СебестоимостьТоваров КАК ОсновнаяТаблица
    ПО ВТ_СебестоимостьТоваров.АналитикаУчетаНоменклатуры = ОсновнаяТаблица.АналитикаУчетаНоменклатуры
```
---
insurgut, с НомеромСтроки запамятовал, что можно было периодичность Запись поставить.
а еще рекомендации:
ВЫБОР
        КОГДА СебестоимостьТоваров.КоличествоПриход = 0
            ТОГДА ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
        КОГДА СебестоимостьТоваров.КоличествоРасход = 0
            ТОГДА ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
    КОНЕЦ КАК ВидДвижения,
лучше оставить проверку не только по количеству, но и по сумме. так как могут быть корректирующие записи ТОЛЬКО по сумме (если нужно скорректировать стоимость, например)

ВЫБОР
        КОГДА СебестоимостьТоваров.СтоимостьПриход ЕСТЬ NULL
                ИЛИ СебестоимостьТоваров.КоличествоПриход ЕСТЬ NULL
                ИЛИ СебестоимостьТоваров.КоличествоПриход = 0
            ТОГДА 0
        ИНАЧЕ СебестоимостьТоваров.СтоимостьПриход / СебестоимостьТоваров.КоличествоПриход
    КОНЕЦ КАК ЦенаПриход
на NULL здесь нет смысла проверять, так как здесь только одна таблица без соединений. у ресурсов тип Число, поэтому NULL и Неопределено быть не может. достаточно проверить делитель на 0, то есть Количество.

    СебестоимостьТоваров.АналитикаУчетаНоменклатуры,
     СебестоимостьТоваров.ВидЗапасов КАК ВидЗапасов,
лучше сразу в ВТ выбрать конечные значения Номенклатура и Поставщик, это уменьшит количество серверных вызовов. фактически обращение к БД будет только при создании ВТ, а не в обоих пакетах.
---
Кажется нашел :) Вместо регистратор.партнер используем СебестоимостьТоваровОбороты.ВидЗапасов.Поставщик
---
Добрый день! Все сообщения не читал. Но что сразу бросается в глаза, вы делаете левое соединение со вложенным запросом, что крайне не рекомендуется делать, потому что если смотреть на физику соединения с вложенным запросом, то производится циклический перебор таблицы из вложенного запроса и если удовлетворяет условиям то производится соединение, но вы представляете насколько это геморно с точки зрения физики соедениения. Лучше вместо вложенной таблицы использовать временную таблицу, а поле Номенклатура проиндексировать.
    Читал мнение что нельзя объединение производить, мое мнение можно и даже нужно, почему нет, объединение запросов. Не рекомендуется использовать просто Объединить, а Объединить все можно использовать, ничего страшного. А если с точки логики построения то объединение здесь действительно не нужно, можно проще.
    Плюс еще одна ошибка в следующем СебестоимостьТоваров.Регистратор.Партнер.Ссылка, лучше делать так
ВЫБОР
КОГДА СебестоимостьТоваров.Регистратор ССЫЛКА Документ.ВашДокумент
ТОГДА ВЫРАЗИТЬ(СебестоимостьТоваров.Регистратор КАК Документ.ВашДокумент).Дата.Партнер.Ссылка
Конец
   где в первом случае производится левое соединение на уровне физического запроса всех регистраторов документов, а во втором случае только явно указанный Вашдокумент
---
tsmgeorg@gmail.com, Все сообщения не читал и зря) во-первых, вопрос уже решен. во-вторых, от вложенного запроса ушли к временной таблице, так что "физика" пострадать не должна). в-третьих, регистраторов много и ВЫРАЗИТЬ для каждого вида документа может быть более трудоемко для вычисления, чем то, что у нас получилось в итоге. хотя все познается в сравнении)
ВЫБОР
КОГДА СебестоимостьТоваров.Регистратор ССЫЛКА Документ.ВашДокумент
ТОГДА ВЫРАЗИТЬ(СебестоимостьТоваров.Регистратор КАК Документ.ВашДокумент).Дата.Партнер.Ссылка
Конец
что тут делает Дата? и потом, забыли ИНАЧЕ. без него будут NULL значения, что тоже не очень хорошо для результата.
---
Lord_Michael, Я просто привел пример, а не разбирался в тонкостях. А дата это описка.
---
Lord_Michael, Согласен что однозначно нужно иначе) А то что использование Выразить используется в офдоках в случае операции разыменования регистраторов и в том числе книжке Хрусталевой отдельная глава по оптимизации это тоже она неэффективно предлагает значит?)
---
tsmgeorg@gmail.com, ВЫРАЗИТЬ() при небольших объемах норм.. а так везде свои плюсы и минусы))))
---
Bukaska, Как раз выразить норм при больших объемах я считаю. Если изучить физику операции разыменования регистраторов. Как вы видите на уровне физических таблиц операцию разыменования?
---
tsmgeorg@gmail.com, я не спорю, поэтому и сказал, что в данном случае регистраторов слишком много и их разыменовывание может съесть больше ресурсов, чем без него. и так же отметил, что нужно сравнивать результаты, чтобы принять решение)
---
Lord_Michael, Решение найдено, это самое главное и вы в отличие от предложений других дали правильный ответ по моему мнению. Только проблема видимо в том что я не прочитал ваше решение, а теперь прочитал, наши мнения сходятся))
---
Lord_Michael,
---
лучше сразу в ВТ выбрать конечные значения Номенклатура и Поставщик, это уменьшит количество серверных вызовов. фактически обращение к БД будет только при создании ВТ, а не в обоих пакетах.
увы, но наложение отборов начинает работать не совсем корректно, вернее до этапа выборки документов перепродажи. В результате они не попадают. Остановился на этом варианте.
---
Но что сразу бросается в глаза, вы делаете левое соединение со вложенным запросом, что крайне не рекомендуется делать
Да там вариантов других нету просто. Компания А продает Компании Б. Компания Б продает клиенту. Как узнать что клиенту в итоге был продан товар компании А. Вот как то таким "извращением" получается узнать :)
---
Результат - старый запрос висел часами (само собой предварительно делались и пересчеты итогов, и прогонялись планы оптимизации базы SQL) при обработке поступлений/продаж за год. Новый запрос - работает не более 5 минут. Более того, данные выдает корректные, в отличии от старого (там поступления порой совсем левые цеплялись).
---
Регистр сворачивать не пробовали ?:)
вообще условиях нужно было еще пихнуть конструкцию Выразить(), хотя об этом уже писали, ну и конечно же индексация Временных таблиц по полям соединения, тут я чтото ее не увидел, хотя об этом тоже упомянули, но вообще сверните регистр для долгосрочной перспективы.
ну а 300 сек для запроса, если его выполняет один пользователь вообще ерунда :) а если отчетик для массовго пользования, то тогда беда с ним 300 сек многовато так то.
---
unoDosTres, так я и говорю, а до оптимизации он часами висел. По поводу свертки регистра - задачи не стояло :)