Как в 1С округлить число до копеек, десятков и тысяч
Содержание
Округляет число в 1С встроенная функция Окр(Число, Разрядность, РежимОкругления). Чтобы получить сумму с точностью до копеек, пишут Окр(Сумма, 2); до целых рублей — Окр(Сумма); до сотен и тысяч — отрицательную разрядность: Окр(Сумма, -2).
Главная путаница новичков — ждать от Окр отбрасывания «хвоста». Функция именно округляет по математическим правилам, а не обрезает: Окр(12.99) даст 13, а не 12. Для обрезки дробной части есть отдельная функция Цел. Ниже разберём все параметры Окр, оба режима округления, работу с валютой и копейками, а также округление в запросах и в системе компоновки данных (СКД).
Синтаксис функции Окр и параметр разрядности
Функция принимает до трёх аргументов, обязателен только первый:
- Число — исходное значение (число или выражение);
- Разрядность — сколько знаков оставить после запятой (по умолчанию
0); - РежимОкругления — что делать с граничным значением
0,5(по умолчанию1).
Положительная разрядность задаёт количество знаков дробной части:
Окр(12.345, 2); // 12.35
Окр(12.344, 2); // 12.34
Окр(12.3456, 1); // 12.3
Окр(12.9); // 13 — разрядность 0, округление до целого
Разрядность бывает и отрицательной — тогда округление идёт в целой части: до десятков, сотен, тысяч.
Окр(1256, -1); // 1260
Окр(1256, -2); // 1300
Окр(1240, -2); // 1200
Окр(1256, -3); // 1000
Отрицательная разрядность удобна для «красивых» сумм в коммерческих предложениях и прайсах — округлить цену до десятков или сотен рублей одной строкой кода.
Тип значения 1С «Число» хранит до 38 значащих цифр в десятичном виде, поэтому классических ошибок двоичной арифметики (когда 0,1 + 0,2 даёт 0,30000000004) здесь нет. Погрешность появляется в основном при делении — вот где округление обязательно.
Два режима округления: 1,5 как 2 и 1,5 как 1
Третий параметр влияет ровно на один случай — когда отбрасываемая часть равна ровно половине последнего оставляемого разряда. Во всех остальных случаях округление идёт к ближайшему значению и от режима не зависит.
| Режим | Значение | Поведение на 0,5 | Пример |
|---|---|---|---|
| По умолчанию | 1 | 1,5 округляется как 2 (от нуля) | Окр(2.5) → 3 |
| Банковский / бухгалтерский | 0 | 1,5 округляется как 1 (к нулю) | Окр(2.5, 0, 0) → 2 |
Окр(2.5); // 3 — по умолчанию «от нуля»
Окр(2.5, 0, 0); // 2 — режим «к нулю»
Окр(0.5); // 1
Окр(0.5, 0, 0); // 0
Окр(-2.5); // -3 — знак не меняет логику: округление по модулю
Окр(-2.5, 0, 0); // -2
Режим по умолчанию — «1,5 как 2». Если забыть третий параметр там, где нужна банковская логика, итоговые суммы разойдутся на копейки. Для сумм НДС и взаиморасчётов уточняйте требование у методиста: типовые конфигурации чаще используют округление «от нуля».
Зачем вообще нужен режим «к нулю». При массовых расчётах округление всегда «вверх» на середине даёт систематическое смещение итога в большую сторону — на больших объёмах это заметные рубли. Банковский режим распределяет смещение симметрично, поэтому в финансовых расчётах его выбирают осознанно, а не «как получилось».
Обратите внимание на отрицательные числа: Окр(-2.5) даёт -3, потому что округление идёт по модулю, а знак возвращается на место. Это важно при расчёте корректировок и сторно.
Как отбросить дробную часть без округления
Когда нужно именно отбросить знаки, а не округлить, функция Окр не подходит. Используйте Цел — она возвращает целую часть, отсекая дробную в сторону нуля.
Цел(12.99); // 12
Цел(12.01); // 12
Цел(-12.99); // -12 — обрезка к нулю, а не к меньшему
Чтобы обрезать до нужного числа знаков (а не до целого), умножьте, обрежьте и поделите обратно:
// Обрезать до 2 знаков без округления
Результат = Цел(12.9999 * 100) / 100; // 12.99, а не 13.00
Сравните разницу подходов на одном числе 12,9999:
Окр(12.9999, 2)→13.00(округление);Цел(12.9999 * 100) / 100→12.99(обрезка).
Не путайте обрезку с режимом 0. Режим «1,5 как 1» срабатывает только на точной середине. Окр(12.9999, 2, 0) вернёт 13.00, потому что отбрасываемая часть 0,0099 больше половины, а не равна ей.
Округление сумм, НДС и копеек
Самая частая задача — свести сумму к копейкам. Копейки — это два знака после запятой, то есть разрядность 2.
// НДС 20% от суммы
СуммаБезНДС = 1234.56;
НДС = Окр(СуммаБезНДС * 0.20, 2); // 246.912 → 246.91
Проверим: 1234,56 × 0,20 = 246,912, после Окр(…, 2) получаем 246,91. Третий знак 2 меньше пяти — округляем вниз.
Отдельная ловушка — распределение суммы по строкам. Если делить и округлять каждую строку независимо, итог не сойдётся с общей суммой на копейку-две. Правильный приём: последней строке отдать остаток.
СуммаВсего = 100; // распределяем 100 руб. по 3 строкам
КолСтрок = 3;
Распределено = 0;
Для Сч = 1 По КолСтрок Цикл
Если Сч = КолСтрок Тогда
ДоляСтроки = СуммаВсего - Распределено; // остаток на последнюю
Иначе
ДоляСтроки = Окр(СуммаВсего / КолСтрок, 2);
Распределено = Распределено + ДоляСтроки;
КонецЕсли;
Сообщить(ДоляСтроки);
КонецЦикла;
// 33.33, 33.33, 33.34 — в сумме ровно 100
Без этого приёма вы получили бы 33,33 × 3 = 99,99 и потеряли копейку. В типовых документах 1С такая логика зашита в проведение, но в собственных обработках и печатных формах её нужно писать руками.
Ещё один механизм округления работает незаметно — при записи в реквизит с фиксированной разрядностью. Если у реквизита документа задано 2 знака после запятой, а вы присваиваете ему 12,345, платформа сама приведёт значение к точности реквизита при записи. Поэтому не удивляйтесь, если «лишние» знаки исчезают без вызова Окр: сработала разрядность самого реквизита. Проверить её можно в конфигураторе, в свойствах реквизита (тип Число, поле «Точность»). Если нужен контроль — округляйте явно перед присвоением, не полагаясь на настройку реквизита.
Округление валютных сумм и пересчёт в валюту учёта
При работе с валютой округление нужно в двух местах: при пересчёте в валюту регламентированного учёта (обычно рубли) и при расчёте курсовых разниц.
Сумма в валюте учёта — это сумма в валюте документа, умноженная на курс и приведённая к копейкам:
СуммаВалюта = 100; // 100 USD
Курс = 92.3456; // курс за единицу
СуммаРубли = Окр(СуммаВалюта * Курс, 2); // 9234.56
Здесь важен тот же вопрос, что и с распределением: округлять построчно или по документу в целом. Если в документе несколько строк, сумма построчных округлений может отличаться от округления итога — отсюда «копеечные» расхождения в проводках. В типовых конфигурациях способ округления задаётся учётной политикой и настройками договора; в своём коде выберите один принцип и держитесь его по всему документу.
Для валют с другой точностью (например, где в обороте нет копеек) меняйте разрядность: Окр(Сумма, 0) для целых единиц. Точность копеек не «зашита» в функцию — её задаёте вы.
Курсовую разницу считают как разность оценок обязательства на две даты, и каждую оценку округляют до копеек до вычитания, иначе разница «поплывёт» на копейку.
Округление в запросах и системе компоновки данных
В языке запросов 1С нет функции Окр. Привести число к нужной точности помогает оператор приведения типа ВЫРАЗИТЬ:
ВЫБРАТЬ
ВЫРАЗИТЬ(Продажи.Сумма КАК ЧИСЛО(15, 2)) КАК СуммаОкругл
ИЗ
РегистрНакопления.Продажи КАК Продажи
Конструкция ЧИСЛО(15, 2) задаёт 15 знаков всего и 2 после запятой, приводя значение к этой точности. Для контроля итогов надёжнее округлять уже результат — в вычисляемом поле или в коде обработки через Окр, где поведение предсказуемо.
В СКД округление делают в двух местах:
- Вычисляемые поля и ресурсы — там доступна функция
Окр(…), как в обычном коде. Например, ресурсОкр(Сумма(Сумма), 2). - Формат поля (
НЧ,ЧДЦ,ЧРД) — но это только отображение. Формат округляет картинку на экране, а не само значение — при выгрузке в таблицу или дальнейших расчётах «сырое» число останется с полным хвостом.
Если итог отчёта должен сходиться до копейки, округляйте в ресурсе функцией Окр, а формат используйте лишь для внешнего вида.
Для вывода в печатную форму разделяйте две задачи. Округление значения — это Окр. Красивое отображение — функция Формат: параметр ЧДЦ задаёт число знаков дробной части, ЧРД — разделитель. Например, Формат(1234.5, "ЧДЦ=2; ЧРД=,") покажет 1 234,50. Но помните: Формат возвращает строку и только оформляет число — для дальнейших расчётов берите исходное значение, уже округлённое через Окр.
Готовые примеры кода
Короткая шпаргалка под частые задачи — можно копировать и подставлять свои переменные.
// До копеек (2 знака)
Копейки = Окр(Число, 2);
// До целых рублей
Рубли = Окр(Число);
// До десятков, сотен, тысяч
Десятки = Окр(Число, -1);
Сотни = Окр(Число, -2);
Тысячи = Окр(Число, -3);
// Банковское округление (1,5 как 1)
Банк = Окр(Число, 2, 0);
// Обрезать дробную часть (без округления)
ЦелаяЧасть = Цел(Число);
ДваЗнакаОбрезка = Цел(Число * 100) / 100;
// Округление вверх до целого (ceiling)
Вверх = ?(Число > Цел(Число), Цел(Число) + 1, Цел(Число));
// Округление процента НДС
НДС = Окр(СуммаБезНДС * СтавкаНДС / 100, 2);
Отдельно про «округление вверх»: встроенного ceiling в 1С нет, но его легко собрать через Цел — если дробная часть ненулевая, прибавляем единицу к целой. Для отрицательных чисел логику нужно адаптировать под задачу.
Проверьте, как вы поняли поведение Окр:
Частые ошибки при округлении
Ошибки округления редко роняют код — они тихо портят суммы. Вот что ловят чаще всего.
- ❌ Ждут от
Окробрезки.Окр(12.99)даёт13. Для обрезки —Цел. - ❌ Путают
ФорматиОкр.Формат(123.456, "ЧДЦ=2")покажет123,46, но переменная по-прежнему хранит123,456. Для реального округления значения нуженОкр, а не формат. - ❌ Округляют каждую строку и теряют копейки в итоге. Лечится остатком на последней строке (см. выше).
- ❌ Забывают третий параметр. Если бизнес-логика требует «1,5 как 1», а в коде
Окр(Сумма, 2)без режима, суммы разойдутся с бухгалтерией. - ❌ Округляют после вычитания курсовой разницы. Округлять нужно каждую оценку до разности, иначе копейка «переедет».
Прежде чем менять округление в типовой конфигурации через расширение или доработку — согласуйте это с методистом и сделайте резервную копию базы. Копеечная разница в проводках всплывает на закрытии периода.
Частые вопросы
Как в 1С округлить число до целого?
Окр(Число) или Окр(Число, 0). По умолчанию значение 0,5 округляется вверх (от нуля): Окр(2.5) даст 3.Чем отличается Окр от Цел?
Окр округляет по математическим правилам к ближайшему значению, Цел просто отбрасывает дробную часть в сторону нуля. Окр(12.9) = 13, а Цел(12.9) = 12.Как округлить до сотен или тысяч?
Окр(Число, -2) округлит до сотен, Окр(Число, -3) — до тысяч.Почему сумма строк не сходится с итогом на копейку?
Как сделать банковское округление (1,5 к меньшему)?
Окр(Число, 2, 0). Тогда значение ровно 0,5 округлится к ближайшему чётному по модулю вниз — «1,5 как 1».Можно ли округлять в запросе?
ВЫРАЗИТЬ(Поле КАК ЧИСЛО(15, 2)) для приведения точности, а для надёжного контроля итогов округляйте результат функцией Окр в коде или в ресурсе СКД.