При проектировании высоконагруженных систем, интеграционных модулей с блокчейн-платформами, криптографических утилит или систем обработки сложных математических моделей разработчики на платформе 1С:Предприятие периодически сталкиваются с необходимостью обработки чисел, которые выходят за рамки привычных типов данных. В этой статье мы подробно разберем, как устроена работа со сверхбольшими целыми числами в экосистеме 1С, какие ограничения накладывают платформа и используемые СУБД, а также рассмотрим практические методы обхода этих лимитов.
Начинающие разработчики часто путают разрядность систем счисления и особенности их представления в оперативной памяти и базах данных. Услышав фразу «ограничение в 32», многие ошибочно полагают, что речь идет о 32-битном представлении числа. Максимальное значение классического беззнакового 32-битного целого числа составляет всего 4 294 967 296 (2 в 32-й степени). Такого диапазона действительно может не хватить даже для учета годового оборота крупной торговой сети в копейках или байтах интернет-трафика.
Однако встроенный числовой тип данных в 1С имеет десятичную природу. Лимит в 32 разряда для реквизита базы данных означает возможность хранения чисел до 10 в 32-й степени минус один. Это гигантская величина, которая значительно превосходит общую денежную массу всех валют мира, переведенную в самые мелкие разменные единицы. Тем не менее, существуют специфические задачи, где стандартных механизмов хранения и обработки чисел платформы становится недостаточно.
Рассмотрим подробнее, как именно платформа обрабатывает числа на разных уровнях архитектуры:
В новых технологических решениях от фирмы 1С работа с числовыми литералами и типами данных была существенно модернизирована. Проанализируем эти изменения:
0b) и шестнадцатеричных (с префиксом 0x) чисел непосредственно в кодовой базе. Это значительно упрощает системное программирование и побитовую обработку информации.Если ваша прикладная задача требует оперировать числами длиннее 32 знаков, стандартные механизмы хранения чисел 1С не подойдут. Разберем по шагам наиболее эффективные архитектурные обходы этой проблемы.
Самый простой и универсальный способ сохранить сверхбольшое число (например, хэш-сумму, приватный криптографический ключ или адрес кошелька смарт-контракта) в базе данных — это использование типа данных Строка неограниченной или фиксированной длины. Этот подход полностью исключает любые проблемы с переполнением на уровне СУБД.
Основной недостаток данного метода — невозможность выполнения математических операций (сложение, вычитание, сортировка) стандартными средствами СУБД или языка запросов. Строки будут сортироваться лексикографически, а не математически (например, строка "10" окажется при сортировке раньше, чем "2").
Если числа хранятся в виде строк, нам придется самостоятельно научить систему выполнять над ними базовые математические действия. Рассмотрим пример функции, реализующей сложение двух сверхбольших чисел «в столбик» на встроенном языке 1С:
Функция СложитьСтроковыеЧисла(Знач ЧислоСтр1, Знач ЧислоСтр2) Экспорт
Результат = "";
Перенос = 0;
// Определяем максимальную длину и выравниваем строки ведущими нулями
МаксДлина = Макс(СтрДлина(ЧислоСтр1), СтрДлина(ЧислоСтр2));
ЧислоСтр1 = Прав("00000000000000000000000000000000" + ЧислоСтр1, МаксДлина);
ЧислоСтр2 = Прав("00000000000000000000000000000000" + ЧислоСтр2, МаксДлина);
// Складываем разряды справа налево
Для Индекс = 1 По МаксДлина Цикл
Поз = МаксДлина - Индекс + 1;
Цифра1 = Число(Сред(ЧислоСтр1, Поз, 1));
Цифра2 = Число(Сред(ЧислоСтр2, Поз, 1));
Сумма = Цифра1 + Цифра2 + Перенос;
Результат = Строка(Сумма % 10) + Результат;
Перенос = Цел(Сумма / 10);
КонецЦикла;
Если Перенос > 0 Тогда
Результат = Строка(Перенос) + Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
Этот простой алгоритм позволяет складывать числа абсолютно любой разрядности (хоть из 100, хоть из 1000 знаков). Аналогичным образом можно реализовать алгоритмы для вычитания, умножения и деления.
Начиная с современных версий платформы 8.3, в распоряжении разработчиков имеется полноценный современный движок отображения HTML, работающий на базе WebKit. Это позволяет нам делегировать тяжелые математические расчеты высокопроизводительному интерпретатору JavaScript, в котором присутствует нативный тип BigInt для работы с целыми числами произвольной точности.
Разберем, как можно организовать такое взаимодействие. Создадим простую разметку с JS-кодом и вызовем ее прямо из контекста 1С:
// Формируем HTML-документ с функцией вычисления на JS
HTMLТекст =
"<html>
|<head>
| <script type='text/javascript'>
| function УмножитьБольшиеЧисла(Строка1, Строка2) {
| const num1 = BigInt(Строка1);
| const num2 = BigInt(Строка2);
| const result = num1 * num2;
| return result.toString();
| }
| </script>
|</head>
|<body></body>
|</html>";
// Инициализируем невидимое поле HTML-документа на форме или в памяти
// После загрузки документа мы можем выполнять вызовы:
// Результат = Элементы.ПолеHTML.Документ.defaultView.УмножитьБольшиеЧисла(Параметр1, Параметр2);
Этот метод гарантирует высокую скорость выполнения сложных операций (возведение в степень, деление с остатком, побитовые сдвиги), так как математический движок браузеров оптимизирован на аппаратном уровне.
Если сервер 1С функционирует под управлением операционной системы Windows, мы можем задействовать библиотеки системной платформы .NET Framework. В частности, класс System.Numerics.BigInteger предоставляет мощнейший инструментарий для работы с числами произвольной длины.
Для интеграции разработчики часто создают небольшие внешние компоненты или используют специализированные COM-обертки, которые позволяют бесшовно передавать строковые представления чисел в среду .NET, выполнять над ними операции и возвращать результат обратно в 1С.
Многие специалисты считают, что подобные задачи носят исключительно теоретический характер. Однако на практике необходимость работы со сверхбольшими числами возникает все чаще в следующих сферах бизнеса:
1 Wei равна 10 в минус 18-й степени от 1 ETH). При получении выписок и расчете комиссионных сборов внутри систем учета на базе 1С приходится оперировать огромными целыми числами.Подводя итоги, можно сказать следующее: стандартный функционал платформы 1С:Предприятие полностью перекрывает любые потребности классического финансового, складского и управленческого учета. Если же перед вами встает нестандартная технологическая задача интеграции с низкоуровневыми системами или шифрования данных, комбинация строкового хранения и внешних вычислительных алгоритмов (таких как JavaScript или .NET) позволит успешно решить эту проблему.