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