Имя: Пароль:
1C
1С v8
Вопрос по запросам. Как правильно с точки зрения классики.
0 Lama12
 
28.02.14
11:10
Есть запрос.

ВЫБРАТЬ ПЕРВЫЕ 1
    Контрагенты.ИНН,
    Контрагенты.КПП,
    Контрагенты.ЮрФизЛицо,
    Контрагенты.Покупатель,
    Контрагенты.Поставщик,
    КонтактнаяИнформация.Представление КАК ЮрАдрес
ИЗ
    РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
        ПО ((ВЫРАЗИТЬ(КонтактнаяИнформация.Объект КАК Справочник.Контрагенты)) = Контрагенты.Ссылка)
            И (Контрагенты.Ссылка = &Контрагент)
            И (КонтактнаяИнформация.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ЮрАдресКонтрагента))

Работает.
Но вот если внутреннее соединение заменить на левое, то результат совсем другой.

Вопрос. Так и должно быть в классике, или это особенность реализации запросов в 1С?
1 wanderer_ица
 
28.02.14
11:12
"результат совсем другой. "

Он тебе ВойнуИМир в ответ выдаёт?
2 Lama12
 
28.02.14
11:14
(1) Нет, он дает Null по полю ЮрАдрес.
3 fvadim
 
28.02.14
11:14
(0) всё правильно, результаты не должны совпадать
4 wanderer_ица
 
28.02.14
11:14
(2) И ши ви таки хочите иного?
5 fisher
 
28.02.14
11:15
(0) Так и должно быть по классике. Если под классикой понимать здравый смысл и формальную логику.
6 fvadim
 
28.02.14
11:15
(3) левое  - справа есть null - выводим
внутреннее - справа есть null - не выводим
7 Lama12
 
28.02.14
11:16
Если убрать "Первые 1", то результаты будут идентичными.
8 Maxus43
 
28.02.14
11:19
Выразить в Соединении - вселенское зло и пичаль
9 Lama12
 
28.02.14
11:19
тьфу...
Не тот запрос скопировал :(

ВЫБРАТЬ
    Контрагенты.ИНН,
    Контрагенты.КПП,
    Контрагенты.ЮрФизЛицо,
    Контрагенты.Покупатель,
    Контрагенты.Поставщик,
    КонтактнаяИнформация.Представление КАК ЮрАдрес
ИЗ
    Справочник.Контрагенты КАК Контрагенты
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
        ПО ((ВЫРАЗИТЬ(КонтактнаяИнформация.Объект КАК Справочник.Контрагенты)) = Контрагенты.Ссылка)
            И (Контрагенты.Ссылка = &Контрагент)
            И (КонтактнаяИнформация.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ЮрАдресКонтрагента))
10 Lama12
 
28.02.14
11:20
(8) Так советует Заратустра от ИТС 1С.
11 Lama12
 
28.02.14
11:22
все... вопрос снимается. Сам туплю.
12 Maxus43
 
28.02.14
11:37
(10) не верю. Использование Выразить рекомендуется в других случаях, я именно про Соединение, там это зло
13 Lama12
 
28.02.14
12:01
(12) Правильно что не веришь. Видимо у меня устарела информация. Сейчас статьи не нашел.
Вопрос - где можно почитать почему не рекомендуется в соединениях использовать Выразить?
14 Maxus43
 
28.02.14
12:03
(13) да просто посмотри в профайлере во что превращается сие богомерзкое дело...
На курсах по запросам об этом прямо говорят преподы обычно
15 Lama12
 
28.02.14
12:08
(14) Понял. Спасибо!
16 fisher
 
28.02.14
12:32
(14) И во что же? Я, наивный, почему-то считал, что просто добавляется условие на тип. Нет?
17 Maxus43
 
28.02.14
12:35
(16) щас точно не скажу, толи индекс скан станет идти, толи целая портянка условий... короче плохо, сталкивался. убрав в одном запросе такое выразить - скорость выполнения на порядочек скакнула. Скуля под рукой нет
18 fisher
 
