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

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

Как в запросе указать тип документа 1С 8.3

Как указать тип документа в запросе 1С 8.3: функция ТипЗначения, параметр типа ДокументСсылка, оператор ССЫЛКА, отбор по виду документа, примеры кода и ошибки.

Указать тип документа в запросе 1С 8.3 — типовая задача при работе с полями составного типа, виртуальными таблицами и параметрами запроса. Платформа предлагает несколько механизмов: функцию ТипЗначения() для сравнения типа ссылки, оператор ССЫЛКА для проверки принадлежности к виду документа, а также передачу конкретной ссылки через параметр с явной типизацией.

Выбор способа зависит от контекста. Если нужно отобрать записи регистра, где регистратор — конкретный вид документа, удобнее всего ВЫРАЗИТЬ или ССЫЛКА. Если требуется сравнить тип значения в поле составного типа — используется ТипЗначения() совместно с литералом ТИП(Документ.ИмяДокумента). Ниже разобраны все основные приёмы с готовыми фрагментами кода.

Все примеры применимы к управляемым и обычным формам, к консоли запросов и к программному выполнению запросов через объект Запрос. Синтаксис языка запросов един для всей линейки платформы 8.3.

Способы указания типа документа в запросе

В языке запросов 1С существует четыре рабочих подхода к указанию типа документа. Первый — функция ТипЗначения(), которая возвращает тип значения поля и позволяет сравнить его с литералом типа. Второй — оператор ССЫЛКА, проверяющий, относится ли ссылка к указанному виду документа. Третий — оператор ВЫРАЗИТЬ, приводящий поле составного типа к конкретному типу. Четвёртый — передача параметра с явным указанием типа ДокументСсылка.ИмяДокумента.

Практическое различие между ними влияет и на производительность. Условие ССЫЛКА и приведение через ВЫРАЗИТЬ обычно эффективнее, потому что позволяют СУБД использовать индексы и соединения по таблице конкретного документа. Сравнение через ТипЗначения() — универсальный, но более тяжёлый вариант, особенно на больших таблицах.

Сравнение способов указания типа

ТипЗначения() = Тип(Документ.Х)

Универсальный отбор по типу поля составного типа. Медленнее на больших таблицах, не всегда использует индексы.

Поле ССЫЛКА Документ.Х

Лаконичная проверка вида документа. Хорошо работает в условиях ГДЕ, читается проще.

ВЫРАЗИТЬ(Поле КАК Документ.Х)

Приведение типа для соединений и обращения к реквизитам. Отсекает записи других типов при соединении.

Параметр типа ДокументСсылка.Х

Передача конкретной ссылки или проверки типа параметра. Используется при программном выполнении запроса.

Отбор по типу через ТипЗначения и ТИП

Функция ТипЗначения() принимает поле запроса и возвращает его тип. Для сравнения используется литерал ТИП(Документ.ИмяДокумента). Типичный сценарий — отбор записей регистра сведений или накопления, где поле составного типа может хранить ссылки на разные документы.

ВЫБРАТЬ

Расчеты.Контрагент,

Расчеты.ДокументРасчетов

ИЗ

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

ГДЕ

ТипЗначения(Расчеты.ДокументРасчетов) = ТИП(Документ.ПоступлениеТоваровУслуг)

Обратите внимание: в литерале ТИП() указывается имя объекта метаданных без кавычек, в формате Документ.ИмяДокумента. Если имя документа указано с ошибкой, запрос не пройдёт проверку в конструкторе — это удобный способ самопроверки ещё до выполнения.

Для проверки нескольких видов документов сравнение комбинируется через ИЛИ либо тип проверяется через оператор В со списком значений типов — однако конструкция ТипЗначения(Поле) В (...) поддерживается не во всех режимах совместимости, поэтому надёжнее перечислять условия через ИЛИ.

Проверка вида документа оператором ССЫЛКА

Оператор ССЫЛКА проверяет, является ли значение поля ссылкой на документ указанного вида. Синтаксис компактнее, чем у ТипЗначения, и часто предпочтительнее в условиях отбора.

