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