Как получить число из строкового кода объекта с префиксами и лидирующими нулями в 1С?

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

В процессе разработки и интеграции систем на платформе 1С:Предприятие часто возникает необходимость выделить чистое числовое значение из строкового кода справочника или документа. Например, кода вида "00-001189" или "00-000078", содержащего префиксы узлов распределенной информационной базы (РИБ), префиксы организаций и лидирующие нули. Такая задача может потребоваться для формирования наименований каталогов на FTP-сервере, создания номеров сторонних документов или выполнения математических расчетов.

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

Способ 1. Использование функций Библиотеки Стандартных Подсистем (БСП)

Самым правильным и методически верным подходом при работе с типовыми конфигурациями является использование готовых функций БСП из общего модуля ПрефиксацияОбъектовКлиентСервер. Это позволяет корректно отсечь все префиксы и лидирующие нули без написания громоздких алгоритмов.

Разберем пример очистки кода объекта с помощью функции БСП:


ИсходныйКод = "00-001189";

// Удаляем префиксы РИБ, организаций и лидирующие нули
СтрокаБезПрефиксов = ПрефиксацияОбъектовКлиентСервер.УдалитьПрефиксыИЛидирующиеНули(ИсходныйКод);

// Преобразуем очищенную строку в число
КодЧислом = Число(СтрокаБезПрефиксов);

Если требуется разделить процесс на этапы, можно последовательно вызвать функции УдалитьПрефиксыИзНомераОбъекта и УдалитьЛидирующиеНулиИзНомераОбъекта. Функция Число() приведение очищенной строки выполнит автоматически, удалив оставшиеся нули слева.

Способ 2. Взятие фиксированного количества символов справа

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

Применим функцию Прав() совместно с функцией Число():


ИсходныйКод = "00-001189";

// Выделяем последние 4 символа и преобразуем их в число
КодЧислом = Число(Прав(ИсходныйКод, 4)); // Вернет 1189

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

Способ 3. Пошаговая обрезка нечисловых символов в цикле

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

Посмотрим на реализацию данного цикла:


ИсходныйКод = "00-001189";
КодЧисло = 0;
РабочаяСтрока = ИсходныйКод;

Пока СтрДлина(РабочаяСтрока) > 0 Цикл
    Попытка
        // Пытаемся привести текущую подстроку к числу
        КодЧисло = Число(РабочаяСтрока);
        Прервать; // Если ошибки не произошло, выходим из цикла
    Исключение
        // Если приведение не удалось, отрезаем один символ слева
        РабочаяСтрока = Сред(РабочаяСтрока, 2);
    КонецПопытки;
КонецЦикла;

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

Способ 4. Использование регулярных выражений (RegExp)

Для поиска и извлечения числовой части из текстовых строк высокой сложности отлично подходят регулярные выражения. Начиная с платформы 8.3.23, в 1С присутствуют нативные функции для работы с регулярными выражениями (например, СтрЗаменитьПоРегулярномуВыражению). В более ранних версиях под управлением Windows можно использовать COM-объект VBScript.RegExp.

Пример использования нативной функции в современных версиях платформы:


ИсходныйКод = "00-001189";

// Удаляем все нецифровые символы из строки
СтрокаЦифр = СтрЗаменитьПоРегулярномуВыражению(ИсходныйКод, "\D", "");

// Преобразуем результат в число
КодЧислом = Число(СтрокаЦифр);

Способ 5. Нестандартный трюк через функцию Выполнить()

В ситуациях, когда префикс состоит из нулей и знаков минус (например, "00-001189"), можно воспользоваться оригинальным свойством интерпретатора платформы. Обернув строку в математическое выражение, минус воспринимается как оператор вычитания.

Проанализируем пример такого вычисления:


КодСимволами = "00-001189";
КодЧислом = 0;

// Выражение преобразуется в: -1 * (00-001189) -> -1 * (-1189) -> 1189
Выполнить("КодЧислом = -1 * (" + КодСимволами + ");");

Важно: данный метод является скорее изящным трюком и не рекомендуется для использования в продакшн-коде, так как применение оператора Выполнить() снижает безопасность и чувствительно к изменению формата префикса (например, при появлении букв вызов приведет к синтаксической ошибке).

Резюме и рекомендации

  1. Для типовых конфигураций на базе БСП всегда используйте методы модуля ПрефиксацияОбъектовКлиентСервер.
  2. Если конфигурация не использует БСП, применяйте посимвольный обход или обработку в цикле с блоком Попытка ... Исключение.
  3. Для интеграций с внешними системами (FTP, веб-сервисы) рассмотрите возможность создания дополнительного числового реквизита или использования уникального идентификатора ссылки (GUID), чтобы избегать зависимости от текстовых кодов объектов.
← На главную