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

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

Как выразить значение как тип в запросе 1С

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

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

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

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

Синтаксис оператора ВЫРАЗИТЬ

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

Пример простого запроса с приведением строки:

ВЫБРАТЬ

ВЫРАЗИТЬ(Товары.Комментарий КАК СТРОКА(50)) КАК КраткийКомментарий

ИЗ

Документ.ПоступлениеТоваровУслуг КАК Товары

Здесь реквизит неограниченной длины приводится к строке из 50 символов. Это позволяет использовать поле в группировке и сравнении, что для строк неограниченной длины невозможно.

Приведение строк: зачем указывать длину

Поля типа «строка неограниченной длины» (в конфигураторе — длина 0) нельзя использовать в соединениях, группировках, сравнениях на равенство и в условиях некоторых СУБД. Запрос с таким полем либо не выполнится, либо будет работать с существенными ограничениями в зависимости от используемой базы данных.

Решение — привести строку к фиксированной длине: ВЫРАЗИТЬ(Поле КАК СТРОКА(200)). Длину следует выбирать по реальному содержимому: если комментарии в базе редко превышают 150 символов, нет смысла задавать 1000 — чрезмерная длина увеличивает объём обрабатываемых данных и может замедлить запрос.

Важно понимать поведение при усечении: если фактическое значение длиннее указанной размерности, лишние символы отсекаются без ошибки. Два разных комментария, совпадающих в первых 50 символах, после приведения к СТРОКА(50) станут неразличимы. Это нужно учитывать при группировках.

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

Для чисел указываются два параметра: общая разрядность и число знаков после запятой — ЧИСЛО(15, 2). Такое приведение применяется, когда нужно округлить результат вычисления или привести составное числовое поле к единому формату для сравнения.

Пример округления суммы до двух знаков:

ВЫБРАТЬ

ВЫРАЗИТЬ(Продажи.СуммаОборот КАК ЧИСЛО(15, 2)) КАК Сумма

ИЗ

РегистрНакопления.Продажи.Обороты КАК Продажи

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

Приведение дат и отсечение времени

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

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

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

ВЫРАЗИТЬ(Дата КАК ДАТА)

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

НАЧАЛОПЕРИОДА / КОНЕЦПЕРИОДА

Предпочтительны в условиях ГДЕ и параметрах виртуальных таблиц: отбор по диапазону использует индекс по дате.

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

Самая частая практическая задача — привести составное поле к конкретному ссылочному типу. Например, реквизит «Контрагент» может хранить ссылки на справочники «Контрагенты» и «ФизическиеЛица». Чтобы обратиться к реквизитам конкретного справочника через точку, поле нужно сначала привести:

ВЫБРАТЬ

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

ИЗ

Документ.Операция КАК Операция

ГДЕ

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

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

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

Приведение параметров и таблиц значений

Когда в запрос передаётся параметр-таблица значений, типы её колонок платформе неизвестны до выполнения. Для колонок, по которым идут соединения, приведение обязательно практически всегда:

ВЫБРАТЬ

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

ВЫРАЗИТЬ(ВТ.Количество КАК ЧИСЛО(15, 3)) КАК Количество

ПОМЕСТИТЬ ВТ_Товары

ИЗ

&ТаблицаТоваров КАК ВТ

Без такого приведения соединение временной таблицы с регистром по полю Номенклатура может не использовать индекс, а сравнение значений — давать неожиданные результаты из-за несовпадения типов. Это одна из самых частых причин «медленных» запросов с временными таблицами.

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

Типичные ошибки и ограничения

Первая ошибка — попытка привести значение к несовместимому типу, например строку «Абв» к ЧИСЛО. Результатом будет NULL, и если это поле участвует в расчётах, итоги исказятся без какого-либо сообщения об ошибке. Вторая ошибка — приведение к ссылочному типу без фильтра ССЫЛКА, из-за чего часть строк получает NULL там, где разработчик ожидал данные.

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

Ограничения оператора: нельзя привести значение к типу «Тип», нельзя использовать ВЫРАЗИТЬ для преобразования в таблицу значений, а приведение к БУЛЕВО из числа или строки не выполняется произвольным образом — допустимы только строго определённые сочетания типов. Полный перечень допустимых преобразований приведён в синтакс-помощнике платформы.

Типичные ошибки
01
Приведение к ссылочному типу без условия ССЫЛКА — в результате появляются NULL, которые искажают итоги и соединения
02
Усечение строки до слишком малой длины перед группировкой — разные значения склеиваются в одну группу
03
Заниженная разрядность ЧИСЛО — ошибка выполнения или потеря значащих цифр на больших суммах
04
Приведение поля, которое уже имеет нужный тип, — лишняя операция, мешающая оптимизатору использовать индекс

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

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

Дополнительно полезно выполнить контрольный запрос вида: выбрать количество записей, где исходное поле не NULL, а приведённое — NULL. Если таких строк больше нуля, значит, в данных встречаются значения несовместимых типов, и фильтр ССЫЛКА или логику отбора нужно пересмотреть.

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

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

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

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

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

NULL появляется в строках с заполненными значениями нужного типа

Время выполнения запроса
Норма

Сопоставимо с аналогичными запросами по тем же таблицам

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

Резкий рост времени после добавления соединения по неприведённому составному полю

Итоги по числовым полям
Норма

Суммы до и после приведения совпадают в пределах округления

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

Итоги заметно расходятся — признак потери разрядов или NULL в данных

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

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

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

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

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

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

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

Что произойдёт, если привести значение к несовместимому типу?

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

Можно ли привести строку неограниченной длины для соединения таблиц?

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

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

ССЫЛКА — это проверка типа в условии: она отвечает на вопрос «является ли значение ссылкой на указанный объект» и возвращает истину или ложь. ВЫРАЗИТЬ преобразует само значение к указанному типу в результате запроса. Часто они используются вместе: ССЫЛКА фильтрует записи, ВЫРАЗИТЬ открывает доступ к реквизитам.

Почему после приведения числа итоги не сошлись?

Две вероятные причины: округление до указанной точности (например, до двух знаков) и появление NULL там, где значение не поместилось в заданную разрядность или имело другой тип. Проверьте контрольным запросом количество NULL и сравните суммы до и после приведения.

Нужно ли приводить поле, которое уже имеет нужный тип?

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

Можно ли использовать ВЫРАЗИТЬ в параметрах виртуальных таблиц?

В параметрах виртуальных таблиц применяются отборы по измерениям, и приведение типов там, как правило, не требуется — типы измерений строго определены в метаданных. ВЫРАЗИТЬ уместен в секциях ВЫБРАТЬ, ГДЕ, соединениях и при помещении параметра-таблицы значений во временную таблицу.

Итог

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

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