Имя: Пароль:
1C
1С v8
Левое соединение в запросе
0 serg_buz
 
16.04.18
10:15
Доброго времени! Коллеги, помогите пожалуйста, где я допустил ошибку, ни как понять не могу... Есть запрос, его смысл понять по каким заказам покупателя пришла вся номенклатура и он готов к отгрузке: ВЫБРАТЬ
    ЗаказыПокупателейОстатки.ЗаказПокупателя КАК ЗаказПокупателя,
    ЗаказыПокупателейОстатки.Номенклатура КАК Номенклатура,
    ЗаказыПокупателейОстатки.КоличествоОстаток
ПОМЕСТИТЬ Заказ
ИЗ
    РегистрНакопления.ЗаказыПокупателей.Остатки КАК ЗаказыПокупателейОстатки
ГДЕ
    ЗаказыПокупателейОстатки.Номенклатура.Услуга = ЛОЖЬ
    И ЗаказыПокупателейОстатки.ЗаказПокупателя.Ответственный = &Ответственный
    И ЗаказыПокупателейОстатки.ЗаказПокупателя.ВнутреннийСтатусЗаказаПокупателя = ЗНАЧЕНИЕ(Перечисление.СтатусЗаказаПокупателя.Запущен)
;

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

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Заказ.ЗаказПокупателя КАК ЗаказПокупателя,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Заказ.Номенклатура) КАК Номенклатура,
    СУММА(Заказ.КоличествоОстаток) КАК КоличествоОстаток,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Остатки.ДокументРезерва) КАК ДокументРезерва,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Остатки.Номенклатура) КАК Номенклатура1,
    СУММА(Остатки.КоличествоОстаток) КАК КоличествоОстаток1,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ЗаказыПоставщикам.ЗаказПоставщикуДокументОснование) КАК ЗаказПоставщикуДокументОснование,
    СУММА(ЗаказыПоставщикам.КоличествоОстаток) КАК КоличествоОстаток2
ИЗ
    Заказ КАК Заказ
        ЛЕВОЕ СОЕДИНЕНИЕ Остатки КАК Остатки
        ПО Заказ.ЗаказПокупателя = Остатки.ДокументРезерва
            И Заказ.Номенклатура = Остатки.Номенклатура
        ЛЕВОЕ СОЕДИНЕНИЕ ЗаказыПоставщикам КАК ЗаказыПоставщикам
        ПО Заказ.ЗаказПокупателя = ЗаказыПоставщикам.ЗаказПоставщикуДокументОснование
ГДЕ
    Заказ.КоличествоОстаток <= Остатки.КоличествоОстаток
    И ЗаказыПоставщикам.КоличествоОстаток ЕСТЬ NULL

СГРУППИРОВАТЬ ПО
    Заказ.ЗаказПокупателя

УПОРЯДОЧИТЬ ПО
    ЗаказПокупателя,
    Номенклатура
Проверяю через консоль запросов первую временную таблицу "Заказ" по одному заказу покупателя вижу 4 номенклатуры, по временной таблице "Остатки" вижу 3 номенклатуры, т.е. в результат он не должен падать, а он падает, и показывает что по "Заказ.Номенклатура" = 3. Что то я, видимо, затупил с соединением, по тому что если убрать связь
И Заказ.Номенклатура = Остатки.Номенклатура
то в результате "Заказ.Номенклатура" = 4, как и должно быть. Не могу понять где я ошибся, подскажите пожалуйста.
1 Darych
 
16.04.18
10:20
ну так у тебя условие на количествоостаток, а не на номенклатуру
2 serg_buz
 
16.04.18
10:39
Все правильно, по номенклатуре мне нужно только общее понимание пришло все или нет. Или я Вас неправильно понял?
3 catena
 
16.04.18
10:52
Условие на левую таблицу превращает левое соединение во внутреннее.
4 Darych
 
16.04.18
10:59
а (3) права... у тебя в выборку попадают позиции которые есть в обоих вт.. условие Заказ.Номенклатура = Остатки.Номенклатура в топку
5 serg_buz
 
16.04.18
11:22
(3) А можно поподробнее? Не совсем понял...
6 serg_buz
 
16.04.18
11:24
(4) Без него ни как... Не будет понятно пришел ли груз по данной номенклатуре или нет. Или можно как то по другому реализовать можно?
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший