К статье
Практический материал

Разработка и Конфигурация · 14 мин

Как получить связанные документы запросом в 1С

Как получить связанные документы запросом в 1С: критерии отбора, структура подчиненности, примеры кода на языке запросов, типичные ошибки и проверка результата.

Получение связанных документов — одна из самых частых задач при разработке отчётов, обработок и печатных форм в 1С. Под связанными документами понимают объекты, объединённые общим реквизитом-основанием: например, реализацию, выписанную на основании заказа покупателя, или оплату по конкретному счёту. Прямого оператора «найди всё подчинённое» в языке запросов нет, поэтому задача решается несколькими способами в зависимости от того, как в конфигурации организована связь.

Основные подходы — соединение по реквизиту-основанию (документ-основание, заказ, счёт), использование критериев отбора, объединяющих документы по составу реквизитов, и программный обход через структуру подчинённости. У каждого варианта есть ограничения по скорости, полноте результата и требованиям к настройке конфигурации. Ниже разобраны рабочие примеры запросов, условия выбора метода и способы проверить корректность выборки.

Важно понимать: запрос работает только с теми связями, которые физически хранятся в базе — в реквизитах документов или в настройках критериев отбора. Если разработчик конфигурации не предусмотрел реквизит-основание и не включил документ в критерий отбора, найти связь чистым запросом не получится, и потребуется анализ движений по регистрам или доработка метаданных.

Как устроены связи между документами в 1С

Прежде чем писать запрос, нужно определить механизм связи, использованный в конкретной конфигурации. Самый распространённый вариант — реквизит-основание: у подчинённого документа есть поле типа «ДокументСсылка», в котором хранится ссылка на документ-источник. В типовых конфигурациях такие реквизиты называются по-разному: «ДокументОснование», «Заказ», «ЗаказПокупателя», «СчетНаОплату», «Сделка». Точное имя смотрят в конфигураторе или через структуру метаданных.

Второй механизм — критерии отбора. Это объекты метаданных, которые объединяют несколько видов документов по общему реквизиту. Например, критерий «СвязанныеДокументы» может включать заказ, реализацию, счёт-фактуру и оплату, связанные через реквизит «Заказ». Запрос к критерию отбора возвращает все документы, удовлетворяющие условию, без необходимости перечислять каждый вид вручную.

Третий вариант — связь через движения по регистрам. Документ-регистратор оставляет записи в регистрах, где одно из измерений содержит ссылку на заказ или счёт. Если реквизита-основания нет, единственный способ найти связанные документы — запрос к таблице регистра с группировкой по регистратору. Это менее очевидный, но часто единственно возможный путь в самописных конфигурациях.

Маршрут решения

Как выбрать способ выборки

У подчинённого документа есть реквизит-основание со ссылкой на исходный документСтройте запрос с соединением или отбором по этому реквизиту — самый быстрый и надёжный вариант
В конфигурации есть критерий отбора, объединяющий нужные виды документовИспользуйте запрос к критерию отбора — получите все связанные виды документов одним обращением
Связь видна только в движениях по регистрам (измерение с заказом или счётом)Делайте запрос к таблице регистра с группировкой по регистратору
Связь нигде не хранится и видна только в форме структуры подчинённостиЗапросом задача не решается — нужна доработка метаданных или анализ кода формирования структуры подчинённости

Получение связанных документов через реквизит-основание

Базовый сценарий: нужно найти все документы, введённые на основании конкретного документа. Запрос обращается к таблице подчинённого вида документов и отбирает записи, где реквизит-основание равен переданной ссылке. Параметр передаётся через конструкцию ГДЕ с параметром запроса.

Пример запроса, находящего все реализации по конкретному заказу покупателя:

ВЫБРАТЬ

Реализация.Ссылка КАК Документ,

Реализация.Дата КАК Дата,

Реализация.Номер КАК Номер,

Реализация.СуммаДокумента КАК Сумма

ИЗ

Документ.РеализацияТоваровУслуг КАК Реализация

ГДЕ

Реализация.ЗаказПокупателя = &Заказ

И НЕ Реализация.ПометкаУдаления

Если оснований может быть несколько видов (например, реализация вводится и на основании заказа, и на основании счёта), реквизит обычно имеет составной тип. Тогда в условии достаточно сравнения с параметром — платформа сама сопоставит тип ссылки. Но если нужно выбрать связанные документы сразу нескольких видов, придётся объединять запросы через ОБЪЕДИНИТЬ ВСЕ, потому что каждый вид документа — отдельная таблица.

Обратный сценарий — найти основание для набора подчинённых документов. Здесь используют левое соединение: основная таблица — подчинённые документы, присоединяемая — таблица оснований по ссылке из реквизита. Поля основания доступны через точку, но обращение через точку к полям составной ссылки без соединения может замедлять запрос на больших объёмах, поэтому явное соединение предпочтительнее.

