Прошу помощи с запросом

1. user625454_storm_00 24.05.23 12:46 Сейчас в теме
Здравствуйте.
есть такой запрос
ВЫБРАТЬ
	Продажи.Номенклатура КАК Номенклатура,
	Продажи.Продавец КАК Продавец,
	Продажи.Количество КАК Количество,
	Продажи.Стоимость КАК Стоимость,
	TDR_УстановкаЦенГруппТоваровСрезПоследних.Сумма КАК Сумма
ИЗ
	РегистрНакопления.Продажи КАК Продажи
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.TDR_УстановкаЦенГруппТоваров.СрезПоследних(&КонПер, ) КАК TDR_УстановкаЦенГруппТоваровСрезПоследних
		ПО (ВЫБОР
				КОГДА Продажи.Номенклатура.Родитель = TDR_УстановкаЦенГруппТоваровСрезПоследних.ВидНоменклатуры
					ТОГДА Продажи.Номенклатура.Родитель = TDR_УстановкаЦенГруппТоваровСрезПоследних.ВидНоменклатуры
				ИНАЧЕ ВЫБОР
						КОГДА Продажи.Номенклатура.Родитель.Родитель = TDR_УстановкаЦенГруппТоваровСрезПоследних.ВидНоменклатуры
							ТОГДА Продажи.Номенклатура.Родитель.Родитель = TDR_УстановкаЦенГруппТоваровСрезПоследних.ВидНоменклатуры
						ИНАЧЕ ВЫБОР
								КОГДА Продажи.Номенклатура.Родитель.Родитель.Родитель = TDR_УстановкаЦенГруппТоваровСрезПоследних.ВидНоменклатуры
									ТОГДА Продажи.Номенклатура.Родитель.Родитель.Родитель = TDR_УстановкаЦенГруппТоваровСрезПоследних.ВидНоменклатуры
								ИНАЧЕ ВЫБОР
										КОГДА Продажи.Номенклатура.Родитель.Родитель.Родитель.Родитель = TDR_УстановкаЦенГруппТоваровСрезПоследних.ВидНоменклатуры
											ТОГДА Продажи.Номенклатура.Родитель.Родитель.Родитель.Родитель = TDR_УстановкаЦенГруппТоваровСрезПоследних.ВидНоменклатуры
										ИНАЧЕ ВЫБОР
												КОГДА Продажи.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель = TDR_УстановкаЦенГруппТоваровСрезПоследних.ВидНоменклатуры
													ТОГДА Продажи.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель = TDR_УстановкаЦенГруппТоваровСрезПоследних.ВидНоменклатуры
												ИНАЧЕ ВЫБОР
														КОГДА Продажи.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = TDR_УстановкаЦенГруппТоваровСрезПоследних.ВидНоменклатуры
															ТОГДА Продажи.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = TDR_УстановкаЦенГруппТоваровСрезПоследних.ВидНоменклатуры
														ИНАЧЕ ВЫБОР
																КОГДА Продажи.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = TDR_УстановкаЦенГруппТоваровСрезПоследних.ВидНоменклатуры
																	ТОГДА Продажи.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = TDR_УстановкаЦенГруппТоваровСрезПоследних.ВидНоменклатуры
															КОНЕЦ
													КОНЕЦ
											КОНЕЦ
									КОНЕЦ
							КОНЕЦ
					КОНЕЦ
			КОНЕЦ)
ГДЕ
	Продажи.Период МЕЖДУ &НачПер И &КонПер
Показать


