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