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