выразить в соединении

1. VoVo 23.12.22 16:34 Сейчас в теме
Здравствуйте, подскажите работает ли выразить в запросе, если я буду соединять по составному реквизиту?
По теме из базы знаний
Найденные решения
13. spacecraft 25.12.22 13:15 Сейчас в теме
(12) в таком варианте выразить ничем не поможет, кроме как отсеять все кроме нужного типа.
14. RustamZz 25.12.22 13:33 Сейчас в теме
(11) Здесь Выразить не добавит оптимальности, можно оставить для наглядности.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
12. VoVo 25.12.22 12:26 Сейчас в теме
(1)
С работать как раз перегруз, скинули на меня несколько задач с сжатыми сроками. Опыт еще не большой, про выразить знаю что оптимизирует если использовать составной реквизит, но не знал работает это ли, если указать это в соединении. Просто запрос для отчета сложный, там куча полей с составными типами, а задача сделать это оптимально, т.к. объем данных очень большой, да и вообще. Задавать такие вопросы на форуме люблю т.к. заметил в процессе обсуждения во первых лучше лично для меня запоминается тема, а во вторых могут вылезти дополнительные ньюансы, о которых при самостоятельном тестировании не узнал бы. Да и не успевал уже тестировать, а офис закрывали уже. Всем выгода, помогающим активность, плюсики и т.д., мне доп опыт и запоминание темы после обсуждения)

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


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

И как писал выше часть текста запроса будет ли это оптимизировано.
13. spacecraft 25.12.22 13:15 Сейчас в теме
(12) в таком варианте выразить ничем не поможет, кроме как отсеять все кроме нужного типа.
23. DBV 27.12.22 08:43 Сейчас в теме
(13) так там уже понятно же какой тип. На мой взгляд ВЫРАЗИТЬ в данном случае бесполезный, только лишние символы в тексте запроса

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

ВЫБРАТЬ ПЕРВЫЕ 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 = ?)
Показать
24. spacecraft 27.12.22 09:27 Сейчас в теме
(23) одно важное отличие есть. Если СписаниеСРасчетногоСчета.ДокументОснование составной тип и там будут несколько типов:
"кроме как отсеять все кроме нужного типа"
25. DBV 27.12.22 09:28 Сейчас в теме
(24) а да, каюсь, невнимательно прочитал, там ДокументОснование
2. user1278383 5 23.12.22 16:36 Сейчас в теме
да. быстрее же попробовать, не?)
VoVo; user1881120; +2 Ответить
3. Sashares 33 23.12.22 16:45 Сейчас в теме
(2)Это же работать придется. На форуме сидеть веселее))
VoVo; user1881120; +2 Ответить
5. user1278383 5 23.12.22 16:47 Сейчас в теме
(3) эх, если бы сидел. А то написал вопрос и убежал( Не удивлюсь, если ответы будут прочитаны в понедельник)
VoVo; Sashares; +2 Ответить
11. VoVo 25.12.22 12:26 Сейчас в теме
(3)С работать как раз перегруз, скинули на меня несколько задач с сжатыми сроками. Опыт еще не большой, про выразить знаю что оптимизирует если использовать составной реквизит, но не знал работает это ли, если указать это в соединении. Просто запрос для отчета сложный, там куча полей с составными типами, а задача сделать это оптимально, т.к. объем данных очень большой, да и вообще. Задавать такие вопросы на форуме люблю т.к. заметил в процессе обсуждения во первых лучше лично для меня запоминается тема, а во вторых могут вылезти дополнительные ньюансы, о которых при самостоятельном тестировании не узнал бы. Да и не успевал уже тестировать, а офис закрывали уже. Всем выгода, помогающим активность, плюсики и т.д., мне доп опыт и запоминание темы после обсуждения)

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


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

