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

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

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

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

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

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

Ниже разобран синтаксис, практические примеры с документами, отличия от ВЫБОР КОГДА, типичные ошибки и способы проверить результат до включения запроса в рабочий код.

Что делает ВЫРАЗИТЬ и когда оно нужно

ВЫРАЗИТЬ — это оператор языка запросов, который выполняет приведение типа значения. Он работает в двух направлениях: приводит ссылочные поля составного типа к конкретному объекту метаданных (справочнику, документу, плану счетов) и изменяет длину или точность примитивных типов — строки, числа, даты.

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

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

Синтаксис приведения к типу документа

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

ВЫБРАТЬ

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

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

Товары.Номенклатура,

Товары.Количество

ИЗ

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

ГДЕ

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

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

Условие ГДЕ с оператором ССЫЛКА в примере дублирует фильтрацию: оно отсекает лишние типы ещё на этапе выборки, что снижает объём обрабатываемых данных. Это необязательно, но полезно для производительности на больших таблицах.

Практические сценарии с документами

Получение реквизитов регистратора

Классическая задача — построить отчёт по движениям регистра с расшифровкой по реквизитам документа-регистратора: организация, склад, договор. Поскольку регистратором может быть несколько видов документов, для каждого вида пишется своё приведение, а результаты объединяются через ЕСТЬNULL или объединение подзапросов.

ВЫБРАТЬ

Движения.Номенклатура,

ЕСТЬNULL(ВЫРАЗИТЬ(Движения.Регистратор КАК Документ.ПоступлениеТоваров).Склад,

ВЫРАЗИТЬ(Движения.Регистратор КАК Документ.ПеремещениеТоваров).СкладПолучатель) КАК Склад

ИЗ

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

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

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

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

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

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

ВЫРАЗИТЬ против ВЫБОР КОГДА и ССЫЛКА

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

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

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

Сравнение вариантов

ВЫРАЗИТЬ

Единственный способ добраться до реквизитов конкретного вида документа в запросе. Ограничение: несовместимые типы дают NULL

Оператор ССЫЛКА

Быстрая фильтрация по типу без приведения. Не открывает доступ к реквизитам

ВЫБОР КОГДА + ТИПЗНАЧЕНИЯ

Гибкое ветвление для нескольких типов. Громоздко и медленнее при большом числе веток

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

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

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

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

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

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

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

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

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

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

Значение приведённого поля
Норма

Ссылка на документ нужного вида, реквизиты доступны

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

NULL во всех строках при наличии таких документов в базе

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

Совпадает с числом документов нужного вида в выборке

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

Меньше ожидаемого — проверьте имя документа и состав типов поля

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

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

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

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

Границы применения и альтернативы

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

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

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

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

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

Почему после ВЫРАЗИТЬ все значения стали NULL?

Чаще всего указанное имя документа не входит в состав типов поля или в данных нет ссылок этого вида. Проверьте состав типов в конфигураторе и фактические типы через ТИПЗНАЧЕНИЯ(Поле).

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

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

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

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

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

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

Влияет ли ВЫРАЗИТЬ на данные в базе?

Нет. Это вычислимое выражение на момент выполнения запроса, оно ничего не записывает и не изменяет в таблицах.

Итог

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

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