При разработке прикладных решений на платформе 1С:Предприятие часто возникает задача обработки строковых данных с использованием регулярных выражений. Однако работа в веб-клиенте накладывает определенные архитектурные ограничения. Рассмотрим, как грамотно реализовать этот функционал, учитывая особенности различных версий платформы.
Начиная с версии платформы 8.3.23, необходимость использовать внешние компоненты или сложные обходные пути для работы с регулярными выражениями отпала. Разработчики 1С внедрили встроенные методы, которые работают как на клиенте, так и на сервере, в том числе в общем модуле без использования форм.
Рассмотрим методы, доступные в глобальном контексте для работы со строками:
СтрНайтиПоРегулярномуВыражению — позволяет найти первое вхождение по заданному шаблону.СтрНайтиВсеПоРегулярномуВыражению — возвращает массив всех найденных совпадений.СтрЗаменитьПоРегулярномуВыражению — выполняет замену подстрок, соответствующих шаблону.СтрПодобноПоРегулярномуВыражению — проверяет, соответствует ли вся строка заданному регулярному выражению.Эти методы работают универсально, что избавляет нас от написания сложного кода с директивами компиляции #Если ВебКлиент. Вы можете просто вызвать нужную функцию в общем модуле, передав в неё строку и шаблон регулярного выражения.
Если вы работаете на более ранней версии платформы, задача усложняется из-за невозможности прямого обращения к объекту 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 объекта веб-клиента. Однако мы настоятельно рекомендуем избегать этого по ряду причин:
iframe, в которых работает веб-клиент 1С.VBScript, будет работать только в устаревших версиях Internet Explorer и не будет исполняться в современных Chrome, Firefox или Edge.Таким образом, для новых разработок лучшим решением будет использование встроенных строковых функций СтрНайтиПоРегулярномуВыражению, а для поддержки старого кода — применение описанного выше паттерна с использованием директив препроцессора.