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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Ограничения базового типа «Число»

Прежде чем мы приступим к написанию алгоритмов, рассмотрим важную особенность платформы 1С. Если у нас есть простая переменная с типом «Число», то получить доступ к ее «Квалификатору числа» напрямую через ТипЗнч() невозможно. Базовый примитивный тип не хранит информацию о максимальной длине и точности, эти данные существуют только в привязке к объектам (реквизитам метаданных, элементам формы, колонкам таблиц).

Также стоит помнить, что базовый тип «Число» в 1С не хранит незначащие нули в конце. Для системы числа 0.120 и 0.12 абсолютно идентичны. Если вам нужно узнать именно количество введенных пользователем символов (включая нули на конце), перехватывать это значение необходимо на уровне интерфейса в виде строки, до преобразования текста в число.

Вычисление реальной разрядности произвольного числа

Проанализируем несколько способов вычисления реального количества знаков после запятой. На форумах часто предлагают математические циклы (умножение на 10, пока число не станет целым), но в 1С их применять не рекомендуется из-за особенностей бинарного представления чисел с плавающей точкой — это может привести к бесконечному циклу из-за микропогрешностей.

Рассмотрим безопасные строково-математические подходы:

  1. Разность длин строк:
    Можно вычислить разность между длиной строки всего числа и длиной его целой части. Не забудем вычесть символ разделителя. КоличествоРазрядов = Макс(СтрДлина(МоеЧисло) - СтрДлина(Цел(МоеЧисло)) - 1, 0);
  2. Выделение дробной части через остаток от деления:
    В 1С операция %1 позволяет получить дробную часть числа. Чтобы корректно обработать отрицательные числа, возьмем модуль числа с помощью функции Макс(). КоличествоРазрядов = Макс(СтрДлина(Макс(МоеЧисло, -МоеЧисло) % 1) - 2, 0); Здесь мы вычитаем 2, так как дробная часть всегда начинается с «0» и разделителя («0,»).

Самый надежный способ получения длины через XMLСтрока

Обычное преобразование в строку или функция Формат() сильно зависят от региональных настроек компьютера. Кроме того, при очень маленьких числах платформа может применить экспоненциальную запись (например, 1.2E-4), что сломает простые алгоритмы поиска запятой. Разберем наиболее универсальный метод с использованием функции XMLСтрока().

Функция XMLСтрока(ВашеЧисло) всегда использует точку в качестве разделителя дроби и никогда не добавляет пробелы между тысячами. Посмотрим на пример кода:


СтрокаЧисла = XMLСтрока(МоеЧисло);
ПозицияТочки = СтрНайти(СтрокаЧисла, ".");

Если ПозицияТочки > 0 Тогда
    Разрядность = СтрДлина(СтрокаЧисла) - ПозицияТочки;
Иначе
    Разрядность = 0; // Число целое
КонецЕсли;

Как получить квалификатор «РазрядностьДробнойЧасти» у объектов

Если же ваша цель — узнать максимальную разрядность, заданную для реквизита конфигурации или элемента формы, то сделать это можно программным путем, обратившись к свойству РазрядностьДробнойЧасти объекта КвалификаторыЧисла.

Посмотрим, как получить эту информацию в разных ситуациях:

  1. Для реквизитов объектов метаданных (Справочники, Документы):
    
    Разрядность = Метаданные.Справочники[ИмяСправочника].Реквизиты[ИмяРеквизита].Тип.КвалификаторыЧисла.РазрядностьДробнойЧасти;
    
  2. Для реквизитов управляемой формы:
    Используем метод формы ПолучитьРеквизиты(), чтобы получить описание типов.
    
    МассивРеквизитов = ЭтаФорма.ПолучитьРеквизиты();
    Для Каждого Реквизит Из МассивРеквизитов Цикл
        Если Реквизит.Имя = "МойРеквизит" Тогда
            Разрядность = Реквизит.ТипЗначения.КвалификаторыЧисла.РазрядностьДробнойЧасти;
        КонецЕсли;
    КонецЦикла;
    
  3. Для колонки Таблицы Значений:
    Если колонка типизирована (создана с указанием ОписанияТипов), мы можем прочитать ее настройки напрямую.
    
    Разрядность = ТаблицаЗначений.Колонки["ИмяКолонки"].ТипЗначения.КвалификаторыЧисла.РазрядностьДробнойЧасти;
    

Таким образом, мы выяснили, что для получения реального числа знаков после запятой лучше всего использовать работу со строками (в идеале — XMLСтрока), а для получения установленных лимитов необходимо обращаться к описанию типов через метаданные или свойства элементов формы.

← На главную