bsl
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Реализация.Ссылка КАК Документ
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Реализация
|ГДЕ
| Реализация.ЗаказПокупателя = &Заказ
| И НЕ Реализация.ПометкаУдаления";
Запрос.УстановитьПараметр("Заказ", ЗаказСсылка);
Результат = Запрос.Выполнить().Выгрузить();

Выборка через критерий отбора

Критерий отбора — готовый механизм платформы для задачи «найти всё связанное». Если в конфигурации он настроен, запрос становится коротким и универсальным: не нужно знать, какие именно виды документов участвуют в связке. Запрос обращается к критерию как к таблице и отбирает записи по значению критерия.

Пример запроса к критерию отбора:

ВЫБРАТЬ

Связанные.Ссылка КАК Документ

ИЗ

КритерийОтбора.СвязанныеДокументы(&Основание) КАК Связанные

Параметр критерия передаётся в скобках после имени — это ссылка на документ, для которого ищутся связанные объекты. Результат содержит ссылки на документы всех видов, включённых в состав критерия. Дальше по ссылке можно получить представление, дату и номер — но учтите, что обращение к реквизитам через точку от ссылки составного типа порождает неявные соединения со всеми таблицами состава, что замедляет выполнение.

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

Поиск связанных документов через движения по регистрам

Когда реквизита-основания нет, связь часто обнаруживается в регистрах. Например, в регистре расчётов с контрагентами есть измерение «Заказ» или «Счёт», и каждый документ-регистратор оставляет там записи. Запрос к такому регистру с группировкой по регистратору возвращает все документы, которые делали движения по конкретному заказу.

ВЫБРАТЬ РАЗЛИЧНЫЕ

Расчеты.Регистратор КАК Документ

ИЗ

РегистрНакопления.РасчетыСКлиентами КАК Расчеты

ГДЕ

Расчеты.ЗаказКлиента = &Заказ

Ключевое слово РАЗЛИЧНЫЕ обязательно: один документ делает по регистру множество записей, и без него в результате будут дубли. Альтернатива — группировка по регистратору, что иногда быстрее на больших таблицах. Если регистр периодический и нужны ещё даты документов, их получают соединением с таблицей документов по ссылке регистратора либо через поле Период записи регистра.

Метод имеет ограничения. Во-первых, документ, который не делает движений по этому регистру (например, черновик или отменённый документ), в выборку не попадёт. Во-вторых, если измерение в регистре заполняется не всегда, часть связей потеряется. Поэтому перед использованием метода стоит вручную проверить несколько документов: открыть их движения и убедиться, что нужное измерение заполнено.

Быстрый способ понять, как связаны документы в незнакомой конфигурации: откройте подчинённый документ, нажмите «Ещё — Движения документа» и посмотрите, в каких регистрах и в каких измерениях фигурирует ссылка на основание. Заодно проверьте список реквизитов документа на наличие полей со ссылочным типом на документы. Это займёт пару минут и избавит от написания запроса вслепую.
ПЗ
Практическое замечание

Объединение нескольких видов документов в одной выборке

Задача «показать все связанные документы одной таблицей» решается через ОБЪЕДИНИТЬ ВСЕ: для каждого вида документа пишется своя секция выборки с одинаковым набором полей. Составное поле «Документ» в результате будет содержать ссылки разных типов, что удобно для отчётов и древовидных структур.

ВЫБРАТЬ

Реализация.Ссылка КАК Документ,

Реализация.Дата КАК Дата

ПОМЕСТИТЬ Связанные

ИЗ

Документ.РеализацияТоваровУслуг КАК Реализация

ГДЕ

Реализация.ЗаказПокупателя = &Заказ

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ

СчетФактура.Ссылка,

СчетФактура.Дата

ИЗ

Документ.СчетФактураВыданный КАК СчетФактура

ГДЕ

СчетФактура.ДокументОснование = &Заказ

Практический приём — помещать объединённый результат во временную таблицу (ПОМЕСТИТЬ), а затем делать из неё финальную выборку с сортировкой по дате. Это упрощает построение цепочки «основание → реализация → счёт-фактура → оплата» в правильном хронологическом порядке. Если нужна многоуровневая связь (документы, связанные со связанными), запрос усложняется: либо добавляются секции с соединением по промежуточному звену, либо логика выносится в код с рекурсивным обходом.

Имена полей во всех секциях объединения задаются по первой секции, поэтому следите за порядком и типами колонок. Несовпадение типов (например, строка разной длины) приводит к усечению значений или ошибке выполнения запроса.

Порядок построения запроса связанных документов
  1. 1
    Определите механизм связи: реквизит-основание, критерий отбора или движения по регистру
  2. 2
    Уточните точные имена реквизитов и видов документов в конфигураторе
  3. 3
    Напишите запрос с отбором по параметру-ссылке и отсеките помеченные на удаление
  4. 4
    Протестируйте запрос в консоли запросов на документе с известными связями
  5. 5
    Сравните результат с формой структуры подчинённости в пользовательском режиме
  6. 6
    При расхождении проверьте состав критерия отбора и заполнение реквизитов у конкретных документов

