Столкнулся с проблемой, есть простой запрос, который усложняется тем, что искать записи надо из ~4млн записей.

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

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

    ТоварыОтбор.Ссылка.Проведен
    И ТоварыОтбор.Ссылка.ВидОперации В (ЗНАЧЕНИЕ(Перечисление.ВидыОперацийОтбораРазмещенияТоваров.Отбор), ЗНАЧЕНИЕ(Перечисление.ВидыОперацийОтбораРазмещенияТоваров.ПолныйОтбор))
    И (ТоварыОтбор.Распоряжение ССЫЛКА Документ.РасходныйОрдерНаТовары
    ИЛИ ТоварыОтбор.Распоряжение ССЫЛКА Документ.ОтборРазмещениеТоваров)
    И ЕСТЬNULL(ТоварыОтбор.Распоряжение.Ссылка, ТоварыОтбор.Ссылка.Распоряжение) В (&МассивДокументов)
```

Вся загвоздка заключается в последней строчке запроса из-за которой выполняется он около 5 секунд. Если вместо ТоварыОтбор.Распоряжение.Ссылка поставить ТоварыОтбор.Распоряжение тогда выполняется мгновенно. Но .ссылка нужна для того, чтобы исключить незаполненные значения в табличной части. Если занчение в ТЧ не заполнено, тогда надо смотреть ТоварыОтбор.Ссылка.Распоряжение.

Как можно сделать это оптимальнее? Немного помог вариант писать в запросе так

```1c
    И ВЫБОР КОГДА ТоварыОтбор.Распоряжение = &ПустоеРаспоряжение Тогда ТоварыОтбор.Ссылка.Распоряжение В (&МассивДокументов)
    ИНАЧЕ ТоварыОтбор.Распоряжение В (&МассивДокументов) КОНЕЦ
```

Но в данном случае он выполняется около 3 секунд вместо 5. Что я упускаю?
---
Попробуйте так:

```1c
    ВЫБРАТЬ
    ТоварыОтбор.Номенклатура КАК Номенклатура,
    ТоварыОтбор.Характеристика КАК Характеристика,
    ТоварыОтбор.Назначение КАК Назначение,
    ТоварыОтбор.Упаковка КАК Упаковка,
    ТоварыОтбор.Серия КАК Серия,
    ТоварыОтбор.КоличествоОтобрано КАК Количество,
    ТоварыОтбор.КоличествоУпаковокОтобрано КАК КоличествоУпаковок,
    0 КАК НеОтгружать,
    ТоварыОтбор.Ссылка.Распоряжение КАК Распоряжение
    ИЗ
    Документ.ОтборРазмещениеТоваров.ТоварыОтбор КАК ТоварыОтбор
    ГДЕ

    ТоварыОтбор.Ссылка.Проведен
    И ТоварыОтбор.Ссылка.ВидОперации В (ЗНАЧЕНИЕ(Перечисление.ВидыОперацийОтбораРазмещенияТоваров.Отбор), ЗНАЧЕНИЕ(Перечисление.ВидыОперацийОтбораРазмещенияТоваров.ПолныйОтбор))
    И ТоварыОтбор.Ссылка.Распоряжение В (&МассивДокументов)
    И ТоварыОтбор.Распоряжение В (Значение(Документ.ОтборРазмещениеТоваров.ПустаяСсылка), Значение(Документ.РасходныйОрдерНаТовары.ПустаяСсылка),Неопределено)

    Объединить Все

    ВЫБРАТЬ
    ТоварыОтбор.Номенклатура КАК Номенклатура,
    ТоварыОтбор.Характеристика КАК Характеристика,
    ТоварыОтбор.Назначение КАК Назначение,
    ТоварыОтбор.Упаковка КАК Упаковка,
    ТоварыОтбор.Серия КАК Серия,
    ТоварыОтбор.КоличествоОтобрано КАК Количество,
    ТоварыОтбор.КоличествоУпаковокОтобрано КАК КоличествоУпаковок,
    0 КАК НеОтгружать,
    ТоварыОтбор.Распоряжение КАК Распоряжение
    ИЗ
    Документ.ОтборРазмещениеТоваров.ТоварыОтбор КАК ТоварыОтбор
    ГДЕ

    ТоварыОтбор.Ссылка.Проведен
    И ТоварыОтбор.Ссылка.ВидОперации В (ЗНАЧЕНИЕ(Перечисление.ВидыОперацийОтбораРазмещенияТоваров.Отбор), ЗНАЧЕНИЕ(Перечисление.ВидыОперацийОтбораРазмещенияТоваров.ПолныйОтбор))
    И ТоварыОтбор.Распоряжение В (&МассивДокументов)
