К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как сделать дробное число в 1С

Как задать дробное число в 1С: тип Число, квалификаторы точности, функции Окр(), Цел(), деление, округление и настройка реквизитов в конфигураторе.

Дробное число в 1С создаётся двумя основными путями: через тип данных «Число» с заданной точностью (количеством знаков после запятой) или через операции встроенного языка, где результат деления и вычислений автоматически становится дробным. Программист работает с дробными значениями в коде, а разработчик конфигурации дополнительно настраивает точность реквизитов объектов — документов, справочников, регистров.

Главная ловушка для начинающих — целочисленное деление и потеря дробной части при неправильно настроенной точности реквизита. Если поле объекта объявлено как «Число (10, 0)», то любое дробное значение, записанное в него, будет округлено до целого, и вернуть исходные данные уже нельзя. Поэтому точность нужно планировать до заполнения базы реальными данными.

Ниже разобраны все практические сценарии: объявление дробных чисел в коде, настройка реквизитов в конфигураторе, деление без потери дробной части, округление, форматированный вывод и типичные ошибки при сравнении дробных значений.

Тип «Число» и квалификатор точности в конфигураторе

Когда вы добавляете реквизит к документу, справочнику или регистру, в палитре свойств выбирается тип «Число» и задаются два параметра: длина (общее количество цифр, включая дробную часть) и точность (количество знаков после запятой). Например, «Число (15, 2)» — стандартный вариант для денежных сумм, а «Число (15, 3)» часто используют для количества товара, когда допускается дробный отпуск (вес, метраж, литраж).

Если точность равна нулю, реквизит хранит только целые значения. При попытке записать туда 7,65 платформа округлит значение по правилам арифметического округления — и исходная дробная часть будет потеряна безвозвратно. Обратное изменение (увеличение точности у уже заполненного реквизита) безопасно: старые значения останутся целыми, новые смогут быть дробными.

При уменьшении длины или точности существующего реквизита платформа при обновлении конфигурации базы данных выполнит реструктуризацию и усечёт значения. Перед таким изменением обязательно сделайте резервную копию информационной базы.

Дробные числа в коде встроенного языка

В модуле дробный литерал записывается с точкой в качестве разделителя, независимо от региональных настроек: Цена = 199.99;. Переменные в 1С не типизируются заранее — переменная становится дробной в момент присваивания ей дробного значения.

Деление оператором «/» всегда возвращает дробный результат, если деление неточное: Результат = 7 / 2; даст 2,5… точнее 3,5. Однако есть нюанс: если оба операнда целые, а результат присваивается реквизиту с нулевой точностью, дробная часть отбрасывается уже на этапе записи в объект, а не в момент вычисления.

Для получения остатка от деления используется оператор «%»: Остаток = 7 % 2; вернёт 1. Целую часть частного можно получить функцией Цел(7 / 2) — она отбрасывает дробную часть без округления, то есть Цел(3,9) равно 3.

bsl
Количество = 7;
Цена = 2;
Среднее = Количество / Цена;      // 3.5 — дробное
ЦелаяЧасть = Цел(Среднее);         // 3
Остаток = Количество % Цена;       // 1
Округлено = Окр(Среднее, 2);       // 3.5 с точностью 2 знака

Округление: функция Окр() и режимы

Функция Окр(Число, Разрядность) округляет значение до указанного количества знаков после запятой: Окр(3.14159, 2) вернёт 3,14. Если разрядность отрицательная, округление идёт влево от запятой: Окр(1234, -2) даст 1200 — это удобно для округления сумм до сотен.

По умолчанию 1С использует арифметическое округление (1,5 → 2). В коде доступен и альтернативный режим через третий параметр функции с перечислением РежимОкругления, позволяющий округлять «до чётного» (банковское округление): Окр(2.5, 0, РежимОкругления.Окр15как10) даст 2, а Окр(3.5, 0, ...) — 4. Это важно в расчётах, где систематическое округление вверх накапливает погрешность на больших объёмах данных.

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

Типичные ошибки
01
Округление промежуточных значений в цикле — итоговая сумма расходится с контрольной на копейки
02
Использование Цел() вместо Окр() — значение 2,99 превращается в 2 вместо 3
03
Сравнение дробных чисел через строгое равенство после вычислений — из-за представления чисел результат 0.1+0.2=0.3 может оказаться ложным
04
Деление с последующей записью в целочисленный реквизит — дробная часть теряется молча, без ошибок

Дробное количество в документах и регистрах

Типовая ситуация: товар отпускается в метрах, килограммах или литрах, и количество в табличной части документа должно быть дробным. Для этого у реквизита «Количество» в табличной части устанавливается точность 3 (или больше, по требованиям учёта). Ту же точность должны иметь ресурсы регистров накопления, куда документ пишет движения, — иначе при проведении дробная часть обрежется.

Проверьте согласованность всей цепочки: реквизит документа → ресурс регистра → реквизиты отчётов и обработок. Расхождение точности в любом звене приводит к тихой потере данных. В типовых конфигурациях точность количества обычно уже настроена, но при добавлении собственных реквизитов и регистров её нужно задавать осознанно.

