При работе с номерами документов и справочников во встроенном языке 1С разработчики часто сталкиваются со строками вида ABC/DI/00000462. Для вывода на печать или интеграций требуется получить чистый номер без буквенных префиксов, слэшей и лидирующих нулей — в данном случае число 462.
Выясним причину такого представления данных: платформа 1С автоматически дополняет числовую часть номера нулями слева до заданной максимальной длины реквизита, чтобы сохранялась корректная текстовая сортировка по возрастанию. Префиксы же необходимы для разделения нумерации по организациям или узлам распределенной базы данных (РИБ). Разберем по шагам различные способы решения задачи: от простых строковых операций до типовых механизмов платформы.
Если длина числовой части фиксирована (например, 8 знаков), самым компактным решением является выделение правой подстроки с помощью функции Прав() и последующее преобразование в числовой тип. Функция Число() автоматически отбрасывает ведущие нули.
Посмотрим на практическую реализацию:
ЧисловаяПодстрока = Прав(МояСтрока, 8);
НомерЧислом = Число(ЧисловаяПодстрока);
Результат = Формат(НомерЧислом, "ЧГ=0");
Обратите внимание: если результат требуется вернуть обратно в строковом виде, использование конструкции Строка(НомерЧислом) может привести к ошибке оформления. Если номер больше 999, платформа по умолчанию добавит неразрывный пробел в качестве разделителя групп разрядов (например, 1 500). Чтобы исключить появление пробелов, всегда применяем функцию Формат() с параметром "ЧГ=0".
Проанализируем ситуацию, когда длина префикса не является строго постоянной, но номер отделен от префикса устойчивым разделителем (например, слэшем / или дефисом -). В таких случаях использовать фиксированное количество символов в Прав() опасно. Надежнее разбить строку на массив с помощью метода СтрРазделить() и взять последний элемент.
Разберем код реализации:
ЧастиНомера = СтрРазделить(МояСтрока, "/");
Если ЧастиНомера.Количество() > 0 Тогда
ЧисловаяСтрока = ЧастиНомера[ЧастиНомера.ВГраница()];
Результат = Формат(Число(ЧисловаяСтрока), "ЧГ=0");
КонецЕсли;
Такой подход защищает логику алгоритма от изменений длины буквенного кода организации или узла распределенной базы.
Если номер имеет непредсказуемую структуру префиксов без четких разделителей, можно выделить только цифровые символы с помощью цикла.
Рассмотрим функцию фильтрации цифр:
Функция ТолькоЦифрыИзСтроки(ИсходнаяСтрока)
ИтоговаяСтрока = "";
Для Индекс = 1 По СтрДлина(ИсходнаяСтрока) Цикл
Символ = Сред(ИсходнаяСтрока, Индекс, 1);
Если Найти("0123456789", Символ) > 0 Тогда
ИтоговаяСтрока = ИтоговаяСтрока + Символ;
КонецЕсли;
КонецЦикла;
Возврат ИтоговаяСтрока;
КонецФункции
ЦифроваяПодстрока = ТолькоЦифрыИзСтроки(МояСтрока);
Результат = Формат(Число(ЦифроваяПодстрока), "ЧГ=0");
Этот способ позволяет гарантированно отсечь любые посторонние буквенные символы, знаки препинания и разделители перед конвертацией в число.
В конфигурациях, использующих БСП, присутствует стандартная функция для очистки номеров при формировании печатных форм. Она располагается в общем модуле ПрефиксацияОбъектовКлиентСервер.
Пример типового вызова:
Результат = ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(МояСтрока, Истина, Истина);
Параметры функции управляют удалением префикса информационной базы и пользовательского префикса. Однако необходимо учитывать ограничения метода: стандартный алгоритм БСП рассчитан на стандартную структуру префиксов 1С (два символа организации, два символа ИБ и дефис). Если в базе используются нестандартные разделители (например, ABC/DI/00000462), вызов БСП может вернуть исходную строку без изменений. Для поддержки нестандартных форматов требуется доработка в модуле ПрефиксацияОбъектовПереопределяемый в процедуре ПриПолученииНомераНаПечать.
При очистке номеров важно учитывать потенциальные ошибки исполнения:
Число(): если в обрабатываемой строке останется хотя бы один нецифровой символ (пробел, буква, спецсимвол), платформа вызовет аварийное завершение с ошибкой «Преобразование значения к типу Число не может быть выполнено». В нестабильных структурах оборачивайте вызов в блок Попытка ... Исключение.Сред() строка вида "00000000" превратится в пустое значение "". Применение функции Число() вернет значение 0, а Формат() сформирует корректную строку "0".