Имеется два источника данных. 1й- вложенный запрос, 2й- РегистрСведений.ЦеныНоменклатурыСрезПоследних.
на вход передается список контрагентов, дата, наименование производителя(Доп.свойство справочника Номенклатура). В случае если во вложенном запросе есть цена по данному контрагенту, берем из вложенного запроса, если нету, берем из 2го источника. На выходе нужно получить дерево, где группировки: контрагент, затем иерархия номенклатур.
Пробовала писать так:
ошибка в том, что если задать одного контрагента, то дерево разобьется на две группировки: МойКонтрагент и пусто, а нужно чтобы все было под одним контрагентом.
на вход передается список контрагентов, дата, наименование производителя(Доп.свойство справочника Номенклатура). В случае если во вложенном запросе есть цена по данному контрагенту, берем из вложенного запроса, если нету, берем из 2го источника. На выходе нужно получить дерево, где группировки: контрагент, затем иерархия номенклатур.
Пробовала писать так:
ВЫБРАТЬ
| ЗначенияСвойствОбъектов.Значение КАК Производитель,
| ВложенныйЗапрос.Валюта,
| ВложенныйЗапрос.Контрагент КАК Контрагент,
| ВложенныйЗапрос.Номенклатура КАК Номенклатура,
| ВложенныйЗапрос.НоменклатураАртикул,
| ЗначенияСвойствОбъектов.Значение,
| ВЫБОР
| КОГДА ВложенныйЗапрос.Цена ЕСТЬ NULL
| ТОГДА ЦеныНоменклатурыСрезПоследних.Цена
| ИНАЧЕ ВложенныйЗапрос.Цена
| КОНЕЦ КАК Цена
|ИЗ
| РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
| ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
| ЦеныНоменклатурыСрезПоследних.Цена КАК Цена,
| ЦеныНоменклатурыСрезПоследних.Валюта КАК Валюта,
| ЦеныНоменклатурыСрезПоследних.ТипЦен КАК ТипЦен,
| ТипыЦенПоГруппамНоменклатурыДляПокупателейСрезПоследних.Контрагент КАК Контрагент,
| ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
| ЦеныНоменклатурыСрезПоследних.Номенклатура.Артикул КАК НоменклатураАртикул
| ИЗ
| РегистрСведений.ТипыЦенПоГруппамНоменклатурыДляПокупателей.СрезПоследних(&Дата, Контрагент В ИЕРАРХИИ (&Контрагент)) КАК ТипыЦенПоГруппамНоменклатурыДляПокупателейСрезПоследних
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ) КАК ЦеныНоменклатурыСрезПоследних
| ПО ТипыЦенПоГруппамНоменклатурыДляПокупателейСрезПоследних.ТипЦен = ЦеныНоменклатурыСрезПоследних.ТипЦен
| И ТипыЦенПоГруппамНоменклатурыДляПокупателейСрезПоследних.НоменклатурнаяЦеноваяГруппа.Ссылка = ЦеныНоменклатурыСрезПоследних.Номенклатура.ЦеноваяГруппа.Ссылка) КАК ВложенныйЗапрос
| ПО ВложенныйЗапрос.Номенклатура.Ссылка = ЗначенияСвойствОбъектов.Объект.Ссылка
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ТипЦен = &ТипЦен) КАК ЦеныНоменклатурыСрезПоследних
| ПО ЦеныНоменклатурыСрезПоследних.Номенклатура = ЗначенияСвойствОбъектов.Объект
|ГДЕ
| ЗначенияСвойствОбъектов.Свойство = &Свойство
| И ЗначенияСвойствОбъектов.Значение В(&Значение)
|
|УПОРЯДОЧИТЬ ПО
| Контрагент
|ИТОГИ ПО
| Контрагент,
| Номенклатура ТОЛЬКО ИЕРАРХИЯ
Показатьошибка в том, что если задать одного контрагента, то дерево разобьется на две группировки: МойКонтрагент и пусто, а нужно чтобы все было под одним контрагентом.
По теме из базы знаний
- Консоль запросов со встроенным Конструктором запросов для 1с8.3 (8.2) своими руками
- Смотрим запросы 1С через Microsoft SQL Profiler по следам ошибок разработчиков, приводящих к проблемам производительности
- Экспертный взгляд на оптимизацию производительности на примере исправления и декомпозиции запроса
- MS SQL Server: изучаем планы запросов
- Начните уже использовать хранилище запросов
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(2) Xershi, я пользуюсь, и вижу что получается (а получается не то, что нужно), но не могу придумать что сделать чтобы было так как мне нужно. Повторюсь: нужно выгружать цены по всей номенклатуре в некотором фиксированном типе цен (ОПТ) если нет записи в регистре ТипыЦенПоГруппамНоменклатурыДляПокупателейСрезПоследних, если запись есть, нужно выгружать из этого регистра.
Пример:
регистр ЦеныНоменклатуры.СрезПоследних:
Некоторый вложенный запрос (регистр ТипыЦенПоГруппамНоменклатурыДляПокупателейСрезПоследних ОБЪЕДИНЕНИЕ ЦеныНоменклатурыСрезПоследних):
В итоге должно получиться(с группировками по контрагенту и номенклатуре):
Иванов
Строительное оборудование
Собственное
Каска 30 руб
Крепеж ж1 190 руб
арендованное
Вал 80 руб
На продажу
Тиски 1500 руб
Петров
Строительное оборудование
Собственное
Каска 100 руб
Крепеж ж1 150 руб
арендованное
Вал 170 руб
На продажу
Тиски 1500 руб
Пример:
регистр ЦеныНоменклатуры.СрезПоследних:
- ТипЦен Номенклатура цена валюта
[LIST]1. ОПТ Вал 100 руб
- 2. МИН вал 50 руб
- 3. Розн Тиски 2000 руб
- 4. ОПТ Тиски 1500 руб
- 5. Розн Крепеж ж1 200 руб
- 6. ОПТ Крепеж ж1 190 руб
- 7. ОПТ каска 100 руб
Некоторый вложенный запрос (регистр ТипыЦенПоГруппамНоменклатурыДляПокупателейСрезПоследних ОБЪЕДИНЕНИЕ ЦеныНоменклатурыСрезПоследних):
- Контрагент Номенклатура Цена Валюта
- 1. Иванов Вал 80 руб
- 2. Иванов каска 30 руб
- 3. Петров Крепеж ж1 150 руб
- 4. Петров Вал 170 руб
В итоге должно получиться(с группировками по контрагенту и номенклатуре):
Иванов
Строительное оборудование
Собственное
Каска 30 руб
Крепеж ж1 190 руб
арендованное
Вал 80 руб
На продажу
Тиски 1500 руб
Петров
Строительное оборудование
Собственное
Каска 100 руб
Крепеж ж1 150 руб
арендованное
Вал 170 руб
На продажу
Тиски 1500 руб
да уж, помогли...(6) Xershi, конечно что-то значит! Явно не ошибка - это значит, что произошло 2 группировки - на контрагента с именем Мойконтрагент и с именем "Пусто". А мне нужно чтоб было все у моего контрагента.
(5) deevil, да можно и скд, конечно! Но я в принципе не понимаю как решить мой вопрос, хоть в скд, хоть в запросе. прошу теоретического ответа.
(5) deevil, да можно и скд, конечно! Но я в принципе не понимаю как решить мой вопрос, хоть в скд, хоть в запросе. прошу теоретического ответа.
(7) EvaMendes, у вас сложный запрос опыта такого рода нету, чтобы сказать как правильно, все методом тыка. Если нету мыслей попробуйте нарисовать таблицы исходных данных и затем как они в процессе должны модифицироваться возможно это будет ключем к решению.
Желательно в картинках))
Желательно в картинках))
(1) EvaMendes, в конструкторе запросов внизу-слева есть кнопка запрос, появляется окошко из которого можно запрос скопировать без этих прикольных вертикальных палочек, и туда-же можно загнать запрос без этих символов если включить редактирование запроса...
И ооочень полезный совет, если не хочешь со временем зашиться с логикой запросов, разберись с временными таблицами и размещением нескольких запросов в одном пакете. Когда запрос разбит на отдельные логические части его легче и читать и составлять.
Насколько я понимаю вместо вот этого:
Лучше написать
Кстати вместо вашего исходного
тоже лучше написать
И ооочень полезный совет, если не хочешь со временем зашиться с логикой запросов, разберись с временными таблицами и размещением нескольких запросов в одном пакете. Когда запрос разбит на отдельные логические части его легче и читать и составлять.
Насколько я понимаю вместо вот этого:
ВЫБОР
КОГДА ВложенныйЗапрос.контрагент ЕСТЬ NULL
ТОГДА ТипыЦенПоГруппамНоменклатурыДляПокупателейСрезПоследних.Контрагент
ИНАЧЕ ВложенныйЗапрос.контрагент
КОНЕЦ КАК Контрагент
Лучше написать
ЕстьNULL(ВложенныйЗапрос.контрагент,ТипыЦенПоГруппамНоменклатурыДляПокупателейСрезПоследних.Контрагент) КАК Контрагент
Кстати вместо вашего исходного
ВЫБОР
КОГДА ВложенныйЗапрос.Цена ЕСТЬ NULL
ТОГДА ЦеныНоменклатурыСрезПоследних.Цена
ИНАЧЕ ВложенныйЗапрос.Цена
КОНЕЦ КАК Цена
тоже лучше написать
ЕстьNULL(ВложенныйЗапрос.Цена,ЦеныНоменклатурыСрезПоследних.Цена) КАК Цена
И кстати если вы уж соединяете по ВложенныйЗапрос.Номенклатура.Ссылка = ЗначенияСвойствОбъектов.Объект.Ссылка то лучше не
ВложенныйЗапрос.Номенклатура КАК Номенклатура
а
ЗначенияСвойствОбъектов.Объект КАК Номенклатура
ВложенныйЗапрос.Номенклатура КАК Номенклатура
а
ЗначенияСвойствОбъектов.Объект КАК Номенклатура
Есть несколько вариаций решения. Для выбора необходимо определиться для чего используется связка контрагент-Номенклатура, ведь не каждому контрагенту мы устанавливаем цену на всю номенклатуру(хотя возможен и такой вариант). Правильно построив фразу получаем половину ответа:1) Надо получить установленные для контрагентов цену по типу цены(Либо выбираем либо нет, см ниже пояснение.) для всех номенклатур выбранного производителя. Тогда запрос выглядит так :
2) Надо получить Все установленные цены по типам цен (Либо выбираем либо нет) для всех номенклатур выбранного производителя с разбивкой Группировкой по Контрагентам для которых установлены соответствия ТипЦены-Ценоваягруппа(есть актуальный документ УстановкаТиповЦенПоГруппамНоменклатурыДляПокупателей) Тогда запрос выглядит так :
Обещанное пояснение: В основном запросе вы использовали ограничение при выборе Цены номенклатуры (2ой источник) по переданному Типу Цен, тогда и во Вложенном подзапросе его необходимо учитывать (это можно сделать внутри или уже при самом соединении), привильнее конечно внутри подзапроса, но я указал именно в соединении потому как по условию так понял что Вложенный подзапрос может меняться, либо это будет передано виртуальной таблицей. вообщем как-то так.
ВЫБРАТЬ
ЗначенияСвойствОбъектов.Значение КАК Производитель,
ЕСТЬNULL(ВложенныйЗапрос.Валюта, ЦеныНоменклатурыСрезПоследних.Валюта) КАК Валюта,
ВложенныйЗапрос.Контрагент КАК Контрагент,
ЕСТЬNULL(ВложенныйЗапрос.Номенклатура, ЗначенияСвойствОбъектов.Объект) КАК Номенклатура,
ЕСТЬNULL(ВложенныйЗапрос.НоменклатураАртикул, ЦеныНоменклатурыСрезПоследних.Номенклатура.Артикул) КАК Артикул,
ЕСТЬNULL(ВложенныйЗапрос.Цена, ЦеныНоменклатурыСрезПоследних.Цена) КАК Цена
ИЗ
РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
ЦеныНоменклатурыСрезПоследних.Цена КАК Цена,
ЦеныНоменклатурыСрезПоследних.Валюта КАК Валюта,
ЦеныНоменклатурыСрезПоследних.ТипЦен КАК ТипЦен,
ТипыЦенПоГруппамНоменклатурыДляПокупателейСрезПоследних.Контрагент КАК Контрагент,
ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
ЦеныНоменклатурыСрезПоследних.Номенклатура.Артикул КАК НоменклатураАртикул
ИЗ
РегистрСведений.ТипыЦенПоГруппамНоменклатурыДляПокупателей.СрезПоследних(&Дата, Контрагент В ИЕРАРХИИ (&Контрагент)) КАК ТипыЦенПоГруппамНоменклатурыДляПокупателейСрезПоследних
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ) КАК ЦеныНоменклатурыСрезПоследних
ПО ТипыЦенПоГруппамНоменклатурыДляПокупателейСрезПоследних.ТипЦен = ЦеныНоменклатурыСрезПоследних.ТипЦен
И ТипыЦенПоГруппамНоменклатурыДляПокупателейСрезПоследних.НоменклатурнаяЦеноваяГруппа.Ссылка = ЦеныНоменклатурыСрезПоследних.Номенклатура.ЦеноваяГруппа.Ссылка) КАК ВложенныйЗапрос
ПО ЗначенияСвойствОбъектов.Объект = ВложенныйЗапрос.Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ТипЦен = &ТипЦен) КАК ЦеныНоменклатурыСрезПоследних
ПО ЗначенияСвойствОбъектов.Объект = ЦеныНоменклатурыСрезПоследних.Номенклатура
ГДЕ
ЗначенияСвойствОбъектов.Свойство = &Свойство
И ЗначенияСвойствОбъектов.Значение В(&Значение)
И НЕ ВложенныйЗапрос.Контрагент есть NULL
СГРУППИРОВАТЬ ПО
ЕСТЬNULL(ВложенныйЗапрос.НоменклатураАртикул, ЦеныНоменклатурыСрезПоследних.Номенклатура.Артикул),
ЗначенияСвойствОбъектов.Значение,
ВложенныйЗапрос.Контрагент,
ЕСТЬNULL(ВложенныйЗапрос.Валюта, ЦеныНоменклатурыСрезПоследних.Валюта),
ЕСТЬNULL(ВложенныйЗапрос.Номенклатура, ЗначенияСвойствОбъектов.Объект),
ЕСТЬNULL(ВложенныйЗапрос.Цена, ЦеныНоменклатурыСрезПоследних.Цена)
ИМЕЮЩИЕ
НЕ ВложенныйЗапрос.Контрагент ЕСТЬ NULL
ИТОГИ ПО
Контрагент,
Номенклатура ТОЛЬКО ИЕРАРХИЯ
Показать2) Надо получить Все установленные цены по типам цен (Либо выбираем либо нет) для всех номенклатур выбранного производителя с разбивкой Группировкой по Контрагентам для которых установлены соответствия ТипЦены-Ценоваягруппа(есть актуальный документ УстановкаТиповЦенПоГруппамНоменклатурыДляПокупателей) Тогда запрос выглядит так :
ВЫБРАТЬ
ЕСТЬNULL(ВложенныйЗапрос.Контрагент, "Нет ни одного контрагенту у которого установлена связь(ценовая группа - Тип цены) для : " + ЗначенияСвойствОбъектов.Объект.ЦеноваяГруппа.Наименование + "-" + ЦеныНоменклатурыСрезПоследних.ТипЦен.Наименование) КАК Контрагент,
ЗначенияСвойствОбъектов.Значение КАК Производитель,
ЕСТЬNULL(ВложенныйЗапрос.Валюта, ЦеныНоменклатурыСрезПоследних.Валюта) КАК Валюта,
ЕСТЬNULL(ВложенныйЗапрос.Номенклатура, ЗначенияСвойствОбъектов.Объект) КАК Номенклатура,
ЕСТЬNULL(ВложенныйЗапрос.НоменклатураАртикул, ЦеныНоменклатурыСрезПоследних.Номенклатура.Артикул) КАК Артикул,
ЕСТЬNULL(ВложенныйЗапрос.ТипЦен, ЦеныНоменклатурыСрезПоследних.ТипЦен) КАК ТипЦены,
ЕСТЬNULL(ВложенныйЗапрос.Цена, ЦеныНоменклатурыСрезПоследних.Цена) КАК Цена
ИЗ
РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
ЦеныНоменклатурыСрезПоследних.Цена КАК Цена,
ЦеныНоменклатурыСрезПоследних.Валюта КАК Валюта,
ЦеныНоменклатурыСрезПоследних.ТипЦен КАК ТипЦен,
ТипыЦенПоГруппамНоменклатурыДляПокупателейСрезПоследних.Контрагент КАК Контрагент,
ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
ЦеныНоменклатурыСрезПоследних.Номенклатура.Артикул КАК НоменклатураАртикул
ИЗ
РегистрСведений.ТипыЦенПоГруппамНоменклатурыДляПокупателей.СрезПоследних(&Дата, ) КАК ТипыЦенПоГруппамНоменклатурыДляПокупателейСрезПоследних
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ) КАК ЦеныНоменклатурыСрезПоследних
ПО ТипыЦенПоГруппамНоменклатурыДляПокупателейСрезПоследних.ТипЦен = ЦеныНоменклатурыСрезПоследних.ТипЦен
И ТипыЦенПоГруппамНоменклатурыДляПокупателейСрезПоследних.НоменклатурнаяЦеноваяГруппа.Ссылка = ЦеныНоменклатурыСрезПоследних.Номенклатура.ЦеноваяГруппа.Ссылка
СГРУППИРОВАТЬ ПО
ТипыЦенПоГруппамНоменклатурыДляПокупателейСрезПоследних.Контрагент,
ЦеныНоменклатурыСрезПоследних.Валюта,
ЦеныНоменклатурыСрезПоследних.Номенклатура,
ЦеныНоменклатурыСрезПоследних.ТипЦен,
ЦеныНоменклатурыСрезПоследних.Цена,
ЦеныНоменклатурыСрезПоследних.Номенклатура.Артикул) КАК ВложенныйЗапрос
ПО ЗначенияСвойствОбъектов.Объект = ВложенныйЗапрос.Номенклатура
И (ВложенныйЗапрос.ТипЦен = &ТипЦен)
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ТипЦен = &ТипЦен) КАК ЦеныНоменклатурыСрезПоследних
ПО ЗначенияСвойствОбъектов.Объект = ЦеныНоменклатурыСрезПоследних.Номенклатура
ГДЕ
ЗначенияСвойствОбъектов.Свойство = &Свойство
И ЗначенияСвойствОбъектов.Значение В(&Значение)
СГРУППИРОВАТЬ ПО
ЕСТЬNULL(ВложенныйЗапрос.НоменклатураАртикул, ЦеныНоменклатурыСрезПоследних.Номенклатура.Артикул),
ЗначенияСвойствОбъектов.Значение,
ЕСТЬNULL(ВложенныйЗапрос.Валюта, ЦеныНоменклатурыСрезПоследних.Валюта),
ЕСТЬNULL(ВложенныйЗапрос.Номенклатура, ЗначенияСвойствОбъектов.Объект),
ЕСТЬNULL(ВложенныйЗапрос.Цена, ЦеныНоменклатурыСрезПоследних.Цена),
ЕСТЬNULL(ВложенныйЗапрос.ТипЦен, ЦеныНоменклатурыСрезПоследних.ТипЦен),
ЕСТЬNULL(ВложенныйЗапрос.Контрагент, "Нет ни одного контрагенту у которого установлена связь(ценовая группа - Тип цены) для : " + ЗначенияСвойствОбъектов.Объект.ЦеноваяГруппа.Наименование + "-" + ЦеныНоменклатурыСрезПоследних.ТипЦен.Наименование)
ИТОГИ ПО
Контрагент,
Номенклатура ТОЛЬКО ИЕРАРХИЯ
ПоказатьОбещанное пояснение: В основном запросе вы использовали ограничение при выборе Цены номенклатуры (2ой источник) по переданному Типу Цен, тогда и во Вложенном подзапросе его необходимо учитывать (это можно сделать внутри или уже при самом соединении), привильнее конечно внутри подзапроса, но я указал именно в соединении потому как по условию так понял что Вложенный подзапрос может меняться, либо это будет передано виртуальной таблицей. вообщем как-то так.
Да кстати, данный запрос можно оптимизировать по скорости, Использовав пакетные запросы мы 2 раза лезем к ценам номенклатуры, а табличка то не маленькая (можно ведь один раз получить эту табличку использовав её потом 2 раза, чем 2 раза получать таблицу), плюс предварительно сделать выборку по значениям свойств объектов и Измерение "Объект" выразить как Справочник номенклатуры, а Ресурс "Значение" выразить как справочник Контрагенты, при этом отсекутся таблицы при соединениях.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот