Как использовать регулярные выражения в 1С на веб-клиенте без привязки к формам?

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

При разработке прикладных решений на платформе 1С:Предприятие часто возникает задача обработки строковых данных с использованием регулярных выражений. Однако работа в веб-клиенте накладывает определенные архитектурные ограничения. Рассмотрим, как грамотно реализовать этот функционал, учитывая особенности различных версий платформы.

Решение для современных версий платформы (8.3.23 и выше)

Начиная с версии платформы 8.3.23, необходимость использовать внешние компоненты или сложные обходные пути для работы с регулярными выражениями отпала. Разработчики 1С внедрили встроенные методы, которые работают как на клиенте, так и на сервере, в том числе в общем модуле без использования форм.

Рассмотрим методы, доступные в глобальном контексте для работы со строками:

Эти методы работают универсально, что избавляет нас от написания сложного кода с директивами компиляции #Если ВебКлиент. Вы можете просто вызвать нужную функцию в общем модуле, передав в неё строку и шаблон регулярного выражения.

Решение для старых версий платформы (до 8.3.23)

Если вы работаете на более ранней версии платформы, задача усложняется из-за невозможности прямого обращения к объекту window браузера из общего модуля. В таких случаях мы используем подход с разделением логики для веб-клиента и других типов клиентов.

Разберем пример реализации, который позволяет выполнять поиск и замену, используя VBScript.RegExp для Internet Explorer и внешнюю компоненту для остальных случаев.

Сначала создадим функцию-обертку, которая инициализирует объект регулярного выражения:


Функция RegEx(РегулярноеВыражение = "", ИгнорироватьРегистр = Истина, ВсеСовпадения = Истина) Экспорт
    #Если ВебКлиент Тогда
        // Использование COM-объекта для IE
        RegEx = Новый COMОбъект("VBScript.RegExp");
        RegEx.Pattern = РегулярноеВыражение;
        RegEx.Global = ВсеСовпадения;
        RegEx.IgnoreCase = ИгнорироватьРегистр;
    #Иначе
        // Использование внешней компоненты для толстого/тонкого клиента
        ПодключитьВнешнююКомпоненту("ОбщийМакет.НП_RegEx", "НП_RegEx", ТипВнешнейКомпоненты.Native);
        RegEx = Новый("AddIn.НП_RegEx.RegEx");
        RegEx.Шаблон = РегулярноеВыражение;
        RegEx.ВсеСовпадения = ВсеСовпадения;
        RegEx.ИгнорироватьРегистр = ИгнорироватьРегистр;
    #КонецЕсли
    
    Возврат RegEx;
КонецФункции

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


Функция Совпадает(Текст, РегулярноеВыражение, ИгнорироватьРегистр = Истина, ВсеСовпадения = Истина) Экспорт
    RegEx = RegEx(РегулярноеВыражение, ИгнорироватьРегистр, ВсеСовпадения);
    #Если ВебКлиент Тогда
        Возврат RegEx.Test(Текст);
    #Иначе
        Возврат RegEx.Совпадает(Текст);
    #КонецЕсли
КонецФункции

Функция Заменить(Текст, РегулярноеВыражение, Замена, ИгнорироватьРегистр = Истина, ВсеСовпадения = Истина) Экспорт
    RegEx = RegEx(РегулярноеВыражение, ИгнорироватьРегистр, ВсеСовпадения);
    #Если ВебКлиент Тогда
        Возврат RegEx.Replace(Текст, Замена);
    #Иначе
        Возврат RegEx.Заменить(Текст, , Замена);
    #КонецЕсли
КонецФункции

Почему не стоит пытаться напрямую обращаться к объекту window

Многие разработчики при возникновении подобных задач пытаются найти способ «проброса» команд в window объекта веб-клиента. Однако мы настоятельно рекомендуем избегать этого по ряду причин:

  1. Безопасность: Современные браузеры блокируют попытки выполнения скриптов из внешних источников или попытки взаимодействия с изолированными областями iframe, в которых работает веб-клиент 1С.
  2. Кросс-браузерность: Код, написанный для VBScript, будет работать только в устаревших версиях Internet Explorer и не будет исполняться в современных Chrome, Firefox или Edge.
  3. Стабильность: Использование архитектурно верных методов платформы (встроенных функций) гарантирует, что ваше решение будет работать после обновления браузеров или платформы 1С.

Таким образом, для новых разработок лучшим решением будет использование встроенных строковых функций СтрНайтиПоРегулярномуВыражению, а для поддержки старого кода — применение описанного выше паттерна с использованием директив препроцессора.

← На главную