Как в 1С округлить число до копеек, десятков и тысяч

· 9 мин

Содержание

Округляет число в 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Пример
По умолчанию11,5 округляется как 2 (от нуля)Окр(2.5) → 3
Банковский / бухгалтерский01,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 после запятой, приводя значение к этой точности. Для контроля итогов надёжнее округлять уже результат — в вычисляемом поле или в коде обработки через Окр, где поведение предсказуемо.

В СКД округление делают в двух местах:

  1. Вычисляемые поля и ресурсы — там доступна функция Окр(…), как в обычном коде. Например, ресурс Окр(Сумма(Сумма), 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С нет, но его легко собрать через Цел — если дробная часть ненулевая, прибавляем единицу к целой. Для отрицательных чисел логику нужно адаптировать под задачу.

Проверьте, как вы поняли поведение Окр:

Проверьте себя
Чему равно Окр(2.5) с режимом по умолчанию?
Чему равно Окр(1256, -2)?
Как отбросить дробную часть без округления?

Частые ошибки при округлении

Ошибки округления редко роняют код — они тихо портят суммы. Вот что ловят чаще всего.

  • ❌ Ждут от Окр обрезки. Окр(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)) для приведения точности, а для надёжного контроля итогов округляйте результат функцией Окр в коде или в ресурсе СКД.