Разработка и Конфигурация · 9 мин
Запрос 1С: ВЫРАЗИТЬ как Число и округление
Как использовать ВЫРАЗИТЬ(... КАК ЧИСЛО) в запросе 1С для округления чисел, задания разрядности и точности. Примеры, ошибки и типовые сценарии.
Конструкция ВЫРАЗИТЬ(... КАК ЧИСЛО(длина, точность)) в языке запросов 1С выполняет две задачи: приводит значение к числовому типу и округляет его до указанного количества знаков после запятой. Это стандартный способ избавиться от «хвостов» вида 123,456789 при расчётах цен, сумм, коэффициентов и количества прямо в запросе, без постобработки в коде.
Важно понимать с самого начала: округление происходит по математическим правилам — цифра 5 и выше округляет вверх, меньше 5 — вниз. То есть ВЫРАЗИТЬ(2.5 КАК ЧИСЛО(10, 0)) вернёт 3, а ВЫРАЗИТЬ(2.4 КАК ЧИСЛО(10, 0)) вернёт 2. Специальных функций «округлить вверх» или «округлить вниз» в языке запросов 1С нет — их приходится эмулировать арифметически.
Вторая частая причина использования ВЫРАЗИТЬ — приведение типов при соединениях и сравнениях. Если поле имеет составной тип или хранится как строка, сравнение с числом без явного приведения может дать неожиданный результат или ошибку. Явное приведение решает и эту задачу, но здесь важно помнить об ограничениях, о которых речь пойдёт ниже.
Синтаксис ВЫРАЗИТЬ КАК ЧИСЛО
Общий вид конструкции: ВЫРАЗИТЬ(Выражение КАК ЧИСЛО(Длина, Точность)). Параметр «Длина» задаёт общее количество цифр числа (включая дробную часть), «Точность» — количество знаков после запятой. Максимальная длина числа в 1С ограничена, обычно используют значения до 31–38 в зависимости от версии платформы и СУБД.
Пример базового запроса:
ВЫБРАТЬ
ВЫРАЗИТЬ(Товары.Цена * Товары.Количество КАК ЧИСЛО(15, 2)) КАК Сумма
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК Товары
Здесь произведение цены на количество округляется до двух знаков — типичный случай для денежных сумм. Если убрать ВЫРАЗИТЬ, результат умножения может содержать больше знаков, чем допускает тип реквизита, куда значение будет записано, что приведёт либо к лишним цифрам в отчёте, либо к ошибке при записи.
Параметр «Точность» можно опустить вместе с запятой: ВЫРАЗИТЬ(Поле КАК ЧИСЛО(10)) — тогда число приводится к целому, то есть округляется до нуля знаков. Это удобно для подсчёта целых единиц, упаковок, дней.
Как округлить до целого, до копеек и до нужного знака
Выбор параметров зависит от прикладной задачи. Для денежных сумм в рублях почти всегда используют ЧИСЛО(15, 2) — два знака под копейки. Для количеств, которые могут быть дробными (вес, метраж), обычно берут ЧИСЛО(15, 3). Для целых значений — ЧИСЛО(10) или ЧИСЛО(10, 0).
Типовые варианты:
ВЫРАЗИТЬ(Сумма КАК ЧИСЛО(15, 2))— округление до копеек;ВЫРАЗИТЬ(Количество КАК ЧИСЛО(15, 3))— до тысячных долей единицы;ВЫРАЗИТЬ(Дней КАК ЧИСЛО(10))— до целого числа;ВЫРАЗИТЬ(Сумма / 100 КАК ЧИСЛО(15, 0)) * 100— округление до сотен.
Последний приём — округление не к знакам после запятой, а к разрядам целой части: сначала делим на нужный порядок, округляем до целого, затем умножаем обратно. Так можно округлить цену до десятков, сотен или тысяч рублей, что бывает нужно при ценообразовании.
Округление вверх и вниз: чего в запросах нет
В языке запросов 1С нет аналогов функций ОкрВверх и ОкрВниз. ВЫРАЗИТЬ всегда округляет математически. Если бизнес-правило требует всегда округлять в большую сторону (например, количество упаковок для отгрузки), применяют арифметический приём: прибавить 0,5 перед округлением для «вверх» или вычесть 0,5 для «вниз» — с поправкой на граничные случаи.
Более надёжный вариант для округления вверх до целого — через ВЫБОР:
ВЫБОР
КОГДА Количество = ВЫРАЗИТЬ(Количество КАК ЧИСЛО(15, 0))
ТОГДА Количество
ИНАЧЕ ВЫРАЗИТЬ(Количество КАК ЧИСЛО(15, 0)) + 1
КОНЕЦ КАК Упаковок
Здесь проверяется, совпадает ли исходное значение с округлённым. Если совпадает — число уже целое, если нет — берётся округлённое вниз плюс единица. Для округления вниз достаточно проверить, что математическое округление увеличило значение, и тогда вычесть единицу.
// Округление вверх до целого в запросе
ВЫБОР
КОГДА Количество = ВЫРАЗИТЬ(Количество КАК ЧИСЛО(15, 0))
ТОГДА Количество
ИНАЧЕ ВЫРАЗИТЬ(Количество - 0.5 КАК ЧИСЛО(15, 0)) + 1
КОНЕЦТиповые сценарии применения
Расчёт сумм и НДС
Самый массовый сценарий — вычисление суммы документа или суммы НДС с округлением до копеек. Ошибка в копейках при дальнейшем сравнении с данными проведённого документа приводит к расхождениям, поэтому округлять нужно тем же способом и в том же месте, что и в типовой логике.
Приведение типов при соединениях
Если в регистре или табличной части поле имеет составной тип, а в соединении участвует числовое поле, платформа может отказаться строить запрос или выдать неверный результат. ВЫРАЗИТЬ(СоставноеПоле КАК ЧИСЛО(15, 2)) явно задаёт тип и снимает проблему. Учтите: значения нечислового типа при таком приведении превратятся в NULL или 0 в зависимости от контекста.
Группировка по округлённым значениям
Иногда нужно сгруппировать данные по округлённому показателю — например, разбить чеки по диапазонам сумм. ВЫРАЗИТЬ допустимо использовать в секции СГРУППИРОВАТЬ ПО, что позволяет строить такие группировки без временных таблиц.
- 1Найдите выражение, результат которого нужно округлить (сумма, произведение, деление).
- 2Определите требуемую точность: 2 знака для денег, 3 для веса, 0 для целых.
- 3Оберните выражение в ВЫРАЗИТЬ(... КАК ЧИСЛО(длина, точность)) с запасом по длине.
- 4Выполните запрос в консоли запросов и проверьте граничные значения: 0,5; 1,005; отрицательные числа.
- 5Сравните результат с данными, рассчитанными типовым механизмом, чтобы правила округления совпадали.
Частые ошибки и ограничения
Первая ошибка — недостаточная длина числа. Если итоговая сумма превышает разрядность, заданную в ЧИСЛО(длина, точность), на файловой базе и на разных СУБД поведение может отличаться: от ошибки выполнения запроса до тихого обрезания значения. Всегда закладывайте длину с запасом относительно максимально возможных значений.
Вторая ошибка — ожидание «бухгалтерского» округления. Математическое округление 2,5 даёт 3, но −2,5 даёт −2 (округление по модулю в большую сторону от нуля работает иначе, чем ожидают некоторые разработчики). Проверяйте отрицательные значения отдельно, особенно в запросах по возвратам и сторно.
Третья ошибка — попытка округлить строку, содержащую нечисловые символы. ВЫРАЗИТЬ не выполняет парсинг строк: если поле строковое, приведение к числу даст NULL или ошибку, а не преобразованное значение. Сначала нужно гарантировать, что строка содержит только цифры и разделитель.
Проверка результата и альтернативы
После внедрения округления проверьте запрос на контрольных примерах: значения ровно на границе округления (x,5), отрицательные числа, ноль и очень большие суммы. Удобно использовать консоль запросов в режиме предприятия на копии базы — так виден реальный результат с учётом конкретной СУБД.
Если правила округления сложнее математических (например, округление по настройкам валюты или до кратности упаковки), разумнее выполнить расчёт в коде встроенного языка через функцию Окр() с явным указанием режима округления, а запрос использовать только для выборки сырых данных. Смешивать оба подхода в одном расчёте не стоит — получите расхождения в копейках.
Как проверить результат
Результат 3
Результат 2 — проверьте версию платформы и СУБД
Результат −3 или ожидаемое по принятому правилу
Результат не совпадает с логикой типового расчёта
Сумма выводится без ошибки
Ошибка переполнения — увеличьте длину
Копейки совпадают
Расхождение — правила округления различаются
Что важно запомнить
ВЫРАЗИТЬ(... КАК ЧИСЛО(длина, точность)) округляет математически и одновременно приводит тип. Задавайте длину с запасом, округляйте только финальный результат, для округления вверх/вниз используйте ВЫБОР или расчёт в коде, а результат проверяйте на граничных и отрицательных значениях.
Частые вопросы
Чем ВЫРАЗИТЬ КАК ЧИСЛО отличается от функции Окр() в коде?
ВЫРАЗИТЬ работает внутри запроса и округляет только математически. Функция Окр() во встроенном языке позволяет явно задать режим округления (вверх, вниз, математически) и удобнее для сложных правил. Для простого округления до копеек в выборке достаточно ВЫРАЗИТЬ.
Почему после ВЫРАЗИТЬ поле стало NULL?
Чаще всего причина в том, что исходное поле строковое или составного типа и содержит значение, которое нельзя интерпретировать как число. Проверьте содержимое поля до приведения и очистите данные от нечисловых символов.
Как округлить до целого всегда в меньшую сторону?
Используйте конструкцию ВЫБОР: если ВЫРАЗИТЬ(Поле КАК ЧИСЛО(15, 0)) больше исходного значения, верните округлённое минус 1, иначе само округлённое. Это эмулирует отбрасывание дробной части.
Работает ли ВЫРАЗИТЬ в итогах и группировках?
Да, конструкцию можно применять и в секции СГРУППИРОВАТЬ ПО, и поверх агрегатных функций, например ВЫРАЗИТЬ(СУММА(Сумма) КАК ЧИСЛО(15, 2)). Округлять агрегат предпочтительнее, чем округлять каждую строку до суммирования.
Что указать в длине, если не знаю максимальное значение?
Ориентируйтесь на разрядность соответствующих реквизитов конфигурации — обычно это ЧИСЛО(15, 2) для сумм. При сомнениях берите длину больше: лишняя разрядность не влияет на результат, а недостаточная приводит к ошибкам.
Можно ли округлить до тысяч без деления и умножения?
Нет, ВЫРАЗИТЬ округляет только по дробной части. Для округления до десятков, сотен или тысяч применяйте приём: разделить на порядок, округлить до целого, умножить обратно.