В процессе разработки и интеграции систем на платформе 1С:Предприятие часто возникает необходимость выделить чистое числовое значение из строкового кода справочника или документа. Например, кода вида "00-001189" или "00-000078", содержащего префиксы узлов распределенной информационной базы (РИБ), префиксы организаций и лидирующие нули. Такая задача может потребоваться для формирования наименований каталогов на FTP-сервере, создания номеров сторонних документов или выполнения математических расчетов.
Рассмотрим подробно несколько эффективных способов решения этой задачи в зависимости от используемых конфигураций и версий платформы.
Самым правильным и методически верным подходом при работе с типовыми конфигурациями является использование готовых функций БСП из общего модуля ПрефиксацияОбъектовКлиентСервер. Это позволяет корректно отсечь все префиксы и лидирующие нули без написания громоздких алгоритмов.
Разберем пример очистки кода объекта с помощью функции БСП:
ИсходныйКод = "00-001189";
// Удаляем префиксы РИБ, организаций и лидирующие нули
СтрокаБезПрефиксов = ПрефиксацияОбъектовКлиентСервер.УдалитьПрефиксыИЛидирующиеНули(ИсходныйКод);
// Преобразуем очищенную строку в число
КодЧислом = Число(СтрокаБезПрефиксов);
Если требуется разделить процесс на этапы, можно последовательно вызвать функции УдалитьПрефиксыИзНомераОбъекта и УдалитьЛидирующиеНулиИзНомераОбъекта. Функция Число() приведение очищенной строки выполнит автоматически, удалив оставшиеся нули слева.
Если структура кодов в базе жестко регламентирована и длина числовой части всегда одинакова (например, под номер выделено строго 4 символа справа), проанализируем простой вариант с использованием встроенных функций работы со строками.
Применим функцию Прав() совместно с функцией Число():
ИсходныйКод = "00-001189";
// Выделяем последние 4 символа и преобразуем их в число
КодЧислом = Число(Прав(ИсходныйКод, 4)); // Вернет 1189
Обратите внимание: данный метод подходят только тогда, когда точно известна длина правой числовой части. Если количество цифр может меняться, лучше использовать универсальные динамические алгоритмы.
Разберем универсальный алгоритм, который позволяет избавиться от любых символов и префиксов слева, независимо от их количества и формата. Суть метода заключается в последовательном сокращении строки слева до тех пор, пока платформа не сможет успешно применить функцию Число().
Посмотрим на реализацию данного цикла:
ИсходныйКод = "00-001189";
КодЧисло = 0;
РабочаяСтрока = ИсходныйКод;
Пока СтрДлина(РабочаяСтрока) > 0 Цикл
Попытка
// Пытаемся привести текущую подстроку к числу
КодЧисло = Число(РабочаяСтрока);
Прервать; // Если ошибки не произошло, выходим из цикла
Исключение
// Если приведение не удалось, отрезаем один символ слева
РабочаяСтрока = Сред(РабочаяСтрока, 2);
КонецПопытки;
КонецЦикла;
Данный алгоритм безопасно обрабатывает строки с дефисами, буквами и спецсимволами в префиксах, оставляя только итоговую числовую часть.
Для поиска и извлечения числовой части из текстовых строк высокой сложности отлично подходят регулярные выражения. Начиная с платформы 8.3.23, в 1С присутствуют нативные функции для работы с регулярными выражениями (например, СтрЗаменитьПоРегулярномуВыражению). В более ранних версиях под управлением Windows можно использовать COM-объект VBScript.RegExp.
Пример использования нативной функции в современных версиях платформы:
ИсходныйКод = "00-001189";
// Удаляем все нецифровые символы из строки
СтрокаЦифр = СтрЗаменитьПоРегулярномуВыражению(ИсходныйКод, "\D", "");
// Преобразуем результат в число
КодЧислом = Число(СтрокаЦифр);
В ситуациях, когда префикс состоит из нулей и знаков минус (например, "00-001189"), можно воспользоваться оригинальным свойством интерпретатора платформы. Обернув строку в математическое выражение, минус воспринимается как оператор вычитания.
Проанализируем пример такого вычисления:
КодСимволами = "00-001189";
КодЧислом = 0;
// Выражение преобразуется в: -1 * (00-001189) -> -1 * (-1189) -> 1189
Выполнить("КодЧислом = -1 * (" + КодСимволами + ");");
Важно: данный метод является скорее изящным трюком и не рекомендуется для использования в продакшн-коде, так как применение оператора Выполнить() снижает безопасность и чувствительно к изменению формата префикса (например, при появлении букв вызов приведет к синтаксической ошибке).
ПрефиксацияОбъектовКлиентСервер.Попытка ... Исключение.