Задача возникла из потребности получить в отчете "Ведомость товаров на складах" графу "Заказ покупателя" по которому происходили движения товаров по регистру "ТоварыНаСкладах", в котором при сложной структуре документов невозможно напрямую вытащить Заказ из регистратора. В итоге задача была решена другим способом, но сам запрос мне показался интересным для публики.
В первой части запроса строится временная таблица, собирающая общий журнал документов с основаниями. В случае, если у вас в цепочке один и тот же документ может появиться через несколько полей узлового документа, то в первую таблицу его необходимо включить два раза.
Вторым этапом путем последовательного(ступенчатого) соединениея журнала с самим собой вытаскивается узловой заказ.
В моем оказалось достаточно 3х уровневого соединения. Если у вас структура документов имеет больше уровней группировок, просто добавьте новое соединение.
Сам запрос собственно. Также показано, как подцепить полученный журнал к регистру.
Запрос опробован и полностью подходит для встраивания в СКД.
ВЫБРАТЬ
ПТУ.Ссылка КАК Ссылка,
ПТУ.Сделка КАК ПервоеОснование
ПОМЕСТИТЬ ПервыеОснования
ИЗ
Документ.ПоступлениеТоваровУслуг КАК ПТУ
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
РТУ.Ссылка,
РТУ.Сделка
ИЗ
Документ.РеализацияТоваровУслуг КАК РТУ
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ВПок.Ссылка,
ВПок.Сделка
ИЗ
Документ.ВозвратТоваровОтПокупателя КАК ВПок
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
СТ.Ссылка,
СТ.Претензия
ИЗ
Документ.СписаниеТоваров КАК СТ
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ОТов.Ссылка,
""
ИЗ
Документ.ОприходованиеТоваров КАК ОТов
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ВТПост.Ссылка,
ВТПост.Сделка
ИЗ
Документ.ВозвратТоваровПоставщику КАК ВТПост
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
РТО.Ссылка,
РТО.ДокументПеремещения
ИЗ
Документ.РасходныйОрдерНаТовары КАК РТО
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ПТО.Ссылка,
ПТО.ДокументПеремещения
ИЗ
Документ.ПриходныйОрдерНаТовары КАК ПТО
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
Перемещение.Ссылка,
Перемещение.ВнутреннийЗаказ
ИЗ
Документ.ПеремещениеТоваров КАК Перемещение
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ВЗак.Ссылка,
ВЗак.ДокументОснование
ИЗ
Документ.ВнутреннийЗаказ КАК ВЗак
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ПервыеОснования.Ссылка,
ПервыеОснования.ПервоеОснование,
ВЫБОР
КОГДА ТИПЗНАЧЕНИЯ(ПервыеОснования.ПервоеОснование) = ТИП(Документ.ЗаказПокупателя)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ КАК ЭтоЗаказ
ПОМЕСТИТЬ ПолныйЖурнал
ИЗ
ПервыеОснования КАК ПервыеОснования
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ПолныйЖурнал.Ссылка,
ВЫБОР
КОГДА ПолныйЖурнал.ЭтоЗаказ
ТОГДА ПолныйЖурнал.ПервоеОснование
ИНАЧЕ ВЫБОР
КОГДА ПолныйЖурналОснований.ЭтоЗаказ
ТОГДА ПолныйЖурналОснований.ПервоеОснование
ИНАЧЕ ВЫБОР
КОГДА ПолныйЖурналОснований2.ЭтоЗаказ
ТОГДА ПолныйЖурналОснований2.ПервоеОснование
ИНАЧЕ NULL
КОНЕЦ
КОНЕЦ
КОНЕЦ КАК ЗаказПокупателя
ПОМЕСТИТЬ ЖурналДокументов
ИЗ
ПолныйЖурнал КАК ПолныйЖурнал
ЛЕВОЕ СОЕДИНЕНИЕ ПолныйЖурнал КАК ПолныйЖурналОснований
ПО ПолныйЖурнал.ПервоеОснование = ПолныйЖурналОснований.Ссылка
ЛЕВОЕ СОЕДИНЕНИЕ ПолныйЖурнал КАК ПолныйЖурналОснований2
ПО (ПолныйЖурналОснований.ПервоеОснование = ПолныйЖурналОснований2.Ссылка)
ЛЕВОЕ СОЕДИНЕНИЕ ПолныйЖурнал КАК ПолныйЖурналОснований3
ПО (ПолныйЖурналОснований2.ПервоеОснование = ПолныйЖурналОснований3.Ссылка)
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ЖурналДокументов.Ссылка,
МАКСИМУМ(ЕСТЬNULL(ЖурналДокументов.ЗаказПокупателя, 0)) КАК ЗаказПокупателя
ПОМЕСТИТЬ Заказы
ИЗ
ЖурналДокументов КАК ЖурналДокументов
СГРУППИРОВАТЬ ПО
ЖурналДокументов.Ссылка
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ТоварыНаСкладах.Склад,
Заказы.ЗаказПокупателя КАК Заказ,
ТоварыНаСкладах.Регистратор,
ТоварыНаСкладах.Номенклатура,
ТоварыНаСкладах.КоличествоНачальныйОстаток КАК НачальныйОстаток,
ТоварыНаСкладах.КоличествоПриход КАК Приход,
ТоварыНаСкладах.КоличествоРасход КАК Расход,
ТоварыНаСкладах.КоличествоКонечныйОстаток КАК КонечныйОстаток
ИЗ
РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Регистратор, , ) КАК ТоварыНаСкладах
ЛЕВОЕ СОЕДИНЕНИЕ Заказы КАК Заказы
ПО (Заказы.Ссылка = ТоварыНаСкладах.Регистратор)