```

Правда вместо

```1c
    ТоварыОтбор.Распоряжение В (Значение(Документ.ОтборРазмещениеТоваров.ПустаяСсылка), Значение(Документ.РасходныйОрдерНаТовары.ПустаяСсылка),Неопределено)
```

лучше в параметре перечислить все пустые ссылки типов значений, которые в может принимать реквизит Распоряжение табличной части + Неопределено.
И сделать отбор

```1c
    ТоварыОтбор.Распоряжение В (&ПустыеСсылки)
```
---
ТоварыОтбор.Распоряжение.Ссылка
Без ВЫРАЗИТЬ как нужный тип будет соединение со всеми возможными таблицами возможных типов в этом реквизите.
То что указали "(ТоварыОтбор.Распоряжение ССЫЛКА Документ.РасходныйОрдерНаТовары
                ИЛИ ТоварыОтбор.Распоряжение ССЫЛКА Документ.ОтборРазмещениеТоваров)" не отменяет эти соединения.

Делайте два подзапроса объединения для каждого ограничения по типу и используйте в каждом ВЫРАЗИТЬ для нужного типа.
---
Проблему понял, решение, если честно, не до конца
---
Вместо

```1c
    ЕСТЬNULL(ТоварыОтбор.Распоряжение.Ссылка, ТоварыОтбор.Ссылка.Распоряжение) КАК Распоряжение
```

Попробуйте так:

```1c
    Выбор
    Когда ТоварыОтбор.Распоряжение В (Значение(Документ.ОтборРазмещениеТоваров.ПустаяСсылка), Значение(Документ.РасходныйОрдерНаТовары.ПустаяСсылка))
    Тогда ТоварыОтбор.Ссылка.Распоряжение
    Иначе ТоварыОтбор.Распоряжение
    Конец
```

И в ГДЕ - аналогично

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

чуть-чуть стал только лучше результат
---
Попробуйте так:

```1c
    ВЫБРАТЬ
    ТоварыОтбор.Номенклатура КАК Номенклатура,
    ТоварыОтбор.Характеристика КАК Характеристика,
    ТоварыОтбор.Назначение КАК Назначение,
    ТоварыОтбор.Упаковка КАК Упаковка,
    ТоварыОтбор.Серия КАК Серия,
    ТоварыОтбор.КоличествоОтобрано КАК Количество,
    ТоварыОтбор.КоличествоУпаковокОтобрано КАК КоличествоУпаковок,
    0 КАК НеОтгружать,
    ТоварыОтбор.Ссылка.Распоряжение КАК Распоряжение
    ИЗ
    Документ.ОтборРазмещениеТоваров.ТоварыОтбор КАК ТоварыОтбор
    ГДЕ

    ТоварыОтбор.Ссылка.Проведен
    И ТоварыОтбор.Ссылка.ВидОперации В (ЗНАЧЕНИЕ(Перечисление.ВидыОперацийОтбораРазмещенияТоваров.Отбор), ЗНАЧЕНИЕ(Перечисление.ВидыОперацийОтбораРазмещенияТоваров.ПолныйОтбор))
    И ТоварыОтбор.Ссылка.Распоряжение В (&МассивДокументов)
    И ТоварыОтбор.Распоряжение В (Значение(Документ.ОтборРазмещениеТоваров.ПустаяСсылка), Значение(Документ.РасходныйОрдерНаТовары.ПустаяСсылка),Неопределено)

    Объединить Все

    ВЫБРАТЬ
    ТоварыОтбор.Номенклатура КАК Номенклатура,
    ТоварыОтбор.Характеристика КАК Характеристика,
    ТоварыОтбор.Назначение КАК Назначение,
    ТоварыОтбор.Упаковка КАК Упаковка,
    ТоварыОтбор.Серия КАК Серия,
    ТоварыОтбор.КоличествоОтобрано КАК Количество,
    ТоварыОтбор.КоличествоУпаковокОтобрано КАК КоличествоУпаковок,
    0 КАК НеОтгружать,
    ТоварыОтбор.Распоряжение КАК Распоряжение
    ИЗ
    Документ.ОтборРазмещениеТоваров.ТоварыОтбор КАК ТоварыОтбор
    ГДЕ

    ТоварыОтбор.Ссылка.Проведен
    И ТоварыОтбор.Ссылка.ВидОперации В (ЗНАЧЕНИЕ(Перечисление.ВидыОперацийОтбораРазмещенияТоваров.Отбор), ЗНАЧЕНИЕ(Перечисление.ВидыОперацийОтбораРазмещенияТоваров.ПолныйОтбор))
    И ТоварыОтбор.Распоряжение В (&МассивДокументов)
