Внешняя компонента для выполнения регулярных выражений

14.01.22

Разработка - Разработка внешних компонент

Внешняя Native API компонента для выполнения регулярных выражений на платформе 1С:Предприятие 8. Написана на C++. Используется движок PCRE2 версии 10.36 (до версии 13, использовался boost::regex v 1.69). Версия синтаксиса Perl Compatible Regular Expressions.

Скачать исходный код

Наименование Файл Версия Размер
RegEx1CAddin_14.zip
.zip 516,42Kb
51
.zip 14 516,42Kb 51 Скачать
RegExMac64_14.so
.so 426,45Kb
6
.so 14 426,45Kb 6 Скачать
RegEx1CAddin_Android_14.zip
.zip 316,12Kb
5
.zip 14 316,12Kb 5 Скачать
RegEx1CAddin_Browsers_14.zip
.zip 440,11Kb
2
.zip 14 440,11Kb 2 Скачать

Текущая версия собрана для следующих платформ:
Windows 32bit 

Windows 64bit 

Linux 32bit 

Linux 64bit

MacOS 64bit

Android ARMv7-A

Android x86-64

Google Chrome (Windows)

Тестировалось на платформе 8.3.12.1567 (Windows 7, Windows Server 2008 R2, Ubuntu 14 32-64bit, MacOS Sierra 10.12, Android 8)

Адрес open-source проекта на GitHub: https://github.com/alexkmbk/RegEx1CAddin

Бинарные файлы можно скачать также с GitHub: https://github.com/alexkmbk/RegEx1CAddin/releases

Архив содержит скомпилированный набор компонент, предназначенный для загрузки в общий макет конфигурации.

Сборка осуществлялась с использованием следующих инструментов:

Под Windows: Microsoft Visual Studio Community 2017

Под Linux: GCC 6

Под Mac OS: Clang 9   

Под Android: Android Studio NDK 19.2

Использовалась статическая сборка, поэтому компонента не требует установки каких-либо дополнительных библиотек.

Компонента реализует следующие методы и свойства:

Метод НайтиСовпадения / Matches(<Текст для анализа>, [<Регулярное выражение>], [<ИерархическийОбходРезультатов>])

Метод выполняет поиск в переданном тексте по переданному регулярному выражению.

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

Здесь, <ИерархическийОбходРезультатов> - определяет то, как будет осуществлен обход результатов. По умолчанию = Ложь. Если ИерархическийОбходРезультатов=Ложь, тогда каждый элемент массива результатов поиска - найденная подгруппа поиска. Если подгрупп нет, то массив будет содержать один элемент - найденную строку. Если ИерархическийОбходРезультатов=Истина, тогда, каждый элемент массива результатов поиска будет содержать только найденную строку, а значение подгруппы при их наличии, можно будет получить методом ПолучитьПодгруппу.

Возвращаемое значение: Ничего не возвращает.

Для того, чтобы получить результаты выполнения метода (массив результатов), необходимо выполнить метод Следующий/Next(), и после этого, в свойстве ТекущееЗначение/CurrentValue будет доступно значение текущей подгруппы результата выполнения (текущий элемент массива результатов). Идея похожа на обход результата запроса.

Пример:

Рег.НайтиСовпадения("Hello world", "([A-Za-z]+)\s+([a-z]+)");

Пока Рег.Следующий() Цикл
    Сообщить(Рег.ТекущееЗначение);    
КонецЦикла; 

Результат будет содержать 3 элемента:

Hello world
Hello
world

Пример с иерархическим обходом:

Рег.НайтиСовпадения("Hello world", "([A-Za-z]+)\s+([a-z]+)", Истина);

Пока Рег.Следующий() Цикл 

Сообщить(Рег.ТекущееЗначение); // Hello world 
Сообщить(Рег.ПолучитьПодгруппу(0)); // Hello 
Сообщить(Рег.ПолучитьПодгруппу(1)); // world 
КонецЦикла; 

Результат будет содержать 1 элемент и 2 подгруппы, а вывод будте таким же:

Hello world

Hello

world

Метод Количество \ Count()

Возвращает количество результатов поиска, после выполнения метода НайтиСовпадения / Matches

Метод КоличествоВложенныхГрупп() \ SubMatchesCount()

Метод возвращает количество групп (подгрупп\SubMatches) если в шаблоне были заданы группы, например, для шаблона ([A-Za-z]+)\s+([a-z]+) будет возвращено значение 2. Метод возвращает значение только после выполнения метода НайтиСовпадения \ Matches.

Метод ПолучитьПодгруппу \ GetSubMatch(<ИндексПодгруппы>)

Метод возвращает строковое значение подгруппы из результатов поиска методом НайтиСовпадения \ Matches. У метода один параметр - Индекс группы, он задает индекс группы, который следует получить(доступны значения от 0 до КоличествоВложенныхГрупп - 1).

Метод НайтиСовпаденияJSON \ MatchesJSON(<Текст для анализа>, [<Регулярное выражение>])

Метод выполняет поиск в переданном тексте по переданному регулярному выражению.

Результатом выполнения метода будет строка в формате JSON представляющая собой массив структур.

Метод позволяет значительно быстрее получить и обработать результат поиска (за счет минимизации вызовов методов через NativeAPI).

Метод Заменить \ Replace(<Текст для анализа>, [<Регулярное выражение>], <Значение для замены>).

Заменяет в переданном тексте часть, соответствующую регулярному выражению, значением, переданным третьим параметром.

Возвращаемое значение: Строка, результат замены.

Метод Совпадает \ IsMatch \ Test(<Текст для анализа>, [<Регулярное выражение>])

Делает проверку на соответствие текста регулярному выражению.

Возвращаемое значение: Булево. Возвращает значение Истина если текст соответствует регулярному выражению.

Метод Версия \ Version()

Возвращает номер версии компоненты в виде строки.

Возвращаемое значение: Строка

Свойство ВсеСовпадения \ Global

Тип: Булево.

Значение по умолчанию: Ложь.

Если установлено в Истина, то поиск будет выполняться по всем совпадениям, а не только по первому.

 

Свойство Multiline \ Многострочный

Тип: Булево.

Значение по умолчанию: Истина.

Если установлено в Истина, то началом строки считаются также и символы перевода строки.

 

