Связать документы в запросе.

1. Кадош 13.03.19 12:33 Сейчас в теме
Всем привет.
Можно ли связать документы в запросе не используя критерий отбора?
Суть в следующем: все документы одного типа, документ может включать в себя ссылку на другой документ.
В результате запрос надо получить дерево вида:
Основной документ
|_Документы ссылающиеся на основной документ.
Прикрепленные файлы:
+
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
7. Xershi 1484 13.03.19 13:07 Сейчас в теме
(1) создаешь ВТ с теми что вверху. Остаток распределяешь по нижним ярусам соединением.
Либо у вас косяк в постановке вопроса.
Но если интересует просто ответ, то да можно.
+
9. Кадош 13.03.19 13:18 Сейчас в теме
(7) запросом надо выводить все документы, в том числе у которых нет подчиненных. Как на картинке, у заказ №3 нет подчиненных документов.
+
10. Xershi 1484 13.03.19 13:20 Сейчас в теме
(9) ну так выводите в чем проблема?
+
11. Кадош 13.03.19 13:27 Сейчас в теме
(10) не пойму как сделать такое соединение в запросе
+
13. Xershi 1484 13.03.19 13:30 Сейчас в теме
(11) получаешь доки. Полная ВТ.
Фильтруешь верхний уровень вторая ВТ.
Левым соединяешь остаток.

План примерно такой.
Если не понятно курс по запросом проходим.
+
17. mrcamomile 80 13.03.19 15:20 Сейчас в теме
(13) Вот запрос - обходи его и создавай дерево - или допиши итоги и выгрузи результат запроса в дерево

ВЫБРАТЬ
	Т1.Заявка КАК Родитель
	, Т2.Заявка КАК Подчиненная
ИЗ
(
	ВЫБРАТЬ
	    Т.Ссылка КАК Заявка
	ИЗ
	    Документ.БЗ_ЗаявкаПокупателя КАК Т
	ГДЕ
		Т.ОсновнаяЗаявка = ЗНАЧЕНИЕ(Документ.БЗ_ЗаявкаПокупателя.ПустаяСсылка)
) КАК Т1

ЛЕВОЕ СОЕДИНЕНИЕ 
(
	ВЫБРАТЬ
	    Т.Ссылка КАК Заявка
	    , Т.ОсновнаяЗаявка КАК ОсновнаяЗаявка
	ИЗ
	    Документ.БЗ_ЗаявкаПокупателя КАК Т
	ГДЕ
		Т.ОсновнаяЗаявка = ЗНАЧЕНИЕ(Документ.БЗ_ЗаявкаПокупателя.ПустаяСсылка)
) КАК Т2 
ПО Т1.Ссылка = Т2.ОсновнаяЗаявка
Показать
+
18. Кадош 13.03.19 23:00 Сейчас в теме
(17) как выбрать и связать документы - проблем нет.
Проблема, связать их так (через ИТОГИ?), чтобы без кода получилось, как на картинке.
С учетом всего вышенаписанного, понятно, что такой возможности нет.
+
19. mrcamomile 80 14.03.19 11:48 Сейчас в теме
(18) в динамическом списке поставь группировку по полу Родитель
+
2. vadver 39 13.03.19 12:44 Сейчас в теме
Привет!

А уровень подчиненности ограничен?
+
3. Кадош 13.03.19 12:53 Сейчас в теме
(2) да. у подчиненного документа не может быть подчиненных. поэтому только один уровень в дереве.
+
4. vadver 39 13.03.19 12:57 Сейчас в теме
Тогда проще всего:
1. Создаем временную таблицу из документов с незаполненным реквизитом "РодительскийДокумент" (или как он там называется?). Это будет верхний уровень
2. Во втором запросе пакета отбираем документы, не входящие в первую таблицу со внутренним соединением со временной таблицей из 1-го запроса пакета.
3. Итоги запроса - по реквизиту "РодительскийДокумент" - это если выводить вручную. Если в СКД - тогда помучиться придется