Если учёт уже ведётся и дробные количества «не вводятся» в форме, проверьте не только тип реквизита, но и форматную строку поля ввода: свойство «Формат» в палитре свойств элемента формы может визуально обрезать дробную часть, хотя в данных она сохраняется.

Порядок действий
  1. 1
    Откройте конфигуратор и найдите нужный реквизит документа или ресурс регистра
  2. 2
    В палитре свойств установите тип «Число», длину и точность (например, 15 и 3)
  3. 3
    Проверьте, что ту же точность имеют связанные ресурсы регистров
  4. 4
    Обновите конфигурацию базы данных (F7), согласившись с реструктуризацией
  5. 5
    Откройте форму документа, введите дробное значение и проведите документ
  6. 6
    Проверьте движения в регистре: дробная часть должна сохраниться

Вывод дробных чисел: форматирование и представление

При выводе в табличный документ, сообщение или строку дробное число преобразуется автоматически, но вид зависит от региональных настроек сеанса: разделителем может быть запятая. Для управления отображением используется функция Формат(Число, "ЧДЦ=2; ЧРД=.; ЧГ=0") — здесь ЧДЦ задаёт число знаков после запятой, ЧРД — разделитель дробной части, ЧГ=0 отключает группировку разрядов (пробелы между тысячами).

Отключение группировки разрядов критично при выгрузке данных в файлы обмена: значение «1 234,56» с пробелом не распарсится внешней системой как число. Для машинного обмена всегда форматируйте числа явно, не полагаясь на преобразование по умолчанию.

В запросах дробные значения сравниваются и фильтруются напрямую: ГДЕ Цена > 100.5. При передаче дробного параметра в запрос тип определяется автоматически по значению параметра — проблем обычно не возникает, но при сравнении с реквизитом меньшей точности учитывайте возможное неявное округление.

Сравнение дробных чисел и пограничные случаи

Числа в 1С хранятся как десятичные значения с фиксированной точностью, что избавляет от классических проблем двоичной арифметики с плавающей точкой в большинстве учётных задач. Тем не менее после цепочек делений и умножений сравнение на строгое равенство остаётся рискованным: надёжнее сравнивать модуль разности с допуском, например Если Макс(А,Б) - Мин(А,Б) < 0.001 Тогда.

Отдельный случай — проверка «целое ли число»: Если Значение = Цел(Значение) Тогда вернёт истину, когда дробной части нет. Это удобно для контроля, что количество штучного товара не введено дробным.

Для денежных расчётов придерживайтесь правила: хранить суммы с точностью 2 знака, курсы и коэффициенты — с большей точностью (4–10 знаков), а округление применять один раз — при фиксации итоговой суммы документа. Такой порядок минимизирует расхождения между суммой строк и итогом документа.

Контрольные точки

Как проверить результат

Ввод дробного значения в форму
Норма

После записи значение отображается с дробной частью

Тревожный признак

Значение округлилось до целого — точность реквизита равна 0

Движения документа в регистре
Норма

Ресурс регистра содержит дробное количество

Тревожный признак

Дробная часть обрезана — точность ресурса меньше точности реквизита

Выгрузка в файл обмена
Норма

Числа без пробелов-разделителей, с точкой или ожидаемым разделителем

Тревожный признак

Значения содержат пробелы групп разрядов и не читаются приёмником

Частые вопросы

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

Откройте в конфигураторе табличную часть документа, найдите реквизит «Количество» и в палитре свойств установите точность, отличную от нуля (например, 3). Убедитесь, что ресурсы регистров, куда документ делает движения, имеют не меньшую точность, затем обновите конфигурацию базы данных.

Почему результат деления записывается как целое число?

Само деление оператором «/» всегда даёт дробный результат. Потеря дробной части происходит при присваивании результата реквизиту или переменной, связанной с квалификатором числа с нулевой точностью. Проверьте тип приёмника значения.

Чем Цел() отличается от Окр()?

Цел() просто отбрасывает дробную часть: Цел(2,9) = 2. Окр() выполняет арифметическое округление: Окр(2,9; 0) = 3. Для отсечения без округления используйте Цел(), для корректного округления — Окр().

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

Используйте Окр(Сумма, 2). Если нужно округление «до чётного» для уменьшения накопленной погрешности, добавьте третьим параметром РежимОкругления.Окр15как10. Округляйте только итоговое значение, а не промежуточные результаты.

Можно ли изменить точность реквизита, когда база уже заполнена?

Увеличение точности безопасно: старые значения останутся как были, новые смогут содержать дробную часть. Уменьшение точности или длины приведёт к усечению существующих данных при реструктуризации — перед таким изменением сделайте резервную копию и проверьте последствия на копии базы.

Как вывести дробное число без пробелов между разрядами?

Используйте функцию Формат() с параметром ЧГ=0: Формат(Значение, "ЧДЦ=2; ЧГ=0"). Это особенно важно при выгрузке данных в файлы обмена, где пробелы групп разрядов делают число нечитаемым для принимающей системы.

Итог

Что важно запомнить

Дробное число в 1С — это тип «Число» с ненулевой точностью. Точность задаётся в квалификаторе реквизита и должна быть согласована по всей цепочке: документ, регистр, отчёт. В коде используйте литералы с точкой, деление «/», функции Окр() и Цел(), а округление применяйте один раз — на финальном результате.