Свойство ИгнорироватьРегистр \ IgnoreCase

Тип: Булево.

Значение по умолчанию: Ложь.

Если установлено в Истина, то поиск будет осуществляться без учета регистра.

Свойство Шаблон \ Pattern

Тип: Строка.

Значение по умолчанию: пустая строка.

Задает регулярное выражение которое будет использоваться при вызове методов компоненты, если в метод не передано значение регулярного выражения.

 

Свойство FirstIndex

Тип: Число.

Аналог свойства FirstIndex из VBScript.RegExp. Возвращает индекс (начинается с 0) первого символа найденного текста в исходной строке.

 

Свойство UCP

Тип: Булево.

Значение по умолчанию: Ложь.

Свойство устанавливает флаг PCRE2_UCP в методе pcre2_compile, что включает обработку всех символов Unicode для директив \W и \w (а не только ASCII).

 

Свойство ОписаниеОшибки \ ErrorDescription

Тип: Строка.

Значение по умолчанию: пустая строка.

Содержит текст последней ошибки. Если ошибки не было, то пустая строка.

Свойство ВызыватьИсключения \ ThrowExceptions

Тип: Булево.

Значение по умолчанию: Ложь.

Если установлена в Истина, то при возникновении ошибки, будет вызываться исключение, при обработке исключения, текст ошибки можно получить из свойства ErrorDescription\ОписаниеОшибки.

Пример использования:

Предполагается что архив с компонентами был загружен в общий макет "RegEx"

УстановитьВнешнююКомпоненту("ОбщийМакет.RegEx");
ПодключитьВнешнююКомпоненту("ОбщийМакет.RegEx", "Component", ТипВнешнейКомпоненты.Native);
            
Рег = Новый("AddIn.Component.RegEx");

Рег.НайтиСовпадения("Hello world", "([A-Za-z]+)\s+([a-z]+)", Истина);

Сообщить(Рег.Количество()); // 1 - всего один результат 
Сообщить(Рег.КоличествоВложенныхГрупп()); // 2 - две подгруппы (submatches)

Пока Рег.Следующий() Цикл 
Сообщить(Рег.ТекущееЗначение); // Hello world 
Сообщить(Рег.ПолучитьПодгруппу(0)); // Hello 
Сообщить(Рег.ПолучитьПодгруппу(1)); // world 
КонецЦикла;

Сообщить(Рег.Совпадает("Hello world", "([A-Za-z]+)\s+([a-z]+)"));
Сообщить(Рег.Заменить("Hello world", "([A-Za-z]+)\s+([a-z]+)", "Текст для замены"));

 

Пример в асинхронном режиме с использованием обещаний (доступно с версии платформы 8.3.18):

&НаКлиенте
Асинх Функция ПодключитьРегулярныеВыражения()
	
	Подключено = Ждать ПодключитьВнешнююКомпонентуАсинх( "ОбщийМакет.RegEx", "Component", ТипВнешнейКомпоненты.Native);
	
	Если НЕ Подключено Тогда 
		
		Ждать УстановитьВнешнююКомпонентуАсинх("ОбщийМакет.RegEx");
		Подключено =  Ждать ПодключитьВнешнююКомпонентуАсинх( "ОбщийМакет.RegEx", "Component", ТипВнешнейКомпоненты.Native);
		
	КонецЕсли;
	
	Возврат Подключено;
	
КонецФункции	

&НаКлиенте
Асинх Процедура Асинхронно(Команда)
	
	Подключено =  Ждать ПодключитьРегулярныеВыражения();
	Если Подключено Тогда
		
		Рег = Новый("AddIn.Component.RegEx"); 
		
		Ждать Рег.УстановитьШаблонАсинх("([A-Za-z]+)\s+([a-z]+)");		
		Ждать Рег.НайтиСовпаденияАсинх("Hello world");
		
		Пока Истина Цикл

			Результат = Ждать Рег.СледующийАсинх();   
			
			Если НЕ Результат.Значение Тогда
				Прервать;        
			КонецЕсли;  
			
			Результат = Ждать Рег.ПолучитьТекущееЗначениеАсинх();
			Сообщить(Результат);    
			
		КонецЦикла; 
	КонецЕсли; 
	
КонецПроцедуры

 

Регулярные выражения RegEx Внешняя компонента

См. также

Медиадисплей. Рекламный информационный монитор для покупателя.

Разработка внешних компонент POS терминал Рабочее место Розничная торговля Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Розничная и сетевая торговля (FMCG) Рестораны, кафе и фаст-фуд Реклама, PR и маркетинг Управленческий учет Платные (руб)

Монитор покупателя может отображать текущую покупку на кассовом месте, показывать видеорекламу, баннеры, во время простоя разворачивать рекламу на весь экран. Можно использовать в качестве графического меню-борда в кафе и видеовывески. Управление выводом на телевизор через hdmi-приставку на базе Windows или Android. В качестве устройства отображения можно использовать Android-планшеты, фоторамки с Android, монитор любого Windows-компьютера, доступного по сети. Настраивается ЛЮБОЙ ДИЗАЙН экрана!

16800 руб.

30.05.2017    52275    34    69    

43

Внешняя компонента печати PDF (Native Win 32/64)

Разработка внешних компонент Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Внешняя компонента позволяет печатать PDF файлы непосредственно из 1С, не используя при этом сторонних программ. Прекрасно работает на сервере, тонком клиенте и веб-клиенте. Основана на проекте PDFium из состава проекта Chromium/Chrome

1500 руб.

17.09.2018    35292    108    127    

112

Внешняя компонента для сканирования (замена TWAIN-компоненты БСП) (Native Win 32/64)

Разработка внешних компонент Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Внешняя компонента позволяет работать c TWAIN-совместимым оборудованием (сканерами, камерами) . Полностью совместима со стандартной TWAIN-компонентой из БСП и может применяться как ее замена без изменения вызовов, при этом может работать с 64-разрядной платформой, а так же имеет расширенную функциональность, например, сохранение результата непосредственно в PDF без использования сторонних утилит. Прекрасно работает на сервере, тонком клиенте и веб-клиенте (проверена работа в браузерах Google Chrome, Mozilla Firefox и Microsoft Internet Explorer).

