Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Тривиальный запрос выдает не все записи - штрихкоды номенклатуры ТЧ документа

Тривиальный запрос выдает не все записи - штрихкоды номенклатуры ТЧ документа
Я
   vdeemer
 
23.07.19 - 08:56
Доброго времени суток!
Задача простая - вывести все строки ТЧ документа(ов) Реализация Товаров и Услуг с некоторым отбором (в запросе - проведенные за период по определенному контрагенту) и с выбранным типом штрихкодов.

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

По идее, левое соединение должно вывести все строки ТЧ и - если таковые имеются - штрихкоды указанного типа. Почему-то выдаются только те строки ТЧ, для которых есть ШК выбранного типа. Что я делаю не так? Спасибо.
 
 
   ДенисЧ
 
1 - 23.07.19 - 08:58
Условия из ГДЕ в ПО перенеси
   Admin_Net_1C
 
2 - 23.07.19 - 08:59
Этот блок условия:
И Штрихкоды.ТипШтрихкода = &ТипШтрихкода
перенести в связь левого соединения
и
Штрихкоды.Штрихкод,
заменить на 
ЕСТЬNULL(Штрихкоды.Штрихкод, "")
   vdeemer
 
3 - 23.07.19 - 09:02
ВЫБРАТЬ
    РеализацияТоваровУслугТовары.Ссылка,
    РеализацияТоваровУслугТовары.НомерСтроки КАК НомерСтроки,
    РеализацияТоваровУслугТовары.Номенклатура,
    РеализацияТоваровУслугТовары.ЕдиницаИзмерения,
    ЕСТЬNULL(Штрихкоды.Штрихкод, "") КАК ЕстьШК
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Штрихкоды КАК Штрихкоды
        ПО РеализацияТоваровУслугТовары.Номенклатура = Штрихкоды.Владелец
            И РеализацияТоваровУслугТовары.ХарактеристикаНоменклатуры = Штрихкоды.ХарактеристикаНоменклатуры
            И (Штрихкоды.ТипШтрихкода = &ТипШтрихкода)
ГДЕ
    РеализацияТоваровУслугТовары.Ссылка.Проведен = ИСТИНА
    И РеализацияТоваровУслугТовары.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
    И РеализацияТоваровУслугТовары.Ссылка.Контрагент = &Контрагент


на выходе те же яйца, только в профиль((
   vdeemer
 
4 - 23.07.19 - 09:07
(3) прошу прощения, кофе не успело сделать свою работу - все работает, как и надо))
Спасибо!
А почему такое поведение?
   ДенисЧ
 
5 - 23.07.19 - 09:09
(4) Поптому что условие Штрихкоды.ТипШтрихкода = &ТипШтрихкода  в первом варианте запросто превращается в NULL = &ТипШтрихкода , а это всегда ложь
   vdeemer
 
6 - 23.07.19 - 09:11
(5) #векжививекучисьадуракомпомрешь
Спасибо!
   Lama12
 
7 - 23.07.19 - 09:14
(4) потому что ты накладываешь условие на правую таблицу. Что б его выполнить нужно выбрать значения которые позволяют сделать разъименования поля "Штрихкоды", а оно Null. Поэтому выполняется как бы внутренний запрос. Не уверен что это верно с точки зрения SQL, но так d 1C работает. А когда условие в соединении, то тут условие накладывается на правую таблицу пока она еще не связана с левой, и условие отрабатывается до соединения.
Думаю В ГДЕ можно было б поставить следующую конструкцию

ВЫБОР
КОГДА Штрихкоды.ТипШтрихкода ЕСТЬ NULL
ТОГДА ИСТИНА
ИНАЧЕ Штрихкоды.ТипШтрихкода = &ТипШтрихкода

Это вместо Штрихкоды.ТипШтрихкода = &ТипШтрихкода
   pasha_d
 
8 - 23.07.19 - 09:22
(3) ты этим не левое, а внутренне соединение делаешь..

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.