Работа с числами в 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) / 100 → 123.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
5. Обрезка чисел в запросах 1С
В языке запросов 1С также есть инструменты для работы с числами. Для округления используйте функцию ОКР(), а для усечения — комбинацию ЦЕЛ() и деления.
Примеры:
ВЫБРАТЬ
ОКР(СуммаДокумента, 2) КАК СуммаОкругленная,
ЦЕЛ(СуммаДокумента * 100) / 100 КАК СуммаУсечённая
ИЗ
Документ.РеализацияТоваровУслуг
Внимание! В запросах 1С нельзя использовать функцию Формат() — она работает только на стороне клиента.
Убедиться, что поле имеет числовой тип|Проверить наличие 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) / 100 → 1.01.
Как округлить число всегда в меньшую сторону?
Используйте функцию Цел() для положительных чисел или ОкрВниз() (если доступна в вашей версии платформы).
Можно ли обрезать числа прямо в СКД (система компоновки данных)?
Да, в настройках поля вывода укажите формат: ЧДЦ=2. Также можно использовать выражение: ОКР(Поле, 2).
Как обрезать число в макете печатной формы?
В макете (.mxl или .ert) для ячейки с числом установите свойство Формат = "ЧДЦ=2" или используйте выражение: =Окр(Сумма, 2).