Разработка и Конфигурация · 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Получите объект метаданных реквизита через Метаданные.<ВидОбъекта>.<Имя>.Реквизиты.Найти(ИмяРеквизита)
- 2Обратитесь к свойству Тип.КвалификаторыЧисла
- 3Считайте Длина и РазрядностьДробнойЧасти
- 4Вычислите разряды целой части: Длина минус РазрядностьДробнойЧасти
- 5Проверьте результат на тестовом значении, близком к максимуму
Разрядность числа в запросе
В языке запросов 1С нет прямой функции подсчёта разрядов, но можно привести число к строке функцией ПОДСТРОКА совместно с представлением, либо использовать выражение ВЫБОР с диапазонами:
ВЫБОР
КОГДА Сумма < 10 ТОГДА 1
КОГДА Сумма < 100 ТОГДА 2
КОГДА Сумма < 1000 ТОГДА 3
ИНАЧЕ 4
КОНЕЦ КАК Разрядность
Также в запросе доступно явное приведение типа через ВЫРАЗИТЬ(Поле КАК ЧИСЛО(15, 2)) — это не определяет разрядность, а задаёт её принудительно, что полезно при объединении таблиц с разной точностью. Если точности не совпадают, результат может округляться неожиданным образом.
Способы определения разрядности
Быстро и читаемо; требует контроля форматирования и знака минуса
Независим от настроек; чуть больше кода, работает только с целыми
Даёт ограничение реквизита, а не разрядность конкретного значения
Подходит для отбора и группировки; громоздко при больших диапазонах
Типичные ошибки и их последствия
При работе с разрядностью чисел разработчики регулярно сталкиваются с одними и теми же проблемами. Знание их заранее экономит время отладки.
Проверка результата и контрольные точки
После реализации функции подсчёта разрядности проверьте её на граничных значениях: ноль, единица, отрицательное число, число с максимальной точностью реквизита и значение на границе диапазона (например, 999999999 при длине 9).
Как проверить результат
Возвращается разрядность 1
Ошибка деления или нулевой результат
Разрядность равна 3
Получено 4 из-за знака минуса
Целая часть 4 разряда, дробная 2
Дробная часть определяется как 1 из-за отброшенного нуля
Длина 15, дробная 2, целая 13
Целая часть посчитана как 15
Если функция используется для валидации вводимых пользователем данных, дополнительно протестируйте ввод с пробелами, нечисловыми символами и вставку из буфера обмена — значения могут приходить в виде строки, которую сначала нужно корректно преобразовать.
Что важно запомнить
Разрядность конкретного значения считают через Формат с ЧГ=0 и СтрДлина или циклом деления на 10. Ограничения реквизита берут из метаданных: Длина и РазрядностьДробнойЧасти квалификаторов числа. Всегда проверяйте ноль, знак и отброшенные нули дробной части.
Частые вопросы
Как узнать максимально возможную разрядность числа в 1С 8?
Тип «Число» в платформе 1С 8 ограничен 32 разрядами общей длины и 10 знаками точности. Эти пределы заданы платформой и не могут быть расширены настройкой конфигурации.
Почему СтрДлина(Число) выдаёт ошибку?
Функция СтрДлина принимает только строку. Сначала преобразуйте число: СтрДлина(Формат(Число, "ЧГ=0")) или СтрДлина(Строка(Число)), но второй вариант может добавить разделители групп.
Как определить разрядность номера документа?
Номер документа — строка, а не число, поэтому используйте СтрДлина(СокрЛП(НомерДокумента)) напрямую. Преобразование в число удалит ведущие нули и исказит результат.
Можно ли изменить разрядность реквизита без потери данных?
Увеличение длины и точности обычно безопасно. Уменьшение приведёт к усечению или потере значений, превышающих новый предел, при реструктуризации базы. Перед изменением сделайте резервную копию и проверьте данные запросом.
Как округлить число до нужной разрядности программно?
Используйте Окр(Число, Разрядность) — второй параметр задаёт число знаков после запятой. Для округления до целых разрядов слева передайте отрицательное значение, например Окр(Число, -2) округлит до сотен.