Проверка результата и типичные ошибки

Корректность выборки проверяют сопоставлением с эталоном. Самый доступный эталон — форма структуры подчинённости в пользовательском режиме: откройте исходный документ, вызовите связанные документы и сравните список с результатом запроса. Совпадение по количеству и составу — признак правильного запроса. Расхождение означает, что часть связей хранится иначе, чем предполагалось.

Также полезно проверить граничные случаи: документ без связанных объектов (запрос должен вернуть пустой результат, а не ошибку), документ с помеченными на удаление подчинёнными (решите осознанно — включать их в выборку или нет) и документ, у которого реквизит-основание не заполнен. Пустое основание в условии равенства параметру не совпадёт ни с чем, но если параметр сам пустой, запрос вернёт все документы с незаполненным основанием — это частый источник «лишних» строк.

Типичные ошибки
01
Не передан параметр запроса — запрос падает с ошибкой или возвращает пустой результат; всегда вызывайте УстановитьПараметр до Выполнить
02
Использовано неверное имя реквизита-основания из другой конфигурации — в разных решениях поля называются по-разному, проверяйте метаданные
03
Забыт фильтр по пометке удаления — в отчёт попадают «мусорные» документы и искажают итоги
04
Обращение через точку к полям ссылки составного типа в большом запросе — резкое падение производительности из-за неявных соединений со всеми таблицами состава
05
Ожидание, что запрос к критерию отбора повторит структуру подчинённости — в типовых конфигурациях структура может строиться программно и шире состава критерия

Отдельная группа проблем — права доступа. Если запрос выполняется под пользователем с ограниченными правами, часть видов документов может быть недоступна, и выборка окажется неполной без какой-либо ошибки. Для служебных обработок, где нужна гарантированно полная картина, запрос выполняют в привилегированном модуле, осознанно принимая риск показа данных вне прав пользователя.

Альтернативы запросу и когда они оправданы

Запрос — не единственный способ. Программно связанные документы можно получить через метод критерия отбора в коде (установка значения критерия и обход), а в типовых конфигурациях — через общие модули, формирующие структуру подчинённости: они возвращают готовую таблицу связей с учётом всей прикладной логики. Если отчёт строится на СКД, связанные документы часто выводят набором данных с соединением, не прибегая к ручному запросу.

Выбор между запросом и программным обходом зависит от объёма. Для одного документа в форме программный вызов проще и читаемее. Для пакетной обработки тысяч документов единственный разумный вариант — один запрос с группировкой, потому что обход в цикле с запросом на каждую итерацию создаёт лишнюю нагрузку на СУБД и работает на порядки медленнее.

Итог

Что важно запомнить

Сначала определите, как хранится связь: реквизит-основание, критерий отбора или измерение регистра. Под каждый механизм — свой шаблон запроса. Проверяйте результат на документе с известными связями, отсекайте помеченные на удаление и следите за производительностью при составных типах и пакетной обработке.

Частые вопросы

Можно ли одним запросом получить связанные документы всех видов, не зная их заранее?

Да, если в конфигурации есть подходящий критерий отбора — запрос к нему вернёт документы всех включённых в состав видов. Без критерия отбора придётся перечислять виды документов в секциях ОБЪЕДИНИТЬ ВСЕ, потому что каждый вид документа — отдельная таблица в базе данных.

Почему запрос не находит документ, который виден в структуре подчинённости?

Скорее всего, связь построена не через тот реквизит, который вы используете, либо структура подчинённости в этой конфигурации формируется программно с дополнительной логикой. Откройте движения документа и его реквизиты, найдите, где реально хранится ссылка на основание, и перестройте запрос под этот механизм.

Как исключить из выборки помеченные на удаление документы?

Добавьте в условие ГДЕ проверку «НЕ Таблица.ПометкаУдаления». Учтите, что у некоторых задач (например, аудиторских выгрузок) помеченные документы наоборот нужно показывать — решение зависит от назначения выборки.

Что делать, если реквизит-основание составного типа и запрос работает медленно?

Избегайте обращения через точку к реквизитам такой ссылки — используйте явное соединение с конкретной таблицей документов. Если отбор идёт по самой ссылке, убедитесь, что параметр имеет конкретный тип, а не составной: это позволяет платформе использовать индекс эффективнее.

Можно ли получить связанные документы по цепочке в несколько уровней одним запросом?

Двухуровневую цепочку (основание → реализация → счёт-фактура) можно построить соединениями: сначала выбираются документы первого уровня во временную таблицу, затем к ней присоединяется следующий уровень. Для произвольной глубины запрос не подходит — используйте рекурсивный обход в коде с накоплением уже найденных ссылок, чтобы избежать зацикливания.

Как протестировать запрос без написания обработки?

Используйте консоль запросов — встроенную в некоторые конфигурации или внешнюю обработку. Вставьте текст запроса, задайте параметр ссылкой на тестовый документ и выполните. Консоль покажет результат и позволит быстро экспериментировать с условиями до переноса текста в код.