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

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

ВЫРАЗИТЬ КАК ДокументСсылка в запросе 1С: приведение типов на практике

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

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

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

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

Синтаксис оператора ВЫРАЗИТЬ для ссылочных типов

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

Оператор допустим в секциях ВЫБРАТЬ, ГДЕ, ИМЕЮЩИЕ, в условиях соединений и в параметрах виртуальных таблиц. В отличие от приведения примитивных типов (строка, число, дата), для ссылочных типов нельзя задавать длину или точность — указывается только вид объекта.

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

Основной сценарий: сужение составного типа

Классическая ситуация — регистр, у которого измерение или реквизит имеет составной тип: например, «Документ.РеализацияТоваровУслуг» и «Документ.ВозвратТоваровПоставщику». Если обратиться к реквизиту Организация через точку от такого поля, платформа построит соединения с таблицами всех видов документов, входящих в тип. Это замедляет запрос и усложняет план выполнения.

Приведение к одному виду решает обе проблемы. Запрос ниже выбирает только движения по реализациям и сразу получает доступ к реквизитам документа:

ВЫБРАТЬ

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

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

ИЗ

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

ГДЕ

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

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

bsl
ВЫБРАТЬ
	ВЫРАЗИТЬ(Движения.Регистратор КАК Документ.ПриходныйКассовыйОрдер) КАК ДокументОплаты
ИЗ
	РегистрНакопления.ДенежныеСредства КАК Движения
ГДЕ
	Движения.Регистратор ССЫЛКА Документ.ПриходныйКассовыйОрдер

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

После приведения типа платформа «знает», что поле — это ссылка на конкретный документ, и разрешает обращение к его реквизитам через точку: .Номер, .Дата, .Контрагент, .Организация и любые прикладные реквизиты шапки. Для составного типа без приведения такая запись либо невозможна, либо порождает множественные левые соединения.

Обращение к табличной части

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

Реквизиты с точкой без приведения

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

ВЫРАЗИТЬ против ССЫЛКА и ЕСТЬNULL: что выбрать

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

ОператорНазначениеГде применяется
ВЫРАЗИТЬ ... КАКПриведение поля к типу, доступ к реквизитамВЫБРАТЬ, ГДЕ, соединения
ССЫЛКАПроверка «поле имеет нужный тип»ГДЕ, условия соединений
ЕСТЬNULLЗамена NULL заданным значениемВЫБРАТЬ, ГДЕ

На практике они комбинируются: ССЫЛКА фильтрует записи, ВЫРАЗИТЬ типизирует поле, ЕСТЬNULL подставляет значение по умолчанию, если после приведения получился NULL. Типичная связка в отчётах по регистрам с составным регистратором.

Сравнение подходов

ССЫЛКА в условии ГДЕ

Быстро отсекает записи других типов, но не даёт доступа к реквизитам документа

ВЫРАЗИТЬ в списке полей

Типизирует значение и открывает доступ к реквизитам, но сама по себе не фильтрует выборку

Связка ССЫЛКА + ВЫРАЗИТЬ

Оптимальный вариант: фильтрация на раннем этапе плюс типизированное поле для дальнейшей работы

Приведение в соединениях и виртуальных таблицах

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

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

Отдельный случай — временные таблицы в пакетных запросах. Если в временную таблицу поместить уже приведённое поле, все последующие запросы пакета работают с типизированной колонкой, что упрощает соединения и индексирование.

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

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

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

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

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

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

При работе с консолью запросов проверяйте приведение на малой выборке: добавьте ВЫБРАТЬ ПЕРВЫЕ 100 и убедитесь, что типизированное поле заполнено, а реквизиты через точку возвращают осмысленные значения. Это быстрее, чем отлаживать полный запрос.

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

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

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

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

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

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

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

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

Почему после ВЫРАЗИТЬ реквизиты документа возвращают NULL?

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

Работает ли ВЫРАЗИТЬ в параметрах виртуальных таблиц регистров?

Да, приведение допустимо в выражениях параметров виртуальных таблиц, например при отборе по регистратору определённого вида. Это помогает СУБД построить более точный план запроса, хотя в простых случаях достаточно условия с ССЫЛКА.

Можно ли получить ссылку документа из строки с его номером через ВЫРАЗИТЬ?

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

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

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

Итог

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

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