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

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

ВЫРАЗИТЬ КАК ЧИСЛО в запросе 1С 8.3: синтаксис, примеры и ошибки

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

Функция ВЫРАЗИТЬ в языке запросов 1С 8.3 применяется для явного приведения значения к нужному типу данных. Когда речь идёт о числах, конструкция ВЫРАЗИТЬ(Поле КАК ЧИСЛО(Длина, Точность)) решает сразу несколько задач: указывает тип поля результата, ограничивает разрядность, округляет значение до нужного количества знаков после запятой и позволяет сравнивать поля разных типов.

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

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

Синтаксис ВЫРАЗИТЬ КАК ЧИСЛО и параметры длины и точности

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

Например, ЧИСЛО(15, 2) означает число до 15 разрядов всего, из которых 2 отводятся под дробную часть, то есть целая часть может занимать до 13 разрядов. Если указать ЧИСЛО(10, 0), получится целое число: дробная часть будет отброшена с округлением по математическим правилам.

Максимальная допустимая длина числа в платформе 1С — 38 разрядов. Сумма «длина минус точность» определяет ёмкость целой части, поэтому при выборе параметров ориентируйтесь на реальные диапазоны данных: для сумм в рублях обычно достаточно ЧИСЛО(15, 2), для количеств с высокой дробностью — ЧИСЛО(15, 3) или больше.

ВЫБРАТЬ

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

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

ИЗ

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

Когда приведение к числу реально необходимо

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

Второй сценарий — числовые данные, хранящиеся в строковых реквизитах. Такое встречается в регистрах сведений с универсальными полями «Значение», в результатах обменов и в дополнительных свойствах. Строка «123,45» при попытке приведения даст NULL, если формат не распознается, поэтому важно знать, что именно лежит в источнике.

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

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

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

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

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

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

Это поведение одновременно удобно и опасно: запрос не упадёт, но часть данных молча превратится в NULL. Поэтому после приведения строки к числу всегда проверяйте долю NULL-значений в результате — например, временным запросом с условием ГДЕ ВЫРАЗИТЬ(Поле КАК ЧИСЛО(15, 2)) ЕСТЬ NULL и сравнением количества строк с исходной выборкой.

ВЫБРАТЬ

Свойства.Объект КАК Объект,

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

ИЗ

РегистрСведений.ЗначенияСвойств КАК Свойства

ГДЕ

Свойства.Свойство = &Свойство

Если в строках встречается запятая как разделитель дробной части, надёжнее предварительно заменить её на точку функцией ПОДСТРОКА с обработкой в коде либо очистить данные до загрузки. Запросный язык не имеет функции замены подстроки, поэтому сложную нормализацию выполняют на уровне встроенного языка до помещения данных во временную таблицу.

Округление и отсечение дробной части через ВЫРАЗИТЬ

Приведение к числу с меньшей точностью выполняет округление результата. Например, ВЫРАЗИТЬ(Цена * Количество КАК ЧИСЛО(15, 2)) округлит произведение до копеек. Это стандартный приём для денежных вычислений в запросе, когда дальше результат суммируется — иначе накапливаются расхождения в «хвостах» дробной части.

Для получения целой части используют ВЫРАЗИТЬ(Значение КАК ЧИСЛО(15, 0)). Учтите, что это округление, а не отсечение: 2,5 станет 3, а не 2. Если нужно именно отсечение дробной части, комбинируйте выражение: ВЫРАЗИТЬ(Значение - 0.5 КАК ЧИСЛО(15, 0)) для положительных чисел либо выполняйте операцию в коде встроенного языка через функцию Цел().

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

bsl
ВЫБРАТЬ
	ВЫРАЗИТЬ(Товары.Цена * Товары.Количество КАК ЧИСЛО(15, 2)) КАК СуммаСОкруглением,
	ВЫРАЗИТЬ(Товары.Количество КАК ЧИСЛО(10, 0)) КАК КоличествоЦелое
ИЗ
	Документ.РеализацияТоваровУслуг.Товары КАК Товары

ВЫРАЗИТЬ КАК ЧИСЛО в виртуальных таблицах и временных таблицах

