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