необходимо соединить регистры, по родителю, но проблема в том, что если номенклатура лежит глубоко в иерархии и в регистре указано несколько родителей по пути к номенклатуре, то в запросе выводятся несколько строк, хотя в условии связи сказано, что если выполняется условие первого порядка, то все ок и дальше соеденять не нужно, но почему то соеденяет по всем условиям
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
5. spacecraft 24.05.23 13:51 Сейчас в теме
(1) в соединении так не сделать.
Как вариант, добавить еще одно числовое поле, в котором вычислять уровень вложенности. Из условий соединений убрать Выбор и соединять просто по первому условию.
Этот запрос поместить во временную таблицу и выбирать по Максимум (или Минимум в зависимости от необходимости) вычисленного поля.
6. Said-We 24.05.23 15:03 Сейчас в теме
(1)
Здравствуйте.
есть такой запрос
И вам не хворать. Не важно какой запрос есть, им же не получилось реализовать - а что хотели реализовать-то?
На сколько я понял, то нужна некая цена по приоритету. Обычно имеет смысл приоритет по ближайшему родителю.
Варианта реализации минимум два. Через вертикальное и поиск первого подходящего и через горизонтальную развертку, но одним соединением. По сути это одно и то же - реализация не на много отличается.
В первом случае обычная нумерация и взять первый подходящий. Как это сделать читать в (5).
В втором случае у вас разные колонки, по сути та же нумерация, но вид сбоку.
7. schweigen 26.05.23 10:27 Сейчас в теме
(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) КАК Сумма
ИЗ
	втПродажи КАК втПродажи
		ЛЕВОЕ СОЕДИНЕНИЕ втЦеныНоменклатуры КАК втЦеныНоменклатуры
		ПО втПродажи.Номенклатура = втЦеныНоменклатуры.Номенклатура
Показать
2. soft_wind 24.05.23 13:03 Сейчас в теме
попробуйте такое соединение
ИЗ
    РегистрНакопления.Продажи КАК Продажи
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.TDR_УстановкаЦенГруппТоваров.СрезПоследних(&КонПер, ) КАК TDR_УстановкаЦенГруппТоваровСрезПоследних
		по TDR_УстановкаЦенГруппТоваровСрезПоследних.ВидНоменклатуры в (
			Продажи.Номенклатура.Родитель,
			Продажи.Номенклатура.Родитель.Родитель,
			Продажи.Номенклатура.Родитель.Родитель.Родитель,
			Продажи.Номенклатура.Родитель.Родитель.Родитель.Родитель,
			Продажи.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель,
			Продажи.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель,
			Продажи.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель )
			
Показать
3. user625454_storm_00 24.05.23 13:09 Сейчас в теме
не помогло, тоже самое получается
Необходимо чтобы если выполняется соединение с родителем первого порядка, то дальше не соединять, иначе соединить с родителем второго порядка, и.т.д. вплоть до 7 уровня иерархии
4. user625454_storm_00 24.05.23 13:42 Сейчас в теме
я наконец понял что вставляю в условие соединения булево, т.е. либо ложь либо истина, судя по всему нужно, что бы тут
ТОГДА "Продажи.Номенклатура.Родитель = TDR_УстановкаЦенГруппТоваровСрезПоследних.ВидНоменклатуры"

была строка, но как сделать не допетрю, а так как написано не работает выдает ошибку "Операция не разрешена в предложении <<?>>ВЫБОР"
8. odn 29.05.23 16:01 Сейчас в теме
(4) Так не работает?

ПО (Продажи.Номенклатура.Родитель = TDR_УстановкаЦенГруппТоваровСрезПоследних.ВидНоменклатуры ИЛИ Продажи.Номенклатура.Родитель.Родитель = TDR_УстановкаЦенГруппТоваровСрезПоследних.ВидНоменклатуры)
9. mkalimulin 1166 29.05.23 18:20 Сейчас в теме
1. Надо проставить уровни иерархии.
2. Сгруппировать и получить минимум уровня для каждой номенклатуры.
3. И вот только теперь соединять
10. Said-We 30.05.23 11:56 Сейчас в теме
(9) Неа...
Минимум уровня не получишь, пока с ценой не соединишь. Так как не для всех групп могут быть установлены цены.
Что бы, сколько там уровней - 7, что бы 7 раз не соединять цены, а соединять только один раз, то построить надо вертикальную таблицу:
Номенклатура, уровень, родитель.
Были бы в 1С рекурсивные запросы, то делается это в пять строк. А так придется несколько раз объединять, и переписывать если появится 8-й уровень.
И уже к этой таблице "Номенклатура, уровень, родитель" цеплять цены по родителю.
Потом уже определяем уровень ближайшего родителя, где установлена цена. И собственно саму цену.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот