Вводная:
=========
Есть справочник СхемаСкидок, у него есть табличная часть ТоварыДействия (с реквизитом Номенклатура - могут быть как группы так и элементы).
Пример:
========
СхемаСкидок1
Товар1 (элемент)
Товар2 (элемент)
Товар3 (ГРУППА) - внутри куча подгрупп и элементов
СхемаСкидок2
Товар4 (элемент)
Товар5 (ГРУППА) - внутри куча подгрупп и элементов
Товар6 (элемент)
То есть , таблица должна содержать скидки и принадлежащие ей товары (только элементы)
PS
========
Сделать нужно все одним запросом.
Вариант "соединения по Родитель.Родитель.Родитель" - не подходит.
Вариант "сделать сначала запрос по скидкам, потом в цикле в обходе получать товары" - не подходит.
Вся проблема в том, что 1с не поддерживает "В ИЕРАРХИИ" в конструкциях соединения :)
ВЫБРАТЬ
Номенклатура.Родитель КАК НачалоДуги,
Номенклатура.Ссылка КАК КонецДуги
ПОМЕСТИТЬ ЗамыканияДлины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 КАК ВтораяДуга
ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги
Так вроде не сложно... Через временные таблицы Первую таблицу делаешь с условием , что это не группа и помещаешь во временную таблицу (это для тч схем). Второй запрос делаешь тоже по условию (это для номенклатуры), что это не группа и добавляешь еще одно условие в иерархии (где вложенный запрос по тч схем по условию группы и в иерархии ). Все это объединяешь. Была бы база, - сделал готовый запрос. А то я привык конструктором больше...
ВЫБРАТЬ
Номенклатура.Родитель КАК НачалоДуги,
Номенклатура.Ссылка КАК КонецДуги
ПОМЕСТИТЬ ЗамыканияДлины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 КАК ВтораяДуга
ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги