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

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

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

Как определить разрядность числа в 1С 8: длина и точность типа Число, функции СтрДлина, Цел, работа с метаданными реквизитов. Примеры кода и типичные ошибки.

Разрядность числа в 1С 8 может пониматься двояко: как количество цифр в конкретном значении переменной и как ограничение длины и точности, заданное в метаданных реквизита (свойства «Длина» и «Точность» квалификатора числа). В зависимости от задачи применяются разные подходы: строковые функции, математические операции или обращение к объекту метаданных.

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

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

Что понимать под разрядностью числа в 1С

Прежде чем писать код, нужно определить, какая именно характеристика требуется. В 1С различают три разных понятия, которые часто путают:

  • Количество цифр в конкретном значении — фактическая разрядность числа, хранящегося в переменной (например, у числа 4567 их четыре).
  • Длина типа Число в метаданных — максимальное количество знаков, включая дробную часть, заданное в конфигураторе для реквизита.
  • Точность (разрядность дробной части) — количество знаков после запятой, допустимое для реквизита.

Тип «Число» в 1С 8 имеет ограничение: максимальная длина — 32 разряда, точность — до 10 знаков после запятой. Если при определении разрядности вы получаете значения больше этих, значит, где-то допущена ошибка в логике обработки.

Определение количества цифр в значении через строку

Самый универсальный способ узнать разрядность конкретного числа — преобразовать его в строку и посчитать символы. Чтобы исключить разделители групп и пробелы, используйте функцию Формат с параметром «ЧГ=0»:

Число = 12345;

СтрокаЧисла = Формат(Число, "ЧГ=0");

Разрядность = СтрДлина(СтрокаЧисла);

// Разрядность = 5

Для отрицательных чисел знак минуса попадёт в строку и исказит результат. Поэтому перед подсчётом берите модуль числа функцией Макс(Число, -Число) или используйте Abs-подобную конструкцию, либо удаляйте знак через СтрЗаменить.

Подсчёт разрядов целой и дробной части отдельно

Если нужно узнать, сколько знаков занимает целая часть и сколько — дробная, разделите число функциями Цел и вычитанием:

Число = 123.456;

ЦелаяЧасть = Цел(Число);

ДробнаяЧасть = Число - ЦелаяЧасть;

РазрядовЦелой = СтрДлина(Формат(ЦелаяЧасть, "ЧГ=0"));

СтрокаДробной = Формат(ДробнаяЧасть, "ЧГ=0");

// убираем "0," в начале

РазрядовДробной = СтрДлина(СтрокаДробной) - 2;

Учтите: при форматировании дробной части 1С может отбрасывать незначащие нули в конце. Число 12.500 превратится в «12,5», и подсчёт покажет один разряд дробной части, а не три. Если важна именно хранимая точность, а не фактическое представление, работайте с метаданными реквизита, а не со значением.

Математический способ подсчёта разрядов

Альтернатива строковому методу — последовательное деление на 10 в цикле. Этот подход не зависит от региональных настроек и форматирования:

Функция КоличествоРазрядов(Знач Число) Экспорт

Число = Цел(Макс(Число, -Число));

Если Число = 0 Тогда

Возврат 1;

КонецЕсли;

Разрядов = 0;

Пока Число >= 1 Цикл

Число = Цел(Число / 10);

Разрядов = Разрядов + 1;

КонецЦикла;

Возврат Разрядов;

КонецФункции

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

Если число хранится как строка (например, код с ведущими нулями «000123»), подсчёт разрядов через преобразование в число потеряет нули. Для кодов и номеров всегда работайте со строковым представлением напрямую через СтрДлина.
ПЗ
Практическое замечание

Получение разрядности реквизита из метаданных

Когда нужно узнать не фактическое значение, а ограничение, заданное в конфигураторе, обращайтесь к метаданным объекта. Свойства длины и точности хранятся в квалификаторах числа:

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

.Реквизиты.Найти("СуммаДокумента");

Квалификаторы = МетаРеквизит.Тип.КвалификаторыЧисла;

ДлинаЧисла = Квалификаторы.Длина; // например, 15

ТочностьЧисла = Квалификаторы.РазрядностьДробнойЧасти; // например, 2

РазрядовЦелойЧасти = ДлинаЧисла - ТочностьЧисла;

Обратите внимание: свойство называется именно «РазрядностьДробнойЧасти», а не «Точность» — в объекте ОписаниеТипов используется это имя. Длина в квалификаторах включает и целую, и дробную части, поэтому разрядов под целую часть отведено Длина минус РазрядностьДробнойЧасти.

Проверка типа перед обращением к квалификаторам

