Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Не работает ЛЕВОЕ СОЕДИНЕНИЕ , Запрос в УТ          
AndreyNaz Подменю пользователя
сообщение 06.10.11, 9:36
Сообщение #1

Молчаливый
*
Группа: Пользователи
Сообщений: 5
Из: Днепропетровск, Украина
Спасибо сказали: 0 раз
Рейтинг: 0

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

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

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

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

vbi Подменю пользователя
сообщение 06.10.11, 16:50
Сообщение #2

Оратор
Иконка группы
Группа: Местный
Сообщений: 374
Из: Украина, Луцк
Спасибо сказали: 72 раз
Рейтинг: 64.3

ПО   ШК.Владелец.Ссылка = ЦенНом.Номенклатура.Ссылка

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

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

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


Блин, ошибок наделал... Извеняюсь!
Причина редактирования: Ну тыкать то ненадо...


Signature
Впроваджую, супроводжую

kivals Подменю пользователя
сообщение 06.10.11, 18:10
Сообщение #3

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 105
Из: Киев
Спасибо сказали: 27 раз
Рейтинг: 0

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

Спасибо сказали: AndreyNaz,

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 15.06.24, 8:42
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!