В виртуальных таблицах регистров (Обороты, Остатки, ОстаткиИОбороты) числовые ресурсы обычно уже имеют тип ЧИСЛО с заданной в конфигураторе разрядностью, поэтому приведение нужно реже — в основном для округления или приведения к единому формату при объединении нескольких источников через ОБЪЕДИНИТЬ.

При объединении запросов колонки должны совпадать по типу. Если одна часть ОБЪЕДИНИТЬ возвращает ЧИСЛО(15, 2), а другая — ЧИСЛО(10, 0), итоговый тип может оказаться неожиданным. Явное приведение обеих колонок к одному формату, например ВЫРАЗИТЬ(... КАК ЧИСЛО(15, 2)) в каждой части объединения, делает результат предсказуемым.

При помещении результата во временную таблицу (ПОМЕСТИТЬ ВТ) типы колонок фиксируются на момент создания. Если планируете последующие соединения по числовому полю, приведите его к числу уже в первом запросе — это избавит от повторных преобразований и ошибок несовпадения типов в дальнейших выборках из временной таблицы.

Приведение к числу в условии ГДЕ (например, ГДЕ ВЫРАЗИТЬ(Поле КАК ЧИСЛО(15,2)) > 100) может заметно замедлить запрос на больших таблицах, так как индекс по исходному полю перестаёт использоваться. По возможности приводите тип параметра сравнения, а не поле таблицы.
ПЗ
Практическое замечание

Типичные ошибки и как их диагностировать

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

Третья ошибка — ожидание, что ВЫРАЗИТЬ «очистит» строку от лишних символов. Функция не парсит произвольный текст: «1 200 руб.» не превратится в 1200. Четвёртая — использование приведения в условиях соединения и фильтрации без оценки производительности: на больших таблицах это приводит к полному сканированию.

Типичные ошибки
01
ВЫРАЗИТЬ(Поле КАК ЧИСЛО) без скобок — синтаксическая ошибка, запрос не выполнится
02
Слишком маленькая длина, например ЧИСЛО(5, 2) для сумм в миллионах — переполнение или обрезка значений
03
Игнорирование NULL после приведения строк — итоги занижаются без видимой ошибки
04
Ожидание отсечения вместо округления: ЧИСЛО(15, 0) округляет 2,5 до 3, а не отбрасывает дробь
05
Приведение поля в условии ГДЕ на большой таблице — потеря индекса и резкое замедление запроса

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

Надёжный способ — выполнить запрос в консоли запросов на копии базы или в режиме предприятия на тестовых данных и посмотреть тип колонки результата. Дополнительно в коде можно проверить тип значения выборки: ТипЗнч(Выборка.Сумма) = Тип("Число").

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

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

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

Тип колонки результата
Норма

Колонка имеет тип Число с заданными длиной и точностью

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

Тип остался строкой или составным — приведение не применено

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

Количество NULL равно нулю или соответствует известным пустым значениям

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

NULL появляются в строках, где ожидались числа

Итоги по суммам
Норма

Сумма по приведённому полю совпадает с контрольным расчётом

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

Итог занижен — часть значений потерялась при приведении

Округление
Норма

Дробная часть содержит не более заданного числа знаков

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

Лишние разряды сохранились — точность указана неверно

Частые вопросы о ВЫРАЗИТЬ КАК ЧИСЛО

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

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

Можно ли написать ВЫРАЗИТЬ(Поле КАК ЧИСЛО) без указания длины и точности?

Нет. Для типа ЧИСЛО оба параметра обязательны: длина и точность в скобках, например ЧИСЛО(15, 2). Запись без параметров вызовет ошибку синтаксиса запроса.

ВЫРАЗИТЬ КАК ЧИСЛО(15, 0) отбрасывает дробную часть или округляет?

Округляет по математическим правилам: 2,5 превратится в 3, а 2,4 — в 2. Для отсечения дробной части используйте функцию Цел() во встроенном языке или скорректируйте выражение вычитанием 0,5 для положительных чисел.

Какая максимальная длина числа допустима в запросе 1С?

Платформа поддерживает числа длиной до 38 разрядов. На практике для сумм обычно достаточно ЧИСЛО(15, 2), а для количеств — ЧИСЛО(15, 3); избыточная разрядность не улучшает точность исходных данных.

Почему запрос с ВЫРАЗИТЬ в условии ГДЕ стал работать медленно?

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

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

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

Итог

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

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