Разработка и Конфигурация · 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 внутри каждого рубля.
Функция ОкруглитьДоПоловины(Число) Экспорт
Возврат Окр(Число * 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. Это и есть правильное поведение: значение на точной границе не должно сдвигаться.
Сравнение вариантов
Математическое округление к ближайшему 0,5. Подходит для отчётов, средних значений, погрузочных величин.
Всегда вверх. Подходит для цен продажи и минимальных партий заказа, чтобы не уйти в минус по марже.
Всегда вниз. Подходит для списаний, лимитов и расчётов, где превышение недопустимо.
Где применять округление: цены, количество, часы
В типовых конфигурациях есть штатные механизмы округления цен, и сначала стоит проверить их. В «1С:Управление торговлей» и «ERP» в настройках видов цен доступны правила округления, в том числе до 0,5 — через параметры «Округлять до» и «Порядок округления». Если задача касается только цен, настройка штатного механизма надёжнее доработки кода.
Если штатных возможностей не хватает — например, нужно округлять количество в заказе поставщику до упаковок по 0,5 тонны — формулу встраивают в обработчики документов или внешние обработки. Типичное место — процедура ПриИзменении поля количества или подписка на событие записи документа.
Для табелей и учёта рабочего времени округление до 0,5 часа применяют в момент расчёта, а не при вводе данных. Так исходные данные остаются точными, а округление становится обратимой операцией: при изменении правила достаточно пересчитать, не теряя первичную информацию.
Пошаговое внедрение формулы в конфигурацию
Ниже порядок действий для безопасного внедрения округления до 0,5 через расширение или доработку. Он подходит и для самописных конфигураций, и для типовых, изменённых через расширение.
- 1Сделайте копию базы или используйте тестовую среду разработки
- 2Определите точку применения: вид цены, обработчик документа, запрос отчёта
- 3Создайте функцию ОкруглитьДоПоловины(Число) с формулой Окр(Число * 2, 0, 1) / 2 в общем модуле
- 4Подключите функцию в нужном месте и пересчитайте тестовый документ
- 5Сравните результат с ручным расчётом на значениях 10,24 / 10,26 / 10,74 / 10,76
- 6Проверьте граничные случаи: 0, отрицательные числа, значения ровно на границе 0,25 и 0,75
- 7Перенесите изменение в рабочую базу и пересчитайте затронутые данные
Отдельно проверьте отрицательные числа, если они возможны в ваших данных (возвраты, сторно). Функция Окр() округляет отрицательные значения по модулю: -10,26 даст -10,5. Обычно это ожидаемое поведение, но в финансовых расчётах правило для отрицательных сумм стоит зафиксировать явно в комментарии к функции.
Типичные ошибки и ограничения
Самая частая ошибка — попытка округлить до 0,5 напрямую через Окр(Число, 0.5). Второй параметр Окр() задаёт разрядность (количество знаков после запятой или отрицательное число для разрядов целой части), а не шаг округления. Значение 0,5 в этом параметре приведёт к ошибке или непредсказуемому результату.
Вторая ошибка — потеря точности из-за типа данных. Если реквизит документа имеет точность Число(15, 0), то округлённое значение 10,5 просто не сохранится — оно обрежется до 10 или 11. Перед внедрением проверьте квалификаторы типа реквизита: для хранения половинок нужна точность минимум один знак после запятой.
Третья ошибка — округление в формах «на лету» без сохранения в данных. Пользователь видит округлённое значение, а в базе хранится исходное, и отчёты показывают другие цифры. Округляйте либо в данных, либо только в отображении — но делайте это единообразно во всех местах, где фигурирует показатель.
Как проверить результат округления
Быстрая проверка формулы без запуска конфигурации — через консоль кода (внешнюю обработку или встроенную в режиме предприятия, если она предусмотрена). Выполните выражение Сообщить(Окр(10.26 * 2, 0, 1) / 2) и убедитесь, что выводится 10,5.
Для массовой проверки сформируйте тестовый набор значений от 0 до 5 с шагом 0,01 и выгрузите результаты в таблицу. Все значения должны попадать в ряд 0; 0,5; 1; 1,5 и так далее, а переходы — происходить строго на отметках 0,25 и 0,75.
Как проверить результат
Результат 10,5
10,0 или 11,0 — нарушена логика округления
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 до переноса в рабочую базу.