```

Правда вместо

```1c
    ТоварыОтбор.Распоряжение В (Значение(Документ.ОтборРазмещениеТоваров.ПустаяСсылка), Значение(Документ.РасходныйОрдерНаТовары.ПустаяСсылка),Неопределено)
```

лучше в параметре перечислить все пустые ссылки типов значений, которые в может принимать реквизит Распоряжение табличной части + Неопределено.
И сделать отбор

```1c
    ТоварыОтбор.Распоряжение В (&ПустыеСсылки)
```
---
а вот это вот очень интересное решение. Мне очень нравится, даже не подумал про такое. И выполняется мгновенно
---
Выбор и Выразить в ГДЕ лучше не использовать, иначе индексы не используются.
---
не вдаваясь в подробности существующего решения...

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

    ТоварыОтбор.Ссылка.Проведен
    И ТоварыОтбор.Ссылка.ВидОперации В (ЗНАЧЕНИЕ(Перечисление.ВидыОперацийОтбораРазмещенияТоваров.Отбор), ЗНАЧЕНИЕ(Перечисление.ВидыОперацийОтбораРазмещенияТоваров.ПолныйОтбор))
    И ТоварыОтбор.Распоряжение ССЫЛКА Документ.РасходныйОрдерНаТовары
    И ЕСТЬNULL(ВЫРАЗИТЬ(ТоварыОтбор.Распоряжение КАК Документ.РасходныйОрдерНаТовары).Ссылка, ТоварыОтбор.Ссылка.Распоряжение) В (&МассивДокументов)

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

    ВЫБРАТЬ
    ТоварыОтбор.Номенклатура КАК Номенклатура,
    ТоварыОтбор.Характеристика КАК Характеристика,
    ТоварыОтбор.Назначение КАК Назначение,
    ТоварыОтбор.Упаковка КАК Упаковка,
    ТоварыОтбор.Серия КАК Серия,
    ТоварыОтбор.КоличествоОтобрано КАК Количество,
    ТоварыОтбор.КоличествоУпаковокОтобрано КАК КоличествоУпаковок,
    0 КАК НеОтгружать,
    ЕСТЬNULL(ВЫРАЗИТЬ(ТоварыОтбор.Распоряжение КАК Документ.ОтборРазмещениеТоваров).Ссылка, ТоварыОтбор.Ссылка.Распоряжение) КАК Распоряжение
    ИЗ
    Документ.ОтборРазмещениеТоваров.ТоварыОтбор КАК ТоварыОтбор
    ГДЕ

    ТоварыОтбор.Ссылка.Проведен
    И ТоварыОтбор.Ссылка.ВидОперации В (ЗНАЧЕНИЕ(Перечисление.ВидыОперацийОтбораРазмещенияТоваров.Отбор), ЗНАЧЕНИЕ(Перечисление.ВидыОперацийОтбораРазмещенияТоваров.ПолныйОтбор))
    И ТоварыОтбор.Распоряжение ССЫЛКА Документ.ОтборРазмещениеТоваров
    И ЕСТЬNULL(ВЫРАЗИТЬ(ТоварыОтбор.Распоряжение КАК Документ.ОтборРазмещениеТоваров).Ссылка, ТоварыОтбор.Ссылка.Распоряжение) В (&МассивДокументов)
```
---
в принципе я проверил, отбор не бывает в этой базе распоряжением никогда, использовал только первую часть запроса, изменений нет, также 4-5 секунд отрабатывает

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

У вас отбор не корректный. Если поле ссылочного типа не заполнено, то оно может быть и неопределено.

Стоит удалить

```1c
    И (ТоварыОтбор.Распоряжение ССЫЛКА Документ.РасходныйОрдерНаТовары
    ИЛИ ТоварыОтбор.Распоряжение ССЫЛКА Документ.ОтборРазмещениеТоваров)
```

У вас и так есть отбор по ссылке.