RexV8

Компонента для использования скрытых в v8 регулярных выражений.
Более мощная альтернатива VBScript.RegExp.

Для работы с юникодом V8 использует кроссплатформенную библиотеку ICU, которая помимо прочего, содержит и функционал по работе с регулярными выражениями. По какой-то неизвестной причине, 1С не «вытащила» этот функционал «наружу», и пользоваться им из языка 1С возможности нет.

Однако, как всегда, на помощь приходят ВК.

Представляю свою разработку, которая строит «мостик» из библиотеки ICU в язык 1С. Она может работать и как Native ВК, и как аддин к Снегопату.

Разработка выполнена по технологии «real native», т.е. не просто нативная по терминологии 1С, а использует «родные» методы движка 1С и притворяется штатным объектом 1С. (В семерке так работали 1С++, Rainbow и пр.)

Работа проверялась в толстом и тонком клиенте, и на серверах 32 и 64 бит. Поддерживаются релизы 8.2, 8.3.

Для работы в релизах 8.2 младше 14ого, необходимо скопировать в папку bin файлы icuXXX46.dll из каталогов bin более старших релизов 1С.

Подробнее о регулярных выражениях в ICU можно посмотреть здесь. 

Если сравнивать их с обычно используемыми VBScript.RegExp — регулярки от ICU:

  • Поддерживает look behind
  • Поддерживает поиск по unicode-свойствам символов
  • Поддерживает комментарии в выражении
  • Более полный и гибкий набор флагов поиска
  • Всегда есть с 1С, даже под linux
  • Быстрее работает

Для упрощения перехода, часть методов компоненты сделана совместима с VBScript.Regexp.
Таким образом, в существующем коде достаточно поменять создание объекта с Новый COMОбъект(«Vbscript.RegExp») на Новый(«V8RegEx»).
После этого можно пользоваться и остальными методами компоненты, в том числе и split — разбиением строки на части по регулярному выражению.

В поставку входит два файла:

  • rex32.dll — для работы в 32-битных клиентах и сервере
  • rex64.dll — для работы в 64-битном сервере

Также имеется полная документация в html и текстовом формате.

 

 

Основные планы на ближайшее будещее — сделать linux-версию.

 

Обновлено:

выложена версия 1.0.0.3, в которой устранен ряд ошибок, иногда приводящих к вылету программы.