28.02.14
12:38
Подумав... Скорее всего да - ничего хорошего не будет.
В соединениях использовать ВЫРАЗИТЬ() в самом деле бессмысленно.
19 Maxus43
 
28.02.14
12:39
частично по теме http://programmist1s.ru/ekspert-optimizatsiya-zaprosov-v-1s/
без выразить правда, но есть моменты типа использования ИЛИ, и соединения с вложенным запросом
20 fisher
 
28.02.14
12:44
(19) С вложенными подзапросами - момент спорный. Всё сильно зависит от условий.
21 H A D G E H O G s
 
28.02.14
12:45
(17) Индекс скан? Точно не индекс сиик?
А если найду?
22 Maxus43
 
28.02.14
12:48
(21) не точно, я ж сказал - щас точно не скажу :)
Ну ты хоть согласен что это ЗЛО?
23 Maxus43
 
28.02.14
12:49
(20) там проблема с постоением плана запроса, мол скулю сложно в этом случае определить оптимальный план, и может (не всегда конечно) выбрать неоптимальный
24 H A D G E H O G s
 
28.02.14
12:50
(22) Я согласен, что запрос - шлак.
И что это - не ДОБРО точно.
25 H A D G E H O G s
 
28.02.14
12:51
(23) Я за все время только 1 раз сталкивался с неоптимальным планом, связанным с конструкцией EXIST (условие по вложенному запросу).
26 Maxus43
 
28.02.14
12:53
(25) если есть вероятность выбора неоптимального плана - то зачем её допускать, если есть простой способ обхода? я хз, у меня уже просто рефлекс выработался, не пишу соединения со вложенными, сразу ВТ делаю
27 Maxus43
 
28.02.14
12:53
конечно если во вложенном всего 5-10 записей всегда - то и он сойдёт, это мелочи
28 Zero on a dice
 
28.02.14
13:01
(26) т.е. оптимальней кидать во временную с полем Выразить() и потом соединять с ним, чем соединять с условием Выразить()?
29 Maxus43
 
28.02.14
13:06
(28) нет, оптимальней просто соединять, без Выразить.
Про временную - это когда используются вложенные запросы
30 fisher
 
28.02.14
14:26
(26) Используя напропалую временные таблицы ты лишаешь оптимизатор запроса свободы при построении плана плюс получаешь лишние накладные расходы. Это далеко не то же самое, что уменьшить "вероятность выбора неоптимального плана".
Лично я использую временные таблицы только в самых явных случаях (многократное использование полученных данных, например). А дальше экспериментирую только если производительность не устраивает. И выигрыш при создании временных таблиц я получаю нечасто.
31 Infsams654
 
28.02.14
14:36
(25), (26), (30) - еретическая мысль, в запросах можно использовать виртуальные т. Почему бы их не сделать методами платформы, а не запроса ?
32 Lama12
 
28.02.14
14:40
Хы... Вот так глупость утром спросишь. Поймешь что глупость спросил.А к обеду много нового узнаешь :)
Обожаю мисту.
33 fisher
 
28.02.14
14:43
(31) Т.е. ты предлагаешь сделать то же самое, только хуже? И какой в этом смысл?
На уровне СУБД это будет тот же самый запрос. Только ты не сможешь его использовать как составляющую более сложного запроса.
34 fisher
 
28.02.14
14:49
Да и сделано уже всё. Методами прикладных объектов ты можешь выбрать практически то же самое, что и голыми виртуальными таблицами этих объектов. Только так никто не делает, потому что глупо.
35 Infsams654
 
28.02.14
16:35
(34) нужно работать "Методами прикладных объектов". Глупо работать запросами (от этого только "растопыривание пальцеВ").
36 fisher
 
28.02.14
19:51
(35) Учи запросы, глупыш упрямый.
Программист всегда исправляет последнюю ошибку.