Работа со строками в 1С — это задача, с которой программисты сталкиваются ежедневно. Когда возможностей стандартных функций типа СтрНайти, Лев или Сред становится недостаточно для обработки сложных текстовых шаблонов, на помощь приходят регулярные выражения (RegExp). В этой статье мы подробно рассмотрим, как реализовать механизм регулярных выражений в 1С, проанализируем ограничения различных подходов и разберем современные возможности платформы.
Долгое время основным способом работы с регулярными выражениями в среде 1С было использование внешнего COM-объекта операционной системы Windows. Этот метод остается актуальным для конфигураций, работающих на старых версиях платформы или в инфраструктуре, где серверная часть жестко привязана к ОС Windows.
Рассмотрим пример реализации поиска числовых значений в строке. Проанализируем программный код, который позволяет инициализировать объект и выполнить поиск:
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.IgnoreCase = Истина; // Игнорировать регистр
RegExp.MultiLine = Ложь; // Текст рассматривается как одна строка
RegExp.Global = Истина; // Поиск всех вхождений, а не только первого
// Определяем шаблон для поиска (например, поиск цифр)
RegExp.Pattern = "(\d+)";
// Выполняем поиск в текстовой переменной
Результаты = RegExp.Execute(Текст);
Если Результаты.Count() > 0 Тогда
// Получаем первое найденное значение
РезультатСтрокой = Результаты.Item(0).Value;
Сообщить("Найдено число: " + РезультатСтрокой);
КонецЕсли;
Важные свойства объекта:
IgnoreCase — определяет, будет ли поиск чувствителен к регистру (А vs а).Global — если установлено в Истина, поиск найдет все совпадения в тексте. Если Ложь — только первое.Pattern — самое важное свойство, куда записывается само регулярное выражение.Выясним причину, по которой опытные разработчики предостерегают от создания COMОбъект внутри циклов. Инициализация внешнего объекта — это дорогостоящая операция для ресурсов системы. Если ваша обработка данных предполагает тысячи итераций, создание объекта на каждом шаге приведет к катастрофическому замедлению работы программы.
Рассмотрим правильный подход:
VBScript.RegExp один раз перед началом цикла или в области инициализации модуля.Pattern или передаем новую строку в метод Execute.Начиная с версии платформы 8.3.24, разработчики 1С получили долгожданный встроенный механизм. Теперь регулярные выражения работают на уровне ядра платформы, что делает код кроссплатформенным (Windows, Linux, macOS) и более быстрым.
Разберем по шагам, как работать с новыми объектами РегулярноеВыражение и РезультатПоискаРегулярногоВыражения:
// Создаем объект регулярного выражения с нужным шаблоном
// Параметры: Шаблон, ИгнорироватьРегистр, Многострочный
РегВыр = Новый РегулярноеВыражение("([0-9]+)", Истина, Ложь);
// Проверяем на соответствие всей строки шаблону
Если РегВыр.Соответствует(ТекстДляПроверки) Тогда
Сообщить("Строка полностью соответствует шаблону");
КонецЕсли;
// Ищем вхождения в тексте
Результаты = РегВыр.Найти(ТекстДляПоиска);
Для Каждого ТекРезультат Из Результаты Цикл
Сообщить("Найдено совпадение: " + ТекРезультат.Значение);
КонецЦикла;
Этот метод лишен недостатков COM-объектов: он работает в веб-клиенте, не требует наличия установленных библиотек Windows и не вызывает проблем с фрагментацией памяти в процессе rphost.
Иногда регулярные выражения нужны только для проверки (валидации) корректности ввода данных (например, проверка формата почты или телефона). В этом случае можно использовать механизм XDTO. Посмотрим на этот процесс подробнее:
В схеме XSD можно создать простой тип данных и наложить на него ограничение в виде «паттерна» (шаблона). При попытке загрузки строки в этот тип, 1С автоматически проверит ее на соответствие регулярному выражению. Это безопасный и быстрый способ, который работает на любой платформе и часто используется в интеграционных решениях.
Проанализируем основные риски при работе с регулярными выражениями в 1С:
COMОбъект("VBScript.RegExp") моментально делает ваш код неработоспособным на серверах под управлением Linux. Если ваша компания планирует переход на импортонезависимое ПО, избегайте этого метода.VBScript.RegExp отличается от стандарта ICU, который используется в нативной реализации 1С. Например, некоторые квантификаторы или "просмотры вперед/назад" могут не поддерживаться в старом COM-объекте.Подводя итог, можно сказать: если ваша версия платформы позволяет, всегда выбирайте объект РегулярноеВыражение. Если же вы ограничены старыми версиями, используйте VBScript.RegExp, но строго соблюдайте правила оптимизации и выносите создание объекта за пределы циклов.