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

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

Функция ВЫРАЗИТЬ(КАК ТИП) в запросах 1С: синтаксис и примеры

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

Функция ВЫРАЗИТЬ в языке запросов 1С позволяет явно указать тип значения поля: привести составное поле к конкретному типу, ограничить длину строки или точность числа, «указать» платформе, как интерпретировать данные. Без неё запросы над составными типами часто возвращают NULL, не соединяются корректно или не позволяют применять функции, специфичные для конкретного типа.

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

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

Синтаксис функции ВЫРАЗИТЬ

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

Пример базового запроса:

ВЫБРАТЬ

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

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

ИЗ

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

ГДЕ

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

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

Приведение к строке

Наиболее востребованный сценарий — ограничение длины строки. Строки неограниченной длины нельзя использовать в соединениях, группировках и сравнениях: платформа выдаст ошибку или запрос будет работать некорректно. Решение — привести поле к строке фиксированной длины:

ВЫБРАТЬ

ВЫРАЗИТЬ(Док.Комментарий КАК Строка(100)) КАК Комментарий

ИЗ

Документ.ЗаказПокупателя КАК Док

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

При выборе длины ориентируйтесь на реальное содержимое. Для комментариев обычно достаточно 100–200 символов, для наименований — длины, заданной в метаданных справочника. Указывать заведомо избыточную длину не стоит: это влияет на объём промежуточных данных при выполнении запроса.

Приведение к числу и дате

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

Если значение не помещается в заданную разрядность, результатом будет NULL, а не ошибка. Это коварное поведение: запрос выполнится, но часть данных тихо пропадёт. Поэтому разрядность выбирают с запасом относительно максимально возможных значений.

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

Типичные ошибки
01
Указали Число(10,2), а в данных встречаются значения с 12 разрядами — такие строки вернули NULL и пропали из итогов
02
Ожидали, что ВЫРАЗИТЬ(КАК Дата) уберёт время, а оно осталось — для отсечения времени нужен НАЧАЛОПЕРИОДА
03
Привели строку к Строка(10) и построили по ней соединение — разные значения с совпадающим началом объединились в одну группу

Приведение к ссылочным типам

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

ВЫБРАТЬ

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

ИЗ

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

ГДЕ

Рег.Объект ССЫЛКА Справочник.Контрагенты

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

Для полей, где типов несколько и нужны разные реквизиты, используют конструкцию ВЫБОР с проверкой ССЫЛКА:

ВЫБОР

КОГДА Рег.Объект ССЫЛКА Справочник.Контрагенты

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

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

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

ИНАЧЕ ""

КОНЕЦ

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

ВЫРАЗИТЬ и NULL: что происходит при несовпадении типов

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

NULL в результате влияет на всё downstream-поведение запроса: соединения по такому полю не сработают, агрегатные функции его проигнорируют, сравнения дадут ложь. Поэтому после приведения полезно явно обрабатывать NULL через ЕСТЬNULL(Поле, ЗначениеПоУмолчанию) или фильтровать условием НЕ Поле ЕСТЬ NULL.

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

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

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

Количество строк в выборке
Норма

Совпадает с ожидаемым количеством записей по отобранному типу

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

Строк меньше, чем записей в регистре — часть данных ушла в NULL из-за несовпадения типов или разрядности

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

Поля заполнены, соединения по ним находят соответствия

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

Массовые NULL или пустые значения там, где данные точно есть

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

Строки не обрезаны посередине слов в критичных местах

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

Наименования и комментарии оборваны — длину нужно увеличить

Производительность и ограничения

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

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

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

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

Альтернативы и смежные приёмы

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

В СКД (системе компоновки данных) приведение типов часто выполняют на уровне выражений ресурсов и полей, а для сложных преобразований — в событии ПриКомпоновкеРезультата или наборе данных «объект». Если преобразование не укладывается в возможности языка запросов, правильнее подготовить данные кодом и передать их в запрос таблицей значений.

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

ВЫРАЗИТЬ(КАК Тип)

Универсальный способ: приведение в самом запросе, работает с реквизитами и соединениями. Ограничение — несовпадающие значения превращаются в NULL

ПРЕДСТАВЛЕНИЕ(Поле)

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

Соединение без приведения

Работает, если нужна только фильтрация по типу через само соединение. Не даёт доступа к реквизитам составного поля

Подготовка данных кодом

Для сложных преобразований, недоступных в языке запросов. Требует передачи таблицы значений и усложняет поддержку

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

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

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

Почему после ВЫРАЗИТЬ поле стало NULL, хотя данные есть?

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

Как привести поле к дате без времени?

ВЫРАЗИТЬ(Поле КАК Дата) время не отсекает. Используйте НАЧАЛОПЕРИОДА(Поле, ДЕНЬ) — она возвращает начало суток, что равнозначно дате без времени.

Нужно ли ВЫРАЗИТЬ, если поле имеет один тип?

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

Влияет ли ВЫРАЗИТЬ на данные в базе?

Нет. Функция работает только в момент выполнения запроса и изменяет представление данных в выборке. Записи в таблицах информационной базы остаются неизменными.

Что быстрее: ВЫРАЗИТЬ с условием ССЫЛКА или соединение с таблицей?

Зависит от объёма данных и индексов. Часто оптимальна комбинация: условие ССЫЛКА отсекает лишние записи на раннем этапе, а ВЫРАЗИТЬ применяется уже к отфильтрованному набору. На больших таблицах стоит сравнить план запроса обоих вариантов.

Итог

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

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