Здравствуйте.
есть такой запрос
необходимо соединить регистры, по родителю, но проблема в том, что если номенклатура лежит глубоко в иерархии и в регистре указано несколько родителей по пути к номенклатуре, то в запросе выводятся несколько строк, хотя в условии связи сказано, что если выполняется условие первого порядка, то все ок и дальше соеденять не нужно, но почему то соеденяет по всем условиям
есть такой запрос
ВЫБРАТЬ
Продажи.Номенклатура КАК Номенклатура,
Продажи.Продавец КАК Продавец,
Продажи.Количество КАК Количество,
Продажи.Стоимость КАК Стоимость,
TDR_УстановкаЦенГруппТоваровСрезПоследних.Сумма КАК Сумма
ИЗ
РегистрНакопления.Продажи КАК Продажи
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.TDR_УстановкаЦенГруппТоваров.СрезПоследних(&КонПер, ) КАК TDR_УстановкаЦенГруппТоваровСрезПоследних
ПО (ВЫБОР
КОГДА Продажи.Номенклатура.Родитель = TDR_УстановкаЦенГруппТоваровСрезПоследних.ВидНоменклатуры
ТОГДА Продажи.Номенклатура.Родитель = TDR_УстановкаЦенГруппТоваровСрезПоследних.ВидНоменклатуры
ИНАЧЕ ВЫБОР
КОГДА Продажи.Номенклатура.Родитель.Родитель = TDR_УстановкаЦенГруппТоваровСрезПоследних.ВидНоменклатуры
ТОГДА Продажи.Номенклатура.Родитель.Родитель = TDR_УстановкаЦенГруппТоваровСрезПоследних.ВидНоменклатуры
ИНАЧЕ ВЫБОР
КОГДА Продажи.Номенклатура.Родитель.Родитель.Родитель = TDR_УстановкаЦенГруппТоваровСрезПоследних.ВидНоменклатуры
ТОГДА Продажи.Номенклатура.Родитель.Родитель.Родитель = TDR_УстановкаЦенГруппТоваровСрезПоследних.ВидНоменклатуры
ИНАЧЕ ВЫБОР
КОГДА Продажи.Номенклатура.Родитель.Родитель.Родитель.Родитель = TDR_УстановкаЦенГруппТоваровСрезПоследних.ВидНоменклатуры
ТОГДА Продажи.Номенклатура.Родитель.Родитель.Родитель.Родитель = TDR_УстановкаЦенГруппТоваровСрезПоследних.ВидНоменклатуры
ИНАЧЕ ВЫБОР
КОГДА Продажи.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель = TDR_УстановкаЦенГруппТоваровСрезПоследних.ВидНоменклатуры
ТОГДА Продажи.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель = TDR_УстановкаЦенГруппТоваровСрезПоследних.ВидНоменклатуры
ИНАЧЕ ВЫБОР
КОГДА Продажи.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = TDR_УстановкаЦенГруппТоваровСрезПоследних.ВидНоменклатуры
ТОГДА Продажи.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = TDR_УстановкаЦенГруппТоваровСрезПоследних.ВидНоменклатуры
ИНАЧЕ ВЫБОР
КОГДА Продажи.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = TDR_УстановкаЦенГруппТоваровСрезПоследних.ВидНоменклатуры
ТОГДА Продажи.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = TDR_УстановкаЦенГруппТоваровСрезПоследних.ВидНоменклатуры
КОНЕЦ
КОНЕЦ
КОНЕЦ
КОНЕЦ
КОНЕЦ
КОНЕЦ
КОНЕЦ)
ГДЕ
Продажи.Период МЕЖДУ &НачПер И &КонПер
Показатьнеобходимо соединить регистры, по родителю, но проблема в том, что если номенклатура лежит глубоко в иерархии и в регистре указано несколько родителей по пути к номенклатуре, то в запросе выводятся несколько строк, хотя в условии связи сказано, что если выполняется условие первого порядка, то все ок и дальше соеденять не нужно, но почему то соеденяет по всем условиям
По теме из базы знаний
- Консоль запросов "Запросник" для управляемых форм с подсветкой синтаксиса
- Интеграция 1С с сайтом (магазином) WordPress (WooCommerce) с помощью Rest API сайта. Часть 2. Категории постов/страниц WordPress.
- Боремся с запросами в циклах. Мой опыт рефакторинга запросов
- Как читать чужой код? Часть 3. Разбор и доработка запросов
- Реализация отборов на форме с помощью СКД
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) в соединении так не сделать.
Как вариант, добавить еще одно числовое поле, в котором вычислять уровень вложенности. Из условий соединений убрать Выбор и соединять просто по первому условию.
Этот запрос поместить во временную таблицу и выбирать по Максимум (или Минимум в зависимости от необходимости) вычисленного поля.
Как вариант, добавить еще одно числовое поле, в котором вычислять уровень вложенности. Из условий соединений убрать Выбор и соединять просто по первому условию.
Этот запрос поместить во временную таблицу и выбирать по Максимум (или Минимум в зависимости от необходимости) вычисленного поля.
(1)
На сколько я понял, то нужна некая цена по приоритету. Обычно имеет смысл приоритет по ближайшему родителю.
Варианта реализации минимум два. Через вертикальное и поиск первого подходящего и через горизонтальную развертку, но одним соединением. По сути это одно и то же - реализация не на много отличается.
В первом случае обычная нумерация и взять первый подходящий. Как это сделать читать в (5).
В втором случае у вас разные колонки, по сути та же нумерация, но вид сбоку.
Здравствуйте.
есть такой запрос
И вам не хворать. Не важно какой запрос есть, им же не получилось реализовать - а что хотели реализовать-то?
есть такой запрос
На сколько я понял, то нужна некая цена по приоритету. Обычно имеет смысл приоритет по ближайшему родителю.
Варианта реализации минимум два. Через вертикальное и поиск первого подходящего и через горизонтальную развертку, но одним соединением. По сути это одно и то же - реализация не на много отличается.
В первом случае обычная нумерация и взять первый подходящий. Как это сделать читать в (5).
В втором случае у вас разные колонки, по сути та же нумерация, но вид сбоку.
(1) ну допустим
ВЫБРАТЬ
Продажи.Номенклатура КАК Номенклатура,
Продажи.Продавец КАК Продавец,
Продажи.Количество КАК Количество,
Продажи.Стоимость КАК Стоимость
ПОМЕСТИТЬ втПродажи
ИЗ
РегистрНакопления.Продажи КАК Продажи
ГДЕ
Продажи.Период МЕЖДУ &НачалоПериода И &КонецПериода
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
Цены.ВидНоменклатуры КАК ВидНоменклатуры,
Цены.Сумма КАК Сумма
ПОМЕСТИТЬ втЦены
ИЗ
РегистрСведений.TDR_УстановкаЦенГруппТоваров.СрезПоследних(&КонецПериода, ) КАК Цены
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
Номенклатура.Ссылка КАК Ссылка,
Номенклатура.Родитель КАК Родитель,
Номенклатура.ЭтоГруппа КАК ЭтоГруппа
ПОМЕСТИТЬ втЭлементы
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Ссылка В ИЕРАРХИИ
(ВЫБРАТЬ
Т.ВидНоменклатуры
ИЗ
втЦены КАК Т)
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
втЦены.Сумма КАК Сумма,
ВЫБОР
КОГДА НЕ втЭлементы1.ЭтоГруппа
ТОГДА втЭлементы1.Ссылка
КОГДА НЕ ЕСТЬNULL(втЭлементы2.ЭтоГруппа, ИСТИНА)
ТОГДА втЭлементы2.Ссылка
КОГДА НЕ ЕСТЬNULL(втЭлементы3.ЭтоГруппа, ИСТИНА)
ТОГДА втЭлементы3.Ссылка
КОГДА НЕ ЕСТЬNULL(втЭлементы4.ЭтоГруппа, ИСТИНА)
ТОГДА втЭлементы4.Ссылка
КОГДА НЕ ЕСТЬNULL(втЭлементы5.ЭтоГруппа, ИСТИНА)
ТОГДА втЭлементы5.Ссылка
КОГДА НЕ ЕСТЬNULL(втЭлементы6.ЭтоГруппа, ИСТИНА)
ТОГДА втЭлементы6.Ссылка
КОГДА НЕ ЕСТЬNULL(втЭлементы7.ЭтоГруппа, ИСТИНА)
ТОГДА втЭлементы7.Ссылка
ИНАЧЕ NULL
КОНЕЦ КАК Номенклатура
ПОМЕСТИТЬ втЦеныНоменклатуры
ИЗ
втЦены КАК втЦены
ВНУТРЕННЕЕ СОЕДИНЕНИЕ втЭлементы КАК втЭлементы1
ЛЕВОЕ СОЕДИНЕНИЕ втЭлементы КАК втЭлементы2
ЛЕВОЕ СОЕДИНЕНИЕ втЭлементы КАК втЭлементы3
ЛЕВОЕ СОЕДИНЕНИЕ втЭлементы КАК втЭлементы4
ЛЕВОЕ СОЕДИНЕНИЕ втЭлементы КАК втЭлементы5
ЛЕВОЕ СОЕДИНЕНИЕ втЭлементы КАК втЭлементы6
ЛЕВОЕ СОЕДИНЕНИЕ втЭлементы КАК втЭлементы7
ПО втЭлементы6.Ссылка = втЭлементы7.Родитель
ПО втЭлементы5.Ссылка = втЭлементы6.Родитель
ПО втЭлементы4.Ссылка = втЭлементы5.Родитель
ПО втЭлементы3.Ссылка = втЭлементы4.Родитель
ПО втЭлементы2.Ссылка = втЭлементы3.Родитель
ПО втЭлементы1.Ссылка = втЭлементы2.Родитель
ПО втЦены.ВидНоменклатуры = втЭлементы1.Родитель
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
втПродажи.Номенклатура КАК Номенклатура,
втПродажи.Продавец КАК Продавец,
втПродажи.Количество КАК Количество,
втПродажи.Стоимость КАК Стоимость,
ЕСТЬNULL(втЦеныНоменклатуры.Сумма, 0) КАК Сумма
ИЗ
втПродажи КАК втПродажи
ЛЕВОЕ СОЕДИНЕНИЕ втЦеныНоменклатуры КАК втЦеныНоменклатуры
ПО втПродажи.Номенклатура = втЦеныНоменклатуры.Номенклатура
Показать
попробуйте такое соединение
ИЗ
РегистрНакопления.Продажи КАК Продажи
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.TDR_УстановкаЦенГруппТоваров.СрезПоследних(&КонПер, ) КАК TDR_УстановкаЦенГруппТоваровСрезПоследних
по TDR_УстановкаЦенГруппТоваровСрезПоследних.ВидНоменклатуры в (
Продажи.Номенклатура.Родитель,
Продажи.Номенклатура.Родитель.Родитель,
Продажи.Номенклатура.Родитель.Родитель.Родитель,
Продажи.Номенклатура.Родитель.Родитель.Родитель.Родитель,
Продажи.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель,
Продажи.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель,
Продажи.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель )
Показать
не помогло, тоже самое получается
Необходимо чтобы если выполняется соединение с родителем первого порядка, то дальше не соединять, иначе соединить с родителем второго порядка, и.т.д. вплоть до 7 уровня иерархии
Необходимо чтобы если выполняется соединение с родителем первого порядка, то дальше не соединять, иначе соединить с родителем второго порядка, и.т.д. вплоть до 7 уровня иерархии
я наконец понял что вставляю в условие соединения булево, т.е. либо ложь либо истина, судя по всему нужно, что бы тут
была строка, но как сделать не допетрю, а так как написано не работает выдает ошибку "Операция не разрешена в предложении <<?>>ВЫБОР"
ТОГДА "Продажи.Номенклатура.Родитель = TDR_УстановкаЦенГруппТоваровСрезПоследних.ВидНоменклатуры"
была строка, но как сделать не допетрю, а так как написано не работает выдает ошибку "Операция не разрешена в предложении <<?>>ВЫБОР"
(9) Неа...
Минимум уровня не получишь, пока с ценой не соединишь. Так как не для всех групп могут быть установлены цены.
Что бы, сколько там уровней - 7, что бы 7 раз не соединять цены, а соединять только один раз, то построить надо вертикальную таблицу:
Номенклатура, уровень, родитель.
Были бы в 1С рекурсивные запросы, то делается это в пять строк. А так придется несколько раз объединять, и переписывать если появится 8-й уровень.
И уже к этой таблице "Номенклатура, уровень, родитель" цеплять цены по родителю.
Потом уже определяем уровень ближайшего родителя, где установлена цена. И собственно саму цену.
Минимум уровня не получишь, пока с ценой не соединишь. Так как не для всех групп могут быть установлены цены.
Что бы, сколько там уровней - 7, что бы 7 раз не соединять цены, а соединять только один раз, то построить надо вертикальную таблицу:
Номенклатура, уровень, родитель.
Были бы в 1С рекурсивные запросы, то делается это в пять строк. А так придется несколько раз объединять, и переписывать если появится 8-й уровень.
И уже к этой таблице "Номенклатура, уровень, родитель" цеплять цены по родителю.
Потом уже определяем уровень ближайшего родителя, где установлена цена. И собственно саму цену.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот