База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как программно получить связанные документы без «Критериев отбора»?
- В этой теме 1 ответ, 2 участника, последнее обновление 9 минут назад сделано
Odin — Одинэсник.
-
АвторСообщения
-
-
7 сентября 2026 в 18:23 #38582
Мне надо программно получить все связанные документы. Я это делаю запросом к Критериям отбора. Но оказалось, что для него надо иметь полные права. И у сотрудника с правами производство не хватает прав обратиться к Критериям отбора. Как получить связанные документ программно?
Запрос.Текст =
«ВЫБРАТЬ
| СвязанныеДокументы.Ссылка КАК ПодчиненныйДокумент,
| ВЫБОР
| КОГДА СвязанныеДокументы.Ссылка ССЫЛКА Документ.РасходныйОрдерНаТовары
| ТОГДА ИСТИНА
| ИНАЧЕ ЛОЖЬ
| КОНЕЦ КАК ЭтоРасходныйОрдер
|ИЗ
| КритерийОтбора.СвязанныеДокументы(&ДокументОснование) КАК СвязанныеДокументы
|ГДЕ
| СвязанныеДокументы.Ссылка.ПометкаУдаления = ЛОЖЬ»;;Запрос.УстановитьПараметр(«ДокументОснование», ДокументОснование);
-
7 сентября 2026 в 18:23 #38583
В 1С:КА 2.5 действительно объект «КритерийОтбора» требует полных прав, и если у пользователя их нет, то запрос к нему не пройдет.
Чтобы получить связанные документы программно без использования «КритерийОтбора», можно обойтись обходом реквизитов и табличных частей документа, где могут храниться ссылки на другие документы. Это универсальный способ, который не требует специальных прав.
Вот пример функции, которая рекурсивно собирает связанные документы (родительские и подчинённые) из реквизитов и табличных частей документа, без обращения к «Критериям отбора»:
1С (Код)123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263Функция ПолучитьСвязанныеДокументы(ДокументСсылка, СписокДокументов = Неопределено, УжеОбработаны = Неопределено) ЭкспортЕсли СписокДокументов = Неопределено ТогдаСписокДокументов = Новый СписокЗначений;КонецЕсли;Если УжеОбработаны = Неопределено ТогдаУжеОбработаны = Новый Соответствие;КонецЕсли;Если УжеОбработаны.Содержит(ДокументСсылка) ТогдаВозврат СписокДокументов;КонецЕсли;УжеОбработаны.Вставить(ДокументСсылка, Истина);МетаданныеДокумента = ДокументСсылка.Метаданные();// Проверяем реквизитыДля Каждого Реквизит Из МетаданныеДокумента.Реквизиты ЦиклТипыРеквизита = Реквизит.Тип.Типы();Для Каждого ТекТип Из ТипыРеквизита ЦиклМетаданныеТипа = Метаданные.НайтиПоТипу(ТекТип);Если МетаданныеТипа <> Неопределено И Метаданные.Документы.Содержит(МетаданныеТипа) ТогдаПопыткаЗначение = ДокументСсылка[Реквизит.Имя];ИсключениеПродолжить;КонецПопытки;Если Значение <> Неопределено И НЕ Значение.Пустая() ТогдаЕсли СписокДокументов.НайтиПоЗначению(Значение) = Неопределено ТогдаСписокДокументов.Добавить(Значение);ПолучитьСвязанныеДокументы(Значение, СписокДокументов, УжеОбработаны);КонецЕсли;КонецЕсли;КонецЕсли;КонецЦикла;КонецЦикла;// Проверяем табличные частиДля Каждого ТЧ Из МетаданныеДокумента.ТабличныеЧасти ЦиклПопыткаТаблицаЗначений = ДокументСсылка[ТЧ.Имя].Выгрузить();ИсключениеПродолжить;КонецПопытки;Для Каждого Строка Из ТаблицаЗначений ЦиклДля Каждого Колонка Из ТаблицаЗначений.Колонки ЦиклЗначение = Строка[Колонка.Имя];Если ТипЗнч(Значение) = Тип("Ссылка") ТогдаМетаданныеТипа = Метаданные.НайтиПоТипу(ТипЗнч(Значение));Если МетаданныеТипа <> Неопределено И Метаданные.Документы.Содержит(МетаданныеТипа) ТогдаЕсли СписокДокументов.НайтиПоЗначению(Значение) = Неопределено ТогдаСписокДокументов.Добавить(Значение);ПолучитьСвязанныеДокументы(Значение, СписокДокументов, УжеОбработаны);КонецЕсли;КонецЕсли;КонецЕсли;КонецЦикла;КонецЦикла;КонецЦикла;Возврат СписокДокументов;КонецФункцииКак использовать:
1С (Код)1СвязанныеДокументы = ПолучитьСвязанныеДокументы(ДокументОснование);Эта функция обходит все реквизиты и табличные части документа, ищет ссылки на другие документы и рекурсивно собирает их в список.
Если нужно получить только подчинённые или только родительские документы — можно доработать функцию, фильтруя по направлению связи.
Такой способ не требует специальных прав, так как работает с самим объектом документа и его метаданными.
Если нужно получить подчинённые документы, которые связаны через структуру подчинённости (например, через реквизиты типа «Документ»), то этот метод работает корректно.
Если в вашей базе есть специфические связи, которые хранятся в отдельных регистрах или справочниках, то нужно будет добавить обработку этих источников.
Рекомендую посмотреть пример из статьи на infostart, где описан похожий подход:
https://infostart.ru/1c/articles/205090/
Там есть готовые функции для получения родительских и подчинённых документов из структуры подчинённости без использования «Критериев отбора».
Если нужна помощь с адаптацией под ваш конкретный документ — приложите код или структуру документа.
-
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.