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

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

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

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

Функция ВЫРАЗИТЬ в языке запросов 1С приводит значение поля к указанному типу. Одна из самых частых задач — привести поле составного типа или строковое представление к типу СправочникСсылка.ИмяСправочника, чтобы затем обратиться к реквизитам через точку, выполнить соединение или сгруппировать данные без неоднозначности типов.

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

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

Синтаксис ВЫРАЗИТЬ и базовый пример

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

ВЫБРАТЬ

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

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

ИЗ

РегистрСведений.СвойстваОбъектов КАК Данные

ГДЕ

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

Здесь поле «Объект» имеет составной тип. Приведение позволяет обратиться к реквизиту «Артикул» через точку — без ВЫРАЗИТЬ конструктор запросов не даст развернуть поле составного типа, а запрос на уровне СУБД будет вынужден делать лишние соединения ко всем таблицам состава типа.

Приведение составного типа к одному справочнику

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

ВЫБРАТЬ

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

Регистр.Значение КАК Значение

ИЗ

РегистрСведений.ДополнительныеСведения КАК Регистр

ГДЕ

Регистр.Владелец ССЫЛКА Справочник.Контрагенты

Условие ССЫЛКА Справочник.Контрагенты отсекает записи с другими типами ещё на этапе выборки, что ускоряет запрос. ВЫРАЗИТЬ в списке полей даёт доступ к реквизиту «ИНН». Формально можно обойтись только ВЫРАЗИТЬ — записи с чужими типами дадут NULL, — но явный фильтр снижает объём обрабатываемых данных.

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

ВЫРАЗИТЬ в параметрах виртуальных таблиц и соединениях

Вторая частая задача — передать в параметр виртуальной таблицы значение составного типа. Например, параметр «Субконто1» виртуальной таблицы остатков по счёту с составным видом субконто. Если передать параметр-список без приведения, платформа может построить неоптимальный план. Приведение прямо в параметре решает проблему:

ВЫБРАТЬ

Остатки.СуммаОстаток КАК Сумма

ИЗ

РегистрБухгалтерии.Хозрасчетный.Остатки(

&Период,

Счет = &Счет,

,

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

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

Если запрос с соединением по составному полю внезапно «завис» после добавления нового типа в состав поля — почти всегда причина в отсутствии ВЫРАЗИТЬ. Каждый новый тип в составе добавляет лишнее соединение в план запроса.
ПЗ
Практическое замечание

Чего ВЫРАЗИТЬ не умеет: строка в ссылку

Частая ошибка новичков — попытка превратить строку с кодом или наименованием в ссылку через ВЫРАЗИТЬ. Такое приведение синтаксически допустимо только между совместимыми типами; строка к ссылке не приводится, результатом будет NULL. ВЫРАЗИТЬ — это не поиск и не преобразование данных, а указание типа.

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

Сравнение вариантов

ВЫРАЗИТЬ(Поле КАК Справочник.Имя)

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

Соединение по реквизиту

Подходит, когда есть строка с кодом или наименованием. Требует, чтобы реквизит был проиндексирован, иначе медленно на больших таблицах.

НайтиПоКоду / НайтиПоНаименованию в коде

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

ВЫРАЗИТЬ для строк, чисел и дат: кратко о других типах

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

Для чисел указывают точность: ВЫРАЗИТЬ(Поле КАК ЧИСЛО(15,2)), что важно при объединениях и расчётах, чтобы типы колонок совпадали. Для дат — ВЫРАЗИТЬ(Поле КАК ДАТА) отсекает время. Эти приёмы часто идут в одном запросе рядом с приведением ссылок, поэтому держать их в памяти полезно.

Типичные ошибки и как их диагностировать

Первая ошибка — ВЫРАЗИТЬ к типу, которого нет в составе поля. Запрос выполнится, но вернёт сплошные NULL. Проверка: открыть состав типа поля в конфигураторе и убедиться, что нужный справочник там есть.

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

Типичные ошибки
01
Приведение строки с наименованием к ссылке — результат NULL, данные «пропадают» без ошибки
02
Отсутствие ВЫРАЗИТЬ при соединении по составному полю — запрос резко замедляется из-за лишних соединений
03
Приведение к справочнику, которого нет в составе типа поля, — все значения становятся NULL
04
Использование ВЫРАЗИТЬ вместо фильтра ССЫЛКА в условии — запрос обрабатывает лишние записи
Контрольные точки

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

Значения после приведения
Норма

Поля с нужным типом заполнены, чужие типы — NULL

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

NULL во всех строках — тип не входит в состав поля или данные не ссылочные

Доступ к реквизиту через точку
Норма

Реквизит возвращает реальные значения из справочника

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

NULL при заполненной ссылке — реквизит не заполнен у элементов или ошибка в имени реквизита

Скорость запроса с соединением
Норма

Выполняется за приемлемое время на рабочей базе

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

Резкое замедление — вероятно, соединение по составному полю без приведения

FAQ

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

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

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

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

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

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

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

Три причины: у элементов справочника реквизит действительно не заполнен; тип значения не входит в состав поля, и приведение дало NULL; либо ошибка в имени реквизита. Проверьте состав типа поля и заполненность реквизита в карточке элемента.

Работает ли ВЫРАЗИТЬ с документами и перечислениями?

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

Влияет ли ВЫРАЗИТЬ на производительность?

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

Итог

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

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