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

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

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

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

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

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

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

Синтаксис и базовый пример

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

ВЫБРАТЬ

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

ИЗ

РегистрСведений.ЦеныНоменклатуры КАК РегистрСведений

ГДЕ

РегистрСведений.Объект ССЫЛКА Справочник.Номенклатура

Обратите внимание на пару приёмов в примере: приведение в списке выборки даёт поле строгого типа, с которым дальше можно работать (обращаться к реквизитам, соединять таблицы), а условие ССЫЛКА в секции ГДЕ отсекает записи с другими типами ещё до приведения. Такое сочетание — стандартная практика.

Зачем нужно приведение к справочнику

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

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

Третья причина — сравнение с параметром. Если параметр запроса имеет тип СправочникСсылка.Контрагенты, а поле в таблице составное, прямое сравнение Поле = &Контрагент может не сработать так, как ожидается. Явное приведение поля к типу параметра снимает неоднозначность.

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

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

ВЫБРАТЬ

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

ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)) КАК Товар

ИЗ

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

Здесь ЕСТЬNULL заменяет NULL на пустую ссылку справочника — итоговое поле остаётся типизированным, и с ним удобно работать дальше, например в СКД или при выгрузке в таблицу значений.

Альтернатива — отфильтровать чужие типы до приведения условием ГДЕ Таб.Объект ССЫЛКА Справочник.Номенклатура. Этот вариант предпочтительнее, когда строки с другими типами вообще не нужны в выборке: он уменьшает объём обрабатываемых данных.

Два подхода к чужим типам

Фильтр ССЫЛКА в ГДЕ

Строки с другими типами исключаются из результата. Подходит, когда нужны только объекты одного вида.

ЕСТЬNULL после ВЫРАЗИТЬ

Все строки сохраняются, чужие типы заменяются пустой ссылкой. Подходит для отчётов, где важно не потерять строки.

Типичные сценарии использования

Регистры с полем «Объект» произвольного типа

Многие регистры сведений в типовых конфигурациях хранят ссылку на произвольный объект — номенклатуру, контрагента, договор. Чтобы построить отчёт только по номенклатуре, поле приводят к нужному справочнику и соединяют с ним для получения реквизитов:

ВЫБРАТЬ

Цены.Период,

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

Цены.Цена

ИЗ

РегистрСведений.Цены КАК Цены

ГДЕ

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

Параметры и временные таблицы

Когда в запрос передаётся таблица значений через параметр, колонки без явного типа могут прийти как произвольные. При помещении во временную таблицу поле сразу приводят к нужному типу — тогда все последующие соединения с этой временной таблицей типизированы и работают быстро.

ВЫБРАТЬ

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

ПОМЕСТИТЬ ВТ_Контрагенты

ИЗ

&ВнешниеДанные КАК ВнешниеДанные

Условия по типу в секции ГДЕ

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

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

Ошибки и ограничения конструкции

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

Вторая частая проблема — забытый NULL в соединениях. Если левую таблицу соединяют по приведённому полю, строки, где приведение дало NULL, при внутреннем соединении молча исчезают. При левом соединении они останутся, но все поля правой таблицы будут NULL.

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

Типичные ошибки
01
Приведение без обработки NULL — строки выпадают из соединений или дают NULL в реквизитах.
02
Попытка привести строковый код к ссылке справочника — ссылку по коду ищут соединением, а не ВЫРАЗИТЬ.
03
Сравнение составного поля с параметром без приведения — условие может не сработать.
04
Приведение к неверному справочнику — все значения станут NULL, ошибки при этом не возникнет.

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

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

Если после приведения строк стало меньше, чем ожидалось, — почти наверняка часть значений имеет другой тип и превратилась в NULL. Проверьте это выборкой с условием ГДЕ НЕ Поле ССЫЛКА Справочник.НужныйТип: она покажет все «потерянные» записи.

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

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

Количество строк до и после приведения
Норма

Совпадает или уменьшилось осознанно за счёт фильтра ССЫЛКА

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

Строки пропали без явного фильтра — значит, NULL в соединении

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

Ссылки нужного справочника, NULL только в ожидаемых местах

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

Сплошные NULL — указан неверный справочник или поле другого типа

Обращение к реквизитам через точку
Норма

Запрос выполняется без ошибок

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

Ошибка «Поле не найдено» — приведение не выполнено или тип не тот

Альтернативы ВЫРАЗИТЬ

Не каждая задача требует приведения. Если нужно только отфильтровать записи по типу, достаточно оператора ССЫЛКА в условии. Если нужно получить представление объекта, есть функция ПРЕДСТАВЛЕНИЕ(Поле) — она работает с любым типом и не требует приведения.

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

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

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

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

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

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

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

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

Скорее всего, указан не тот справочник: значения в поле относятся к другому типу. Проверьте реальные типы группировкой по ТИПЗНАЧЕНИЯ(Поле) и сверьте с типом, указанным в конструкции.

Можно ли привести строку с кодом к ссылке справочника?

Нет. ВЫРАЗИТЬ работает только со ссылочными значениями. Чтобы получить ссылку по коду, соедините таблицу со справочником по полю Код или найдите элемент средствами встроенного языка до выполнения запроса.

Нужно ли приводить поле, если у него уже один тип?

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

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

Само по себе приведение недорогое, но оно позволяет СУБД корректно строить соединения и использовать индексы, что часто ускоряет запрос. Обратный эффект возможен, если приведение применяется к обеим сторонам соединения и мешает оптимизатору — такие случаи проверяют замером на реальных данных.

Как заменить NULL после приведения на пустую ссылку?

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

Итог

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

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