Получить таблицу подчинённых документов

Функция ПолучитьСписокПодчиненныхДокументов(ДокументОснование)

Запрос = Новый Запрос;

ТекстЗапроса = "";

ТипДокументОснование = ТипЗнч(ДокументОснование);

Для Каждого ЭлементСостава ИЗ Метаданные.КритерииОтбора.СтруктураПодчиненности.Состав Цикл

Если Не ЭлементСостава.Тип.СодержитТип(ТипДокументОснование) Тогда

Продолжить;

КонецЕсли;

ПутьКДанным = ЭлементСостава.ПолноеИмя();

СтруктураПутьКДанным = РазобратьПутьКОбъектуМетаданных(ПутьКДанным);

ИмяОбъекта = СтруктураПутьКДанным.ТипОбъекта + "." + СтруктураПутьКДанным.ВидОбъекта;

ТекущаяСтрокаГДЕ = "ГДЕ " + СтруктураПутьКДанным.ВидОбъекта + "." +СтруктураПутьКДанным.ИмяРеквизита + " = &ЗначениеКритерияОтбора";

ИмяТЧ = Лев(СтруктураПутьКДанным.ИмяРеквизита, Найти(СтруктураПутьКДанным.ИмяРеквизита, ".")-1);

ИмяРеквизита = Лев(СтруктураПутьКДанным.ИмяРеквизита, Найти(СтруктураПутьКДанным.ИмяРеквизита, ".")-1);

ТекстЗапроса = ТекстЗапроса + ?(ТекстЗапроса = "", "ВЫБРАТЬ РАЗРЕШЕННЫЕ", "ОБЪЕДИНИТЬ

|ВЫБРАТЬ") + "

|" + СтруктураПутьКДанным.ВидОбъекта +".Ссылка ИЗ " + ИмяОбъекта + "." + СтруктураПутьКДанным.ИмяТаблЧасти + " КАК " + СтруктураПутьКДанным.ВидОбъекта + "

|" + СтрЗаменить(ТекущаяСтрокаГДЕ, "..", ".") + "

|";

КонецЦикла;

Запрос.Текст = ТекстЗапроса;

Запрос.УстановитьПараметр("ЗначениеКритерияОтбора", ДокументОснование);

Если ТекстЗапроса = "" Тогда

Возврат новый ТаблицаЗначений;

КонецЕсли;

Возврат Запрос.Выполнить().Выгрузить();

КонецФункции

Функция РазобратьПутьКОбъектуМетаданных(ПутьКДанным)

Структура = Новый Структура;

СоответствиеИмен = Новый Массив();

СоответствиеИмен.Добавить("ТипОбъекта");

СоответствиеИмен.Добавить("ВидОбъекта");

СоответствиеИмен.Добавить("ПутьКДанным");

СоответствиеИмен.Добавить("ИмяТаблЧасти");

СоответствиеИмен.Добавить("ИмяРеквизита");

Для индекс = 1 по 3 Цикл

Точка = Найти(ПутьКДанным, ".");

ТекущееЗначение = Лев(ПутьКДанным, Точка-1);

Структура.Вставить(СоответствиеИмен[индекс-1], ТекущееЗначение);

ПутьКДанным = Сред(ПутьКДанным, Точка+1);

КонецЦикла;

ПутьКДанным = СтрЗаменить(ПутьКДанным, "Реквизит.", "");

Если Структура.ПутьКДанным = "ТабличнаяЧасть" Тогда

Для индекс = 4 по 5 Цикл

Точка = Найти(ПутьКДанным, ".");

Если Точка = 0 Тогда

ТекущееЗначение = ПутьКДанным;

Иначе

ТекущееЗначение = Лев(ПутьКДанным, Точка-1);

КонецЕсли;

Структура.Вставить(СоответствиеИмен[индекс-1], ТекущееЗначение);

ПутьКДанным = Сред(ПутьКДанным, Точка+1);

КонецЦикла;

Иначе

Структура.Вставить(СоответствиеИмен[3], "");

Структура.Вставить(СоответствиеИмен[4], ПутьКДанным);

КонецЕсли;

Возврат Структура;

КонецФункции // РазобратьПутьКОбъектуМетаданных()