Возникла необходимость при решении тестовой задачи получить номер документа без префикса и лидирующих нулей. Стандартные процедуры тут не подходят, так как нерационально вести таблицу префиксов. На помощь пришли регулярные выражения.
P.S. Тестирование проводилось на сервере 1С:Предприятие 8.3 (8.3.10.2561)
Обработка демонстрирует работу кода. При нажатии на кнопку в служебном сообщении будет выведен искомый номер. Под номером понимается максимально правое числовое значение строки, не начинающееся с нуля.
Функция размещается в модуле документа или любом общем модуле и вызывается просто.
НомерБезПрефиксаИНулей = ЧисловойНомер(НомерСПрефиксом)
Функция ЧисловойНомер (НомерСПрефиксом, Шаблон="[1-9]d*", ИскатьДоПервогоСовпадения = Истина, МногоСтрок = Истина, ИгнорироватьРегистр = Истина) Экспорт
RegExp = Новый COMОбъект("VBScript.RegExp"); // создаем объект для работы с регулярными выражениями
//Заполняем данные
RegExp.MultiLine = МногоСтрок; // истина — текст многострочный, ложь — одна строка
RegExp.Global = Не ИскатьДоПервогоСовпадения; // истина — поиск по всей строке, ложь — до первого совпадения
RegExp.IgnoreCase = ИгнорироватьРегистр; // истина — игнорировать регистр строки при поиске
RegExp.Pattern = Шаблон; // шаблон (регулярное выражение)
РезультатАнализаСтроки = RegExp.Execute(НомерСПрефиксом);
Для Каждого Выражение Из РезультатАнализаСтроки Цикл
Возврат Выражение.Value;
КонецЦикла;
КонецФункции
А, что там за такая «таблица префиксов». Чего я не знаю?
а просто проверить вхождения каждого символа в «123456789»? и когда первый символ найдется далее искать в «0123456789». так не вариант?
с хвоста строки посимвольно проверяем вхождение в «0123456789».
нашли первый нецифровой символ — начиная со следующего за ним отрезали строку и применили Число() — так не пойдет? или я что-то не понял? смысл усложнять такую простую задачу регэкспами?
(1) Регистр сведений «ПрефиксыИнформационныхБаз»
Если нужно быстрее, то заменить на
Показать
Кода немного, при этом тягать регулярные выражения — нужды нет.