Как программно получить список документов, подчиненных текущему (1С: 8.1: Программисту)

Вопрос Как программно получить список документов, подчиненных текущему
Ответ Для этого в типовых конфигурациях 1С можно использовать типовую функцию «ПолучитьСписокДокументовПоКритериюОтбора», расположенную в общем модуле «ПолныеПрава»

Примечание. У общего модуля «ПолныеПрава» установлены свойства «привилегированный» и «Сервер».
Свойство «привилегированный» означает, что выполнение процедур этого общего модуля будет выполняться на сервере без контроля прав доступа.
Свойство «Сервер» означает, что процедуры этого общего модуля могут быть выполнены на сервере.

Вызов функции

ТаблицаПодчиненных = ПолныеПрава.ПолучитьСписокДокументовПоКритериюОтбора("СвязанныеДокументы", Выборка.Ссылка);

В результате в переменной «ТаблицаПодчиненных» будет находиться таблица значений, в графе «Ссылка» которой будут документы, подчиненные документу «Выборка.Ссылка».

Полный текст функции, формирующей таблицу подчиненных документов:

Функция ПолучитьСписокДокументовПоКритериюОтбора(ИмяКритерияОтбора, ЗначениеКритерияОтбора) Экспорт

    Запрос = Новый Запрос;
    ТекстЗапроса = "";

    ТипЗначениеКритерияОтбора = ТипЗнч(ЗначениеКритерияОтбора);

    Запрос = Новый Запрос;
    ТекстЗапроса = "";

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

        Если НЕ ЭлементСостава.Тип.СодержитТип(ТипЗначениеКритерияОтбора) Тогда
            Продолжить;
        КонецЕсли;

        ПутьКДанным = ЭлементСостава.ПолноеИмя();
        СтруктураПутьКДанным = ОбщегоНазначения.РазобратьПутьКОбъектуМетаданных(ПутьКДанным);

        ЕСли НЕ ПравоДоступа("Чтение", СтруктураПутьКДанным.Метаданные) Тогда
            Продолжить;
        КонецЕсли;

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

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

        ИмяТЧ = Лев(СтруктураПутьКДанным.ИмяРеквизита, Найти(СтруктураПутьКДанным.ИмяРеквизита, ".")-1);
        ИмяРеквизита = Лев(СтруктураПутьКДанным.ИмяРеквизита, Найти(СтруктураПутьКДанным.ИмяРеквизита, ".")-1);
        ТекстЗапроса = ТекстЗапроса + ?(ТекстЗапроса = "", "ВЫБРАТЬ", "ОБЪЕДИНИТЬ ВСЕ
        |ВЫБРАТЬ") + "
        |" + СтруктураПутьКДанным.ВидОбъекта +".Ссылка ИЗ " + ИмяОбъекта + "." + СтруктураПутьКДанным.ИмяТаблЧасти + " КАК " + СтруктураПутьКДанным.ВидОбъекта + "
        |" + СтрЗаменить(ТекущаяСтрокаГДЕ, "..", ".") + "
        |";

    КонецЦикла;

    Запрос.Текст = ТекстЗапроса;
    Запрос.УстановитьПараметр("ЗначениеКритерияОтбора", ЗначениеКритерияОтбора);
    Возврат Запрос.Выполнить().Выгрузить();

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

Как видно, из этой функции вызывается вспомогательная функция «РазобратьПутьКОбъектуМетаданных» общего модуля «ОбщегоНазначения»

Примечание. У общего модуля «ОбщегоНазначения» установлены свойства «Клиент», «Сервер» и «Внешнее соединение»
Свойство «Клиент» означает, что процедуры и функции общего модуля могут быть использованы в клиентском приложениии.
Свойство «Внешнее соединение» означает, что процедуры и функции общего модуля могут быть использованы во внешнем соединении.

Полный текст вспомогательной функции «РазобратьПутьКОбъектуМетаданных»:

// Функция разбирает строку вида например:
// ТипОбъектаМетаданных.ИмяДокумента.ТабличнаяЧасть.ИмяТабличнойЧасти.Реквизит.ИмяРеквизита.
// ТипОбъектаМетаданных должен быть Справочник или Документ.
//
// Параметры:
//  ПутьКДанным - строка.
//
// Возвращаемое значение:
//  Структура - путь к объекту метаданных
//
Функция РазобратьПутьКОбъектуМетаданных(ПутьКДанным, МетаданныеОбъекта = Неопределено) Экспорт

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

   
СоответствиеИмен = Новый Массив();
   
СоответствиеИмен.Добавить("ТипОбъекта");
   
СоответствиеИмен.Добавить("ВидОбъекта");
   
СоответствиеИмен.Добавить("ПутьКДанным");
   
СоответствиеИмен.Добавить("ИмяТаблЧасти");
   
СоответствиеИмен.Добавить("ИмяРеквизита");

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

       
Точка = Найти(ПутьКДанным, ".");
       
ТекущееЗначение = Лев(ПутьКДанным, Точка-1);
       
Структура.Вставить(СоответствиеИмен[индекс-1], ТекущееЗначение);
       
ПутьКДанным = Сред(ПутьКДанным, Точка+1);

    КонецЦикла;

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

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

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

           
Точка = Найти(ПутьКДанным, ".");
            Если
Точка = 0 Тогда
               
ТекущееЗначение = ПутьКДанным;
            Иначе
               
ТекущееЗначение = Лев(ПутьКДанным, Точка-1);
            КонецЕсли;

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

        КонецЦикла;

    Иначе

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

    КонецЕсли;

    Если
МетаданныеОбъекта <> Неопределено Тогда
       
Структура.Вставить("Метаданные", МетаданныеОбъекта);
    Иначе
        Если
Структура.ТипОбъекта = "Документ" Тогда
           
Структура.Вставить("Метаданные", Метаданные.Документы[Структура.ВидОбъекта]);
        Иначе
           
Структура.Вставить("Метаданные", Метаданные.Справочники[Структура.ВидОбъекта]);
        КонецЕсли;
    КонецЕсли;

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

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

См. также Дерево подчиненных документов – использование стандартной обработки получения структуры подчиненных документов в своей форме

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.