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