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

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

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

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


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

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

Это вместо Штрихкоды.ТипШтрихкода = &ТипШтрихкода
8 pasha_d
 
23.07.19
09:22
(3) ты этим не левое, а внутренне соединение делаешь..
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс