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

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

Как в 1С округлить число до 0,5

Как в 1С округлить число до 0,5: готовые формулы для языка запросов и встроенного языка, округление цен и количества, типичные ошибки и проверка результата.

Округление до 0,5 — частая задача в 1С: так округляют цены, количество в заказах, вес тары, показания счётчиков и часы в табелях. Стандартная функция Окр() умеет округлять только до заданного разряда — до целых, десятых, сотых, — но не до произвольного шага вроде 0,5. Поэтому приходится применять простой приём: умножить число на 2, округлить до целого и разделить обратно на 2.

Приём работает одинаково во всех конфигурациях — в «1С:Бухгалтерии», «Управлении торговлей», «Зарплате и управлении персоналом» и в самописных решениях. Он применим и во встроенном языке 1С, и в языке запросов, и в формулах ценообразования. Разница только в синтаксисе и в том, где именно вы вставляете формулу.

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

Базовая формула округления до 0,5 во встроенном языке

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

Готовая формула для встроенного языка 1С:

Результат = Окр(Число * 2, 0, 1) / 2;

Здесь Окр() — стандартная функция округления. Первый параметр — округляемое значение, второй (0) — разрядность, то есть округление до целого, третий (1) — режим округления «математически» (1,5 и выше — вверх). Если третий параметр опустить, по умолчанию тоже применяется математическое округление.

Проверьте логику на примерах: 10,24 превращается в 20,48 → округляется до 20 → результат 10,0. Значение 10,26 даёт 20,52 → 21 → 10,5. Значение 10,74 даёт 21,48 → 21 → 10,5. Значение 10,76 даёт 21,52 → 22 → 11,0. То есть границы перехода — 0,25 и 0,75 внутри каждого рубля.

bsl
Функция ОкруглитьДоПоловины(Число) Экспорт
	Возврат Окр(Число * 2, 0, 1) / 2;
КонецФункции

Округление до 0,5 в языке запросов

В запросах 1С нет прямого аналога функции Окр() для произвольного шага, но тот же приём реализуется через умножение и приведение типов. Универсальный вариант — использовать функцию ВЫРАЗИТЬ с усечением до целого, предварительно добавив 0,5 для имитации математического округления:

ВЫБРАТЬ

(ВЫРАЗИТЬ(Цена * 2 + 0.5 КАК ЧИСЛО(15, 0))) / 2 КАК ЦенаОкругленная

ИЗ

РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК Цены

Приведение к ЧИСЛО(15, 0) отбрасывает дробную часть, поэтому добавление 0,5 превращает усечение в округление до ближайшего. Если ваша платформа поддерживает в запросах функцию округления (в свежих версиях платформы есть ОКР), формула упрощается до ОКР(Цена * 2, 0) / 2.

Учтите ограничение: приведение ВЫРАЗИТЬ(... КАК ЧИСЛО(15, 0)) фактически округляет, а не усекает — поведение зависит от версии платформы и СУБД. Поэтому перед внедрением обязательно проверьте запрос на граничных значениях 0,25, 0,75, 1,25 в консоли запросов на копии базы.

Округление всегда вверх или всегда вниз до 0,5

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

Для округления всегда вверх до ближайших 0,5 используйте сочетание целой части и небольшой добавки:

РезультатВверх = Цел(Число * 2 + 0.999999) / 2;

РезультатВниз = Цел(Число * 2) / 2;

Функция Цел() отбрасывает дробную часть. Добавка 0,999999 гарантирует переход на следующий полушаг для любого значения, не равного точной границе. Почему не +1: если число уже ровно кратно 0,5 (например, 10,5), добавка единицы ошибочно поднимет его до 11,0, а 0,999999 оставит на месте.

Проверьте: 10,01 → вверх 10,5, вниз 10,0. Ровно 10,5 → в обеих формулах остаётся 10,5. Это и есть правильное поведение: значение на точной границе не должно сдвигаться.

Сравнение вариантов

Окр(Число <em> 2, 0, 1) / 2

Математическое округление к ближайшему 0,5. Подходит для отчётов, средних значений, погрузочных величин.

Цел(Число </em> 2 + 0.999999) / 2

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

Цел(Число * 2) / 2

Всегда вниз. Подходит для списаний, лимитов и расчётов, где превышение недопустимо.

Где применять округление: цены, количество, часы

В типовых конфигурациях есть штатные механизмы округления цен, и сначала стоит проверить их. В «1С:Управление торговлей» и «ERP» в настройках видов цен доступны правила округления, в том числе до 0,5 — через параметры «Округлять до» и «Порядок округления». Если задача касается только цен, настройка штатного механизма надёжнее доработки кода.

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

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

Пошаговое внедрение формулы в конфигурацию

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

Порядок действий
  1. 1
    Сделайте копию базы или используйте тестовую среду разработки
  2. 2
    Определите точку применения: вид цены, обработчик документа, запрос отчёта
  3. 3
    Создайте функцию ОкруглитьДоПоловины(Число) с формулой Окр(Число * 2, 0, 1) / 2 в общем модуле
  4. 4
    Подключите функцию в нужном месте и пересчитайте тестовый документ
  5. 5
    Сравните результат с ручным расчётом на значениях 10,24 / 10,26 / 10,74 / 10,76
  6. 6
    Проверьте граничные случаи: 0, отрицательные числа, значения ровно на границе 0,25 и 0,75
  7. 7
    Перенесите изменение в рабочую базу и пересчитайте затронутые данные

