В процессе работы потребовалось получать иерархию документов. Для проверки работоспособности алгоритма (взят из УТ 10.3) написал примитивный отчет. Проверен в УТ 10.3. Может пригодиться как пример или фундамент при решении схожих задач.
Полный код:
Перем мУжеВСписке;
Процедура КнопкаСформироватьНажатие(Кнопка)
мУжеВСписке.Очистить();
Если Родители тогда
ВывестиРодительскиеДокументы(ДокументСсылка);
иначе
ВывестиПодчиненныеДокументы(ДокументСсылка);
КонецЕсли;
КонецПроцедуры//КнопкаСформироватьНажатие
// Процедура осуществляет вывод подчиненных документов
Процедура ВывестиПодчиненныеДокументы(ДокументСсылка)
ТекущийДокумент = ДокументСсылка;
Таблица = ПолныеПрава.ПолучитьСписокДокументовПоКритериюОтбора("СвязанныеДокументы", ТекущийДокумент);
КэшПоТипамДокументов = Новый Соответствие;
Для Каждого СтрокаТаблицы ИЗ Таблица Цикл
МетаданныеДокумента = СтрокаТаблицы.Ссылка.Метаданные();
Если Не ПравоДоступа("Чтение", МетаданныеДокумента) Тогда
Продолжить;
КонецЕсли;
ИмяДокумента = МетаданныеДокумента.Имя;
СинонимДокумента = МетаданныеДокумента.Синоним;
СтруктураТипа = КэшПоТипамДокументов[ИмяДокумента];
Если СтруктураТипа = Неопределено Тогда
СтруктураТипа = Новый Структура("Синоним, МассивСсылок", СинонимДокумента, Новый Массив);
КэшПоТипамДокументов.Вставить(ИмяДокумента, СтруктураТипа);
КонецЕсли;
СтруктураТипа.МассивСсылок.Добавить(СтрокаТаблицы.Ссылка);
КонецЦикла;
ЕСли КэшПоТипамДокументов.Количество() = 0 ТОгда
Возврат;
КонецЕсли;
ТекстЗапросаНачало = "ВЫБРАТЬ РАЗРЕШЕННЫЕ * ИЗ (";
ТекстЗапросаКонец = ") КАК ПодчиненныеДокументы УПОРЯДОЧИТЬ ПО ПодчиненныеДокументы.Дата";
Запрос = Новый Запрос;
Для Каждого КлючИЗначение ИЗ КэшПоТипамДокументов Цикл
Запрос.Текст = Запрос.Текст + ?(Запрос.Текст = "", "
|ВЫБРАТЬ ", "
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ") + "
|Дата, Ссылка, Представление, Проведен, ПометкаУдаления
|ИЗ Документ." + КлючИЗначение.Ключ + "
|ГДЕ Ссылка В (&" + КлючИЗначение.Ключ + ")";
Запрос.УстановитьПараметр(КлючИЗначение.Ключ, КлючИЗначение.Значение.МассивСсылок);
КонецЦикла;
Запрос.Текст = ТекстЗапросаНачало + Запрос.Текст + ТекстЗапросаКонец;
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Если мУжеВСписке[Выборка.Ссылка] = Неопределено Тогда
Сообщить(Выборка.Ссылка);
//отвечает за вложенное дерево у подчиненных документов. именно там КлючИЗначение.Ключ="ВводНачальныхОстатковПоВзаиморасчетам" (искал именно этот док)
ВывестиПодчиненныеДокументы(Выборка.Ссылка);
КонецЕсли;
КонецЦикла;
КонецПроцедуры//ВывестиПодчиненныеДокументы
/////////////////////////////////////////////////////////////////////////////////
//////////////////////////////Процедуры для показа родительских документов
// Процедура выполняет вывод родительских документов
Процедура ВывестиРодительскиеДокументы(ДокументСсылка)
МетаданныеДокумента = ДокументСсылка.Метаданные();
СписокРеквизитов = Новый СписокЗначений;
Для Каждого Реквизит ИЗ МетаданныеДокумента.Реквизиты Цикл
ТипыРеквизита = Реквизит.Тип.Типы();
Для Каждого ТекущийТип ИЗ ТипыРеквизита Цикл
МетаданныеРеквизита = Метаданные.НайтиПоТипу(ТекущийТип);
Если МетаданныеРеквизита<>Неопределено И Метаданные.Документы.Содержит(МетаданныеРеквизита)
И ПравоДоступа("Чтение", МетаданныеРеквизита) Тогда
Попытка
ЗначениеРеквизита = ДокументСсылка[Реквизит.Имя];
Исключение
Прервать;
КонецПопытки;
ЕСли ЗначениеРеквизита<>Неопределено И НЕ ЗначениеРеквизита.Пустая() И ТипЗнч(ЗначениеРеквизита) = ТекущийТип
И мУжеВСписке[ЗначениеРеквизита] = Неопределено И СписокРеквизитов.НайтиПоЗначению(ДокументСсылка[Реквизит.Имя]) = Неопределено Тогда
Попытка
СписокРеквизитов.Добавить(ЗначениеРеквизита,Формат(ЗначениеРеквизита.Дата,"ДФ=yyyyMMddЧЧММсс"));
Исключение
ОтладкаТекстОшибки = ОписаниеОшибки();
КонецПопытки;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Для Каждого ТЧ Из МетаданныеДокумента.ТабличныеЧасти Цикл
СтрРеквизитов = "";
Попытка
СодержимоеТЧ = ДокументСсылка[ТЧ.Имя].Выгрузить();
Исключение
Прервать;
КонецПопытки;
Для Каждого Реквизит ИЗ ТЧ.Реквизиты Цикл
ТипыРеквизита = Реквизит.Тип.Типы();
Для Каждого ТекущийТип ИЗ ТипыРеквизита Цикл
МетаданныеРеквизита = Метаданные.НайтиПоТипу(ТекущийТип);
Если МетаданныеРеквизита<>Неопределено И Метаданные.Документы.Содержит(МетаданныеРеквизита)
И ПравоДоступа("Чтение", МетаданныеРеквизита) Тогда
СтрРеквизитов = СтрРеквизитов + ?(СтрРеквизитов = "", "", ", ") + Реквизит.Имя;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЦикла;
СодержимоеТЧ.Свернуть(СтрРеквизитов);
Для Каждого КолонкаТЧ ИЗ СодержимоеТЧ.Колонки Цикл
Для Каждого СтрокаТЧ ИЗ СодержимоеТЧ Цикл
Попытка
ЗначениеРеквизита = СтрокаТЧ[КолонкаТЧ.Имя];
Исключение
Продолжить;
КонецПопытки;
МетаданныеЗначения = Метаданные.НайтиПоТипу(ТипЗнч(ЗначениеРеквизита));
Если МетаданныеЗначения = Неопределено Тогда
// базовый тип
Продолжить;
КонецЕсли;
ЕСли ЗначениеРеквизита<>Неопределено И НЕ ЗначениеРеквизита.Пустая()
И Метаданные.Документы.Содержит(МетаданныеЗначения)
И мУжеВСписке[ЗначениеРеквизита] = Неопределено Тогда
Если СписокРеквизитов.НайтиПоЗначению(ЗначениеРеквизита) = Неопределено Тогда
Попытка
СписокРеквизитов.Добавить(ЗначениеРеквизита,Формат(ЗначениеРеквизита.Дата,"ДФ=yyyyMMddЧЧММсс"));
Исключение
ОтладкаТекстОшибки = ОписаниеОшибки();
КонецПопытки;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
СписокРеквизитов.СортироватьПоПредставлению();
мУжеВСписке.Вставить(ДокументСсылка, Истина);
Если СписокРеквизитов.Количество() = 1 Тогда
ВывестиРодительскиеДокументы(СписокРеквизитов[0].Значение);
ИначеЕсли СписокРеквизитов.Количество() > 1 Тогда
ВывестиБезРодителей(СписокРеквизитов);
КонецЕсли;
Запрос = Новый Запрос("ВЫБРАТЬ РАЗРЕШЕННЫЕ Ссылка, Проведен, ПометкаУдаления, Представление, """ + МетаданныеДокумента.Имя + """ КАК Метаданные
| ИЗ Документ."+МетаданныеДокумента.Имя + " ГДЕ Ссылка = &Ссылка");
Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Сообщить(Выборка.Ссылка);
КонецЕсли;
КонецПроцедуры//ВывестиРодительскиеДокументы
//
Процедура ВывестиБезРодителей(СписокДокументов)
Для Каждого ЭлементСписка Из СписокДокументов Цикл
МетаданныеДокумента = ЭлементСписка.Значение.Метаданные();
Запрос = Новый Запрос("ВЫБРАТЬ РАЗРЕШЕННЫЕ Ссылка, Проведен, ПометкаУдаления, Представление, """ + МетаданныеДокумента.Имя + """ КАК Метаданные
| ИЗ Документ."+МетаданныеДокумента.Имя + " ГДЕ Ссылка = &Ссылка");
Запрос.УстановитьПараметр("Ссылка", ЭлементСписка.Значение);
Выборка = Запрос.Выполнить().Выбрать();
ЕСли Выборка.Следующий() Тогда
Если мУжеВСписке[Выборка.Ссылка] = Неопределено Тогда
Сообщить(Выборка.Ссылка);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры//ВывестиБезРодителей
мУжеВСписке = Новый Соответствие;