Если реквизит имеет составной тип (например, Число и Строка), квалификаторы числа всё равно доступны, но могут иметь нулевую длину. Перед использованием проверяйте, что тип содержит Число:

Если МетаРеквизит.Тип.СодержитТип(Тип("Число")) Тогда

// работаем с квалификаторами числа

КонецЕсли;

Как узнать разрядность реквизита программно
  1. 1
    Получите объект метаданных реквизита через Метаданные.<ВидОбъекта>.<Имя>.Реквизиты.Найти(ИмяРеквизита)
  2. 2
    Обратитесь к свойству Тип.КвалификаторыЧисла
  3. 3
    Считайте Длина и РазрядностьДробнойЧасти
  4. 4
    Вычислите разряды целой части: Длина минус РазрядностьДробнойЧасти
  5. 5
    Проверьте результат на тестовом значении, близком к максимуму

Разрядность числа в запросе

В языке запросов 1С нет прямой функции подсчёта разрядов, но можно привести число к строке функцией ПОДСТРОКА совместно с представлением, либо использовать выражение ВЫБОР с диапазонами:

ВЫБОР

КОГДА Сумма < 10 ТОГДА 1

КОГДА Сумма < 100 ТОГДА 2

КОГДА Сумма < 1000 ТОГДА 3

ИНАЧЕ 4

КОНЕЦ КАК Разрядность

Также в запросе доступно явное приведение типа через ВЫРАЗИТЬ(Поле КАК ЧИСЛО(15, 2)) — это не определяет разрядность, а задаёт её принудительно, что полезно при объединении таблиц с разной точностью. Если точности не совпадают, результат может округляться неожиданным образом.

Способы определения разрядности

Строка + СтрДлина

Быстро и читаемо; требует контроля форматирования и знака минуса

Цикл деления на 10

Независим от настроек; чуть больше кода, работает только с целыми

Метаданные (КвалификаторыЧисла)

Даёт ограничение реквизита, а не разрядность конкретного значения

Запрос с ВЫБОР

Подходит для отбора и группировки; громоздко при больших диапазонах

Типичные ошибки и их последствия

При работе с разрядностью чисел разработчики регулярно сталкиваются с одними и теми же проблемами. Знание их заранее экономит время отладки.

Типичные ошибки
01
Подсчёт длины строки без ЧГ=0 — в строку попадают разделители групп, и разрядность завышается
02
Игнорирование знака минуса у отрицательных чисел — результат на единицу больше реального
03
Путаница между Длина и РазрядностьДробнойЧасти — разработчик принимает общую длину за разрядность целой части
04
Ожидание ведущих нулей у числового типа — число не хранит нули слева, для этого нужен строковый тип
05
Превышение 32 разрядов при задании длины в квалификаторах — платформа отказывает в сохранении конфигурации

Проверка результата и контрольные точки

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

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

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

Число 0
Норма

Возвращается разрядность 1

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

Ошибка деления или нулевой результат

Отрицательное число -456
Норма

Разрядность равна 3

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

Получено 4 из-за знака минуса

Число 1000.50 при точности 2
Норма

Целая часть 4 разряда, дробная 2

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

Дробная часть определяется как 1 из-за отброшенного нуля

Квалификаторы реквизита 15(2)
Норма

Длина 15, дробная 2, целая 13

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

Целая часть посчитана как 15

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

Итог

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

Разрядность конкретного значения считают через Формат с ЧГ=0 и СтрДлина или циклом деления на 10. Ограничения реквизита берут из метаданных: Длина и РазрядностьДробнойЧасти квалификаторов числа. Всегда проверяйте ноль, знак и отброшенные нули дробной части.

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

Как узнать максимально возможную разрядность числа в 1С 8?

Тип «Число» в платформе 1С 8 ограничен 32 разрядами общей длины и 10 знаками точности. Эти пределы заданы платформой и не могут быть расширены настройкой конфигурации.

Почему СтрДлина(Число) выдаёт ошибку?

Функция СтрДлина принимает только строку. Сначала преобразуйте число: СтрДлина(Формат(Число, "ЧГ=0")) или СтрДлина(Строка(Число)), но второй вариант может добавить разделители групп.

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

Номер документа — строка, а не число, поэтому используйте СтрДлина(СокрЛП(НомерДокумента)) напрямую. Преобразование в число удалит ведущие нули и исказит результат.

Можно ли изменить разрядность реквизита без потери данных?

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

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

Используйте Окр(Число, Разрядность) — второй параметр задаёт число знаков после запятой. Для округления до целых разрядов слева передайте отрицательное значение, например Окр(Число, -2) округлит до сотен.