Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Запрос с ЛЕВЫМ СОЕДИНИНИЕМ, выбор всех элементов
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.1 (8.0)
irbis_triffle
Всем добрый вечер!

Делаю небольшую таблицу со столбцами "Номенклатура" и "Цена". Делаю запрос через конструктор (все "по-книжке"):

Запрос.Текст = "ВЫБРАТЬ
               |    ТекНоменклатура.Ссылка,
               |    ТекНоменклатура.Наименование КАК Товар,
               |    ЦеныНоменклатуры.Цена КАК Цена
               |ИЗ
               |    РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
               |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК ТекНоменклатура
               |        ПО ЦеныНоменклатуры.Номенклатура = ТекНоменклатура.Ссылка
               |ГДЕ
               |    ТекНоменклатура.ЭтоГруппа = ЛОЖЬ
               |    И ТекНоменклатура.Родитель = &Родитель
               |    И ТекНоменклатура.ВидНоменклатуры = &ВидНоменклатуры
               |
               |УПОРЯДОЧИТЬ ПО
               |    ТекНоменклатура.Наименование";

Запрос.УстановитьПараметр("Родитель", ТекКатегория);
Запрос.УстановитьПараметр("ВидНоменклатуры", Справочники.ВидыНоменклатуры.НайтиПоКоду("000000001"));
Запрос.УстановитьПараметр("ТипЦен", Справочники.ТипыЦенНоменклатуры.НайтиПоКоду("000000002"));
Запрос.УстановитьПараметр("Валюта", Справочники.Валюты.НайтиПоКоду("980"));

Результат = Запрос.Выполнить().Выбрать();


и хочу получить таблицу со всеми элементами номенклатуры, а вместо этого получаю лишь те, у которых есть цена в регистре.
В конструкторе в "связях" устанавливал галочку "все" возле справочника номенклатуры...
Ткните пожалуйста куда копать...

Заранее благодарен!

... недовставился кусок запроса, под конец еще есть параметры, хотя это и не существенно:
             |    И ЦеныНоменклатуры.ТипЦен = &ТипЦен
               |    И ЦеныНоменклатуры.Валюта = &Валюта
logist
ЛЕВОЕ по регистру цен, а не по справочнику номенклатуры.
irbis_triffle
"ВЫБРАТЬ
               |    ТекНоменклатура.Ссылка,
               |    ТекНоменклатура.Наименование КАК Товар,
               |    ЦеныНоменклатуры.Цена КАК Цена
               |ИЗ
               |    Справочник.Номенклатура КАК ТекНоменклатура
               |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
               |        ПО ТекНоменклатура.Ссылка = ЦеныНоменклатуры.Номенклатура
               |ГДЕ
               |    ТекНоменклатура.ЭтоГруппа = ЛОЖЬ
               |    И ТекНоменклатура.Родитель = &Родитель
               |    И ТекНоменклатура.ВидНоменклатуры = &ВидНоменклатуры
               |    И ЦеныНоменклатуры.ТипЦен = &ТипЦен
               |    И ЦеныНоменклатуры.Валюта = &Валюта
               |
               |УПОРЯДОЧИТЬ ПО
               |    ТекНоменклатура.Наименование";

