Версия для печати темы (https://pro1c.org.ua/index.php?s=80da6976b61331fd299895b20c83bcbb&showtopic=23846)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование обычных форм 1С 8.2 и не интерфейсной логики _ Проблемы с левосторонним склеиванием

Автор: cocon2003 26.06.15, 10:26

Привет.
Это мой 3-й запрос в браке с 1С и что-то с ним не так sad.gif

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

На выходе хочу получить номенклатуру + 2 колонки цен Опт/Розница.
Проблема в том, что по одному из прайсов (Розница) цены в регистре не заполнены - в результате получаю НОЛЬ строк. Если выберу скажем прайсы ОПТ и КИЕВ (оба заполнены) получаю то, что хочу - список номенклатуры с ценами в обоих колонках ОПТ и КИЕВ. Как быть?
Может зря заморочился с левосторонним соединением? И есть другой способ?

Автор: logist 26.06.15, 10:32

Прайсы надо отбирать во вложенном запросе и там накладывать условие, т.е. у вас должно быть два вложенных запроса - для одного и другого прайса, и в них условия отбора. А номенклатуру уже соединять с результатами вложенных запросов.

Автор: sava1 26.06.15, 10:33

Цитата(cocon2003 @ 26.06.15, 11:26) *
ГДЕ
        ЦенаОпт.Прайс = &ПрайсОпт
        И ЦенаРозница.Прайс = &ПрайсРозница


Перенести в условия соединения

Автор: logist 26.06.15, 10:38

Как-то так

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

Автор: sava1 26.06.15, 10:40

Цитата(logist @ 26.06.15, 11:32) *
Прайсы надо отбирать во вложенном запросе и там накладывать условие,

А зачем ? Сформировать еще одну виртуальную таблицу? Так она уже есть.

Автор: cocon2003 26.06.15, 10:57

Цитата(logist @ 26.06.15, 11:38) http://pro1c.org.ua/index.php?act=findpost&pid=100300
А зачем ? Сформировать еще одну виртуальную таблицу? Так она уже есть.


А можете ткнуть носом? Для самых понятливых, но не знающих теории вообще ;-) Если можно переделать мой пример?

Автор: sava1 26.06.15, 10:59

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


Автор: cocon2003 26.06.15, 11:04

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


Слава, направление понял, спасибо. Сейчас прикручу, думаю это более простой вариант из предложенных.
А с циклом в запросе поможете?

Автор: sava1 26.06.15, 11:04

Цитата(cocon2003 @ 26.06.15, 12:00) *
Завернул?

Нет. Текст запроса надо формировать динамически.

Автор: cocon2003 26.06.15, 11:13

Цитата(sava1 @ 26.06.15, 12:04) *
Нет. Текст запроса надо формировать динамически.

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

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

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

Я любознательныыыыыййй и местами ленивый. 64000000.gif

Автор: sava1 26.06.15, 11:23

Цитата(cocon2003 @ 26.06.15, 12:04) *
А с циклом в запросе поможете?

К-сожалению 1с-кий запрос не поддерживает СТЕ, поэтому рекурсивный запрос не пройдет.
С циклом формирования текста понятно?

Автор: cocon2003 26.06.15, 11:33

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


Да, подобные задачки реализовывал когда-то на Дэлфи. Спасибо.

Автор: cocon2003 26.06.15, 16:25

Возник дополнительный вопрос:

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

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

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

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua