Как использовать регулярные выражения в 1С и какие существуют ограничения

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

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

Решение 1: Использование COM-объекта VBScript.RegExp (для Windows)

Долгое время основным способом работы с регулярными выражениями в среде 1С было использование внешнего COM-объекта операционной системы Windows. Этот метод остается актуальным для конфигураций, работающих на старых версиях платформы или в инфраструктуре, где серверная часть жестко привязана к ОС Windows.

Рассмотрим пример реализации поиска числовых значений в строке. Проанализируем программный код, который позволяет инициализировать объект и выполнить поиск:


RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.IgnoreCase = Истина; // Игнорировать регистр
RegExp.MultiLine = Ложь;    // Текст рассматривается как одна строка
RegExp.Global = Истина;     // Поиск всех вхождений, а не только первого

// Определяем шаблон для поиска (например, поиск цифр)
RegExp.Pattern = "(\d+)";

// Выполняем поиск в текстовой переменной
Результаты = RegExp.Execute(Текст);

Если Результаты.Count() > 0 Тогда
    // Получаем первое найденное значение
    РезультатСтрокой = Результаты.Item(0).Value;
    Сообщить("Найдено число: " + РезультатСтрокой);
КонецЕсли;

Важные свойства объекта:

  1. IgnoreCase — определяет, будет ли поиск чувствителен к регистру (А vs а).
  2. Global — если установлено в Истина, поиск найдет все совпадения в тексте. Если Ложь — только первое.
  3. Pattern — самое важное свойство, куда записывается само регулярное выражение.

Оптимизация производительности: почему нельзя создавать объект в цикле

Выясним причину, по которой опытные разработчики предостерегают от создания COMОбъект внутри циклов. Инициализация внешнего объекта — это дорогостоящая операция для ресурсов системы. Если ваша обработка данных предполагает тысячи итераций, создание объекта на каждом шаге приведет к катастрофическому замедлению работы программы.

Рассмотрим правильный подход:

  1. Создаем объект VBScript.RegExp один раз перед началом цикла или в области инициализации модуля.
  2. Внутри цикла меняем только значение свойства Pattern или передаем новую строку в метод Execute.
  3. Если используется серверный вызов, стараемся кэшировать объект или использовать повторное использование возвращаемых значений в функциональных опциях/модулях.

Решение 2: Нативная поддержка в платформе 8.3.24 и выше

Начиная с версии платформы 8.3.24, разработчики 1С получили долгожданный встроенный механизм. Теперь регулярные выражения работают на уровне ядра платформы, что делает код кроссплатформенным (Windows, Linux, macOS) и более быстрым.

Разберем по шагам, как работать с новыми объектами РегулярноеВыражение и РезультатПоискаРегулярногоВыражения:


// Создаем объект регулярного выражения с нужным шаблоном
// Параметры: Шаблон, ИгнорироватьРегистр, Многострочный
РегВыр = Новый РегулярноеВыражение("([0-9]+)", Истина, Ложь);

// Проверяем на соответствие всей строки шаблону
Если РегВыр.Соответствует(ТекстДляПроверки) Тогда
    Сообщить("Строка полностью соответствует шаблону");
КонецЕсли;

// Ищем вхождения в тексте
Результаты = РегВыр.Найти(ТекстДляПоиска);
Для Каждого ТекРезультат Из Результаты Цикл
    Сообщить("Найдено совпадение: " + ТекРезультат.Значение);
КонецЦикла;

Этот метод лишен недостатков COM-объектов: он работает в веб-клиенте, не требует наличия установленных библиотек Windows и не вызывает проблем с фрагментацией памяти в процессе rphost.

Альтернативный метод: Валидация через XDTO

Иногда регулярные выражения нужны только для проверки (валидации) корректности ввода данных (например, проверка формата почты или телефона). В этом случае можно использовать механизм XDTO. Посмотрим на этот процесс подробнее:

В схеме XSD можно создать простой тип данных и наложить на него ограничение в виде «паттерна» (шаблона). При попытке загрузки строки в этот тип, 1С автоматически проверит ее на соответствие регулярному выражению. Это безопасный и быстрый способ, который работает на любой платформе и часто используется в интеграционных решениях.

Ограничения и потенциальные ошибки

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

  1. Зависимость от ОС: Использование COMОбъект("VBScript.RegExp") моментально делает ваш код неработоспособным на серверах под управлением Linux. Если ваша компания планирует переход на импортонезависимое ПО, избегайте этого метода.
  2. Безопасный режим: В облачных сервисах (например, 1С:Фреш) использование COM-объектов запрещено политиками безопасности. В таких случаях помогут либо нативные функции 8.3.24, либо строковые функции платформы.
  3. Сложность отладки: Регулярные выражения сложно читать. Если шаблон составлен некорректно, поиск может занимать слишком много времени (эффект "катастрофического отступления"). Всегда тестируйте свои шаблоны на специализированных ресурсах перед внедрением в код 1С.
  4. Диалекты: Помните, что синтаксис VBScript.RegExp отличается от стандарта ICU, который используется в нативной реализации 1С. Например, некоторые квантификаторы или "просмотры вперед/назад" могут не поддерживаться в старом COM-объекте.

Подводя итог, можно сказать: если ваша версия платформы позволяет, всегда выбирайте объект РегулярноеВыражение. Если же вы ограничены старыми версиями, используйте VBScript.RegExp, но строго соблюдайте правила оптимизации и выносите создание объекта за пределы циклов.

← На главную