И как писал выше часть текста запроса будет ли это оптимизировано.
14. RustamZz 25.12.22 13:33 Сейчас в теме
(11) Здесь Выразить не добавит оптимальности, можно оставить для наглядности.
4. beldieff 23.12.22 16:46 Сейчас в теме
6. soft_wind 23.12.22 16:54 Сейчас в теме
(1) вообще не нужно ни чего выражать, просто сравнивайте и все!
7. beldieff 23.12.22 16:57 Сейчас в теме
(6)
вообще не нужно ни чего выражать, просто сравнивайте и все!
Оптимизация? Не, не слышал.
8. user1863362 23.12.22 17:07 Сейчас в теме
(7) А аргументировать сможешь?
9. soft_wind 23.12.22 17:13 Сейчас в теме
(7)допустим вы сравниваете

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

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

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

в этом случае если не нужный тип, дальше проверка не выполняется
но что-то сомнительная оптимизация (замеров не делал)
10. spacecraft 23.12.22 19:01 Сейчас в теме
(9) смотря для чего выражать.
Пример:
    Рег.Регистратор.Номер = ВТ.Номер

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

Разница очевидна.
15. dehro 12 25.12.22 16:39 Сейчас в теме
(10) И тут без "ВЫРАЗИТЬ" можно обойтись:

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

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

Показать
16. spacecraft 25.12.22 18:00 Сейчас в теме
21. dehro 12 26.12.22 23:05 Сейчас в теме
(16) До сих пор не могу понять смысла этого оператора.

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

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

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

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

До сих пор не могу понять смысла этого оператора

А Левое соединение, хоть и левое, но всегда понятное и однозначное)). Как и Подстрока(....,1,100)

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

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

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

Как раз явное. Но в 1С это скорее ограничение типа.
И более наглядно работает с цифрами/числами.
26. dehro 12 27.12.22 23:41 Сейчас в теме
(22)

...оптимизатор поймет и сделает...
...Оптимизатор не ошибается...


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

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


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

Мда.. тяжелый случай. Причем тут оптимизатор плана запроса и СКД?
Я наверно новое для вас открою, но вот это (описанное выше) делает сама СКД. Оптимизатор тут совсем не причем. Он уже обрабатывает измененный запрос.
28. dehro 12 28.12.22 19:16 Сейчас в теме
(27)Платформа преобразует запрос 1С в запрос SQL и только тогда оптимизатор SQL его начнёт оптимизировать.
Так что платформа тут совсем при делах, с помощью функций СКД, либо без них.

"Выразить как ... Ссылка" прилетит в SQL как left join.
29. spacecraft 28.12.22 20:10 Сейчас в теме
17. beldieff 26.12.22 08:37 Сейчас в теме
(8)
(9)
после Выразить() у вас все равно идет сравнение с ссылкой документа
Вот только джойнишь ты эту ссылку документа к одной таблице в БД которую выразил или к десятку возможных типов в регистраторе как раз на производительность и влияет.
18. user1863362 26.12.22 08:43 Сейчас в теме
(17) Нет. Такое поведение будет только если ты разыменовываешь составной тип регистратора, получая от него значение через точку. Например, получаешь контрагента и джойнишь по этому контрагенту. При использовании самого регистратора составного типа при джоине по равенству будет все хорошо.
Вот при джоине по неравенству/больше/меньше будут проблемы, это общая беда сравнений составных типов.

Учите и понимайте матчасть перед тем как поучать. Для вас же вон даже ИТС онлайн сделали.
RustamZz; +1 Ответить
19. user1635644 26.12.22 09:43 Сейчас в теме
самый оптимальным вариантом будет проверка на ссылку в условии. все остальные манипуляции с полями при соединении таблиц только замедляют работу.

ИЗ ВТ1 КАК ВТ1
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.СписаниеСРасчетногоСчета КАК СписаниеСРасчетногоСчета
ПО ВТ1.ДокРегистратор = СписаниеСРасчетногоСчета.ДокументОснование
ГДЕ
СписаниеСРасчетногоСчета.ДокументОснование ССЫЛКА Документ.скДопсДСП
20. user1863362 26.12.22 09:54 Сейчас в теме
(19) План запроса покажи. С этим условием и без этого условия.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот