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