Разработка и Конфигурация · 8 мин
Как получить подчинённые документы в 1С
Как найти подчинённые документы в 1С: через структуру подчинения, критерии отбора и программно запросом. Примеры кода, типичные ошибки и ответы на вопросы.
Подчинённым называют документ, который создан на основании другого документа и ссылается на него через реквизит-основание (например, «Реализация товаров и услуг», введённая на основании «Заказа покупателя», хранит ссылку на заказ в табличной части или реквизите «ДокументОснование»). Получить список таких документов нужно и пользователю — чтобы проверить цепочку «заказ → реализация → счёт-фактура», и разработчику — чтобы построить отчёт или проверку в коде.
Существует три основных способа: штатная кнопка «Структура подчинения» в интерфейсе, критерий отбора «Связанные документы» и программный запрос к базе данных. Выбор зависит от задачи: разовая проверка делается мышкой за пару секунд, а массовая обработка или отчёт требуют запроса.
Важно понимать ограничение: подчинённость в 1С определяется не «магией платформы», а тем, что в конфигураторе у документа заполнен список «Вводится на основании», а в подчинённом документе есть реквизит, хранящий ссылку на основание. Если разработчик конфигурации не предусмотрел такую связь, стандартные механизмы её не покажут.
Что такое подчинённый документ и как устроена связь
Связь «основание — подчинённый документ» хранится в самом подчинённом документе: в нём есть реквизит (или табличная часть «ДокументыОснования» в современных конфигурациях), содержащий ссылку на документ-основание. Платформа при вводе на основании автоматически заполняет этот реквизит.
Один документ может быть основанием для нескольких подчинённых: например, из одного заказа делают несколько реализаций и несколько счетов на оплату. Обратная ситуация тоже возможна — один подчинённый документ может ссылаться на несколько оснований, если конфигурация это поддерживает.
Как посмотреть подчинённые документы через интерфейс
Откройте документ-основание и нажмите кнопку «Ещё» → «Структура подчинения» (в тонком клиенте также встречается отдельная кнопка с пиктограммой дерева на панели навигации формы). Откроется окно с деревом: текущий документ выделен, ниже — все введённые на его основании документы, выше — его собственные основания.
Из этого окна можно перейти в любой документ двойным щелчком. Это самый быстрый способ ответить на вопросы вроде «была ли отгрузка по этому заказу» или «выписан ли счёт-фактура по реализации».
- 1Откройте документ-основание в списке или по ссылке
- 2Нажмите «Ещё» → «Структура подчинения»
- 3Проверьте ветку ниже текущего документа — там подчинённые документы
- 4Дважды щёлкните нужный документ, чтобы открыть его
- 5Если дерево пустое — проверьте, вводились ли документы именно на основании, а не копированием
Получение через критерий отбора «Связанные документы»
В типовых конфигурациях часто есть критерий отбора, который собирает все документы, связанные с выбранным. В пользовательском режиме он обычно доступен из формы документа (команда «Связанные документы» или отчёт с аналогичным названием) и показывает плоский список с типами, датами и суммами — это удобнее дерева, когда документов много.
Программно критерий отбора используется так: у объекта КритерииОтбора вызывается метод Найти(СсылкаНаОснование), который возвращает массив ссылок на связанные документы. Способ хорош тем, что не нужно знать, в каком именно реквизите хранится основание, — критерий уже настроен в конфигураторе.
Программное получение запросом
Универсальный и самый контролируемый способ — запрос к таблице документа с отбором по реквизиту-основанию. Нужно знать имя реквизита, в котором хранится ссылка: в разных конфигурациях это «ДокументОснование», «ЗаказПокупателя», «Сделка» или табличная часть с основаниями.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Реализация.Ссылка КАК Документ,
| Реализация.Дата КАК Дата
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Реализация
|ГДЕ
| Реализация.ЗаказПокупателя = &Основание
| И НЕ Реализация.ПометкаУдаления";
Запрос.УстановитьПараметр("Основание", СсылкаНаЗаказ);
Результат = Запрос.Выполнить().Выгрузить();
Если оснований может быть несколько и они хранятся в табличной части, запрос пишется по табличной части: Документ.РеализацияТоваровУслуг.ДокументыОснования с условием ГДЕ Таб.ДокументОснование = &Основание. Синтакс-помощник в конфигураторе подскажет точную структуру конкретного документа.
Для поиска подчинённых сразу по нескольким типам документов объединяйте запросы через ОБЪЕДИНИТЬ ВСЕ или выполняйте отдельные запросы в цикле по массиву типов. Это надёжнее, чем перебор всех документов через Выбрать() — перебор читает каждый объект целиком и на больших базах работает медленно.
Перед написанием запроса откройте в конфигураторе свойства документа и посмотрите реквизиты: имя поля с основанием и то, одиночный это реквизит или табличная часть, определяет весь текст запроса.
Типичные ошибки и ограничения
Самая частая причина «не находятся подчинённые» — документы создавались не вводом на основании, а копированием или вручную, и реквизит-основание остался пустым. В этом случае формальной связи нет, и ни структура подчинения, ни запрос её не покажут.
Вторая ошибка — забыть отфильтровать помеченные на удаление. Без условия НЕ ПометкаУдаления в выборку попадут «мёртвые» документы, и отчёт покажет неверные суммы и количества.
Третья — искать связь не в том реквизите. В одной конфигурации реализация ссылается на заказ через «ЗаказПокупателя», в другой — через табличную часть оснований. Запрос по несуществующему реквизиту просто вернёт пустой результат без ошибки, если поле есть, но не заполняется.
Как проверить результат
Дерево показывает подчинённые документы под текущим
Дерево пустое, хотя документы точно создавались
Возвращаются только проведённые и непомеченные документы с нужным основанием
Пустой результат или лишние помеченные на удаление записи
В подчинённом документе поле основания заполнено ссылкой
Поле пустое — документ введён не на основании
Частые вопросы
Почему структура подчинения пустая, хотя документы по заказу есть?
Скорее всего, документы создавались не командой «Ввести на основании», а вручную или копированием, и реквизит со ссылкой на основание не заполнен. Откройте предполагаемый подчинённый документ и проверьте поле основания. Если оно пустое — заполните его вручную или перепроведите документ через штатный механизм ввода на основании.
Можно ли получить подчинённые документы сразу для списка оснований?
Да. Передайте в запрос массив ссылок и используйте условие Основание В (&СписокОснований). Это правильный способ для пакетной обработки: один запрос вместо цикла с запросом на каждый документ.
Чем критерий отбора лучше прямого запроса?
Критерий отбора не требует знать имя реквизита-основания и сразу охватывает все включённые в него типы документов. Но он менее гибок: нельзя добавить свои поля и условия. Для отчётов и сложных выборок запрос предпочтительнее.
Как найти документы, у которых основание вообще не заполнено?
Запросом с условием ГДЕ Реализация.ЗаказПокупателя = ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка) или ЕСТЬ NULL при соединениях. Такая проверка полезна для поиска документов, введённых вручную в обход цепочки.
Работает ли структура подчинения для помеченных на удаление документов?
Да, дерево обычно показывает и помеченные документы — они отображаются с соответствующей пиктограммой. При программной выборке их нужно отфильтровывать явно, иначе они исказят итоги.
Что важно запомнить
Для разовой проверки используйте «Структуру подчинения», для списков — критерий отбора, для отчётов и обработок — запрос по реквизиту-основанию с фильтром пометки удаления. Связь существует только если основание реально записано в подчинённом документе.