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