Задача на запросы

Внимание! Тема закрыта. Добавлять сообщения в закрытую тему запрещено.
1. dimbasbear 14 19.02.15 16:27 Сейчас в теме
Вводная:
=========
Есть справочник СхемаСкидок, у него есть табличная часть ТоварыДействия (с реквизитом Номенклатура - могут быть как группы так и элементы).

Пример:
========

СхемаСкидок1
Товар1 (элемент)
Товар2 (элемент)
Товар3 (ГРУППА) - внутри куча подгрупп и элементов

СхемаСкидок2
Товар4 (элемент)
Товар5 (ГРУППА) - внутри куча подгрупп и элементов
Товар6 (элемент)

Задача:
========

Как запросом получить таблицу вида:

СхемаСкидок1 Товар1 (элемент)
СхемаСкидок1 Товар2 (элемент)
СхемаСкидок1 Товар3.1 (элемент)
СхемаСкидок1 Товар3.2 (элемент)
СхемаСкидок1 Товар3.3 (элемент)

СхемаСкидок2 Товар4 (элемент)
СхемаСкидок2 Товар5.1 (элемент)
СхемаСкидок2 Товар5.2 (элемент)
СхемаСкидок2 Товар5.3 (элемент)
СхемаСкидок2 Товар6 (элемент)




То есть , таблица должна содержать скидки и принадлежащие ей товары (только элементы)

PS
========
Сделать нужно все одним запросом.
Вариант "соединения по Родитель.Родитель.Родитель" - не подходит.
Вариант "сделать сначала запрос по скидкам, потом в цикле в обходе получать товары" - не подходит.

Вся проблема в том, что 1с не поддерживает "В ИЕРАРХИИ" в конструкциях соединения :)
+
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
5. ildarovich 7861 19.02.15 21:40 Сейчас в теме
Вот запрос, решающий данную задачу
ВЫБРАТЬ
	Номенклатура.Родитель КАК НачалоДуги,
	Номенклатура.Ссылка КАК КонецДуги
ПОМЕСТИТЬ ЗамыканияДлины1
ИЗ
	Справочник.Номенклатура КАК Номенклатура
ГДЕ
	Номенклатура.Родитель <> ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	Номенклатура.Ссылка,
	Номенклатура.Ссылка
ИЗ
	Справочник.Номенклатура КАК Номенклатура
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
	ПерваяДуга.НачалоДуги,
	ВтораяДуга.КонецДуги
ПОМЕСТИТЬ ЗамыканияДлины2
ИЗ
	ЗамыканияДлины1 КАК ПерваяДуга
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗамыканияДлины1 КАК ВтораяДуга
		ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
	ПерваяДуга.НачалоДуги,
	ВтораяДуга.КонецДуги
ПОМЕСТИТЬ ЗамыканияДлины4
ИЗ
	ЗамыканияДлины2 КАК ПерваяДуга
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗамыканияДлины2 КАК ВтораяДуга
		ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
	ПерваяДуга.НачалоДуги,
	ВтораяДуга.КонецДуги
ПОМЕСТИТЬ ЗамыканияДлины8
ИЗ
	ЗамыканияДлины4 КАК ПерваяДуга
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗамыканияДлины4 КАК ВтораяДуга
		ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
	ПерваяДуга.НачалоДуги,
	ВтораяДуга.КонецДуги
ПОМЕСТИТЬ ЗамыканияДлины16
ИЗ
	ЗамыканияДлины8 КАК ПерваяДуга
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗамыканияДлины8 КАК ВтораяДуга
		ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
	ПерваяДуга.НачалоДуги,
	ВтораяДуга.КонецДуги
ПОМЕСТИТЬ ЗамыканияДлины32
ИЗ
	ЗамыканияДлины16 КАК ПерваяДуга
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗамыканияДлины16 КАК ВтораяДуга
		ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	СхемаСкидокТоварыДействия.Ссылка КАК СхемаСкидок,
	ЗамыканияДлины32.КонецДуги КАК Товар
ИЗ
	Справочник.СхемаСкидок.ТоварыДействия КАК СхемаСкидокТоварыДействия
		ЛЕВОЕ СОЕДИНЕНИЕ ЗамыканияДлины32 КАК ЗамыканияДлины32
		ПО СхемаСкидокТоварыДействия.Товар = ЗамыканияДлины32.НачалоДуги
ГДЕ
	НЕ ЗамыканияДлины32.КонецДуги.ЭтоГруппа
Показать

Запрос построен по материалам статьи Транзитивное замыкаие запросом. Ограничением является максимальная глубина иерархии номенклатуры 32. Если нужно больше, в запрос добавляется секция вида
ВЫБРАТЬ РАЗЛИЧНЫЕ
	ПерваяДуга.НачалоДуги,
	ВтораяДуга.КонецДуги
ПОМЕСТИТЬ ЗамыканияДлины64
ИЗ
	ЗамыканияДлины32 КАК ПерваяДуга
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗамыканияДлины32 КАК ВтораяДуга
		ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги
Прикрепленные файлы:
unichkin; dimbasbear; НовенькийЯ; dj_serega; +4
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. dimbasbear 14 19.02.15 16:31 Сейчас в теме
Предоставившему рабочее решение (ПОЛНОСТЬЮ С ПОМОЩЬЮ ЗАПРОСА) - переведу 50 стартмани
+
3. tarassov 112 19.02.15 18:00 Сейчас в теме
Интересная задачка ...
+
4. Bienko 212 19.02.15 18:03 Сейчас в теме
Так вроде не сложно... Через временные таблицы Первую таблицу делаешь с условием , что это не группа и помещаешь во временную таблицу (это для тч схем). Второй запрос делаешь тоже по условию (это для номенклатуры), что это не группа и добавляешь еще одно условие в иерархии (где вложенный запрос по тч схем по условию группы и в иерархии ). Все это объединяешь. Была бы база, - сделал готовый запрос. А то я привык конструктором больше...
+
5. ildarovich 7861 19.02.15 21:40 Сейчас в теме
Вот запрос, решающий данную задачу
ВЫБРАТЬ
	Номенклатура.Родитель КАК НачалоДуги,
	Номенклатура.Ссылка КАК КонецДуги
ПОМЕСТИТЬ ЗамыканияДлины1
ИЗ
	Справочник.Номенклатура КАК Номенклатура
ГДЕ
	Номенклатура.Родитель <> ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	Номенклатура.Ссылка,
	Номенклатура.Ссылка
ИЗ
	Справочник.Номенклатура КАК Номенклатура
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
	ПерваяДуга.НачалоДуги,
	ВтораяДуга.КонецДуги
ПОМЕСТИТЬ ЗамыканияДлины2
ИЗ
	ЗамыканияДлины1 КАК ПерваяДуга
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗамыканияДлины1 КАК ВтораяДуга
		ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
	ПерваяДуга.НачалоДуги,
	ВтораяДуга.КонецДуги
ПОМЕСТИТЬ ЗамыканияДлины4
ИЗ
	ЗамыканияДлины2 КАК ПерваяДуга
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗамыканияДлины2 КАК ВтораяДуга
		ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
	ПерваяДуга.НачалоДуги,
	ВтораяДуга.КонецДуги
ПОМЕСТИТЬ ЗамыканияДлины8
ИЗ
	ЗамыканияДлины4 КАК ПерваяДуга
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗамыканияДлины4 КАК ВтораяДуга
		ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
	ПерваяДуга.НачалоДуги,
	ВтораяДуга.КонецДуги
ПОМЕСТИТЬ ЗамыканияДлины16
ИЗ
	ЗамыканияДлины8 КАК ПерваяДуга
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗамыканияДлины8 КАК ВтораяДуга
		ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
	ПерваяДуга.НачалоДуги,
	ВтораяДуга.КонецДуги
ПОМЕСТИТЬ ЗамыканияДлины32
ИЗ
	ЗамыканияДлины16 КАК ПерваяДуга
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗамыканияДлины16 КАК ВтораяДуга
		ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	СхемаСкидокТоварыДействия.Ссылка КАК СхемаСкидок,
	ЗамыканияДлины32.КонецДуги КАК Товар
ИЗ
	Справочник.СхемаСкидок.ТоварыДействия КАК СхемаСкидокТоварыДействия
		ЛЕВОЕ СОЕДИНЕНИЕ ЗамыканияДлины32 КАК ЗамыканияДлины32
		ПО СхемаСкидокТоварыДействия.Товар = ЗамыканияДлины32.НачалоДуги
ГДЕ
	НЕ ЗамыканияДлины32.КонецДуги.ЭтоГруппа
Показать

Запрос построен по материалам статьи Транзитивное замыкаие запросом. Ограничением является максимальная глубина иерархии номенклатуры 32. Если нужно больше, в запрос добавляется секция вида
ВЫБРАТЬ РАЗЛИЧНЫЕ
	ПерваяДуга.НачалоДуги,
	ВтораяДуга.КонецДуги
ПОМЕСТИТЬ ЗамыканияДлины64
ИЗ
	ЗамыканияДлины32 КАК ПерваяДуга
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗамыканияДлины32 КАК ВтораяДуга
		ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги
Прикрепленные файлы:
unichkin; dimbasbear; НовенькийЯ; dj_serega; +4
6. dimbasbear 14 20.02.15 08:28 Сейчас в теме
С(5) ildarovich, Спасибо. Ваш ответ лучший и рабочий (проверил).

Как мне вам перевести стартмани, при переводе пишет "В связи с участившимися случаями мошенничества, переводы временно отключены" ????
+
7. Xershi 1484 20.02.15 08:48 Сейчас в теме
(6) dimbasbear, мне переводили с помощью скачивания моих обработок н-раз=))
+
8. dimbasbear 14 20.02.15 08:51 Сейчас в теме
50 раз придется качать )))
+
9. dimbasbear 14 20.02.15 08:54 Сейчас в теме
разобрался, перевел :)
ildarovich; +1
Внимание! Тема сдана в архив

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