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