Имя: Пароль:
1C
1С v8
Странность с запросом - кто пояснит?
0 tciban
 
22.08.19
07:13
Уважаемые коллеги! столкнулся со странным поведением запроса (или туплю :)). Понадобился простой отчетик, по суди соединение табличных частей документов за период
Вот он:

ВЫБРАТЬ
    ЗаказНаПроизводствоПродукция.Номенклатура,
    СУММА(ЗаказНаПроизводствоПродукция.Количество) КАК Количество,
    СУММА(ЦиклПроизводстваГотоваяПродукция.ВесНоменклатуры) КАК ВесНоменклатуры,
    СУММА(ЦиклПроизводстваГотоваяПродукция.ВесБрутто) КАК ВесБрутто
ИЗ
    Документ.ЗаказНаПроизводство.Продукция КАК ЗаказНаПроизводствоПродукция
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЦиклПроизводства.ГотоваяПродукция КАК ЦиклПроизводстваГотоваяПродукция
        ПО ЗаказНаПроизводствоПродукция.Номенклатура = ЦиклПроизводстваГотоваяПродукция.Номенклатура
ГДЕ
    ЗаказНаПроизводствоПродукция.Ссылка.Дата МЕЖДУ &ДатаН И &ДатаК
    И ЗаказНаПроизводствоПродукция.Ссылка.Проведен
    И ЦиклПроизводстваГотоваяПродукция.Ссылка.Дата МЕЖДУ &ДатаН И &ДатаК
    И ЦиклПроизводстваГотоваяПродукция.Ссылка.Проведен

СГРУППИРОВАТЬ ПО
    ЗаказНаПроизводствоПродукция.Номенклатура

По идее классическое левое соединение, т.е. в результат запроса должны попасть все строки из Документ.ЗаказНаПроизводство.Продукция и те строки из Документ.ЦиклПроизводства.ГотоваяПродукция у которых совпадает номенклатура.
Но в резултате имею только те строки из первого ТЧ документа, к которым нашлись строки во втором ТЧ! Не понимаю почему?!
1 PuhUfa
 
22.08.19
07:23
(0)     И ЦиклПроизводстваГотоваяПродукция.Ссылка.Дата МЕЖДУ &ДатаН И &ДатаК
    И ЦиклПроизводстваГотоваяПродукция.Ссылка.Проведен
Перенеси в соединение
2 tciban
 
22.08.19
07:25
условие в соединение все фигачить? Ну это  даст прибавку на больших объемах может быть, но почему вместо левого раюотает полное соединение?
3 ДенисЧ
 
22.08.19
07:28
(2) Потому что у тебя работает не левое и не полное. А внутреннее.
4 azt-yur
 
22.08.19
07:28
(2) при условии в Где у тебя записи с Null второй таблицы отсеиваются.
5 Троекратное ура
 
22.08.19
07:29
Не полное, а внутреннее. У тебя это условие за пределами соединения исключает все ситуации, когда ЦиклПроизводстваГотоваяПродукция.Ссылка.Проведен = ЛОЖЬ (а по факту это значение вообще NULL).
6 PuhUfa
 
22.08.19
07:30
(2)
ВЫБРАТЬ
    ЗаказНаПроизводствоПродукция.Номенклатура,
    СУММА(ЗаказНаПроизводствоПродукция.Количество) КАК Количество,
    СУММА(ЦиклПроизводстваГотоваяПродукция.ВесНоменклатуры) КАК ВесНоменклатуры,
    СУММА(ЦиклПроизводстваГотоваяПродукция.ВесБрутто) КАК ВесБрутто
ИЗ
    Документ.ЗаказНаПроизводство.Продукция КАК ЗаказНаПроизводствоПродукция
        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                            ЦиклПроизводстваГотоваяПродукция.Номенклатура КАК Номенклатура,
                            ЦиклПроизводстваГотоваяПродукция.ВесНоменклатуры КАК ВесНоменклатуры,
                            ЦиклПроизводстваГотоваяПродукция.ВесБрутто КАК ВесБрутто
                          ИЗ
                            Документ.ЦиклПроизводства.ГотоваяПродукция КАК ЦиклПроизводстваГотоваяПродукция
                          ГДЕ
                              ЦиклПроизводстваГотоваяПродукция.Ссылка.Дата МЕЖДУ &ДатаН И &ДатаК
                              И ЦиклПроизводстваГотоваяПродукция.Ссылка.Проведен) КАК ЦиклПроизводстваГотоваяПродукция

        ПО ЗаказНаПроизводствоПродукция.Номенклатура = ЦиклПроизводстваГотоваяПродукция.Номенклатура
ГДЕ
    ЗаказНаПроизводствоПродукция.Ссылка.Дата МЕЖДУ &ДатаН И &ДатаК
    И ЗаказНаПроизводствоПродукция.Ссылка.Проведен

как то так. в синтаксесе мог где то накосячить
7 hhhh
 
22.08.19
07:36
(0) да однозначно условие

ЦиклПроизводстваГотоваяПродукция.Ссылка.Проведен

оставляет только строчки

"в резултате имею только те строки из первого ТЧ документа, к которым нашлись строки во втором ТЧ! Не понимаю почему?!"

потому что если строка второго ТЧ не найдена, там условие Проведен не выполняется и она не попадает.
8 tciban
 
22.08.19
07:41
Ну да, оговорился, не полное, а внутреннее соединение получилось!
Попробую из где перенести в условие соединения.

Сработало!!!

ВЫБРАТЬ
    ЗаказНаПроизводствоПродукция.Номенклатура,
    СУММА(ЗаказНаПроизводствоПродукция.Количество) КАК Количество,
    СУММА(ЦиклПроизводстваГотоваяПродукция.ВесНоменклатуры) КАК ВесНоменклатуры,
    СУММА(ЦиклПроизводстваГотоваяПродукция.ВесБрутто) КАК ВесБрутто
ИЗ
    Документ.ЗаказНаПроизводство.Продукция КАК ЗаказНаПроизводствоПродукция
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЦиклПроизводства.ГотоваяПродукция КАК ЦиклПроизводстваГотоваяПродукция
        ПО ЗаказНаПроизводствоПродукция.Номенклатура = ЦиклПроизводстваГотоваяПродукция.Номенклатура
            И (ЦиклПроизводстваГотоваяПродукция.Ссылка.Дата МЕЖДУ &ДатаН И &ДатаК)
            И (ЦиклПроизводстваГотоваяПродукция.Ссылка.Проведен)
ГДЕ
    ЗаказНаПроизводствоПродукция.Ссылка.Дата МЕЖДУ &ДатаН И &ДатаК
    И ЗаказНаПроизводствоПродукция.Ссылка.Проведен

СГРУППИРОВАТЬ ПО
    ЗаказНаПроизводствоПродукция.Номенклатура
9 tciban
 
22.08.19
07:41
Спасибо! Вопрос закрыт, все понял.
Полезно запомнить (я это когда то знал но уже забыл :))
10 Йохохо
 
22.08.19
07:49
(9) а что будет в ВесНоменклатуры если производства не было?
11 13_Mult
 
22.08.19
07:58
(9) В моём универе один препод говорил: "Хорошо когда не знал, да ещё и забыл". ))
12 DrZombi
 
гуру
22.08.19
08:05
(0) Ты же сам так указал в

ПО ЗаказНаПроизводствоПродукция.Номенклатура = ЦиклПроизводстваГотоваяПродукция.Номенклатура
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.