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