Как преобразовать строку из цифр в число в СКД или запросе 1С?

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

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

Математический метод «разложения по разрядам»

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

Допустим, у нас есть строка вида «12356». Чтобы получить из неё число 12356, нам нужно каждую цифру умножить на соответствующую степень десятки и сложить результаты. Рассмотрим логику на примере:


// Пример логики для 5-значного числа
(Символ1 * 10000) + (Символ2 * 1000) + (Символ3 * 100) + (Символ4 * 10) + Символ5

Этот метод отлично подходит для фиксированной длины строки. Мы последовательно перебираем каждый символ, приводим его к числовому значению (например, через конструкцию ВЫБОР КОГДА) и умножаем на множитель, соответствующий позиции символа в строке.

Использование функций в СКД

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

Рассмотрим пример функции, которую можно поместить в общий модуль и вызвать из выражения СКД:


Функция СтрокаВЧисло(Стр)
    Результат = 0;
    ИсхСтр = СокрЛП(Стр);
    ПромСтр = "";
    
    // Очищаем строку от нецифровых символов
    Для Сч = 1 По СтрДлина(ИсхСтр) Цикл
        ТекСимв = СокрЛП(Сред(ИсхСтр, Сч, 1));
        Если НЕ ОбщегоНазначения.ЕстьНеЦифры(ТекСимв) И НЕ ТекСимв = "" Тогда
            ПромСтр = ПромСтр + ТекСимв;
        КонецЕсли;
    КонецЦикла;
    
    // Преобразуем очищенную строку в число
    Для Сч = -СтрДлина(ПромСтр) По -1 Цикл
        ТекМножитель = Сред(ПромСтр, -Сч, 1);
        ТекРазряд = Pow(10, (СтрДлина(ПромСтр) + Сч));
        Результат = Результат + ТекМножитель * ТекРазряд;
    КонецЦикла;
    
    Возврат Результат;
КонецФункции

Как реализовать это на практике?

  1. Анализ данных: Прежде всего, убедитесь, что ваша строка не содержит «мусорных» символов. Если они есть, их нужно отсеять на этапе формирования запроса или через функцию-обертку, как показано выше.
  2. Выбор метода: Если вы строите отчет в СКД и вам нужно преобразовать поле, используйте вычисляемые поля. В выражении вычисляемого поля вызовите свою функцию (например, ВычислитьВыражение() или просто обратитесь к общему модулю, если это разрешено настройками СКД).
  3. Оптимизация: Старайтесь избегать громоздких преобразований внутри запросов, выполняемых на больших объемах данных. Если есть возможность, лучше преобразовать типы при выгрузке во временную таблицу или непосредственно в коде модуля, заполняющего источник данных для отчета.

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

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

← На главную