ВЫБРАТЬ

Взаиморасчеты.Регистратор,

Взаиморасчеты.Сумма

ИЗ

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

ГДЕ

Взаиморасчеты.Регистратор ССЫЛКА Документ.ПриходныйКассовыйОрдер

Важная особенность: ССЫЛКА возвращает истину и для «битых» ссылок соответствующего вида, потому что проверяется именно тип значения, а не существование объекта в базе. Если нужно исключить битые ссылки, добавьте проверку на существование через соединение с таблицей документа или условие НЕ Документ.Ссылка ЕСТЬ NULL.

Приведение составного типа через ВЫРАЗИТЬ

Когда поле имеет составной тип (например, регистратор регистра накопления), обратиться к реквизитам документа напрямую нельзя — сначала поле нужно привести к конкретному типу оператором ВЫРАЗИТЬ. После приведения становятся доступны реквизиты документа через точку.

ВЫБРАТЬ

Продажи.Регистратор,

ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.РеализацияТоваровУслуг).Организация КАК Организация

ИЗ

РегистрНакопления.Продажи КАК Продажи

ГДЕ

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

Рекомендуется всегда сочетать ВЫРАЗИТЬ с условием ССЫЛКА в секции ГДЕ. Без отбора платформа построит соединение со всеми таблицами видов документов, входящих в составной тип, что резко увеличивает стоимость запроса. С условием же соединение выполняется только с нужной таблицей.

ВЫРАЗИТЬ без отбора по типу — одна из главных причин медленных запросов к регистрам. Всегда добавляйте в ГДЕ условие Регистратор ССЫЛКА Документ.ИмяДокумента: план запроса станет заметно легче, особенно если регистратор имеет десятки возможных видов.
ПЗ
Практическое замечание

Указание типа документа в параметре запроса

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

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Реализация.Ссылка,

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

|ИЗ

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

|ГДЕ

| Реализация.Ссылка = &ДокументСсылка";

Запрос.УстановитьПараметр("ДокументСсылка", ТекущийДокумент);

Если параметр должен принимать только определённый вид документа, но значение приходит составного типа, полезно проверить тип на стороне встроенного языка до выполнения запроса: Если ТипЗнч(ТекущийДокумент) = Тип("ДокументСсылка.РеализацияТоваровУслуг") Тогда .... Это защищает от логических ошибок, когда в запрос попадает ссылка не того вида и результат молча оказывается пустым.

Параметр-список документов одного вида

Для отбора по списку документов параметр передаётся как массив или список значений, а в тексте запроса используется условие В (&СписокДокументов). Все элементы списка должны быть ссылками одного вида — иначе условие корректно отработает, но читаемость и диагностика ошибок усложнятся.

Тип документа в виртуальных таблицах и соединениях

В параметрах виртуальных таблиц регистров отбор по типу регистратора задаётся прямо в круглых скобках после имени таблицы. Это важно для производительности: условие в параметрах виртуальной таблицы применяется на уровне выборки, а не после соединения.

ВЫБРАТЬ

Остатки.Номенклатура,

Остатки.КоличествоОборот

ИЗ

РегистрНакопления.ТоварыНаСкладах.Обороты(

, , Регистратор,

Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг) КАК Остатки

Отдельный сценарий — критерии отбора и поле ТипСсылки в журналах документов. В запросах к таблице журнала (например, ЖурналДокументов.СкладскиеДокументы) тип документа доступен как поле Ссылка составного типа, и к нему применимы те же приёмы: ССЫЛКА, ТипЗначения, ВЫРАЗИТЬ.

Порядок действий
  1. 1
    Определите, где нужен тип документа: отбор, соединение или обращение к реквизитам.
  2. 2
    Для простого отбора используйте условие Поле ССЫЛКА Документ.ИмяДокумента.
  3. 3
    Для доступа к реквизитам добавьте ВЫРАЗИТЬ(Поле КАК Документ.ИмяДокумента).
  4. 4
    Проверьте запрос в консоли запросов на реальных данных и сравните количество записей.
  5. 5
    Убедитесь, что в плане запроса нет соединений со всеми таблицами составного типа.

