Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не работает ЛЕВОЕ СОЕДИНЕНИЕ
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование обычных форм 1С 8.2 и не интерфейсной логики
AndreyNaz
Столкнулся с проблемой. Необходимо запросом получить все штрихкода и цены номенклатуры по заданным параметрам, если таковые присутствуют.
Вот код:
тмпТипЦен = ЭлементыФормы.ТипЦен.Значение;
        тмпТипМинЦен = ЭлементыФормы.ТипМинимальныхЦен.Значение;
    Запрос = Новый Запрос;
    Запрос.Текст="
    |ВЫБРАТЬ
    |    ШК.Владелец.Ссылка КАК Номенклатура,
    |    ШК.Владелец.Весовой КАК Весовой,
    |    ШК.Владелец.БазоваяЕдиницаИзмерения КАК ЕдИзм,
    |    ШК.Штрихкод КАК ШтрКод,
    |    ЕСТЬNULL(ЦенНом.Цена,0) КАК Цена,
    |    ЕСТЬNULL(МинЦенНом.Цена,0.01) КАК МинЦена
    |ИЗ
    |        РегистрСведений.Штрихкоды КАК ШК
    |    ЛЕВОЕ СОЕДИНЕНИЕ
    |        РегистрСведений.ЦеныНоменклатуры КАК ЦенНом
    |    ПО   ШК.Владелец.Ссылка = ЦенНом.Номенклатура.Ссылка
    |    ЛЕВОЕ СОЕДИНЕНИЕ
    |        РегистрСведений.ЦеныНоменклатуры КАК МинЦенНом
    |    ПО ШК.Владелец.Ссылка = МинЦенНом.Номенклатура.Ссылка
    |ГДЕ
    |        ЦенНом.ТипЦен = &ТипЦен
    |    И
    |        МинЦенНом.ТипЦен = &ТипМинЦен";
    Запрос.УстановитьПараметр("ТипЦен",тмпТипЦен);
    Запрос.УстановитьПараметр("ТипМинЦен",тмпТипМинЦен);
    Рез = Запрос.Выполнить().Выбрать();

По логике, должно возвращать все штрихкода, но возвращает лишь те, для номенклатуры которых установлены цены.
Платформа 8.2.13.219

Посидел помучился. Вобщем если у кого будет такая же проблема, вот решение:

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

тут Вы делаеТЕ левое соединение. То есть Вы думаеТЕ, что в результате отбора встретятся такие записи:
1. в левой части ссылка на владельца штрихкода, а в правой ссылка на номенклатуру,
2. в левой части ссылка на владельца штрихкода, а в правой NULL,

- за правилами левого соединения.

Но результат у Вас содержит только записи "1". Почему?
ДавайТЕ представим, что ЦенНом.Номенклатура.Ссылка = NULL, тогда ЦенНом.Номенклатура = NULL тоже, ведь "ЦенНом.Номенклатура.Ссылка" = "ЦенНом.Номенклатура". А тогда получается, что у Вас в правой части: ЦенНом.NULL.NULL, а такого біть не может! Потому такой вариант не проходит вовсе. ПоставьТЕ условие
ПО   ШК.Владелец.Ссылка = ЦенНом.Номенклатура


Блин, ошибок наделал... Извеняюсь!
kivals
Нужно понимать, что при левом соединении условия из ГДЕ накладываются на результирующую таблицу, т.е. как заметил vbi в случае отсутствия записи значение поля будет NULL (дальше углубляться не нужно) и условие "ЦенНом.ТипЦен = &ТипЦен" не выполнится.
В случае если регистр цен - периодический и нам важен срез цен более правильным было бы наложить условия на срез:
Запрос.Текст="
     |ВЫБРАТЬ
     |    ШК.Владелец.Ссылка КАК Номенклатура,
     |    ШК.Владелец.Весовой КАК Весовой,
     |    ШК.Владелец.БазоваяЕдиницаИзмерения КАК ЕдИзм,
     |    ШК.Штрихкод КАК ШтрКод,
     |    ЕСТЬNULL(ЦенНом.Цена,0) КАК Цена,
     |    ЕСТЬNULL(МинЦенНом.Цена,0.01) КАК МинЦена
     |ИЗ
     |        РегистрСведений.Штрихкоды КАК ШК
     |    ЛЕВОЕ СОЕДИНЕНИЕ
     |        РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ТипЦен = &ТипЦен) КАК ЦенНом
     |    ПО   ШК.Владелец.Ссылка = ЦенНом.Номенклатура.Ссылка
     |    ЛЕВОЕ СОЕДИНЕНИЕ
     |        РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ТипЦен = &ТипМинЦен) КАК МинЦенНом
     |    ПО ШК.Владелец.Ссылка = МинЦенНом.Номенклатура.Ссылка";
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.