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

```1c
    ИЗ ВТ1 КАК ВТ1
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.СписаниеСРасчетногоСчета КАК СписаниеСРасчетногоСчета
    ПО ВТ1.ДокРегистратор = ВЫРАЗИТЬ(СписаниеСРасчетногоСчета.ДокументОснование КАК Документ.скДопсДСП)
```

ВТ1.ДокРегистратор при создании временной таблицы я тоже это поле с помощью выразить(......КАК Документ.скДопсДСП) сделал.

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

В плане запроса всё одинаково, что с ВЫРАЗИТЬ, что без него
Предполагаю, что для самой платформы функция ВЫРАЗИТЬ - это лишнее действие (хоть и незначительное)

```1c
    ВЫБРАТЬ ПЕРВЫЕ 1
    Регистр.Активность КАК Активность
    ИЗ
    РегистрБухгалтерии.Хозрасчетный КАК Регистр
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.АвансовыйОтчет КАК Документ
    ПО Регистр.Регистратор = ВЫРАЗИТЬ(Документ.Ссылка КАК Документ.АвансовыйОтчет)

    SEL ECT TOP 1
    T1._Active
    FR OM
    dbo._AccRg960 T1
    INNER JOIN dbo._Document299 T2
    ON (T1._RecorderTRef = 0x0000012B AND T1._RecorderRRef = (T2._IDRRef))
    WHERE
    ((T1._Fld947 = ?)) AND (T2._Fld947 = ?)

    ////////////////////////////////////////////////////////////­////////////////////////////////

    ВЫБРАТЬ ПЕРВЫЕ 1
    Регистр.Активность КАК Активность
    ИЗ
    РегистрБухгалтерии.Хозрасчетный КАК Регистр
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.АвансовыйОтчет КАК Документ
    ПО Регистр.Регистратор = Документ.Ссылка

    SELECT TOP 1
    T1._Active
    FR OM
    dbo._AccRg960 T1
    INNER JOIN dbo._Document299 T2
    ON (T1._RecorderTRef = 0x0000012B AND T1._RecorderRRef = T2._IDRRef)
    WH ERE
    ((T1._Fld947 = ?)) AND (T2._Fld947 = ?)
```
---
одно важное отличие есть. Если СписаниеСРасчетногоСчета.ДокументОснование составной тип и там будут несколько типов:
"кроме как отсеять все кроме нужного типа"
---
а да, каюсь, невнимательно прочитал, там ДокументОснование
---
да. быстрее же попробовать, не?)
---
Это же работать придется. На форуме сидеть веселее))
---
эх, если бы сидел. А то написал вопрос и убежал( Не удивлюсь, если ответы будут прочитаны в понедельник)
---
С работать как раз перегруз, скинули на меня несколько задач с сжатыми сроками. Опыт еще не большой, про выразить знаю что оптимизирует если использовать составной реквизит, но не знал работает это ли, если указать это в соединении. Просто запрос для отчета сложный, там куча полей с составными типами, а задача сделать это оптимально, т.к. объем данных очень большой, да и вообще. Задавать такие вопросы на форуме люблю т.к. заметил в процессе обсуждения во первых лучше лично для меня запоминается тема, а во вторых могут вылезти дополнительные ньюансы, о которых при самостоятельном тестировании не узнал бы. Да и не успевал уже тестировать, а офис закрывали уже. Всем выгода, помогающим активность, плюсики и т.д., мне доп опыт и запоминание темы после обсуждения)

```1c
    ИЗ ВТ1 КАК ВТ1
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.СписаниеСРасчетногоСчета КАК СписаниеСРасчетногоСчета
    ПО ВТ1.ДокРегистратор = ВЫРАЗИТЬ(СписаниеСРасчетногоСчета.ДокументОснование КАК Документ.скДопсДСП)
```

ВТ1.ДокРегистратор при создании временной таблицы я тоже это поле с помощью выразить(......КАК Документ.скДопсДСП) сделал.

И как писал выше часть текста запроса будет ли это оптимизировано.
---
Здесь Выразить не добавит оптимальности, можно оставить для наглядности.
---
работает
---
вообще не нужно ни чего выражать, просто сравнивайте и все!
---
вообще не нужно ни чего выражать, просто сравнивайте и все! Оптимизация? Не, не слышал.
---
А аргументировать сможешь?
---
допустим вы сравниваете

Рег.Регистратор = Док.Ссылка

регистратор составной тип
после Выразить() у вас все равно идет сравнение с ссылкой документа
смысл выражать?

или делать двойное сравнение
Рег.Регистратор Ссылка Документ.<НужныйДокумента>.
и Рег.Регистратор = Док.Ссылка

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

```1c
    Рег.Регистратор.Номер = ВТ.Номер
```

И

```1c
    ВЫРАЗИТЬ(Рег.Регистратор КАК Документ.НужныйДокумент).Номер = ВТ.Номер
```

Разница очевидна.
---
И тут без "ВЫРАЗИТЬ" можно обойтись:

```1c
    ...
    ЕстьNULL(НужныйТипДокумента.Номер,") = ВТ.Номер
    ...

    левое соединение Документ.НужныйТипДокумента как НужныйТипДокумента
    по Рег.Регистратор = НужныйТипДокумента.Ссылка
```
---
можно, только зачем?
---
До сих пор не могу понять смысла этого оператора.

Хорошо, когда мы отбираем по одному типу регистра, а если, например, регистр двигает 12 документов, а нам нужно отобрать по двум? Отсечение не сработает.

А выражение (Выразить ... КАК Строка(100)) - неявное преобразование типов?

А Левое соединение, хоть и левое, но всегда понятное и однозначное)). Как и Подстрока(....,1,100)
---
Хорошо, когда мы отбираем по одному типу регистра, а если, например, регистр двигает 12 документов, а нам нужно отобрать по двум? Отсечение не сработает.
Да ладно:

```1c
    ВЫРАЗИТЬ(Рег.Регистратор КАК Документ.НужныйДокумент1).Номер = ВТ.Номер
    ИЛИ ВЫРАЗИТЬ(Рег.Регистратор КАК Документ.НужныйДокумент2).Номер = ВТ.Номер
```

До сих пор не могу понять смысла этого оператора
А Левое соединение, хоть и левое, но всегда понятное и однозначное)). Как и Подстрока(....,1,100)
В данном случае оптимизатор поймет и сделает необходимое левое соединение за нас.
Когда соединения сложные трехэтажные, при добавлении самим дополнительных соединений можно ошибиться. Оптимизатор не ошибается.
Код получается более наглядным.

Это как с циклами. "Зачем придумали столько вариантов синтаксиса циклов? Ведь можно обходиться одним Пока ... Цикл."
Так и тут.

А выражение (Выразить ... КАК Строка(100)) - неявное преобразование типов?
Как раз явное. Но в 1С это скорее ограничение типа.
И более наглядно работает с цифрами/числами.
---
...оптимизатор поймет и сделает...
...Оптимизатор не ошибается...

Угу. Конечно! Всенепременно! Не ошибётся! Поэтому нам нужна консоль, показывающая текст запроса, который выполнит СКД. Т.е. мы пишем один запрос, в консоли он работает, всё правильно, вставляем в СКД: опа, соптимизировался))) И не всегда правильно!

...Но в 1С это скорее ограничение типа...

Программирование - вещь точная. И при определении функции не должно быть слов "скорее", "похоже", "вроде как", "возможно".
А тут либо по типам фильтрует, либо явно значения преобразовывает. Оно "ВЫРАЗИТЬ" может и безопасное, но пусть за ним следят.
---
Угу. Конечно! Всенепременно! Не ошибётся! Поэтому нам нужна консоль, показывающая текст запроса, который выполнит СКД. Т.е. мы пишем один запрос, в консоли он работает, всё правильно, вставляем в СКД: опа, соптимизировался))) И не всегда правильно!
Мда.. тяжелый случай. Причем тут оптимизатор плана запроса и СКД?
Я наверно новое для вас открою, но вот это (описанное выше) делает сама СКД. Оптимизатор тут совсем не причем. Он уже обрабатывает измененный запрос.
---
Платформа преобразует запрос 1С в запрос SQL и только тогда оптимизатор SQL его начнёт оптимизировать.
Так что платформа тут совсем при делах, с помощью функций СКД, либо без них.

"Выразить как ... Ссылка" прилетит в SQL как left join.
---
И причем тут СКД?
---
(9) после Выразить() у вас все равно идет сравнение с ссылкой документа Вот только джойнишь ты эту ссылку документа к одной таблице в БД которую выразил или к десятку возможных типов в регистраторе как раз на производительность и влияет.
---
Нет. Такое поведение будет только если ты разыменовываешь составной тип регистратора, получая от него значение через точку. Например, получаешь контрагента и джойнишь по этому контрагенту. При использовании самого регистратора составного типа при джоине по равенству будет все хорошо.
Вот при джоине по неравенству/больше/меньше будут проблемы, это общая беда сравнений составных типов.

Учите и понимайте матчасть перед тем как поучать. Для вас же вон даже ИТС онлайн сделали.
---
самый оптимальным вариантом будет проверка на ссылку в условии. все остальные манипуляции с полями при соединении таблиц только замедляют работу.

ИЗ ВТ1 КАК ВТ1
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.СписаниеСРасчетногоСчета КАК СписаниеСРасчетногоСчета
       ПО ВТ1.ДокРегистратор = СписаниеСРасчетногоСчета.ДокументОснование
ГДЕ
      СписаниеСРасчетногоСчета.ДокументОснование ССЫЛКА Документ.скДопсДСП
---
План запроса покажи. С этим условием и без этого условия.