эффект тот же(

точнее наверное так:
ПО ЦеныНоменклатуры.Номенклатура = ТекНоменклатура.Ссылка
logist
Ну так если Вы отбираете по Типу цен, то естественно что отобразится только та у которой есть указанный Тип цен и Валюта. В начальном запросе этого не было.
А какая цель такого запроса?
irbis_triffle
Показать таблицу со всеми ценами, товары часто добавляются (одними людьми), а те, кто формирует цены - не знаю что добавилось. вот и надо им показать все товары - есть ли цены - они тут и найдут и сделают...

можно конечно сделать отчет, но здесь же прикрутится система интерактивного изменения цен.

и еще, кстати, листаю ман и никак не могу найти почему не работает
    |УПОРЯДОЧИТЬ ПО
    |    Наименование ИЕРАРХИЯ


когда в запросе есть ЛЕВОЕ СОЕДИНЕНИЕ

как вариант думал сделать двумя отдельными запросами, но чую что так делать нельзя(
logist
Тогда по-моему проще выбрать только ту номенклатуру у которой вообще нет цен, или нет определенного типа цен (списка типов цен).
yuritch
"ВЫБРАТЬ
               |    ТекНоменклатура.Ссылка,
               |    ТекНоменклатура.Наименование КАК Товар,
               |    ЦеныНоменклатуры.Цена КАК Цена
               |ИЗ
               |    Справочник.Номенклатура КАК ТекНоменклатура
               |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
               |        ПО ТекНоменклатура.Ссылка = ЦеныНоменклатуры.Номенклатура
               |ГДЕ
               |    НЕ ТекНоменклатура.ЭтоГруппа
               |    И ТекНоменклатура.Родитель = &Родитель
               |    И ТекНоменклатура.ВидНоменклатуры = &ВидНоменклатуры
               |    И IsNULL(ЦеныНоменклатуры.ТипЦен, &ТипЦен) = &ТипЦен
               |    И IsNULL(ЦеныНоменклатуры.Валюта, &Валюта) = &Валюта
               |
               |УПОРЯДОЧИТЬ ПО
               |    ТекНоменклатура.Наименование";


Вот это отберет всю номенклатуру, для которой есть цены (подходящие по условиям), и всю, для которой цен нет.
irbis_triffle
Цитата(yuritch @ 05.08.11, 8:55) необходимо зарегистрироваться для просмотра ссылки
"ВЫБРАТЬ
               |    ТекНоменклатура.Ссылка,
               |    ТекНоменклатура.Наименование КАК Товар,
               |    ЦеныНоменклатуры.Цена КАК Цена
               |ИЗ
               |    Справочник.Номенклатура КАК ТекНоменклатура
               |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
               |        ПО ТекНоменклатура.Ссылка = ЦеныНоменклатуры.Номенклатура
               |ГДЕ
               |    НЕ ТекНоменклатура.ЭтоГруппа
               |    И ТекНоменклатура.Родитель = &Родитель
               |    И ТекНоменклатура.ВидНоменклатуры = &ВидНоменклатуры
               |    И IsNULL(ЦеныНоменклатуры.ТипЦен, &ТипЦен) = &ТипЦен
               |    И IsNULL(ЦеныНоменклатуры.Валюта, &Валюта) = &Валюта
               |
               |УПОРЯДОЧИТЬ ПО
               |    ТекНоменклатура.Наименование";


Вот это отберет всю номенклатуру, для которой есть цены (подходящие по условиям), и всю, для которой цен нет.

БОЛЬШОЕ Вам СПАСИБО, ДОБРЫЙ ЧЕЛОВЕК!!!
5_kopeek
irbis_triffle, Вам стОит обратить внимание на необходимо зарегистрироваться для просмотра ссылки.
irbis_triffle
yuritch, запрос все равно работает не так как надо, потому что в результате получаем только те товары, у которых есть нужная цена (согласно параметрам) и те, у которых нет вообще никаких цен. Если у товара есть какая-то цена, кроме нужной - он не попадает в результата запроса (((
Разбираюсь дальше...
irbis_triffle
В общем одним запросом по-моему не получится, так как условия влияют на весь запрос а не только на ЛЕВОЕ СОЕДИНЕНИЕ.
Я сделал через временную таблицу:
        // ФОРМИРУЕМ ВРЕМЕННУЮ ТАБЛИЦУ ЦЕН С ЖЕЛАЕМЫМИ УСЛОВИЯМИ
        ЗапросЦен = Новый Запрос;
        ЗапросЦен.Текст =
            "ВЫБРАТЬ
            |    ЦеныНоменклатурыСрезПоследних.Номенклатура,
            |    ЦеныНоменклатурыСрезПоследних.Цена,
            |    ЦеныНоменклатурыСрезПоследних.ТипЦен
            |ПОМЕСТИТЬ СрезПоследнихРозничныхЦен
            |ИЗ
            |    РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
            |ГДЕ
            |    ЦеныНоменклатурыСрезПоследних.ТипЦен = &ТипЦен";
        ЗапросЦен.УстановитьПараметр("ТипЦен", Справочники.ТипыЦенНоменклатуры.НайтиПоКоду("000000002"));
        ЗапросЦен.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
        
        ЗапросЦен.Выполнить();
        
        // ФОРМИРУЕМ ЗАПРОС НОМЕНКЛАТУРЫ С ЦЕНАМИ (или 0 если цены нет)
        Запрос = Новый Запрос;
        Запрос.Текст =
        "ВЫБРАТЬ
        |    ТекНоменклатура.Артикул,
        |    ТекНоменклатура.Наименование КАК Товар,
        |    ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК Цена
        |ИЗ
        |    Справочник.Номенклатура КАК ТекНоменклатура
        |        ЛЕВОЕ СОЕДИНЕНИЕ СрезПоследнихРозничныхЦен КАК ЦеныНоменклатурыСрезПоследних
        |        ПО ТекНоменклатура.Ссылка = ЦеныНоменклатурыСрезПоследних.Номенклатура
        |ГДЕ
        |    (НЕ ТекНоменклатура.ЭтоГруппа)
        |    И ТекНоменклатура.Родитель = &Родитель
        |    И ТекНоменклатура.ВидНоменклатуры = &ВидНоменклатуры
        |
        |УПОРЯДОЧИТЬ ПО
        |    Товар";
            
        Запрос.УстановитьПараметр("ВидНоменклатуры", Справочники.ВидыНоменклатуры.НайтиПоКоду("000000001"));
        Запрос.УстановитьПараметр("Родитель", Элемент.ТекущиеДанные.Группа.Ссылка);
        Запрос.МенеджерВременныхТаблиц=ЗапросЦен.МенеджерВременныхТаблиц;
        
        Результат = Запрос.Выполнить();


Кажется работает корректно, тестирую))
Может кому пригодится, или ГУРУ ткнут в явную ошибку.
Fynjy
Условие Где нужно было поместить в ПО и цельный запрос бы заработал. Но в целом решение корректно и не повлечет падения производительности...
ЗЫ: не забывайте уничтожать временные таблицы, а то чревато для сервера 1с ...
irbis_triffle
Цитата(Fynjy @ 07.08.11, 16:06) необходимо зарегистрироваться для просмотра ссылки
Условие Где нужно было поместить в ПО и цельный запрос бы заработал. Но в целом решение корректно и не повлечет падения производительности...
ЗЫ: не забывайте уничтожать временные таблицы, а то чревато для сервера 1с ...

А можно посмотреть правильный вариант одним запросом? Я пробовал поместить Где в По, но у меня ничего не получилось, поэтому и выбрал вариант временной таблицы.
Если на производительность не влияет - пусть так и остается ("работает - не лезь"), но на будущее хотелось бы понять...
Заранее благодарен!
Fynjy
Цитата(irbis_triffle @ 08.08.11, 2:32) необходимо зарегистрироваться для просмотра ссылки
А можно посмотреть правильный вариант одним запросом? Я пробовал поместить Где в По, но у меня ничего не получилось, поэтому и выбрал вариант временной таблицы.
Если на производительность не влияет - пусть так и остается ("работает - не лезь"), но на будущее хотелось бы понять...
Заранее благодарен!

ВЫБРАТЬ
    ТекНоменклатура.Ссылка,
    ТекНоменклатура.Наименование КАК Товар,
    ЦеныНоменклатуры.Цена КАК Цена
ИЗ
    Справочник.Номенклатура КАК ТекНоменклатура
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
        ПО ТекНоменклатура.Ссылка = ЦеныНоменклатуры.Номенклатура
            И (ЦеныНоменклатуры.ТипЦен = &ТипЦен)
            И (ЦеныНоменклатуры.Валюта = &Валюта)
ГДЕ
    (НЕ ТекНоменклатура.ЭтоГруппа)
    И ТекНоменклатура.Родитель = &Родитель
    И ТекНоменклатура.ВидНоменклатуры = &ВидНоменклатуры

УПОРЯДОЧИТЬ ПО
    ТекНоменклатура.Наименование

как то так ...
ЗЫ: но правильнее юзать виртуальные таблицы ...
Vofka
Цитата
но правильнее юзать виртуальные таблицы ...

Почему?

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

Зы. на корректность не проверял
Fynjy
Цитата(Vofka @ 08.08.11, 12:11) необходимо зарегистрироваться для просмотра ссылки
Почему?

Так как именно это основное назначение РС.
Цитата(Vofka @ 08.08.11, 12:11) необходимо зарегистрироваться для просмотра ссылки
А вообще, почему не сделать так:
Запрос.Текст =
        "ВЫБРАТЬ
        |    ТекНоменклатура.Артикул,
        |    ТекНоменклатура.Наименование КАК Товар,
        |    ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК Цена
        |ИЗ
        |    Справочник.Номенклатура КАК ТекНоменклатура
        |        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
        |    ЦеныНоменклатурыСрезПоследних.Номенклатура,
        |    ЦеныНоменклатурыСрезПоследних.Цена,
        |    ЦеныНоменклатурыСрезПоследних.ТипЦен
        |ИЗ
        |    РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
        |ГДЕ
        |    ЦеныНоменклатурыСрезПоследних.ТипЦен = &ТипЦен) КАК ЦеныНоменклатурыСрезПоследних
        |        ПО ТекНоменклатура.Ссылка = ЦеныНоменклатурыСрезПоследних.Номенклатура
        |ГДЕ
        |    (НЕ ТекНоменклатура.ЭтоГруппа)
        |    И ТекНоменклатура.Родитель = &Родитель
        |    И ТекНоменклатура.ВидНоменклатуры = &ВидНоменклатуры
        |
        |УПОРЯДОЧИТЬ ПО
        |    Товар";

Зы. на корректность не проверял

Условия для ВТ должны задаваться не через ГДЕ.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.