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

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

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

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

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

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

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

Зачем приводить поле к типу документа

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

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

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

Синтаксис ВЫРАЗИТЬ для документа

Базовая форма выглядит так:

ВЫБРАТЬ

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

ИЗ

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

Чтобы получить реквизит документа, приведение оборачивают в скобки и обращаются через точку:

ВЫБРАТЬ

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

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

ИЗ

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

В конструкторе запросов то же самое делается визуально: на закладке «Таблицы и поля» поле раскрывается только после того, как в свойствах поля задано приведение типа, либо выражение вводится вручную на закладке «Условия» и «Дополнительно».

bsl
ВЫБРАТЬ
    (ВЫРАЗИТЬ(Таб.Основание КАК Документ.ЗаказКлиента)).Дата КАК ДатаЗаказа
ИЗ
    Документ.РеализацияТоваровУслуг КАК Таб
ГДЕ
    Таб.Основание ССЫЛКА Документ.ЗаказКлиента

Приведение типа в условиях и фильтрация по виду документа

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

Первый — проверка типа через ССЫЛКА: ГДЕ Таб.Основание ССЫЛКА Документ.ЗаказКлиента. Это самый читаемый и обычно самый быстрый способ отфильтровать по виду документа.

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

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

Сравнение способов фильтрации по виду документа

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

Рекомендуемый вариант для условия ГДЕ: короткий, понятный, хорошо оптимизируется.

ВЫРАЗИТЬ + ЕСТЬ NULL

Подходит, когда приведённое значение уже вычисляется в запросе; в чистом условии избыточен.

ТИПЗНАЧЕНИЯ + ТИП

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

Типовые сценарии применения

Разворот реквизитов документа-основания

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

Объединение данных разных документов

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

ВЫБРАТЬ

ВЫБОР

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

ТОГДА (ВЫРАЗИТЬ(Таб.Документ КАК Документ.ПриходныйКассовыйОрдер)).Касса

ИНАЧЕ NULL

КОНЕЦ КАК Касса

ИЗ

РегистрНакопления.ДенежныеСредства КАК Таб

Параметры виртуальных таблиц

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

Ограничения и подводные камни

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

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

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

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

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

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

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

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

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

Приведённое поле для строк нужного вида документа
Норма

Заполнено ссылкой, реквизиты через точку доступны

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

NULL при совпадающем типе — вероятна битая ссылка

Строки с документом другого вида
Норма

Приведённое поле равно NULL

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

Появляются значения — ошибка в синтаксисе ВЫРАЗИТЬ

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

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

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

Резкое замедление после добавления ВЫРАЗИТЬ в условие — проверьте план запроса

Типичные ошибки

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

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

Чем ВЫРАЗИТЬ отличается от ССЫЛКА в запросе?

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

Почему после ВЫРАЗИТЬ поле равно NULL, хотя документ точно того вида?

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

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

Нет, ВЫРАЗИТЬ принимает один конкретный тип. Если нужно обработать несколько видов, пишут отдельные приведения для каждого и собирают результат через ВЫБОР или ОБЪЕДИНИТЬ ВСЕ.

Работает ли ВЫРАЗИТЬ с документом в СКД?

Да, оператор поддерживается в тексте запроса набора данных. Но поля, полученные через точку после приведения, нужно аккуратно добавить в выбранные поля и проверить отчёт на реальных данных — ошибки проявляются на этапе формирования, а не редактирования.

Нужно ли ВЫРАЗИТЬ, если поле имеет единственный тип документа?

Нет. Если реквизит объявлен строго как Документ.Имя, реквизиты доступны через точку напрямую, и приведение типа ничего не добавит — только удлинит текст запроса.

Влияет ли ВЫРАЗИТЬ на производительность?

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

Итог

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

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