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

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

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

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

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

Типичная ситуация: в документе есть реквизит составного типа «Контрагент», который может содержать ссылку на справочник «Контрагенты» или «Организации». Чтобы в запросе получить реквизит «ИНН», поле сначала приводят к типу Справочник.Контрагенты, и только потом обращаются к реквизиту. Если этого не сделать, конструктор запроса не покажет реквизиты, а попытка написать обращение вручную приведёт к ошибке исполнения.

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

Когда требуется приведение к типу Справочник

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

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

Синтаксис ВЫРАЗИТЬ КАК Справочник

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

Пример: выбрать контрагентов из реализации и достать их ИНН:

ВЫБРАТЬ

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

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

ИЗ

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

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

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

Приведение составных типов и работа с NULL

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

Если реквизит составной и нужно обработать оба варианта, применяют ВЫБОР с проверкой через ВЫРАЗИТЬ или функцию ЕСТЬNULL:

ВЫБРАТЬ

ЕСТЬNULL(ВЫРАЗИТЬ(Док.Плательщик КАК Справочник.Контрагенты).Наименование,

ВЫРАЗИТЬ(Док.Плательщик КАК Справочник.Организации).Наименование) КАК Плательщик

ИЗ

Документ.ПлатежноеПоручение КАК Док

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

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

Соединения и параметры через ВЫРАЗИТЬ

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

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

Производительность и типичные ошибки

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

Вторая группа ошибок — логические. Разработчик приводит поле к неправильному справочнику (например, к «Номенклатура» вместо «НоменклатураПоставщиков»), получает сплошные NULL и ошибочно считает, что данных нет. Третья ошибка — приведение поля, которое уже имеет одиночный тип: запрос выполнится, но текст станет избыточным и труднее для сопровождения.

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

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

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

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

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

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

Заполненность приведённой колонки
Норма

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

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

Сплошные NULL при заведомо заполненных данных — неверное имя справочника

Количество строк результата
Норма

Совпадает с выборкой без приведения (если не было отбора)

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

Строк стало меньше — приведение использовано как скрытый фильтр

Время выполнения запроса
Норма

Сопоставимо с запросом без ВЫРАЗИТЬ в условиях

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

Резкий рост времени — приведение в ГДЕ или соединении отключило индекс

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

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

Нет. ВЫРАЗИТЬ не выполняет поиск объекта, а только указывает запросу, как трактовать уже существующее значение. Для получения ссылки по наименованию нужно соединение со справочником по полю Наименование или поиск методом НайтиПоНаименованию() в коде.

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

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

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

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

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

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

Нужно ли приводить поле, если у реквизита одиночный тип справочника?

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

Как привести значение дополнительного реквизита к справочнику?

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

Итог

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

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