Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблемы с левосторонним склеиванием
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование обычных форм 1С 8.2 и не интерфейсной логики
cocon2003
Привет.
Это мой 3-й запрос в браке с 1С и что-то с ним не так sad.gif
    ВЫБРАТЬ
        СпрНоменклатура.Наименование КАК Наименование,
        ЦенаОпт.ЦенаСНДС КАК ОптЦенаСНДС,
        ЦенаРозница.ЦенаСНДС КАК РозницаЦенаСНДС
    ИЗ
        Справочник.Номенклатура КАК СпрНоменклатура
            ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныПродажи.СрезПоследних(&Дата, ) КАК ЦенаОпт
            ПО (ЦенаОпт.Номенклатура.Ссылка = СпрНоменклатура.Ссылка)
            ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныПродажи.СрезПоследних(&Дата, ) КАК ЦенаРозница
            ПО (ЦенаРозница.Номенклатура.Ссылка = СпрНоменклатура.Ссылка)
    ГДЕ
        ЦенаОпт.Прайс = &ПрайсОпт
        И ЦенаРозница.Прайс = &ПрайсРозница

На выходе хочу получить номенклатуру + 2 колонки цен Опт/Розница.
Проблема в том, что по одному из прайсов (Розница) цены в регистре не заполнены - в результате получаю НОЛЬ строк. Если выберу скажем прайсы ОПТ и КИЕВ (оба заполнены) получаю то, что хочу - список номенклатуры с ценами в обоих колонках ОПТ и КИЕВ. Как быть?
Может зря заморочился с левосторонним соединением? И есть другой способ?
logist
Прайсы надо отбирать во вложенном запросе и там накладывать условие, т.е. у вас должно быть два вложенных запроса - для одного и другого прайса, и в них условия отбора. А номенклатуру уже соединять с результатами вложенных запросов.
sava1
Цитата(cocon2003 @ 26.06.15, 11:26) необходимо зарегистрироваться для просмотра ссылки
ГДЕ
        ЦенаОпт.Прайс = &ПрайсОпт
        И ЦенаРозница.Прайс = &ПрайсРозница


Перенести в условия соединения
logist
Как-то так
"ВЫБРАТЬ
|    Номенклатура.Наименование,
|    ВложенныйЗапрос.Цена1,
|    ВложенныйЗапрос1.Цена2
|ИЗ
|    Справочник.Номенклатура КАК Номенклатура
|        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
|            ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура2,
|            ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК Цена2
|        ИЗ
|            РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ВидЦен = &Прайс2) КАК ЦеныНоменклатурыСрезПоследних) КАК ВложенныйЗапрос1
|        ПО Номенклатура.Ссылка = ВложенныйЗапрос1.Номенклатура2
|        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
|            ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура1,
|            ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК Цена1
|        ИЗ
|            РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ВидЦен = &Прайс1) КАК ЦеныНоменклатурыСрезПоследних) КАК ВложенныйЗапрос
|        ПО Номенклатура.Ссылка = ВложенныйЗапрос.Номенклатура1"
sava1
Цитата(logist @ 26.06.15, 11:32) необходимо зарегистрироваться для просмотра ссылки
Прайсы надо отбирать во вложенном запросе и там накладывать условие,

А зачем ? Сформировать еще одну виртуальную таблицу? Так она уже есть.
cocon2003
Цитата(logist @ 26.06.15, 11:38) необходимо зарегистрироваться для просмотра ссылки
Как-то так
"ВЫБРАТЬ
|    Номенклатура.Наименование,
|    ВложенныйЗапрос.Цена1,
|    ВложенныйЗапрос1.Цена2
|ИЗ
|    Справочник.Номенклатура КАК Номенклатура
|        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
|            ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура2,
|            ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК Цена2
|        ИЗ
|            РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ВидЦен = &Прайс2) КАК ЦеныНоменклатурыСрезПоследних) КАК ВложенныйЗапрос1
|        ПО Номенклатура.Ссылка = ВложенныйЗапрос1.Номенклатура2
|        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
|            ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура1,
|            ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК Цена1
|        ИЗ
|            РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ВидЦен = &Прайс1) КАК ЦеныНоменклатурыСрезПоследних) КАК ВложенныйЗапрос
|        ПО Номенклатура.Ссылка = ВложенныйЗапрос.Номенклатура1"


Подогнал под свои поля - работает нормально. Но это только начало задачи ...

Цитата(sava1 @ 26.06.15, 11:40) необходимо зарегистрироваться для просмотра ссылки
А зачем ? Сформировать еще одну виртуальную таблицу? Так она уже есть.


А можете ткнуть носом? Для самых понятливых, но не знающих теории вообще ;-) Если можно переделать мой пример?
sava1
Цитата(cocon2003 @ 26.06.15, 11:57) необходимо зарегистрироваться для просмотра ссылки
|        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ВидЦен = &Прайс2) КАК ВложенныйЗапрос1
|        ПО Номенклатура.Ссылка = ВложенныйЗапрос1.Номенклатура
|        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ВидЦен = &Прайс1) КАК ВложенныйЗапрос
|        ПО Номенклатура.Ссылка = ВложенныйЗапрос.Номенклатура

cocon2003
Задача усложнена тем, что в начале я показал только 2 прайса в запросе. на самом деле их известное количество, но оно большее. Есть справочник прайсовых типов. В нём перечислены наименования прайсов (Опт, Розница, Киев ...) и есть поле с номером (порядоковый номер для колонки отчёта). Смысл сделать реестр цен Наименование / колонки с ценами этого наименования в определённых прайсах.
Можно ли замутить какой-то цикл в запросе, который бы перебрал справочник прайсов на предмет наличия этого поля с номером и по каждому найденному прайсу получить цену для номенклатуры?
Завернул?


Слава, направление понял, спасибо. Сейчас прикручу, думаю это более простой вариант из предложенных.
А с циклом в запросе поможете?
sava1
Цитата(cocon2003 @ 26.06.15, 12:00) необходимо зарегистрироваться для просмотра ссылки
Завернул?

Нет. Текст запроса надо формировать динамически.
cocon2003
Цитата(sava1 @ 26.06.15, 12:04) необходимо зарегистрироваться для просмотра ссылки
Нет. Текст запроса надо формировать динамически.

А ведь вариант. Спасибо, натолкнули. icon_beer17.gif

И кстати, запрос с двумя параметрами сработал. Жить буду biggrin.gif

В принципе всё случилось. Спасибо всем за участие. Буду обращаться.

Я любознательныыыыыййй и местами ленивый. 64000000.gif
sava1
Цитата(cocon2003 @ 26.06.15, 12:04) необходимо зарегистрироваться для просмотра ссылки
А с циклом в запросе поможете?

К-сожалению 1с-кий запрос не поддерживает СТЕ, поэтому рекурсивный запрос не пройдет.
С циклом формирования текста понятно?
cocon2003
Цитата(sava1 @ 26.06.15, 12:23) необходимо зарегистрироваться для просмотра ссылки
К-сожалению 1с-кий запрос не поддерживает СТЕ, поэтому рекурсивный запрос не пройдет.
С циклом формирования текста понятно?


Да, подобные задачки реализовывал когда-то на Дэлфи. Спасибо.
cocon2003
Возник дополнительный вопрос:
ВЫБРАТЬ
    |    СпрНоменклатура.Наименование КАК Наименование,
    |    ЦенаОпт.ЦенаСНДС КАК ОптЦенаСНДС,
    |    ЦенаКиев.ЦенаСНДС КАК КиевЦенаСНДС
    |ИЗ
    |    Справочник.Номенклатура КАК СпрНоменклатура
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныПродажи.СрезПоследних(&Дата, Прайс = &ПрайсОпт) КАК ЦенаОпт
    |        ПО (ЦенаОпт.Номенклатура.Ссылка = СпрНоменклатура.Ссылка)
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныПродажи.СрезПоследних(&Дата, Прайс = &ПрайсКиев) КАК ЦенаКиев
    |        ПО (ЦенаКиев.Номенклатура.Ссылка = СпрНоменклатура.Ссылка)

Если в дополнение к этому мне нужно ещё по одному признаку отловить 3-й прайс, скажем РОЗНИЦА но не с ценой, а с количеством записей Как это сделать?

Задачку решил через группировку всего и вся, чтобы из одной присоединённой таблицы выгрести количество записей.
Может есть решение получше?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.