2400 руб.

12.05.2020    26452    132    99    

84

Внешняя компонента для подключения 1С к телефонии Asterisk

Разработка внешних компонент Телефония, SIP Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Внешняя компонента выполнена по технологии Native API для 1С 8.х, обеспечивает доступ к программным АТС Asterisk (FreePBX, Elastix) через AMI интерфейс. Через него можно управлять многими функциями Asterisk (определение номеров, перевод звонков, набор телефона и т. д.)

2400 руб.

04.05.2018    45202    117    66    

61

Мастер создания внешних компонент 1С (технология COM) для DELPHI 6/7/8/2005/2006/2007/2008/2010/XE/XE2/XE3

Разработка внешних компонент Платформа 1С v8.3 Платные (руб)

Средство для сверхбыстрой разработки внешних компонент 1С:Предприятия 7.7 и 8 по технологии COM на всех версиях DELPHI, начиная с 6.

2000 руб.

28.03.2013    54090    35    14    

68

QR-код с логотипом компании (обычная и управляемая форма)

Разработка внешних компонент Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Как известно, стремление сделать свою рекламную продукцию запоминающейся и выделяющейся — верный путь к успеху. Сегодня, мы поговорим с вами о том, что можно сделать с обычным черно-белым QR-кодом, чтобы он стал более живым и привлекательным. Если вам не терпится попробовать сделать QR-код с логотипом компании, то эта обработка для вас!

2400 руб.

22.06.2016    30892    4    4    

8

Внешняя компонента 1С и С++. Продолжаем разговор.

Разработка внешних компонент Платформа 1С v8.3 Бесплатно (free)

А давайте запилим 8.3.26 до релиза, или оповещение с сервера...

19.02.2024    4221    starik-2005    28    

53

Внешние компоненты 1С и язык C++

Разработка внешних компонент Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Некоторые практические аспекты создания внешних компонент на языке С++ для платформы 1С 8.3++.

26.01.2024    4978    starik-2005    32    

40
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
98. starik-2005 3038 01.11.21 17:35 Сейчас в теме
Затестил компоненту, она работает медленнее VBScript.RegExp в 3-4 раза. Что я делаю не так?
100. starik-2005 3038 01.11.21 22:52 Сейчас в теме
(99) интересно написано. Я использовал последнюю версию с гита и последнюю вин10 на виртуалбоксе, серверный контекст файловой базы. Один паттерн на 2000 номенклатурных позиций. Суть паттерна - проверка наличия двух английских слов подряд. VBscript.RegExp справляется с этим за 16 мс, последняя версия этой либы - за 48-78 мс (разброс). 78 мс было 3 раза, один раз 61 мс и один раз 48 мс.

Я думаю, что дело в паттерне RegExp, который находится в однажды установленном свойстве, а в эту компоненту приходится паттерн передавать каждый раз. Если сделать паттерн, устанавливаемый однажды, то это может весьма хорощо сказаться на производительности, т к. большинмтво кейсов использования регулярок - это одинипаттерн для охулиарда строк...
101. KAV2 156 04.11.21 06:37 Сейчас в теме
(100) Свойство Шаблон тоже можно задать один раз и затем он будет использоваться при каждом вызове НайтиСовпадения.
Тесты показывают что компонента работает раза в 2 быстрее VBscript.RegExp в серверном контексте в клиент-серверном режиме, в клиентском режиме и в режиме файловой базы, компонента работает в большинстве сценариев медленне в 2-4 раза. Есть возможность несколько повысить скорость работы компоненты, используя метод НайтиСовпаденияJson, в этом случае, за счет уменьшения количество вызовов по протоколу NativeAPI получается существенно быстрее (но все равно медленне чем VBscript), даже при том, что приходится перегонять это все в Json и обратно.

Главная проблема здесь в медленной работе протокола NativeAPI, это ограничение платформы.
102. starik-2005 3038 05.11.21 20:41 Сейчас в теме
(101)
Главная проблема здесь в медленной работе протокола NativeAPI, это ограничение платформы.
А что конкретно в нем медленно? И что вообще за "протокол" такой?

На сколько я знаю, натиа АПИ вызывает функцию, преобразуя имя в номер, который потом обернут этим case в "вызватькакфункцию". Предположу, что "мудрые" 1С-неги каждый раз дергают "получитьномерметодапоимени", потом уже дергают "вызватькакфункцию". Но при небольшом количестве методов скорость не должна сильно падать из-за этого, тем более вроде как у вас там map юзается для списка методов и свойств, поиск в котором достаточно шустр.

Я так вижу, что основные тормоза могут быть при копировании каждого параметра с типом P_WSTR, переданного из 1С, из которого через видимо конструктор базовой строки создается стринг, потом преобразуется в строку, которую можно скормить функции регулярок. А у нас каждый раз две строки передаются - шаблон и сама строка. Если шаблон передавать в отдельное свойство (например. свойство "шаблон"), а Test вызывать с одной строкой, то это может повысить производительность, т.к. не придется копировать строку с шаблоном и преобразовывать ее для функции регулярки - достаточно сделать это один раз при установке свойства "Шаблон".

PS: я тут протестил Test с параметром по умолчанию и с двумя параметрами. Так вот с двумя параметрами работает быстрее. Видимо не дергается дополнительно функция проверки параметров. Надо будет попробовать добавить к вашим методам еще один - Тест2, у которого будет один параметр. Потестирую - отпишусь потом.

PSS: У меня очень нехорошие цифры получились - 8,4 сек за 1000 * 2000 раз для RegExp и 28,2/30,4 сек для тех же данных с Вашей ВК.
105. KAV2 156 06.11.21 10:52 Сейчас в теме
(102) Установку свойства Шаблон и прочих свойств необходимо вынести за пределы цикла.
106. starik-2005 3038 06.11.21 15:07 Сейчас в теме
(105)
Установку свойства Шаблон и
Ну как бы не совсем я даун вроде бы )))

