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

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

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

Как указать вид документа в запросе 1С: ВЫРАЗИТЬ, ТИПЗНАЧЕНИЯ, ссылки на конкретный документ, виртуальные таблицы. Примеры кода и типичные ошибки.

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

Проблема в том, что в языке запросов 1С нельзя напрямую написать условие вида «Документ = РеализацияТоваровУслуг». Тип документа — это не значение, а метаданные, поэтому для фильтрации используются специальные конструкции: функция ТИПЗНАЧЕНИЯ, оператор ССЫЛКА, перечисление ТипДокумента или явное указание таблицы документа.

Ниже разобраны все рабочие способы указать вид документа в запросе: от простого сравнения по типу до отбора через параметр и работы с виртуальными таблицами. Примеры приведены на встроенном языке запросов 1С и подходят для большинства типовых и самописных конфигураций.

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

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

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

Сравнение способов

ССЫЛКА Документ.Имя

Подходит для отбора по типу ссылки в условии ГДЕ. Работает быстро, но применим только к ссылочным полям.

ТИПЗНАЧЕНИЯ(Поле) = ТИП(Документ.Имя)

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

Выборка из таблицы Документ.Имя

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

Отбор по виду через оператор ССЫЛКА

Оператор ССЫЛКА проверяет, что значение поля является ссылкой на объект указанного типа. Это самый читаемый способ отфильтровать документы нужного вида в условии ГДЕ:

ВЫБРАТЬ

ДокументыОплаты.ДокументОснование КАК Основание

ИЗ

РегистрСведений.ДокументыОплаты КАК ДокументыОплаты

ГДЕ

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

Такой запрос вернёт только те записи регистра, где основание — именно «Реализация товаров и услуг», даже если поле «ДокументОснование» имеет составной тип из десятка документов. Для отрицания используется конструкция НЕ ... ССЫЛКА.

Важно понимать: ССЫЛКА проверяет тип ссылки, а не существование документа в базе. Если в поле лежит «битая» ссылка нужного типа, условие всё равно сработает.

Проверка типа через ТИПЗНАЧЕНИЯ и ТИП

Функция ТИПЗНАЧЕНИЯ возвращает тип значения поля, а функция ТИП — тип по имени метаданных. Их комбинация даёт альтернативный способ фильтрации:

ВЫБРАТЬ

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

ИЗ

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

ГДЕ

ТИПЗНАЧЕНИЯ(Взаиморасчеты.ДокументРасчетов) = ТИП(Документ.ПоступлениеТоваровУслуг)

Этот вариант удобен, когда нужно вывести тип в результат запроса — например, сгруппировать записи по видам документов. Поле с ТИПЗНАЧЕНИЯ можно поместить в секцию ВЫБРАТЬ и использовать в группировках и итогах.

Недостаток — производительность: вычисление типа для каждой строки большой таблицы обходится дороже, чем проверка через ССЫЛКА. Если тип нужен только для отбора, предпочтительнее оператор ССЫЛКА.

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

Обращение к реквизитам через ВЫРАЗИТЬ

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

ВЫБРАТЬ

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

ИЗ

РегистрСведений.Оплаты КАК Оплаты

ГДЕ

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

ВЫРАЗИТЬ приводит составное поле к указанному типу, после чего через точку доступны реквизиты конкретного документа. Если в поле окажется ссылка другого вида, результат выражения будет NULL.

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

Передача вида документа через параметр

Жёстко прописывать имя документа в тексте запроса не всегда удобно — например, когда один и тот же запрос должен работать с разными видами в зависимости от настроек пользователя. Здесь есть два подхода.

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

ИмяДокумента = "РеализацияТоваровУслуг";

ТекстЗапроса = "ВЫБРАТЬ Док.Ссылка ИЗ Документ." + ИмяДокумента + " КАК Док

|ГДЕ Док.Дата МЕЖДУ &НачалоПериода И &КонецПериода";

Запрос = Новый Запрос(ТекстЗапроса);

При программной подстановке имени обязательно проверяйте, что такое имя существует в метаданных, через Метаданные.Документы.Найти(ИмяДокумента). Иначе при опечатке запрос упадёт с ошибкой уже на этапе выполнения.

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

Отбор документов через виртуальные таблицы и журналы

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

ВЫБРАТЬ

Журнал.Ссылка КАК Документ,

Журнал.Дата КАК Дата

ИЗ

ЖурналДокументов.СкладскиеДокументы КАК Журнал

ГДЕ

Журнал.Ссылка ССЫЛКА Документ.ПриходныйОрдерНаТовары

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

Учтите, что фильтрация по типу регистратора в секции ГДЕ виртуальной таблицы Обороты может привести к полному расчёту оборотов с последующим отбрасыванием строк. Если записей много, эффективнее соединить физическую таблицу регистра с таблицей нужного документа по ссылке.

Типичные ошибки
01
Обращение к реквизиту составного поля без ВЫРАЗИТЬ — запрос падает с ошибкой «Поле не найдено».
02
Сравнение ссылки со строкой имени документа — типы несовместимы, условие никогда не выполняется.
03
Использование синонима вместо имени метаданных в конструкции Документ.Имя — ошибка при выполнении запроса.
04
Отбор по типу в ГДЕ виртуальной таблицы Обороты без параметров — резкое падение производительности на больших объёмах.
05
Отсутствие проверки на NULL после ВЫРАЗИТЬ — в отчёт попадают пустые значения реквизитов.

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

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

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

Итог

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

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

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

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

Да. Используйте несколько условий ССЫЛКА через ИЛИ: Поле ССЫЛКА Документ.ПриходныйОрдер ИЛИ Поле ССЫЛКА Документ.РасходныйОрдер. Альтернатива — ТИПЗНАЧЕНИЯ(Поле) В (ТИП(Документ.ПриходныйОрдер), ТИП(Документ.РасходныйОрдер)).

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

Выведите поле ТИПЗНАЧЕНИЯ(Поле) — в результате оно отобразится как тип. Для пользовательского представления вида удобнее вывести само поле ссылки: его строковое представление включает вид документа и номер.

Почему условие ССЫЛКА не отбирает записи, хотя документы нужного вида есть?

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

Можно ли указать вид документа в СКД?

Да, те же конструкции работают в тексте запроса схемы компоновки данных. Дополнительно в СКД можно вынести отбор по типу в настройки, используя вычисляемое поле с ТИПЗНАЧЕНИЯ.

Что быстрее: ССЫЛКА или ТИПЗНАЧЕНИЯ?

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