Типичные ошибки и ограничения

Самая распространённая ошибка — сравнение ссылки со строковым именем типа: ГДЕ Регистратор = "РеализацияТоваровУслуг". Такое условие всегда ложно, потому что ссылка никогда не равна строке. Тип задаётся только через ТИП(Документ.Имя), ССЫЛКА или параметр-ссылку.

Вторая ошибка — использование ВЫРАЗИТЬ к полю, которое уже имеет одиночный тип. Платформа это допускает, но конструкция бессмысленна и затрудняет чтение. Третья — попытка указать в ВЫРАЗИТЬ тип, не входящий в составной тип поля: запрос вернёт NULL для всех записей, и причину придётся искать в настройках состава типа в конфигураторе.

Типичные ошибки
01
Сравнение ссылки со строкой имени документа — условие всегда ложно, результат пустой.
02
ВЫРАЗИТЬ без отбора ССЫЛКА — соединение со всеми таблицами составного типа и резкое падение скорости.
03
Опечатка в имени документа внутри ТИП() — запрос не проходит проверку, но в динамически собранном тексте ошибка всплывёт только при выполнении.
04
Ожидание, что ССЫЛКА отсечёт битые ссылки — оператор проверяет только тип, а не существование объекта.

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

Проверка результата

После написания запроса проверьте его в консоли запросов на копии базы или на тестовых данных. Контрольные признаки корректной работы: количество записей соответствует ожидаемому виду документов, реквизиты, полученные через ВЫРАЗИТЬ, заполнены, а не содержат NULL, время выполнения не растёт непропорционально объёму данных.

Контрольные точки

Как проверить результат

Состав выборки
Норма

Все записи относятся к нужному виду документа

Тревожный признак

Попадают документы других видов или пустой результат при заведомо существующих данных

Реквизиты через ВЫРАЗИТЬ
Норма

Поля заполнены значениями

Тревожный признак

Все поля NULL — тип не входит в составной тип поля

Скорость выполнения
Норма

Запрос отрабатывает за приемлемое время

Тревожный признак

Резкое замедление — вероятно, нет отбора ССЫЛКА при ВЫРАЗИТЬ

Итог

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

Тип документа в запросе 1С 8.3 задаётся через ССЫЛКА для отбора, ТипЗначения() = ТИП(Документ.Имя) для сравнения типов и ВЫРАЗИТЬ для доступа к реквизитам. Всегда сочетайте ВЫРАЗИТЬ с отбором по типу и помните, что ССЫЛКА не отсекает битые ссылки.

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

Как указать несколько видов документов в одном условии?

Перечислите условия через ИЛИ: Регистратор ССЫЛКА Документ.ПриходныйОрдер ИЛИ Регистратор ССЫЛКА Документ.РасходныйОрдер. Альтернатива — создать временную таблицу со списком нужных ссылок и соединиться с ней.

Чем ССЫЛКА отличается от ТипЗначения?

Оба проверяют тип значения поля. ССЫЛКА короче и лучше читается в условиях ГДЕ, а ТипЗначения удобна, когда тип нужно получить как значение, например, для группировки или вывода в результат запроса.

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

Да, если виртуальная таблица поддерживает отбор по регистратору, условие Регистратор ССЫЛКА Документ.ИмяДокумента указывается прямо в параметрах в круглых скобках. Это эффективнее, чем фильтрация в секции ГДЕ.

Почему ВЫРАЗИТЬ возвращает NULL для всех записей?

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

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

На встроенном языке используйте ТипЗнч(Значение) = Тип("ДокументСсылка.ИмяДокумента"). Это позволяет заранее отсечь неподходящие значения и выдать понятное сообщение вместо пустого результата запроса.

Работает ли отбор по типу в СКД?

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