Разработка и Конфигурация · 9 мин
ВЫРАЗИТЬ КАК ЧИСЛО в запросах 1С: синтаксис и практические приёмы
Как использовать ВЫРАЗИТЬ КАК ЧИСЛО в запросах 1С: синтаксис, приведение строк к числу, округление, работа с NULL, типичные ошибки и проверка результата.
Функция ВЫРАЗИТЬ в языке запросов 1С приводит значение поля к заданному типу. Конструкция ВЫРАЗИТЬ(... КАК ЧИСЛО(длина, точность)) чаще всего нужна в трёх ситуациях: когда поле имеет составной тип и его нужно «сузить» до числа, когда число хранится в строковом реквизите и требуется сортировка или агрегация, и когда нужно округлить результат вычисления до заданного количества знаков.
Без явного приведения запрос может вернуть неожиданный результат: строки «10» и «9» сортируются как текст («10» раньше «9»), поле составного типа не участвует в агрегатных функциях предсказуемо, а деление даёт длинный «хвост» знаков после запятой. ВЫРАЗИТЬ КАК ЧИСЛО решает все три задачи, но требует понимания ограничений: приведение не превращает произвольный текст в число, а лишь интерпретирует уже совместимое значение.
Ниже разобран синтаксис, рабочие примеры, поведение с NULL и строками, типичные ошибки и способы проверить, что приведение сработало корректно.
Синтаксис и параметры функции ВЫРАЗИТЬ
Общий вид конструкции: ВЫРАЗИТЬ(Выражение КАК ЧИСЛО(Длина, Точность)). Первый параметр типа ЧИСЛО — общее количество цифр (включая дробную часть), второй — количество знаков после запятой. Например, ЧИСЛО(10, 2) допускает значения до восьми цифр в целой части и двух в дробной.
Точность можно опустить: ЧИСЛО(10) означает целое число. Это удобный способ отбросить дробную часть — значение будет округлено по правилам арифметического округления, а не просто усечено. Для усечения без округления применяйте деление и обратное умножение или функции работы с числами на встроенном языке.
ВЫБРАТЬ
ВЫРАЗИТЬ(Таблица.Сумма КАК ЧИСЛО(15, 2)) КАК СуммаОкругленная,
ВЫРАЗИТЬ(Таблица.Количество КАК ЧИСЛО(10, 0)) КАК КоличествоЦелое
ИЗ
Документ.РеализацияТоваровУслуг КАК Таблица
Сужение составного типа до числа
Классический сценарий — реквизит или ресурс регистра имеет составной тип (например, число и строка), а для отчёта нужна только числовая часть. Без приведения СУММА по такому полю может работать некорректно или запрос не пройдёт проверку в консоли.
Приведение отбрасывает значения нечисловых типов: они превращаются в NULL. Это важно учитывать при группировках — NULL не суммируется, но и не вызывает ошибку, поэтому итог может «молча» занизиться.
ВЫБРАТЬ
Товары.Номенклатура КАК Номенклатура,
СУММА(ВЫРАЗИТЬ(Товары.ЗначениеСвойства КАК ЧИСЛО(15, 3))) КАК ИтогоЗначение
ИЗ
РегистрСведений.ЗначенияСвойств КАК Товары
СГРУППИРОВАТЬ ПО
Товары.Номенклатура
Если нужно заменить NULL нулём, оберните выражение в ЕСТЬNULL: ЕСТЬNULL(ВЫРАЗИТЬ(Поле КАК ЧИСЛО(15, 2)), 0). Порядок важен: сначала приведение, потом подстановка значения по умолчанию.
Преобразование строки в число
Если цифровые данные хранятся в строковом реквизите (артикул, код, вес из обмена), ВЫРАЗИТЬ КАК ЧИСЛО позволяет сортировать и суммировать их как числа. Строка «00125» станет числом 125, строка «12,5» в зависимости от региональных настроек сервера может быть распознана или дать NULL.
Ограничение принципиально: приведение работает только для строк, содержащих корректное числовое представление. Строки с буквами, пробелами внутри числа, разделителями разрядов или пустые значения превращаются в NULL без какого-либо сообщения об ошибке. Поэтому перед массовым преобразованием полезно проверить данные отдельным запросом.
- 1Выберите строковое поле и рядом ВЫРАЗИТЬ(Поле КАК ЧИСЛО(15, 2)) в консоли запросов
- 2Отфильтруйте строки, где исходное поле непустое, а приведённое значение ЕСТЬ NULL
- 3Проанализируйте найденные значения: лишние пробелы, запятые, буквы
- 4Очистите данные обработкой или учтите их отдельно в логике отчёта
ВЫБРАТЬ
Данные.КодСтрокой КАК КодСтрокой,
ВЫРАЗИТЬ(Данные.КодСтрокой КАК ЧИСЛО(10, 0)) КАК КодЧислом
ИЗ
Справочник.Номенклатура КАК Данные
ГДЕ
Данные.КодСтрокой <> ""
И ВЫРАЗИТЬ(Данные.КодСтрокой КАК ЧИСЛО(10, 0)) ЕСТЬ NULL
Округление и отбрасывание дробной части
ВЫРАЗИТЬ КАК ЧИСЛО с меньшей точностью — штатный способ округления прямо в запросе. Например, цена с четырьмя знаками приводится к ЧИСЛО(15, 2), и дальнейшие расчёты идут уже с округлёнными значениями. Это важно при сравнении сумм с данными учёта, где хранятся копейки.
Помните о разнице между округлением в запросе и встроенной функцией Окр() в коде: правила совпадают (арифметическое округление), но место применения разное. Если округление делать в запросе, согласованность гарантируется для всех потребителей результата; если в коде — только для конкретного алгоритма.
Где выполнять округление
Подходит для отчётов и СКД: единое правило для всех строк результата. Ограничение — нельзя выбрать режим округления, только арифметический.
Подходит, когда нужен режим Округление15как20 или нестандартная логика. Ограничение — обработка каждой строки в цикле, медленнее на больших выборках.
Подходит для промежуточных вычислений, где точность важнее представления. Округляйте только финальный результат.
ВЫРАЗИТЬ в виртуальных таблицах и соединениях
Частая задача — соединить таблицы по полю, которое в одной таблице числовое, а в другой строковое или составное. Приведение выполняют прямо в условии соединения: Таб1.Поле = ВЫРАЗИТЬ(Таб2.Поле КАК ЧИСЛО(15, 0)). Это работает, но мешает использованию индексов и может заметно замедлить запрос на больших таблицах.
Производительнее привести типы заранее во временной таблице: поместить данные с уже приведённым полем во временную таблицу, проиндексировать её и соединять по приведённому полю. Разница на сотнях тысяч строк ощутима.
Поведение с NULL и пустыми значениями
ВЫРАЗИТЬ(NULL КАК ЧИСЛО) возвращает NULL — приведение не создаёт значение из ничего. Пустая строка при приведении к числу также даёт NULL, а не ноль. Это контринтуитивно для тех, кто ждёт поведения как у числового реквизита по умолчанию.
Для отчётов почти всегда нужна связка с ЕСТЬNULL. Но будьте осторожны в условиях ГДЕ: сравнение приведённого поля с нулём не отберёт строки с NULL, поскольку NULL не равен ничему, включая NULL. Используйте явную проверку ЕСТЬ NULL или ЕСТЬNULL в условии.
Как проверить результат приведения
Число строк результата не изменилось
Строки пропали — вероятно, приведение стоит в условии ГДЕ и отсекает NULL
Сумма совпадает с контрольным расчётом по исходным данным
Итог ниже ожидаемого — часть значений превратилась в NULL и не просуммировалась
Количество знаков после запятой соответствует заданной точности
Лишние знаки — приведение не применено к финальному выражению, а только к промежуточному
Альтернативы и границы применимости
ВЫРАЗИТЬ — не единственный способ работы с типами. Для проверки типа без приведения используется оператор ССЫЛКА (для ссылочных типов) и функция ТИПЗНАЧЕНИЯ(). Для преобразования числа в строку прямой функции в языке запросов нет — приходится использовать ПОДСТРОКУ или выполнять форматирование в коде и СКД.
Помните и про ограничение платформы: максимальная разрядность числа в запросах ограничена допустимой точностью типа Число (обычно до 38 знаков в зависимости от СУБД). Значения за пределами разрядности приведут к ошибке выполнения запроса на уровне СУБД, поэтому для расчётов с очень большими числами проверяйте порядок величин заранее.
Что важно запомнить
ВЫРАЗИТЬ(Поле КАК ЧИСЛО(длина, точность)) приводит совместимые значения к числу, округляет по заданной точности и превращает несовместимые значения в NULL без ошибки. Задавайте разрядность с запасом, оборачивайте результат в ЕСТЬNULL для отчётов, выносите приведение из условий соединений во временные таблицы и проверяйте итоги контрольным расчётом.
Частые вопросы
Почему ВЫРАЗИТЬ строки в число возвращает NULL?
Строка содержит символы, не образующие корректное число: буквы, пробелы, запятую вместо точки, разделители разрядов, или строка пустая. Приведение не выдаёт ошибку, а возвращает NULL. Найдите проблемные значения запросом с условием «исходное поле непустое И приведённое ЕСТЬ NULL» и очистите данные.
Чем ЧИСЛО(10, 0) отличается от отбрасывания дробной части?
Приведение к ЧИСЛО(10, 0) выполняет арифметическое округление: 2,7 станет 3, а 2,4 станет 2. Если нужно именно отсечь дробную часть без округления, в запросе используют деление с последующим приведением или обрабатывают значение в коде встроенного языка.
Можно ли применять ВЫРАЗИТЬ к результату СУММА?
Да, конструкция ВЫРАЗИТЬ(СУММА(Поле) КАК ЧИСЛО(15, 2)) корректна и часто предпочтительнее приведения до агрегации: сумма накапливается с полной точностью, а округляется только финальный результат. Это уменьшает накопленную погрешность округления по строкам.
Работает ли ВЫРАЗИТЬ КАК ЧИСЛО в СКД?
Да, функция доступна в запросе набора данных СКД наравне с обычными запросами. В вычисляемых полях и выражениях ресурсов действует тот же синтаксис. Учитывайте, что тип поля в настройках СКД должен соответствовать приведённому типу, иначе возможны сообщения о несоответствии типов.
Что произойдёт, если значение не помещается в заданную разрядность?
При выполнении запроса СУБД может вернуть ошибку переполнения, либо значение будет обработано с потерей точности — поведение зависит от используемой СУБД. Чтобы избежать проблем, задавайте длину и точность с запасом относительно максимально возможных значений в данных.
Как преобразовать число обратно в строку в запросе?
Прямой функции приведения числа к строке в языке запросов нет. Используют обходные приёмы: функцию ПРЕДСТАВЛЕНИЕ для ссылок, операции с ПОДСТРОКОЙ для отдельных разрядов или форматирование уже в коде встроенного языка либо в настройках СКД через форматную строку.