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