&НаСервере
Процедура ПроверитьREGEXНаСервере()
	ПодключитьВнешнююКомпоненту("ОбщийМакет.RegEx", "Component", ТипВнешнейКомпоненты.Native);
	            
	Рег = Новый("AddIn.Component.RegEx");
	
	Запрос = Новый Запрос("ВЫБРАТЬ Наименование ИЗ Справочник.Номенклатура");
	Т = ТекущаяУниверсальнаяДатаВМиллисекундах();
	ТАБ = Запрос.Выполнить().Выгрузить();
	Рег.Шаблон = "([A-Za-z]+)\s+([a-z]+)"; // перед циклом, ежу понятно, но с паттерном еще медленнее (((
	Для А = 1 ПО 100 Цикл 
		Н = 0;
		Для Каждого Ст ИЗ ТАБ Цикл Если Рег.Test( Ст.Наименование ) Тогда Н = Н + 1; КонецЕсли; КонецЦикла;
	КонецЦикла;
	Сообщить(ТекущаяУниверсальнаяДатаВМиллисекундах() - Т);
	Сообщить(Н);
	
	Рег = Новый COMОбъект("VBScript.RegExp");
	Рег.Pattern = "([A-Za-z]+)\s+([a-z]+)";
	
	Т = ТекущаяУниверсальнаяДатаВМиллисекундах();
	Для А = 1 ПО 100 Цикл 
		Н = 0;
		Для Каждого Ст ИЗ ТАБ Цикл Если Рег.Test(Ст.Наименование) Тогда Н = Н + 1; КонецЕсли; КонецЦикла;
	КонецЦикла;
	Сообщить(ТекущаяУниверсальнаяДатаВМиллисекундах() - Т);
	Сообщить(Н);

	Тест = Неопределено;
	
	ПроверитьСтроку("1",".*([A-Za-z]+)\s+([a-z]+).*", Тест);
	
	Т = ТекущаяУниверсальнаяДатаВМиллисекундах();
	Для А = 1 ПО 100 Цикл 
		Н = 0;
		Для Каждого Ст ИЗ ТАБ Цикл Попытка Тест.TestItem = Ст.Наименование; Н = Н + 1; Исключение КонецПопытки; КонецЦикла;
	КонецЦикла;

	Сообщить(ТекущаяУниверсальнаяДатаВМиллисекундах() - Т);
	Сообщить(Н);

КонецПроцедуры
Показать

Даже в одну строку не помогло...

затраты на вызов сопоставимы с вызовом метода VBscript.RegExp который при этом еще что-то делает
Это, кстати, странно очень.

Я последнюю компоненту пилил для стохастического "анализа" (Монте-Карло, достаточно простой вариант). Там просто через свойства сделал, метод расчета вызывается в общем-то один - Calculate(). 100к строк (по 6 значений) через свойства грузятся достаточно быстро (через "ЗаполнитьЗначенияСвойств( Компонента, СтрокаТаблицыФормы )", после вызывается метод "Компонента.ДобваитьДанные()" ), но тоже не сказал бы, что совсем. Зато расчет занимает 12 секунд на ноуте и 16 секунд на сервере (30к итераций на 7,3к данных).

Надо будет посмотреть, что там в какой последовательности дергается и где сократить....

Вообще, у народа кейсы есть, например, такие - есть куча платежек, для которых нужно по тексту назначения платежа подобрать параметры (выдрать договор, если есть, его параметры, прочие атрибуты). Если это творить на сервере, то RegExp от мелкомягких действительно сильно начинает тормозить (ориентировочно на порядок). При том обычный 1С-ный механизм проверки паттерна через XDTO как раз на порядок медленнее, что как бы намекает, что разницы нет...

Ны и вообще серверные компы работают несказанно медленнее десктопов в части однопоточной производительности (может это только Ынтел)...
107. KAV2 156 06.11.21 16:08 Сейчас в теме
(106) Если на сервере и данных много то это скорее всего клиент-серверная база, а на ней компонента однозначно быстрее чем VBScript.RegExp.

через свойства грузятся достаточно быстро


А сравнивали скорость работы с альтернативной технологией, реализованной через COM сервер?
108. starik-2005 3038 06.11.21 20:39 Сейчас в теме
(107)
реализованной через COM сервер
Я редко живу в винде, так что даже не пытаюсь.
109. starik-2005 3038 08.11.21 13:47 Сейчас в теме
(107)
а на ней компонента однозначно быстрее чем VBScript.RegExp.
И это действительно оказалось так:
RegEx (3 815)
2 из 1 479
VBScript.RegExp (6 986)
2 из 1 479
XDTO (17 667)
2 из 1 479
Чуть менее, чем в два раза быстрее...
103. starik-2005 3038 05.11.21 21:17 Сейчас в теме
(101)
PSSS:
Я тут решил затестить то, что писал когда-то давно про регулярки без ВК. Вот общие результаты на 100 * 2000 тестов (сервер файловой):
3 064 мс - эта компонента
47 - количество совпадений
===
842 мс - RegExp
47 - количество совпадений
===
8 890 мс - XDTO (к паттерну были добавлены ".*" в начале и конце строки), объект был закеширован (см код ниже)
47 - количество совпадений

Объект ХДТО был закеширован и вызывался так:
Попытка
	Тест.TestItem = Ст.Наименование;
	Н = Н + 1;
Исключение
КонецПопытки;

Таким образом я делаю вывод, что в файловых базах вполне можно обойтись и без внешних компонент при поиске строк, удовлетворяющих паттерну.
104. KAV2 156 06.11.21 09:43 Сейчас в теме
(103) Ну в определенных сценариях да, конечно можно XDTO использовать, но там насколько я понимаю можно реализовать только функцию Test из VBscript.RegExp, то есть получить результат типа булево. Если же требуется вернуть найденные строки или еще и с подгруппами, или выполнить замену текста или скажем выполнить настройку поиска (учет регистра, глобальный поиск, режим обработки многострочного текста), то тут XDTO не получается использовать. Потом, по поводу производительности многое зависит от сценария, какая регулярка, какой текст обрабатывается, используется ли функция НайтиСовпаденияJson.