78 Comments

  1. andrewks

    зачёт. а исходники потом выложить не планируете?

    Reply
  2. orefkov

    (1)

    Планирую, как линукс версию сделаю.

    Reply
  3. andrewks

    (2) отлично, будет очень интересно подглядеть 🙂

    Reply
  4. MarSeN

    (2)

    Я бы тоже глянул, как делается real native.

    Reply
  5. ADirks

    Ну так то может и хорошо, что просто спрятали, а не как с SQL. Прикинь, Регулярные Выражения от 1С… страшно же…

    Reply
  6. andrewks

    (5) ADirks, в том и цимус, что они не от 1С 🙂

    это, типа, как в 7.7 zlibeng для архивации — приаттачили опенсорсовую длл-ку для внутренних нужд

    Reply
  7. Evil Beaver

    А есть ли вообще в сети документация по SCOM? Я так понимаю, «притворяться» объектом 1С можно, если библиотека реализует этот одинэсовский креатив? Интересно, как можно вызвать, скажем moxel.dll из стороннего кода..

    Reply
  8. orefkov

    (7)

    Откуда ж документации-то в сети взяться?

    Да и нет никакого SCOM на самом деле. Внутри там обычный COM — куча интерфейсов от IUnknown отнаследована, а объекты реализуют кучу интерфейсов, все через QueryInterface получается.

    Reply
  9. Evil Beaver

    (8) а в линукс-дистрибутиве же то же самое, скорее всего? Я так думал, SCOM, это Sамодельный COM, с целью абстрагироваться от обычного.

    Откуда ж документации-то в сети взяться?

    Ну на *.cf и *.1cd откуда-то взялся, так что почему нет…

    Reply
  10. orefkov

    (9)

    Я не могу точно сказать, что в 1С имели ввиду под аббревиатурой SCOM.

    Делать его самодельным — ну я не знаю. Сам по себе COM прост как три рубля, и довольно легко имплементируется.

    Reply
  11. andrewks

    (9) Evil Beaver,

    а в линукс-дистрибутиве же то же самое, скорее всего?

    в линукс COM нет

    Reply
  12. orefkov

    (11)

    По сути своей (если не брать деталей межпроцессного обмена) — COM очень прост.

    Он описывает правила вызова методов интерфейсов, подсчета ссылок на объект, и интерфейс IUnknown.

    Вот всё, что я хотел сказать о COM.

    Reply
  13. Evil Beaver

    (11) andrewks, дык и я про что. COM нет, а SCOM, скорее всего есть.

    Помнится, давно, я пытался извлечь из 1С-овской dll набор типов в виде type library. Так вот, ни один инструмент не опознал в ней COM-dll и ничего о внутренностях не сказал. Я это дело забросил, а вообще — жутко интересно, как можно правильно вызвать код из родной 1С-овской dll.

    Reply
  14. andrewks

    (12) да это понятно

    Reply
  15. orefkov

    (13)

    TypeLibrary — это уже OLE, которое базируется на COM.

    Сам COM для работы ни в каких type library не нуждается.

    Reply
  16. andrewks

    (13) Evil Beaver, ну так dll-ка и не обязана всегда иметь COM-интерфейс, в общем случае

    Reply
  17. tormozit

    Для совместимости RegExMatch.SubMatches(0) должен возвращать Неопределено в случае, если подгруппа не найдена. Сейчас возвращает пустую строку.

    Reply
  18. orefkov

    (17)

    Хм, странно. Вообще, по моей задумке должно было исключение кидать.

    Приведи пожалуйста пример для ясности, я проверю.

    Reply
  19. tormozit

    (18) Речь о необязательных подгруппах.

    аа = Новый («V8RegEx»);
    аа.Pattern = «(d)?»;
    Результат = аа.Execute(«»);
    Сообщить(ТипЗнч(Результат.Item(0).SubMatches(0)));
    

    Должно выдавать Неопределено, а не Строка.

    Reply
  20. orefkov

    Нет, все правильно выдает "Строка".

    Найдено одно совпадение, захвачена группа — пустая строка.

    В javascript себя так же ведет:

    Код
    typeof "".match(/(\d)?/)[1]
    "string"
    

    Показать полностью

    Reply
  21. tormozit

    Ну я говорю про VBScript.RegExp, который очень распространен в коде 1С. Так вот он работает именно так, как я описал, что легко проверить в моем примере, заменив первую строку.

    Кстати для новых типов объектов неплохо бы обеспечить преобразование к строке. Модифицировав мой пример

    аа.Pattern = «(d)?»;
    Результат = аа.Execute(«»);
    Для Каждого Элемент Из Результат Цикл
    Сообщить(«» + Элемент);
    КонецЦикла;
    

    получаем исключение

    Преобразование значения к типу Строка не может быть выполнено

    Reply
  22. tormozit

    (20) Я конечно не специалист в JavaScript, но возможно в твоем коде сообщается тип первой Группы, а не первой Подгруппы первой Группы.

    Reply
  23. orefkov

    (22)

    В javascript — если регэксп не глобальный, возвращает объект, где [0] — все совпадение, [1] и далее — подгруппы.

    А с (19) я наверное не смогу ничего делать.

    Налицо разная реализация самих регекспов в разных библиотеках.

    То есть ICU и javascript считают, что захвачена подгруппа — пустая строка, VBScript считает, что подгруппа не захвачена. Я же не полезу внутрь ICU переделывать реализацию самих регэкспов. Или VBScript всегда для подгрупп — пустых строк возвращает Неопределено? Если это так, то можно и сделать в этом частном случае.

    Преобразование одного результата в строку — как его сделать? Выдавать значение свойства Value? Или выдавать «COMОбъект», как у VBScript?

    Reply
  24. cool.vlad4

    (20) а у меня undefined, что в html страничке, что в phantomjs.

    Reply
  25. tormozit

    (23) Преобразование к строке есть насколько я знаю у всех типов 1С. Раз уж имитировать родной тип, то и эту особенность следует учесть. По умолчанию для всех типов платформы преобразование к строке возвращает имя типа. Думаю в нашем случае нужно сделать также.

    > VBScript всегда для подгрупп — пустых строк возвращает Неопределено?

    Нет. Неопределено возвращается в качестве подгруппы, если она необязательная и была не найдена. Для пустых строк возвращается пустая строка. Что очень логично, т.к. есть возможность различать

    — не найденную необязательную подгруппу

    — найденную пустую подгруппу

    Такой код для VBScript.RegExp

    аа.Pattern = «()?»;
    Результат = аа.Execute(«»);
    Сообщить(ТипЗнч(Результат.Item(0).SubMatches(0)));
    аа.Pattern = «(d)?»;
    Результат = аа.Execute(«»);
    Сообщить(ТипЗнч(Результат.Item(0).SubMatches(0)));
    

    выдает

    Строка

    Не определено

    Reply
  26. orefkov

    (24)

    Ну тут уже в-принципе, не так важно, что в разных реализациях javascript выдает, важно, как себя ведет ICU.

    А в ICU вообще невозможно отследить, захватилась или нет группа, ибо она всегда захватывается. Так что это тот порог, на котором борьбу за совместимость придется остановить.

    Reply
  27. wirg

    Супер

    Reply
  28. StepByStep

    Вопрос по производительности:

    Быстрее работает

    На сколько (%)?

    Reply
  29. orefkov

    (28)

    На некоторых тестах первая версия RexV8 обгоняла VBScript.Regexp не на проценты, а в 5 раз, а на других тестах — проигрывала в 2 раза. Вот жду, когда tormozit сделает замеры на новой версии.

    Reply
  30. DrAku1a

    Офигеть! 🙂

    Reply
  31. coder1cv8

    Класс!

    «Просмотра назад» в VBScript.RegExp бывало очень не хватало, да..

    Reply
  32. Andry.Boris

    Хорошая вещь… автору +

    Reply
  33. It-developer

    Какая цель? Что с помощью этого можно делать?

    Reply
  34. tormozit

    Провел сравнительный замер новой версии следующим кодом в консоли кода ИР

    ПодключитьВнешнююКомпоненту(«D:Program Files1cv82common
    ex32.dll», «V8RegEx», ТипВнешнейКомпоненты.Native);
    текст = «луоалаокоащроощурагк кашгкаршгукрашгукр 87677 ыолвраылораыолршгр 8777 ыолвапаоыпорыпа рыпарваорпаырпа 999»;
    Количество = 100000;
    
    ре = Новый(«V8RegEx»);
    ре.Global = Истина;
    ЛксНачатьЗамер(Количество);
    Для К = 1 По Количество Цикл
    результат1 = Новый Массив;
    ре.Шаблон = «»;
    ре.Шаблон = «(d+)»;
    Вхождения = Ре.Execute(Текст);
    Для Каждого Вхождение Из Вхождения Цикл
    результат1.Добавить(Вхождение.SubMatches(0));
    КонецЦикла;
    КонецЦикла;
    ЛксКончитьЗамер();
    
    ре = Новый COMОбъект(«Vbscript.RegExp»);
    ре.Global = Истина;
    ЛксНачатьЗамер(Количество);
    Для К = 1 По Количество Цикл
    результат2 = Новый Массив;
    ре.Pattern = «»;
    ре.Pattern  = «(d+)»;
    Вхождения = ре.Execute(текст);
    Для Каждого Вхождение Из Вхождения Цикл
    результат2.Добавить(Вхождение.SubMatches(0));
    КонецЦикла;
    КонецЦикла;
    ЛксКончитьЗамер();
    
    ///////////////////////////////////////
    
    ре = Новый(«V8RegEx»);
    ре.Global = Истина;
    ре.Шаблон = «(d+)»;
    ЛксНачатьЗамер(Количество);
    Для К = 1 По Количество Цикл
    результат1 = Новый Массив;
    Вхождения = Ре.Execute(Текст);
    Для Каждого Вхождение Из Вхождения Цикл
    результат1.Добавить(Вхождение.SubMatches(0));
    КонецЦикла;
    КонецЦикла;
    ЛксКончитьЗамер();
    
    ре = Новый COMОбъект(«Vbscript.RegExp»);
    ре.Global = Истина;
    ре.Pattern  = «(d+)»;
    ЛксНачатьЗамер(Количество);
    Для К = 1 По Количество Цикл
    результат2 = Новый Массив;
    Вхождения = ре.Execute(текст);
    Для Каждого Вхождение Из Вхождения Цикл
    результат2.Добавить(Вхождение.SubMatches(0));
    КонецЦикла;
    КонецЦикла;
    ЛксКончитьЗамер();
    

    Показать

    Получил

    Окончание замера «Замер_30» — Длительность = 1.135с, Среднее = 0.00001135с

    Окончание замера «Замер_31» — Длительность = 2.849с, Среднее = 0.00002849с

    Окончание замера «Замер_32» — Длительность = 1.08с, Среднее = 0.0000108с

    Окончание замера «Замер_33» — Длительность = 2.538с, Среднее = 0.00002538с

    Т.е. этот объект в 2-3 раз быстрее работает, чем VBScript.RegExp.

    Reply
  35. orefkov

    (34)

    Огромное спасибо за тесты!

    Результаты радуют.

    Reply
  36. tormozit

    Такой код приводит к недопустимой операции (переполнению стека?). 8.2.18.51

    ПодключитьВнешнююКомпоненту(«D:Program Files1cv82common
    ex32.dll», «V8RegEx», ТипВнешнейКомпоненты.Native);
    текст = «луоалаокоащроощурагк кашгкаршгукрашгукр 87677 ыолвраылораыолршгр 8777 ыолвапаоыпорыпа рыпарваорпаырпа 999»;
    Количество = 1000;
    ре = Новый(«V8RegEx»);
    ре.Global = Истина;
    Для К = 1 По Количество Цикл
    ре.Шаблон = «(d+)» + новый УникальныйИдентификатор;
    Ре.Заменить(текст, «$1»);
    КонецЦикла;
    

    Показать

    Problem signature:

    Problem Event Name: APPCRASH

    Application Name: 1CV8.exe

    Application Version: 8.2.18.51

    Application Timestamp: 513e4ca9

    Fault Module Name: icudt46.dll

    Fault Module Version: 4.6.1.5

    Fault Module Timestamp: 50751a3d

    Exception Code: c0000005

    Exception Offset: 0029007a

    OS Version: 6.1.7601.2.1.0.256.1

    Locale ID: 1049

    Additional Information 1: 0a9e

    Additional Information 2: 0a9e372d3b4ad19135b953a78882e789

    Additional Information 3: 0a9e

    Additional Information 4: 0a9e372d3b4ad19135b953a78882e789

    Показать

    Видимо внутренний кэш не имеет контроля роста.

    Reply
  37. orefkov

    Выложил версию 1.0.0.3.

    Устранен ряд ошибок, иногда приводящий к вылету программы.

    Reply
  38. tormozit

    Будет хорошо, если в описании указать про неполную совместимость с VB (пустая строка против Неопределено для не найденных необязательных подгрупп). Речь про этот фрагмент

    Таким образом, в существующем коде достаточно поменять создание объекта с Новый COMОбъект(«Vbscript.RegExp») на Новый(«V8RegEx»).

    Дальше я бы дописал «Однако следует учитывать, что при получении не найденных необязательных подгрупп метод SubMatches в VBScript возвращает Неопределено, а в V8RegExp возвращает пустую строку».

    Reply
  39. tormozit

    В новой версии 1.0.0.3 тест (36) по-прежнему приводит к падению.

    Reply
  40. orefkov

    (39)

    Странно, у меня не падает.

    Напиши версию 1С и архитектуру (32/64)

    Reply
  41. tormozit

    (40) Да. Теперь в чистом виде (36) не воспроизводится, но в грязном воспроизводится. Пока могу лишь описание ошибки предоставить (ОС Win7 32b)

    Problem signature:

    Problem Event Name: APPCRASH

    Application Name: 1CV8.exe

    Application Version: 8.2.18.51

    Application Timestamp: 513e4ca9

    Fault Module Name: V8RegEx32.dll

    Fault Module Version: 1.0.0.3

    Fault Module Timestamp: 5194801f

    Exception Code: c0000005

    Exception Offset: 00006bb7

    OS Version: 6.1.7601.2.1.0.256.1

    Locale ID: 1049

    Additional Information 1: 0a9e

    Additional Information 2: 0a9e372d3b4ad19135b953a78882e789

    Additional Information 3: 0a9e

    Additional Information 4: 0a9e372d3b4ad19135b953a78882e789

    Показать

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

    Reply
  42. tormozit

    Несколько часов пытался, но не удалось сделать чистый пример. Ошибка точно есть (остаток от первоначальной). Сделал демо-базу из ИР, где в включен режим использования этого RegExp, и снял 2 видеоролика для демонстрации багов, насколько было возможно отвязал от логики ИР. http://rghost.ru/46054911. Я готов показать более подробно teamviewer’у, если есть желание.

    Reply
  43. tormozit

    Вывел в чистом виде остаток бага. Так

    ПодключитьВнешнююКомпоненту(«D:Program Files1cv82common
    ex32.dll», «V8RegEx», ТипВнешнейКомпоненты.Native);
    текст = «луоалаокоащроощурагк кашгкаршгукрашгукр 87677 ыолвраылораыолршгр 8777 ыолвапаоыпорыпа рыпарваорпаырпа 999»;
    Количество = 1000;
    ре = Новый(«V8RegEx»);
    ре.Global = Истина;
    ре.IgnoreCase = Истина;
    Для К = 1 По Количество Цикл
    ре.Шаблон = «(d+)» + Новый УникальныйИдентификатор + «»;
    Ре.Заменить(текст, «$1»);
    КонецЦикла;
    

    Показать

    возникает недопустимая операция

    Problem signature:

    Problem Event Name: APPCRASH

    Application Name: 1CV8.exe

    Application Version: 8.2.18.51

    Application Timestamp: 513e4ca9

    Fault Module Name: rex32.dll

    Fault Module Version: 1.0.0.3

    Fault Module Timestamp: 5194801f

    Exception Code: c0000005

    Exception Offset: 00006bb7

    OS Version: 6.1.7601.2.1.0.256.1

    Locale ID: 1049

    Additional Information 1: 0a9e

    Additional Information 2: 0a9e372d3b4ad19135b953a78882e789

    Additional Information 3: 0a9e

    Additional Information 4: 0a9e372d3b4ad19135b953a78882e789

    Показать

    Reply
  44. tormozit

    Ну что, есть надежда на исправление бага (43)?

    Reply
  45. tormozit

    При выполнении поиска с таким шаблоном

    [(DisplayName(«(w+»))s*:s*w+,)?Description(«(.*?)»)s*[#k8SjZc9Dxk
    ]+]s*classs+(w+)s*:s*w+s*{(.*?)};

    ругается

    Ошибка при вызове метода контекста (Выполнить): Не удалось создать регулярное выражение. Строка 1, Позиция 106, текст до: ‘+)s*:s*w+s*’, после: ‘{(.*?)};’

    Reply
  46. orefkov

    Так фигурные скобки тоже надо экранировать

    Код
    \{(.*?)\};
    

    Показать полностью

    Reply
  47. tormozit

    (46) еще одно отличие от MS реализации. Там это не вызывает ошибки. Теперь вспомнил, что фигурные скобки для числа повторов используются. Но видимо в зависимости от контекста они автоматом распознаются в других реализациях как символы. Ок, буду везде их экранить для надежности.

    Reply
  48. BorovikSV

    (33) It-developer,

    подумай, ты же как никак It-developer

    Reply
  49. tormozit

    Ждать ли нам стабильной версии?

    Reply
  50. tormozit

    Ну что, когда? =)

    Reply
  51. GreenLab

    У кого-нибудь работает под 8.3.4. ? При подключении компоненты под 8.3.4.389 падает платформа. ОС:Win7 Pro x64.

    Reply
  52. helgi

    (0) orefkof,

    а почему не Новый(«V8RegExp«) ? 🙂

    Reply
  53. manaxov83

    Платформа 8.3.4.408, при подключение ВК(ПодключитьВнешнююКомпоненту(ПутьКВК, «RegEx», ТипВнешнейКомпоненты.Native)) платформа вылетает в дамп!!!.

    Можно ли как нить исправить этот косяк?

    Reply
  54. UncleVader

    Отличная штука!

    Странно что в 1С нет штатного объекта для регулярок.

    Мне не хватает до полного счастья только версии под линукс и параметра /U (Ungreedy), его сложно реализовать?

    Reply
  55. deevil

    Была платформа 8.2.19 — все работало нормально.

    Обновились на 8.3.15 — начал падать 1с в момент подключения внешней обработки…

    Reply
  56. orefkov

    (55)

    8.3.15 пока не поддерживается. Следите за обновлениями.

    Reply
  57. deevil

    (56) ну хотя бы ориентир по срокам какой?

    И желательно в описании написать до какой версии поддерживается…

    Reply
  58. orefkov

    (57)

    Проверяй — https://snegopat.ru/downloads/rex83.zip

    Для 8.3.4.x, 8.3.5.x.

    Я наскоро проверял на 8.3.5.823, на клиенте. На 64битном сервере не проверял.

    Reply
  59. deevil

    (58) да теперь все работает.

    64х битного сервера к сожалению нет, поэтому не могу проверить.

    А на 32х битном все работает отлично.

    Спасибо за оперативность)

    PS Касательно линукс версии — тоже было бы круто поскорей увидеть)

    Reply
  60. Поручик

    (58) Спасибо. Я тоже сейчас использовал на 8.3.4.

    Reply
  61. kolayuk

    Здравствуйте, не могли бы вы предоставить исходники данной компоненты? Очень интересует работа real native компонент, необходимо интегрировать свое окно в существующую форму 1С, через FindWindowEx это сделать проблематично, тк там куча окон с одинаковыми классами у всех ЭУ, нужно хотя бы получить HWND конкретной формы, судя по FormEx это возможно. Нашел исходники 1С++, но они для 7.7 и там, судя по инициализации компоненты с IDispatch она загружается как COM-объект, а не как Native… Собственно интересуют даже не столько исходники конкретной компоненты, сколько технология создания real-native компонент. Спасибо! Мои контакты: kolayuk at gmail.com

    Reply
  62. Поручик

    (58) Компонента успешно проработала с сентября месяца, а вчера внезапно началась валиться без выдачи каких-либо сообщений и исключений, просто программа тупо завершает работу. Пришлось в срочном порядке переключать на виндовый VBScript.RegExp.

    Если интересно, вот набор регулярок

    МассивШаблонов.Добавить(«(евро[а-яa-z]{0,5}s{0,1}[а-яa-z]{0,15}s{0,1}отдел[а-яa-z]{0,5}s{0,1})»);
    МассивШаблонов.Добавить(«(итальян[а-яa-z]{0,5}s{0,1}[а-яa-z]{0,10}s{0,1}кафел[а-яa-z]{0,5}s{0,1})»);
    МассивШаблонов.Добавить(«(встроен[а-яa-z]{0,5}s{0,1}[а-яa-z]{0,10}s{0,1}шкаф[а-яa-z]{0,5}s{0,1}купе[а-яa-z]{0,5}s{0,1})»);
    МассивШаблонов.Добавить(«(отдел[а-яa-z]{0,5}s{0,1}[а-яa-z]{0,15}s{0,1}евро[а-яa-z]{0,5}s{0,1})»);
    МассивШаблонов.Добавить(«(тепл[а-яa-z]{0,5}s{0,1}[а-яa-z]{0,10}s{0,1}пол[а-яa-z]{0,5}s{0,1})»);
    
    МассивШаблонов.Добавить(«(евроs?ремон[а-яa-z]{0,5}s?)|(evros?ремон[а-яa-z]{0,5}s?)»);
    МассивШаблонов.Добавить(«(ремон[а-яa-z]{0,5}s{0,1}[а-яa-z]{0,10}s{0,1}евро[а-яa-z]{0,5}s{0,1})»);
    МассивШаблонов.Добавить(«(сост[а-яa-z]{0,5}s{0,1}[а-яa-z]{0,15}s{0,1}отлич[а-яa-z]{0,5}s{0,1})|(отлич[а-яa-z]{0,5}s{0,1}[а-яa-z]{0,15}s{0,1}сост[а-яa-z]{0,5}s{0,1})»);
    МассивШаблонов.Добавить(«(отлич[а-яa-z]{0,5}s{0,1}[а-яa-z ]{0,35}s{0,1}ремон[а-яa-z]{0,5}s{0,1})»);
    МассивШаблонов.Добавить(«([а-яa-z]{0,15}качествен[а-яa-z]{0,5}s{0,1}[а-яa-z ]{0,35}s{0,1}ремон[а-яa-z]{0,5}s{0,1})»);
    МассивШаблонов.Добавить(«(соврем[а-яa-z]{0,5}s{0,1}[а-яa-z ]{0,35}s{0,1}ремон[а-яa-z]{0,5}s{0,1})|(ремон[а-яa-z]{0,5}s{0,1}[а-яa-z ]{0,35}s{0,1}соврем[а-яa-z]{0,5}s{0,1})»);
    МассивШаблонов.Добавить(«(дорогой[а-яa-z]{0,5}s{0,1}[а-яa-z ]{0,35}s{0,1}ремон[а-яa-z]{0,5}s{0,1})|(ремон[а-яa-z]{0,5}s{0,1}[а-яa-z ]{0,35}s{0,1}дорогой[а-яa-z]{0,5}s{0,1})»);
    МассивШаблонов.Добавить(«(дизайн[а-яa-z]{0,5}s{0,1}[а-яa-z ]{0,35}s{0,1}ремон[а-яa-z]{0,5}s{0,1})|(ремон[а-яa-z]{0,5}s{0,1}[а-яa-z ]{0,35}s{0,1}дизайн[а-яa-z]{0,5}s{0,1})»);
    
    Для каждого ЭлементМассива Из МассивШаблонов Цикл
    RegExp.Pattern = ЭлементМассива;
    Результат = RegExp.Test(ТекстовоеСодержимое);
    Если Результат Тогда //Результат.Count > 0
    ………… здесь что-то делаем
    КонецЕсли;
    КонецЦикла; //Для каждого ЭлементМассива Из  

    Показать

    Платформа 8.3.5.1383. Очень странно. Виндовый объект отрабатывает спокойно, причём ТекстовоеСодержимое предварительно очищается от всех небуквенно-цифровых символов.

    Reply
  63. tormozit

    (62) Так я же еще в (41),(45) предупреждал. Автор до сих пор динамит багу =)

    Reply
  64. sashocq

    Давно ещё приметил эту разработку, а сейчас вот случай представился. И первый же случай не работает 🙁 На выражение

    (?<Code>BD-?d+).*

    ругается:

    Не удалось создать регулярное выражение. Строка 1, Позиция 4, текст до: ‘(?<‘, после: ‘Code>BD-?d+).*’

    Reply
  65. grumagargler

    на 1С:Предприятие x32 сервере 8.3.x, в многопользовательском режиме, использование этой компоненты приводит к падению рабочих процессов 1с, пришлось вернуться на regexp

    Reply
  66. Петров-Водкин

    А как можно ПодключитьВнешнююКомпоненту через макет?

    Reply
  67. Петров-Водкин

    Отвечаю сам себе.

    Отлично подключается zip-архив с манифестом из общего макета.

    Reply
  68. q4a

    Выложите исходники, пожалуйста!

    Версии под Linux очень не хватает =(

    Reply
  69. orefkov

    (68)

    Сейчас глянул исходники — это ужас. Я сейчас сам там с трудом разберусь — что нужно, что не нужно, что можно выкладывать, а что нет.

    Давайте я постараюсь до Нового Года как-то решить вопрос. Сейчас есть мысль на базе нового снегопата сделать по аналогии работу в предприятии, там и регулярки тогда будут.

    Reply
  70. Pupkindt

    На сервере х64 Дерево результата заполняется мусором (8.3.7), на x32 все в порядке. Дело явно в ерунде! Может все-таки имеет смысл выложить исходники? Компонента крайне полезная! Автору Большое спасибо!

    Reply
  71. orefkov

    (70) Pupkindt,

    Дело то на самом деле не в исходниках. Эта ВК — костыли, причём релизо-зависимые. Как одинэсники-то докатились до жизни такой, что стоя уже обеими ногами в 21 веке — не имеют в своём распоряжении такого элементарного инструмента, как регулярные выражения? Они сейчас чуть не в каждой микроволновке есть. Даже С++ — и то уже включил их в стандарт языка — да, даже в С++ они теперь уже не сторонняя библиотека, а часть языка. И как я показал, внутри движка они есть. Но партия решила — одинэсники обойдутся.

    Reply
  72. sigmov

    Приложение умирает при «ПодключитьВнешнююКомпоненту».

    Только у меня?

    Сигнатура проблемы:

    Имя события проблемы: BEX

    Имя приложения: 1CV8C.exe

    Версия приложения: 8.3.7.2008

    Отметка времени приложения: 56f1d2b8

    Имя модуля с ошибкой: StackHash_0a9e

    Версия модуля с ошибкой: 0.0.0.0
    Reply
  73. kirillkr

    Исходников компоненты не будет?

    Reply
  74. q4a

    Да, я еще в 2015 году просил. Пусть лучше будут хоть какие-то исходники, чем ничего.

    Спасибо!

    Reply
  75. bke

    Добрый день, после обновления платформы с 8.3.10 до 8.3.11.2867 (по крайней мере других изменений в системе и коде не произошло) компонента «отвалилась» 🙂 метод ПодключитьВнешнююКомпоненту() возвращает Ложь. При попытке перерегистрировать «ругается» на то, что «не найдена указанная процедура» (см. рис. во вложении).

    Возможно, кто-то сталкивался с подобным, буду рад советам/комментариям. Спасибо!

    Reply
  76. sphere

    наткнулся на не корректную работу компоненты… как бы понять по используемому сейчас dll файлу, последняя ли это версия?

    Reply
  77. kuntashov

    (76) Сравните с той версией, что находится на сайте автора https://snegopat.ru/downloads/

    Reply
  78. sphere

    (77) вчера перешёл на использование VBScript.RegExp и проблема ушла. а файлы сейчас сравнил — совпадают (а за ссылку спасибо, вчера тут не смог найти раздел скачивания)

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *