Работа с числами в 1С:Предприятие — одна из самых частых задач при разработке отчётов, обработок и конфигураций. Но что делать, когда нужно уменьшить количество знаков после запятой, округлить значение до целого или усечь дробную часть без округления? В этой статье разберём все способы «обрезки» чисел в 1С 8.3, включая нюансы для типовых конфигураций (УТ 11, БП 3.0, ЗУП 3.1).

Многие разработчики путают округление и усечение — это разные операции. Например, число 3.789 при округлении до двух знаков станет 3.79, а при усечении — 3.78. Также важно учитывать региональные настройки платформы, которые влияют на разделитель дробной части (точка или запятая). Далее — подробные инструкции с примерами кода и таблицами сравнения методов.

1. Округление чисел в 1С: функции Окр() и Round()

Самый распространённый способ — использование встроенных функций Окр() (для русскоязычной платформы) или Round() (для англоязычной). Они позволяют округлить число до заданного количества знаков после запятой по математическим правилам (если дробная часть ≥ 0.5 — округляет вверх).

Синтаксис:

Окр(Число, КоличествоЗнаков)

Round(Number, Precision)

Примеры:

  • 📌 Окр(123.456, 1)123.5 (округление до 1 знака)
  • 📌 Окр(123.456, 0)123 (округление до целого)
  • 📌 Окр(123.456, -1)120 (округление до десятков)

Важно! При округлении отрицательных чисел функция ведёт себя иначе: Окр(-123.456, 1)-123.5. Это связано с направлением округления (к нулю или от нуля).

💡

Если нужно округлить число всегда в большую сторону (например, для расчёта запасов), используйте функцию ОкрВверх() или Ceil().

2. Усечение дробной части без округления: функция Цел() и её аналоги

Если задача — просто отбросить лишние знаки после запятой без округления, используйте функцию Цел() (или Int() для англоязычной версии). Она возвращает целую часть числа, отбрасывая дробную.

Примеры:

  • 🔢 Цел(123.999)123
  • 🔢 Цел(-123.999)-124 (внимание на отрицательные числа!)

Для усечения до N знаков после запятой используйте комбинацию функций:

Цел(Число * 10^N) / 10^N

Пример для 2 знаков: Цел(123.456 * 100) / 100123.45.

Почему Цел() работает не так с отрицательными числами?

Функция Цел() возвращает наибольшее целое число, не превышающее аргумент. Для -123.999 это -124, так как -124 < -123.999 < -123.

3. Форматирование чисел для вывода: функция Формат()

Когда нужно не изменить само число, а только отобразить его с определённым количеством знаков, используйте функцию Формат(). Она не меняет значение переменной, но возвращает строку с нужным форматом.

Синтаксис:

Формат(Число, "ЧФ=N; ЧДЦ=N")

Где:

  • 📝 ЧФ — количество знаков в целой части.
  • 📝 ЧДЦ — количество знаков в дробной части.

Примеры:

КодРезультат
Формат(123.456, "ЧДЦ=1")"123.5"
Формат(123.456, "ЧДЦ=0")"123"
Формат(123.456, "ЧФ=5; ЧДЦ=2")"00123.46"

Формат() не изменяет само число — только его строковое представление. Для математических операций используйте Окр() или Цел().

4. Работа с типами данных: Число vs. ДробноеЧисло

В 1С:Предприятие 8.3 есть два типа для хранения чисел:

  • 🔹 Число — целое или с фиксированной точностью (до 10 знаков после запятой).
  • 🔹 ДробноеЧисло — для высокоточных вычислений (до 28 знаков после запятой).

При обрезке чисел важно учитывать их тип:

  • 🛠 Для Число функции Окр() и Цел() работают стандартно.
  • 🛠 Для ДробноеЧисло может потребоваться явное приведение типов:
ДробноеЧисло = 123.456789;

Обрезанное = Окр(Число(ДробноеЧисло), 2); // → 123.46

📊 Какой тип чисел вы чаще используете в 1С?
Число
ДробноеЧисло
Зависит от задачи
Не знаю

5. Обрезка чисел в запросах 1С

В языке запросов также есть инструменты для работы с числами. Для округления используйте функцию ОКР(), а для усечения — комбинацию ЦЕЛ() и деления.

Примеры:

ВЫБРАТЬ

ОКР(СуммаДокумента, 2) КАК СуммаОкругленная,

ЦЕЛ(СуммаДокумента * 100) / 100 КАК СуммаУсечённая

ИЗ

Документ.РеализацияТоваровУслуг

Внимание! В запросах нельзя использовать функцию Формат() — она работает только на стороне клиента.

Убедиться, что поле имеет числовой тип|Проверить наличие NULL-значений|Учесть региональные настройки (разделитель дробной части)|Протестировать на отрицательных числах-->

6. Особенности обрезки чисел в типовых конфигурациях

В стандартных конфигурациях (УТ 11, БП 3.0, ЗУП 3.1) часто встречаются готовые механизмы для работы с числами:

  • 📦 В Управлении Торговлей цены и количества обычно хранятся с точностью до 3 знаков после запятой. При выводе в печатные формы используется округление до 2 знаков.
  • 💰 В Бухгалтерии Предприятия суммы в валюте округляются согласно настройкам валюты (например, рубли — до 2 знаков, доллары — до 2 или 4 знаков).
  • 👥 В Зарплате и Управлении Персоналом расчёты с точностью до копеек (2 знака), но промежуточные вычисления могут использовать больше знаков.

Пример кода для обрезки суммы документа в БП 3.0:

СуммаДокумента = Документ.СуммаДокумента;

СуммаОкругленная = Окр(СуммаДокумента, 2); // Округление до копеек

СуммаУсечённая = Цел(СуммаДокумента * 100) / 100; // Усечение до копеек

💡

В типовых конфигурациях часто есть предопределённые процедуры для округления (например, ОкруглитьСумму() в БП). Ищите их в модулях объектов перед написанием своего кода.

7. Ошибки при обрезке чисел и как их избежать

Распространённые ошибки и их решения:

⚠️ Внимание! При обрезке чисел для финансовых расчётов (налоги, зарплата) используйте округление, а не усечение. Это требование бухгалтерских стандартов (ПБУ, НК РФ).
  • Потеря точности: При многократных операциях с дробными числами накапливаются ошибки. Решение — использовать ДробноеЧисло для промежуточных вычислений.
  • Неучёт региональных настроек: В некоторых странах разделитель дробной части — запятая, а не точка. Проверяйте настройку ФорматЧисла().
  • Округление в неправильную сторону: Для налоговых расчётов может потребоваться округление всегда в большую сторону (например, НДС). Используйте ОкрВверх().

Пример кода для безопасного округления НДС:

СуммаБезНДС = 1000.123;

СтавкаНДС = 20; // %

НДС = ОкрВверх(СуммаБезНДС * СтавкаНДС / 100, 2); // Всегда вверх до копеек

8. Альтернативные способы: регулярные выражения и строковые функции

В редких случаях (например, при парсинге строковых данных) может потребоваться обрезать число как строку. Для этого используйте функции СтрЗнач(), Лев(), Прав() или регулярные выражения.

Пример обрезки дробной части через строки:

ЧислоСтрокой = СтрЗнач(123.456, "ЧДЦ=3"); // "123.456"

ЧислоБезДробной = Число(Лев(ЧислоСтрокой, Найти(ЧислоСтрокой, ".") - 1)); // 123

Предупреждение: Такой подход не рекомендуется для финансовых расчётов из-за риска ошибок при преобразовании строк в числа.

💡

Для обрезки чисел в табличных документах (например, в печатных формах) используйте свойство Формат у колонки: Таблица.Колонки.Сумма.Формат = "ЧДЦ=2".

FAQ: Частые вопросы по обрезке чисел в 1С

Как обрезать число до 2 знаков после запятой без округления?

Используйте формулу: Цел(Число * 100) / 100. Например, для 123.456 результат будет 123.45.

Почему Окр(1.005, 2) даёт 1.0 вместо 1.01?

Это особенность работы с числами с плавающей запятой. Для точных расчётов используйте ДробноеЧисло или умножайте на 100 перед округлением: Окр(1.005 * 100, 0) / 1001.01.

Как округлить число всегда в меньшую сторону?

Используйте функцию Цел() для положительных чисел или ОкрВниз() (если доступна в вашей версии платформы).

Можно ли обрезать числа прямо в СКД (система компоновки данных)?

Да, в настройках поля вывода укажите формат: ЧДЦ=2. Также можно использовать выражение: ОКР(Поле, 2).

Как обрезать число в макете печатной формы?

В макете (.mxl или .ert) для ячейки с числом установите свойство Формат = "ЧДЦ=2" или используйте выражение: =Окр(Сумма, 2).