Понятно, или подробнее надо?
+
5. Кадош 13.03.19 13:00 Сейчас в теме
(4) В таком случае будет выводится итог по документам у которых нет подчиненных связей, а этого не надо.
+
6. vadver 39 13.03.19 13:05 Сейчас в теме
(5) Не будет. Мы отбираем во 2-м запросе с ВНУТРЕННИМ соединением со временной таблицей из первого запроса
+
8. Кадош 13.03.19 13:16 Сейчас в теме
(6) а если у документа нет подчиненных?
+
12. vadver 39 13.03.19 13:28 Сейчас в теме
(8) Я вот пытаюсь у себя в голове совместить эти утверждения:
В таком случае будет выводится итог по документам у которых нет подчиненных связей, а этого не надо.

и
а если у документа нет подчиненных?

и что-то у меня плохо получается их совместить.... Наверно чего-то не понимаю...
Давай еще раз уточним: надо выводить все документы, или документы только с подчиненными?
И как планируешь выводить: через обходы результата запроса или через СКД?
+
14. Кадош 13.03.19 13:31 Сейчас в теме
(12) Надо выводить все документы.
+
15. vadver 39 13.03.19 13:48 Сейчас в теме
(14) Тогда во 2-й запрос пакета добавить объединение со временной таблицей из 1-го запроса. Что-то типа такого:
ВЫБРАТЬ
ВЫБРАТЬ
	Док.РодительскийДокумент,
	Док.Ссылка
ИЗ Документ.ЗаявкаПокупателя
	ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_РодДокументы
	ПО ВТ_РодДокументы.Ссылка = Док.РодительскийДокумент
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
	ВТ_РодДокументы.Ссылка,
	NULL
ИЗ ВТ_РодДокументы

УПОРЯДОЧИТЬ ПО
	Док.РодительскийДокумент.Дата,
	isnull(Док.Ссылка.Дата, ДАТАВРЕМЯ(1,1,1))
Показать

Упорядочивать по дате.
При обходе детальных записей проверять заполненность ссылки документа. Если не заполнена - прерывать цикл по детальным записям
+
16. Кадош 13.03.19 13:57 Сейчас в теме
(15) Сейчас я делаю так:
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	БЗ_ЗаявкаПокупателя.Ссылка КАК Заявка,
		|	БЗ_ПодчиненныеЗаявки.Ссылка КАК ЗаявкаПодчиненная
		|ИЗ
		|	Документ.БЗ_ЗаявкаПокупателя КАК БЗ_ЗаявкаПокупателя
		|		ЛЕВОЕ СОЕДИНЕНИЕ Документ.БЗ_ЗаявкаПокупателя КАК БЗ_ПодчиненныеЗаявки
		|		ПО БЗ_ЗаявкаПокупателя.Ссылка = БЗ_ПодчиненныеЗаявки.Ссылка.ОсновнаяЗаявка
		|			И (БЗ_ПодчиненныеЗаявки.ВключитьвЗаявку)
		|ГДЕ
		|	НЕ БЗ_ЗаявкаПокупателя.ВключитьвЗаявку
		|ИТОГИ ПО
		|	Заявка";
	
	РезультатЗапроса = Запрос.Выполнить();
	
	ВыборкаСсылка = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
	ДеревоЗначений = РеквизитФормыВЗначение("СписокДокументов");
	ДеревоЗначений.Строки.Очистить();
	Пока ВыборкаСсылка.Следующий() Цикл
		Корень = ДеревоЗначений.Строки.Добавить();;
		Корень.Заявка = ВыборкаСсылка.Заявка;
		
		ВыборкаДетальныеЗаписи = ВыборкаСсылка.Выбрать();
		
		Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
			Если ВыборкаДетальныеЗаписи.ЗаявкаПодчиненная <> NULL Тогда
				
				ПодчиненаяСтрока = Корень.Строки.Добавить();
				ПодчиненаяСтрока.Заявка = ВыборкаДетальныеЗаписи.ЗаявкаПодчиненная;
				
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
Показать


Получаю результат, как на рисунке.

Вопрос в том, можно ли получить такой же результат, только одним запросом.
Прикрепленные файлы:
+
Внимание! Тема сдана в архив

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