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

Хранилище

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

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



> Проблемы с левосторонним склеиванием          
cocon2003 Подменю пользователя
сообщение 26.06.15, 10:26
Сообщение #1

Общительный
**
Группа: Пользователи
Сообщений: 36
Спасибо сказали: 0 раз
Рейтинг: 0

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

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

logist Подменю пользователя
сообщение 26.06.15, 10:32
Сообщение #2

Про1С-ник
Иконка группы
Квалифицированный бухгалтерГений телепатии и социального моделированияЗа заслуги на форуме в 2010 годуМодератору Про1С (за заслуги в 2011 году)
Группа: Местный
Сообщений: 9564
Из: Kharkiv, UA
Спасибо сказали: 2536 раз
Рейтинг: 0

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


Signature
Личные бесплатные консультации не даю, для этого есть форум!

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

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2684
Из: Проскуров
Спасибо сказали: 678 раз
Рейтинг: 656.7

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


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

logist Подменю пользователя
сообщение 26.06.15, 10:38
Сообщение #4

Про1С-ник
Иконка группы
Квалифицированный бухгалтерГений телепатии и социального моделированияЗа заслуги на форуме в 2010 годуМодератору Про1С (за заслуги в 2011 году)
Группа: Местный
Сообщений: 9564
Из: Kharkiv, UA
Спасибо сказали: 2536 раз
Рейтинг: 0

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


Signature
Личные бесплатные консультации не даю, для этого есть форум!

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

sava1 Подменю пользователя
сообщение 26.06.15, 10:40
Сообщение #5

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2684
Из: Проскуров
Спасибо сказали: 678 раз
Рейтинг: 656.7

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

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

cocon2003 Подменю пользователя
сообщение 26.06.15, 10:57
Сообщение #6

Общительный
**
Группа: Пользователи
Сообщений: 36
Спасибо сказали: 0 раз
Рейтинг: 0

Цитата(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 Подменю пользователя
сообщение 26.06.15, 10:59
Сообщение #7

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2684
Из: Проскуров
Спасибо сказали: 678 раз
Рейтинг: 656.7

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


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

cocon2003 Подменю пользователя
сообщение 26.06.15, 11:04
Сообщение #8

Общительный
**
Группа: Пользователи
Сообщений: 36
Спасибо сказали: 0 раз
Рейтинг: 0

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


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

sava1 Подменю пользователя
сообщение 26.06.15, 11:04
Сообщение #9

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2684
Из: Проскуров
Спасибо сказали: 678 раз
Рейтинг: 656.7

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

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

cocon2003 Подменю пользователя
сообщение 26.06.15, 11:13
Сообщение #10

Общительный
**
Группа: Пользователи
Сообщений: 36
Спасибо сказали: 0 раз
Рейтинг: 0

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

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

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

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

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

sava1 Подменю пользователя
сообщение 26.06.15, 11:23
Сообщение #11

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2684
Из: Проскуров
Спасибо сказали: 678 раз
Рейтинг: 656.7

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

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

cocon2003 Подменю пользователя
сообщение 26.06.15, 11:33
Сообщение #12

Общительный
**
Группа: Пользователи
Сообщений: 36
Спасибо сказали: 0 раз
Рейтинг: 0

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


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

cocon2003 Подменю пользователя
сообщение 26.06.15, 16:25
Сообщение #13

Общительный
**
Группа: Пользователи
Сообщений: 36
Спасибо сказали: 0 раз
Рейтинг: 0

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

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

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

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


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

 

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