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

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

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

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

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

Типичная ситуация: у регистра или документа есть поле составного типа — например, «ДокументОснование», которое может хранить ссылку на заказ, поступление или счёт. Если обратиться к реквизиту такого поля напрямую, запрос вернёт ошибку или NULL. Приведение типа решает задачу декларативно, прямо в тексте запроса.

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

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

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

Для ссылочных типов, в отличие от примитивных, параметры длины и точности не указываются — достаточно имени вида документа: Документ.ЗаказКлиента, Документ.ПоступлениеТоваровУслуг. Имя должно точно совпадать с именем объекта метаданных, включая регистр букв в соответствии с конфигурацией.

Приведение возможно только к типу, который входит в состав типа исходного поля. Если поле объявлено как «ДокументСсылка.ЗаказКлиента» и ничего больше, приводить его к Документ.РеализацияТоваровУслуг бессмысленно — результат всегда будет NULL. Проверить состав типа можно в конфигураторе, открыв свойства реквизита.

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

Самый частый сценарий — вытащить реквизит документа-основания в отчёт. Допустим, у реализации есть поле «ЗаказКлиента» составного типа, и нужно показать номер и дату заказа. Без приведения обращение Реализация.ЗаказКлиента.Номер не сработает корректно для составного поля.

С приведением запрос выглядит так:

ВЫБРАТЬ

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

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

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

ИЗ

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

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

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

Фильтрация записей по виду документа

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

ВЫБРАТЬ

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

Расчеты.Сумма КАК Сумма

ИЗ

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

ГДЕ

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

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

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

Способы проверить тип ссылки

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

Подходит, когда дальше нужны реквизиты документа; универсально, но запись длиннее

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

Короткая проверка типа без доступа к реквизитам; оптимальна для простой фильтрации

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

Используется реже; удобно в СКД и при динамическом сравнении типов

Приведение типов в полях СКД и динамических списках

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

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

При работе в консоли запросов проверяйте результат приведения на небольшой выборке с ограничением ПЕРВЫЕ, прежде чем переносить текст в модуль. Так быстрее заметить, что поле приведено не к тому виду документа.

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

Ограничения и частые ошибки

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

Оператор нельзя применять к полям, полученным агрегатными функциями, и в ряде случаев — к выражениям с уже выполненным разыменованием. Если конструктор запросов подсвечивает ошибку, проверьте, не пытаетесь ли вы привести результат соединения или вложенного запроса без повторного объявления поля.

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

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

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

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

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

Для запросов, уходящих в продакшен-код, добавьте в модуль обработку NULL-значений: функции ЕСТЬNULL(Выражение, ЗначениеПоУмолчанию) в самом запросе или проверки ЗначениеЗаполнено() при обходе выборки. Это защитит от неожиданных пустых значений при выводе в отчёты и печатные формы.

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

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

Колонка с приведённым полем
Норма

Заполнена для строк с нужным типом, NULL для остальных

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

NULL во всех строках — ошибка в имени типа или составе поля

ТИПЗНАЧЕНИЯ(Поле) в тестовой выборке
Норма

Показывает ожидаемые виды документов

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

Тип не совпадает с тем, к которому приводите

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

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

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

Резкое замедление — пересмотрите фильтры по разыменованным полям

Часто задаваемые вопросы

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

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

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

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

Почему после приведения реквизит показывает NULL, хотя документ заполнен?

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

Работает ли ВЫРАЗИТЬ с перечислениями и справочниками?

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

Влияет ли приведение типа на производительность запроса?

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

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

В параметрах виртуальных таблиц приведение напрямую не применяется — там используются переданные параметры. Приведение выполняется в основном тексте запроса над полями выборки или в условиях соединений и отборов.

Итог

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

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