Native API много времени тратит именно на вызов метода из внешней компоненты, при этом, даже если в самой компоненте поставить заглушку, затраты на вызов сопоставимы с вызовом метода VBscript.RegExp который при этом еще что-то делает (на клиенте или на файловой базе).
110. kislitsin 15.11.21 10:29 Сейчас в теме
Коллеги приветствую.
Может кто подскажет, мне нужно удалять из текста определенные слова в принципе работает такая конструкция: ИскомоеСлово(?=[\|\s.,:;'"!?]) но проблема в том что если у меня строка заканчивается на ИскомоеСлово , то по такому шаблону компонента не находит данного слова. На одном из онлайн тестеров регулярных выражений мне удалось подобрать такой шаблон : ИскомоеСлово(?=[\|\s.,:;'"!?]|$) и он работает в онлайн тестере, а почему то при использовании компоненты эта конструкция не работает. Видимо есть особенности реализации, подскажите как можно решить мою задачу используя вашу компоненту ?
111. KAV2 156 27.11.21 21:30 Сейчас в теме
(110)
и он работает в онлайн тестере, а почему то при использовании компоненты эта конструкция не работает


Ну на текущей версии компоненты шаблон ИскомоеСлово(?=[\|\s.,:;'"!?]|$) работает, для текста, который оканчивается на искомое слово.

Можно проверить на этом сервисе, поскольку он использует тот же движок PCRE2: https://regex101.com/r/Ldjqk6/1
112. VVi3ard 52 27.12.21 23:28 Сейчас в теме
(99), (95)
Подскажите пожалуйста не как не могу понять почему не работает шаблон:
https://regex101.com/r/TZU3ZU/2

Как видно в тестере работает нормально (PCRE2) версия компоненты 13.7.

	Рег = Новый("AddIn.Component.RegEx");
	Рег.ВсеСовпадения = Истина;
	Рег.Многострочный = Истина;
	Рег.IgnoreCase = Истина;
	Рег.ВызыватьИсключения = Истина;
	Рег.Шаблон = "([^\W]\w+\.(?:(?!\w )[^\s]\w+){1,})";

	СтрокаПоиска = "ВЫБОР
		|КОГДА Договор.ВидОперации = ЗНАЧЕНИЕ(Перечисление.навВидыОперацийДоговор.СоглашениеОПеременеСтороны)
		|		И НЕ Договор.ПрежнийАгент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
		|		И НЕ Договор.АгентскийДоговорОсновной = ЗНАЧЕНИЕ(Документ.Договор.ПустаяСсылка)
		|	ТОГДА Договор.АгентскийДоговорОсновной.НомерДоговора";

		СписокГрупп = Новый СписокЗначений;
		Рег.НайтиСовпадения(СтрокаПоиска,, Ложь);
		Пока  Рег.Следующий() Цикл
			СписокГрупп.Добавить(Рег.ТекущееЗначение);
		КонецЦикла; 
Показать


При этом со строкой:
SELECT
		|CASE Contract.Vid = VALUE(ENUMERATION.VidContract.Soglash)
		|		AND NOT Contract.LastAgent= VALUE(Catalog.Contragent.Empty)
		|		AND NOT Contract.ContractMain = VALUE(Doc.Contract.Empty)
		|	ТОГДА Contract.ContractMain.NumberContractа


работает, такое впечатление что какие то проблемы с параметром \u unicode.
113. KAV2 156 28.12.21 11:28 Сейчас в теме
(112) В PCRE2 по дефолту директивы \W и \w распространяются только на символы ASCII

Позже планирую добавить опцию для включения обработки всего Юникода для этих директив.

На текущий момент могу предложить тестовую сборку (только под Windows) где эта опция всегда включена:
https://github.com/alexkmbk/RegEx1CAddin/releases/tag/14.0

Или вместо директив \W и \w можно использовать альтернативные, например \p{L}
114. VVi3ard 52 28.12.21 12:15 Сейчас в теме
(113)
Да альтернативный вариант замена \w на [а-яА-Я_]. (это не совсем равноценная замена, но мне нужно было именно так)

Огромное спасибо за тестовую сборку, и за проделанную работу. Кстати с VBA такая же проблема, только решить её заменой \w на [а-яА-Я_] не получилось (но не сильно долго разбирался).
115. KAV2 156 30.12.21 11:14 Сейчас в теме
(114) Выложена тестовая версия компоненты 14.2, с добавленным свойством "UCP" типа булево (по умолчанию равно Ложь). Оно включает обработку всех символов Unicode для директив \W и \w.

https://github.com/alexkmbk/RegEx1CAddin/releases/tag/14.2
116. KAV2 156 14.01.22 11:52 Сейчас в теме
Новая версия компоненты - 14

Изменения в версии:

- Добавлено новое свойство UCP типа булево (по умолчанию равно Ложь). Оно устанавливает флаг PCRE2_UCP в методе pcre2_compile, что включает обработку всех символов Unicode для директив \W и \w (а не только символов ASCII).

- Исправлено падение платформы, при передачи в качестве текста шаблона или текста для поиска дробных числовых значений.

- Исправлена неработающая очистка свойства ОписаниеОшибки.
SerVer1C; +1 Ответить
117. SerVer1C 760 14.01.22 16:22 Сейчас в теме
(116) Круть! А то приходилось костылями обыгрывать проблему для Unicode.
118. KAV2 156 19.01.22 08:10 Сейчас в теме
Описание дополнено примером в асинхронном режиме, с использованием обещаний (доступно с версии 8.3.18).
jake_qwert; +1 Ответить
121. leasing 5 06.04.22 13:59 Сейчас в теме
Ссылки на шаблон проекта в публикации.
122. madonov 202 14.07.23 08:59 Сейчас в теме
Поймал странный глюк.
Задаю текст шаблона (любым способом, см скрин).

А он не задается. В реквизите пустая строка.

Шаблон нетривиальный:
(?<!одновременный |одновременных |одновременного |удаленный |удаленных |удаленного |беспрепятственный |ПЕРЕДАВАЕМОЙ ИНФОРМАЦИИ.*предоставление |ПЕРЕДАВАЕМОЙ ИНФОРМАЦИИ.*предоставлять |ПЕРЕДАВАЕМОЙ ИНФОРМАЦИИ.*предоставления к ним )доступ


Но я проверяю шаблон онлайн через https://wtools.io/ru/check-regex-online - шаблон корректный, находит по тексту что требуется (отсекая лишнее).


Ага... Вижу - ОписаниеОшибки "The regexp template is not specified.: lookbehind assertion is not fixed length". Похоже перебор с длиной строки...
Прикрепленные файлы:
123. KAV2 156 14.07.23 09:13 Сейчас в теме
(122)
Здравствуйте, дело не в длине строки, дело в самом шаблоне, движок PCRE не поддерживает данный шаблон:
https://stackoverflow.com/questions/3796436/whats-the-technical-reason-for-lookbehind-assertion-must-be-fixed-length-in-r

Можно проверить на https://regexr.com/ выбрав движок PCRE (по умолчанию там движок JavaScript)
Там будет выдана такая же ошибка.
124. madonov 202 14.07.23 09:40 Сейчас в теме
(123) Спасибо за быстрый ответ.
убираю из шаблона ".*" - ошибок нет.
Возвращаю - ошибки есть.

Похоже, что при обратном поиске нельзя использовать ".*".

Придется ограничиться менее точным шаблоном
(?<!одновременный |одновременных |одновременного |удаленный |удаленных |удаленного |беспрепятственный |предоставление |предоставлять |предоставления к ним )доступ
125. madonov 202 14.07.23 10:46 Сейчас в теме
Со вложенными скобками тоже беда.
Вот по такому шаблону
(Адаптац(ия|ию|ей) и сопровожден(ие|ия|ию) экземпляр(ов|а) Систем|Услуг( |и )по адаптации и сопровожден(ие|ия|ию)|Сопровожден(ие|ия|ию) адаптированн(ых|ого)( | Исполнителем )экземпляр(ов|а) Систем)


https://regexr.com/ на движке PCRE находит по тексту 2 совпадения.

В то время как компонента возвращает 88 совпадений, в числе которых " ", "ия", "ию", "ов", "а"... то есть скобки внутри скобок игнорируются.
126. KAV2 156 14.07.23 12:39 Сейчас в теме
(125)
скиньте пожалуйста текст в котором выполняется поиск по шаблону.
127. tormozit 7143 14.07.23 16:04 Сейчас в теме
(125) А где проверочный текст то?
128. madonov 202 15.07.23 04:45 Сейчас в теме
(126)
(127)

В Хабаровске уже конец рабочего дня был.
Выложу пример уже в понедельник.
129. madonov 202 17.07.23 03:08 Сейчас в теме
Параметры ВК:
ВсеСовпадения Истина
ИгнорироватьРегистр Истина
Многострочный Истина

Далее код:
Шаблон = "(Адаптац(ия|ию|ей) и сопровожден(ие|ия|ию) экземпляр(ов|а) Систем|Услуг( |и )по адаптации и сопровожден(ие|ия|ию)|Сопровожден(ие|ия|ию) адаптированн(ых|ого)( | Исполнителем )экземпляр(ов|а) Систем)";

ТекстДокумента = "Сопровождение адаптированных Исполнителем экземпляров Систем";

RegExp.Matches(ТекстДокумента, Шаблон);


RegExp.Count() возвращает 11 совпадений.

При обходе получаю 6 уникальных результатов:
"" (пустая строка)
"ие"
"ых"
"ов"
" Исполнителем "
"Сопровождение адаптированных Исполнителем экземпляров Систем"

https://regexr.com/ в режиме PCRM с тем же набором флагов возвращает 1 результат "Сопровождение адаптированных Исполнителем экземпляров Систем", и этот результат совпадает с моими ожиданиями.

Изначально я думал, что вложенные скобки игнорируются ВК только при просмотре назад (из-за этого парой постов выше я выкладывал очень громоздкий шаблон), но отладка показала, что вложенные скобки игнорируются и при относительно простом поиске совпадений по шаблону.

PS. Проверил как указанный пример отработает VBScript.RegExp - результат аналогичный regexr.com.
130. tormozit 7143 17.07.23 07:36 Сейчас в теме
(129)
Получил 1 результат. Тест:
СвойствоФрол = "(Адаптац(ия|ию|ей) и сопровожден(ие|ия|ию) экземпляр(ов|а) Систем|Услуг( |и )по адаптации и сопровожден(ие|ия|ию)|Сопровожден(ие|ия|ию) адаптированн(ых|ого)( | Исполнителем )экземпляр(ов|а) Систем)";
Вычислитель = Новый ("AddIn.ВычислительРегВыражений.RegEx");
Вычислитель.Global = Истина;
Вычислитель.Multiline = Истина;
Вычислитель.IgnoreCase = Истина;
Вычислитель.Pattern = СвойствоФрол;
Вычислитель.ВызыватьИсключения = Истина;
РезультатJSON = Вычислитель.MatchesJSON(ТекстГдеИскать);
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(РезультатJSON);
Вхождения = ПрочитатьJSON(ЧтениеJSON, Ложь);
Показать

А внутри этого результата, как и полагается 10 групп
Прикрепленные файлы:
131. madonov 202 17.07.23 09:05 Сейчас в теме
(130)

Возможно, что я не до конца разобрался в синтаксисе.

Пример использования ВК из статьи:
Рег.НайтиСовпадения("Hello world", "([A-Za-z]+)\s+([a-z]+)", Истина);

Сообщить(Рег.Количество()); // 1 - всего один результат 
Сообщить(Рег.КоличествоВложенныхГрупп()); // 2 - две подгруппы (submatches)

Пока Рег.Следующий() Цикл 
Сообщить(Рег.ТекущееЗначение); // Hello world 
Сообщить(Рег.ПолучитьПодгруппу(0)); // Hello 
Сообщить(Рег.ПолучитьПодгруппу(1)); // world 
КонецЦикла;
Показать


Результат будет содержать 1 элемент и 2 подгруппы, а вывод будте таким же:

Hello world
Hello
world


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


В моем понимании группы не должны попадать в результат. Да и метод "Количество()" должен возвращать количество результатов, а не групп.

PS. Метод MatchesJSON не пробовал, использовал Matches.
132. KAV2 156 17.07.23 10:26 Сейчас в теме
(129)
RegExp.Count() возвращает 11 совпадений.


Чтобы получить результат как на https://regexr.com/, необходимо третьим параметром в методе Matches указать значение Истина. По умолчанию (без указания третьего параметра), метод Matches "возвращает" результат в виде массива всех результатов, включая подгруппы, для того, чтобы результат был иерархическим (то есть возвращается основной результат, а подгруппы получаются с помощью метода GetSubMatch) и необходим третий параметр в значении Истина.
133. madonov 202 18.07.23 05:38 Сейчас в теме
(132) спасибо за разъяснения.
134. ImHunter 315 03.08.23 21:11 Сейчас в теме
Обертка для методов компоненты.
#Область ИспользованиеКомпонентыRegEx

////////////////////////////////////////////////////////////­////////////////////////////////////////////
// Методы для работы с компонентой разбора текста регулярным выражением.
// Компонента сохранена в виде общего макета RegEx. Для ее использования, необходимо сохранить
// содержимое макета (zip-архив) в справочник ВнешниеКомпоненты.  
//
// Ссылки:
// https://infostart.ru/1c/tools/940766/
// https://github.com/alexkmbk/RegEx1CAddin/releases
////////////////////////////////////////////////////////////­/////////////////////////////////////////////

// Создает экземпляр компоненты RegEx. При необходимости, подключает компоненту.
// 
// Возвращаемое значение:
//  Произвольный - Созданная компонента.
//
Функция РегСоздать() Экспорт   
	
	// Вероятно, нужно модифицировать метод, чтобы можно было использовать асинхронное подключение на клиенте.
	
	ИмяКомпоненты = "AddIn.Component.RegEx";
	
	Попытка
		Компонента = Новый(ИмяКомпоненты);
	Исключение  
		Подключено = РегПодключитьСинхронно();
		Если Не Подключено Тогда
			ВызватьИсключение(СтрШаблон(НСтр("ru = 'Не удалось подключить компоненту %1'"), ИмяКомпоненты));
		КонецЕсли; 
		Компонента = Новый(ИмяКомпоненты);
	КонецПопытки;      
	
	Возврат Компонента;
	
КонецФункции  

Функция РегПодключитьСинхронно() Экспорт   
	#Если ТонкийКлиент Или ВебКлиент Тогда
	УстановитьВнешнююКомпоненту("ОбщийМакет.RegEx");
	#КонецЕсли
	Возврат ПодключитьВнешнююКомпоненту("ОбщийМакет.RegEx", "Component", ТипВнешнейКомпоненты.Native);
КонецФункции  

// Метод выполняет поиск в переданном тексте по переданному регулярному выражению.
//  Результатом выполнения метода будет массив результатов поиска.
//  
//  Для того, чтобы получить результаты выполнения метода (массив результатов), необходимо
//  выполнить метод Следующий/Next(), и после этого, в свойстве ТекущееЗначение/CurrentValue будет доступно
//  значение текущей подгруппы результата выполнения (текущий элемент массива результатов).
//  Идея похожа на обход результата запроса.
//  
//  Пример:
//  Рег.НайтиСовпадения("Hello world", "([A-Za-z]+)\s+([a-z]+)");
//  Пока Рег.Следующий() Цикл
//  	Сообщить(Рег.ТекущееЗначение);
//  КонецЦикла;
//
// Параметры:
//  Компонента						 - Произвольный	 - Компонента RegEx
//  ТекстДляАнализа					 - Строка		 - Анализируемый текст
//  РегулярноеВыражение				 - Строка		 - Регулярное выражение. Если не задано, то берется из свойства Шаблон.
//  ИерархическийОбходРезультатов	 - Булево		 - Определяет то, как будет осуществлен обход результатов.
//  		По умолчанию = Ложь. Если ИерархическийОбходРезультатов=Ложь, тогда каждый элемент массива результатов поиска - найденная подгруппа поиска.
//  		Если подгрупп нет, то массив будет содержать один элемент - найденную строку.
//  		Если ИерархическийОбходРезультатов=Истина, тогда, каждый элемент массива результатов поиска будет содержать
//  		только найденную строку, а значение подгруппы при их наличии, можно будет получить методом ПолучитьПодгруппу.
//
Процедура РегНайтиСовпадения(Компонента, 
		ТекстДляАнализа, РегулярноеВыражение = Неопределено, ИерархическийОбходРезультатов = Ложь) Экспорт
	Компонента.НайтиСовпадения(ТекстДляАнализа, РегулярноеВыражение, ИерархическийОбходРезультатов)
КонецПроцедуры 

// Выполняет переход к следующему найденному фрагменту - аналогично методу выборки Следующий().
//
// Параметры:
//  Компонента	- Произвольный	 - Компонента RegEx
// 
// Возвращаемое значение:
//  Булево - Удалось ли перейти к следующему найденному фрагменту.
//
Функция РегСледующий(Компонента) Экспорт
	Возврат Компонента.Следующий();
КонецФункции

// Возвращает количество результатов поиска, после выполнения метода РегНайтиСовпадения
//
// Параметры:
//  Компонента	- Произвольный	 - Компонента RegEx
// 
// Возвращаемое значение:
//  Число - Количество результатов поиска
//
Функция РегКоличество(Компонента) Экспорт 
	Возврат Компонента.Количество();
КонецФункции                        

// Возвращает количество групп (подгрупп\SubMatches) если в шаблоне были заданы группы.
//  Например, для шаблона ([A-Za-z]+)\s+([a-z]+) будет возвращено значение 2.
//  Метод возвращает значение только после выполнения метода РегНайтиСовпадения
//
// Параметры:
//  Компонента	- Произвольный	 - Компонента RegEx
// 
// Возвращаемое значение:
//  Число - количество групп
//
Функция РегКоличествоВложенныхГрупп(Компонента) Экспорт
	Возврат Компонента.КоличествоВложенныхГрупп();
КонецФункции  

// Возвращает строковое значение подгруппы из результатов поиска методом НайтиСовпадения.
//
// Параметры:
//  Компонента		 - Произвольный	 - Компонента RegEx
//  ИндексПодгруппы	 - Число		 - Задает индекс группы, который следует получить(доступны значения от 0 до КоличествоВложенныхГрупп - 1)
// 
// Возвращаемое значение:
//  Строка - Строковое значение подгруппы из результатов поиска методом РегНайтиСовпадения
//
Функция РегПолучитьПодгруппу(Компонента, ИндексПодгруппы) Экспорт
	Возврат Компонента.ПолучитьПодгруппу(ИндексПодгруппы);	
КонецФункции  

// Выполняет поиск в переданном тексте по переданному регулярному выражению.
//  Результатом выполнения метода будет строка в формате JSON представляющая собой массив структур.
//  Метод позволяет значительно быстрее получить и обработать результат поиска
//  (за счет минимизации вызовов методов через NativeAPI).
//
// Параметры:
//  Компонента			 - Произвольный	 - Компонента RegEx
//  ТекстДляАнализа		 - Строка		 - Анализируемый текст
//  РегулярноеВыражение	 - Строка		 - Регулярное выражение. Если не задано, то берется из свойства Шаблон.
// 
// Возвращаемое значение:
//  Строка - Строка в формате JSON представляющая собой массив структур
//
Функция РегНайтиСовпаденияJSON(Компонента, ТекстДляАнализа, РегулярноеВыражение = Неопределено) Экспорт
	Возврат Компонента.НайтиСовпаденияJSON(ТекстДляАнализа, РегулярноеВыражение);
КонецФункции  

// Заменяет в переданном тексте часть, соответствующую регулярному выражению, значением, переданным параметром ЗначениеДляЗамены.
//
// Параметры:
//  Компонента			 - Произвольный	 - Компонента RegEx
//  ТекстДляАнализа		 - Строка		 - Анализируемый текст
//  РегулярноеВыражение	 - Строка		 - Регулярное выражение. Если не задано, то берется из свойства Шаблон.
//  ЗначениеДляЗамены	 - Строка		 - Значение для замены
// 
// Возвращаемое значение:
//  Строка - Строка с замененными фрагментами
//
Функция РегЗаменить(Компонента, ТекстДляАнализа, РегулярноеВыражение = Неопределено, ЗначениеДляЗамены = Неопределено) Экспорт
	Возврат Компонента.Заменить(ТекстДляАнализа, РегулярноеВыражение, ЗначениеДляЗамены);
КонецФункции 

// Делает проверку на соответствие текста регулярному выражению.
//
// Параметры:
//  Компонента			 - Произвольный	 - Компонента RegEx
//  ТекстДляАнализа		 - Строка		 - Анализируемый текст
//  РегулярноеВыражение	 - Строка		 - Регулярное выражение. Если не задано, то берется из свойства Шаблон.
// 
// Возвращаемое значение:
//  Булево - Возвращает значение Истина если текст соответствует регулярному выражению
//
Функция РегСовпадает(Компонента, ТекстДляАнализа, РегулярноеВыражение = Неопределено) Экспорт
	Возврат Компонента.Совпадает(ТекстДляАнализа, РегулярноеВыражение);
КонецФункции  

// Возвращает номер версии компоненты в виде строки.
//
// Параметры:
//  Компонента	 - Произвольный	 - Компонента RegEx
// 
// Возвращаемое значение:
//  Строка - Номер версии компоненты в виде строки
//
Функция РегВерсия(Компонента) Экспорт 
	Возврат Компонента.Версия();
КонецФункции 

// Получает или устанавливает свойство компоненты.
//  Если Задано значение параметра Значение (<>Неопределено), то происходит установка значения соответствующего свойства.
//  Однако, режим можно задавать директивно, параметром УстановитьЗначение. Если передать Булево, то это явно укажет,
//  что необходимо выполнить - прочитать или установить значение.
//
// Параметры:
//  Компонента			 - Произвольный			 - Компонента RegEx
//  ИмяСвойства			 - Строка				 - Имя свойства. Варианты:
//		*ВсеСовпадения	- Булево	- Если установлено в Истина, то поиск будет выполняться по всем совпадениям, а не только по первому.
//		*Многострочный	- Булево	- Если установлено в Истина, то началом строки считаются также и символы перевода строки.
//			Значение по умолчанию: Истина.
//		*ИгнорироватьРегистр	- Булево	- Если установлено в Истина, то поиск будет осуществляться без учета регистра.
//			Значение по умолчанию: Ложь.                                                    
//		*Шаблон			- Строка	- Задает регулярное выражение которое будет использоваться при вызове методов компоненты, 
//			если в метод не передано значение регулярного выражения.  
//			Значение по умолчанию: пустая строка. 
//		*FirstIndex		- Число		- Аналог свойства FirstIndex из VBScript.RegExp. 
//			Возвращает индекс (начинается с 0) первого символа найденного текста в исходной строке.
//		*UCP			- Булево	- Свойство устанавливает флаг PCRE2_UCP в методе pcre2_compile, 
//			что включает обработку всех символов Unicode для директив \W и \w (а не только ASCII).
//			Значение по умолчанию: Ложь.
//		*ОписаниеОшибки	- Строка	- Содержит текст последней ошибки. Если ошибки не было, то пустая строка.
//			Значение по умолчанию: пустая строка.
//		*ВызыватьИсключения	- Булево	- Если установлена в Истина, то при возникновении ошибки, 
//			будет вызываться исключение, при обработке исключения, текст ошибки можно получить
//			из свойства ErrorDescription\ОписаниеОшибки. 
//		*ТекущееЗначение	- Строка	- Текущее значение найденного фрагмента при выполнении метода РегСледующий().
//  Значение			 - Произвольный, Неопределено	 - Устанавливаемое значение
//  УстановитьЗначение	 - Булево, Неопределено			 - Режим установки/чтения свойства.
// 
// Возвращаемое значение:
//  Произвольный, Неопределено - Если это установка свойства, то возвращается Неопределено.
//
Функция РегПолучитьУстановитьСвойство(Компонента, ИмяСвойства, Значение = Неопределено, УстановитьЗначение = Неопределено) Экспорт
	
	Результат = Неопределено;
	
	Если ТипЗнч(УстановитьЗначение)=Тип("Булево") Тогда
		ТребуетсяУстановитьЗначение = УстановитьЗначение;
	Иначе     
		ТребуетсяУстановитьЗначение = Значение<>Неопределено;
	КонецЕсли;

	Если ТребуетсяУстановитьЗначение Тогда 
		Компонента[ИмяСвойства] = Значение;
	Иначе 
		Результат = Компонента[ИмяСвойства];
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

#КонецОбласти // ИспользованиеКомпонентыRegEx
Показать
madonov; tormozit; +2 Ответить
Оставьте свое сообщение