Отдельно проверьте отрицательные числа, если они возможны в ваших данных (возвраты, сторно). Функция Окр() округляет отрицательные значения по модулю: -10,26 даст -10,5. Обычно это ожидаемое поведение, но в финансовых расчётах правило для отрицательных сумм стоит зафиксировать явно в комментарии к функции.

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

Самая частая ошибка — попытка округлить до 0,5 напрямую через Окр(Число, 0.5). Второй параметр Окр() задаёт разрядность (количество знаков после запятой или отрицательное число для разрядов целой части), а не шаг округления. Значение 0,5 в этом параметре приведёт к ошибке или непредсказуемому результату.

Вторая ошибка — потеря точности из-за типа данных. Если реквизит документа имеет точность Число(15, 0), то округлённое значение 10,5 просто не сохранится — оно обрежется до 10 или 11. Перед внедрением проверьте квалификаторы типа реквизита: для хранения половинок нужна точность минимум один знак после запятой.

Третья ошибка — округление в формах «на лету» без сохранения в данных. Пользователь видит округлённое значение, а в базе хранится исходное, и отчёты показывают другие цифры. Округляйте либо в данных, либо только в отображении — но делайте это единообразно во всех местах, где фигурирует показатель.

Типичные ошибки
01
Окр(Число, 0.5) — параметр задаёт разрядность, а не шаг; формула не работает как ожидается
02
Реквизит с точностью 0 знаков обрезает 10,5 до целого — результат теряется при записи
03
Округление до умножения на количество — погрешность накапливается в итоге документа
04
Округление только в отображении — отчёты и проводки расходятся с тем, что видит пользователь
05
Проверка только на «удобных» числах — ошибка всплывает на границах 0,25 и 0,75 уже в работе

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

Быстрая проверка формулы без запуска конфигурации — через консоль кода (внешнюю обработку или встроенную в режиме предприятия, если она предусмотрена). Выполните выражение Сообщить(Окр(10.26 * 2, 0, 1) / 2) и убедитесь, что выводится 10,5.

Для массовой проверки сформируйте тестовый набор значений от 0 до 5 с шагом 0,01 и выгрузите результаты в таблицу. Все значения должны попадать в ряд 0; 0,5; 1; 1,5 и так далее, а переходы — происходить строго на отметках 0,25 и 0,75.

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

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

Значение 10,26
Норма

Результат 10,5

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

10,0 или 11,0 — нарушена логика округления

Значение ровно на границе 10,25
Норма

10,5 при математическом режиме

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

10,0 — проверьте третий параметр Окр()

Реквизит после записи документа
Норма

Сохраняется 10,5

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

Сохраняется 10 или 11 — не хватает точности типа

Отчёт по тем же данным
Норма

Цифры совпадают с документом

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

Расхождения — округление применено не везде

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

Как округлить до 0,5 в формуле цены без программирования?

В конфигурациях с штатным ценообразованием (УТ, ERP, Комплексная автоматизация) откройте настройку вида цены и задайте правило округления: точность 0,5 и нужный порядок — в большую сторону или по арифметическим правилам. Доработка кода в этом случае не требуется.

Работает ли формула с отрицательными числами?

Да. Окр(-10,26 * 2, 0, 1) / 2 даст -10,5, то есть округление идёт от нуля по модулю. Для возвратов и сторно это обычно корректно, но если учётная политика требует иного правила для отрицательных сумм, задайте его отдельным условием.

Как округлить до 0,5 в СКД или отчёте?

В вычисляемом поле СКД используйте тот же приём, что и в запросе: ВЫРАЗИТЬ(Поле * 2 + 0.5 КАК ЧИСЛО(15, 0)) / 2. Альтернатива — добавить вычисляемое поле на языке 1С в настройках СКД и применить функцию Окр().

Можно ли округлить до 0,25 или 0,1 тем же способом?

Да, метод универсален: разделите единицу на нужный шаг и используйте результат как множитель. Для 0,25 — Окр(Число 4, 0, 1) / 4, для 0,1 — Окр(Число 10, 0, 1) / 10, для 5 — Окр(Число / 5, 0, 1) * 5.

Почему после округления 10,5 сохраняется как 10 или 11?

Причина в квалификаторе типа реквизита: у числового поля задана точность 0 знаков после запятой. Увеличьте точность реквизита минимум до одного знака в конфигураторе и обновите конфигурацию базы данных — после этого половинки будут сохраняться корректно.

Чем округление до 0,5 отличается от округления до 1 знака после запятой?

Округление до одного знака даёт шаг 0,1 (10,1; 10,2; 10,3), а до 0,5 — только два значения в пределах единицы: ,0 и ,5. Функция Окр() с разрядностью 1 не заменяет округление до половин, нужен приём с умножением на 2.

Итог

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

Округление до 0,5 в 1С делается формулой Окр(Число * 2, 0, 1) / 2; для округления строго вверх или вниз используйте Цел() с соответствующей добавкой. Проверяйте точность типа реквизита, округляйте один раз в конце расчёта и тестируйте формулу на граничных значениях 0,25 и 0,75 до переноса в рабочую базу.