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

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

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

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

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

Приведение к справочнику решает три практические задачи: убирает из составного поля лишние типы (что ускоряет запрос и позволяет обращаться к реквизитам через точку без предупреждений), преобразует строковое представление ссылки в настоящую ссылку и задаёт тип для вычисляемых полей и параметров виртуальных таблиц. Без приведения платформа часто не даёт разыменовать реквизит поля, а СКД и построитель отчёта не могут корректно определить тип колонки.

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

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

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

ВЫБРАТЬ

ВЫРАЗИТЬ(Регистр.Субконто1 КАК Справочник.Номенклатура) КАК Товар,

СУММА(Регистр.СуммаОборот) КАК Сумма

ИЗ

РегистрБухгалтерии.Хозрасчетный.Обороты(, , , , , , ) КАК Регистр

СГРУППИРОВАТЬ ПО

ВЫРАЗИТЬ(Регистр.Субконто1 КАК Справочник.Номенклатура)

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

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

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

Второй случай — соединение таблиц по составному полю. Соединение ПО Таб1.Поле = Таб2.Ссылка, где Поле составное, работает медленно и может давать неочевидные планы запроса на СУБД. Приведение обеих сторон к одному типу помогает оптимизатору использовать индексы.

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

Маршрут решения

Как выбрать действие

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

Приведение составных полей и субконто

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

ВЫБРАТЬ

ВЫРАЗИТЬ(Обороты.Субконто1 КАК Справочник.Номенклатура) КАК Товар,

ВЫРАЗИТЬ(Обороты.Субконто1 КАК Справочник.Номенклатура).Артикул КАК Артикул,

Обороты.СуммаОборот КАК Сумма

ИЗ

РегистрБухгалтерии.Хозрасчетный.Обороты(, , , , , , ) КАК Обороты

ГДЕ

Обороты.Субконто1 ССЫЛКА Справочник.Номенклатура

Условие ССЫЛКА Справочник.Номенклатура отсекает записи с другими типами субконто ещё до приведения. Без него строки с контрагентами вернут NULL в колонке «Товар», и при группировке появится строка с пустой ссылкой — это сбивает итоги и путает пользователей отчёта.

Аналогичный подход работает для реквизитов документов с составным типом, например «ДокументОснование» или «Контрагент/Договор» в старых конфигурациях, а также для значений дополнительных реквизитов, хранящихся в плане видов характеристик.

ВЫРАЗИТЬ и строки: что можно, а что нельзя

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

Если в регистре сведений или внешнем источнике хранится наименование или код элемента справочника, правильный путь — соединение с таблицей справочника по этому полю:

ВЫБРАТЬ

Данные.КодТовара КАК КодТовара,

Номенклатура.Ссылка КАК Товар

ИЗ

РегистрСведений.ВнешниеДанные КАК Данные

ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура

ПО Данные.КодТовара = Номенклатура.Код

Если сопоставление по коду не дало результата, поле «Товар» будет NULL — это нормальный индикатор того, что элемент не найден, и такие строки стоит выводить в отдельный отчёт для разбора, а не молча терять.

Типичные ошибки
01
Попытка привести строку с GUID к ссылке через ВЫРАЗИТЬ — результат всегда NULL, нужна подстановка через соединение или код на встроенном языке
02
Приведение типа в ВЫБРАТЬ, но не в условии соединения — соединение идёт по составному полю, запрос тормозит
03
Отсутствие фильтра ССЫЛКА Справочник.Имя — в выборке появляются строки с NULL вместо ссылки
04
Приведение к справочнику поля, которое уже имеет нужный тип — лишняя операция и шум в тексте запроса
05
Использование ВЫРАЗИТЬ вместо проверки ТИПЗНАЧЕНИЯ, когда нужно просто определить тип значения

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

При соединении с таблицей справочника по составному полю приводите обе стороны условия к одному типу. Это позволяет СУБД использовать индекс по ссылке вместо полного перебора:

ВЫБРАТЬ

Заказы.Номер КАК Номер,

Контрагенты.Наименование КАК Контрагент

ИЗ

Документ.ЗаказПокупателя КАК Заказы

ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты

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

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

Для динамических списков и СКД приведение типа в полях набора данных дополнительно даёт корректные отборы: пользователь сможет выбрать в отборе именно элемент справочника, а не «значение составного типа».

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

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

После добавления приведения проверьте запрос в консоли запросов: колонка должна иметь тип «СправочникСсылка.Имя», значения должны открываться как элементы справочника, а строк с NULL не должно быть (если вы добавили фильтр ССЫЛКА). Если NULL остаются — либо фильтр пропущен, либо в данных есть битые ссылки вида «Объект не найден».

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

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

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

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

Тип колонки в консоли запросов
Норма

СправочникСсылка.ИмяСправочника

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

Составной тип или Строка — приведение не сработало

Значения в колонке
Норма

Ссылки открываются, реквизиты доступны через точку

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

NULL в строках, где должны быть ссылки

Количество строк до и после фильтра ССЫЛКА
Норма

Убраны только строки с чужими типами

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

Пропали нужные строки — проверьте тип поля в конфигураторе

Скорость запроса
Норма

Соединение по индексу, время приемлемое

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

Полный перебор — приведение не добавлено в условие соединения

Альтернативы и смежные приёмы

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

Для получения ссылки по строковому идентификатору вне запроса применяется метод Справочники.Имя.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаГУИД)) — но это код на встроенном языке, а не язык запросов. В связке «запрос + код» типичный приём: выгрузить строки с GUID во временную таблицу, в коде получить ссылки, вернуть их в запрос для дальнейшей обработки.

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

Итог

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

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

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

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

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

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

Нет. Язык запросов не преобразует строковые представления в ссылки. Получить ссылку по GUID можно только в коде через Справочники.Имя.ПолучитьСсылку(УникальныйИдентификатор), а в запросе — соединением со справочником по коду или другому реквизиту.

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

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

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

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

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

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

Как найти битые ссылки через приведение?

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