Задача: Необходимо из 1С использовать регулярные выражения (RegExp) в Linux.
Проблема: В Windows можно использовать COM-объект VBScript.Regexp. В Linux нет COM-объектов.
Решение: Устанавливаем Wine и выполняем скрипт через командную строку.
Исходные данные: Клиент-серверный вариант установки 1С. Клиенты любые, сервер — Linux (в моем случае Debian Wheezy).
Теперь по шагам
1. Установим wine (https://wiki.winehq.org/Debian).
wine ставится на i386 архитектуру.
Проверим, что она у нас стоит:
# dpkg --print-architecture
Если нет, то установим (за подробностями сюда https://wiki.debian.org/ru/Multiarch/HOWTO):
# dpkg --add-architecture i386
Установим репозиторий для установки:
wget -nc https://dl.winehq.org/wine-builds/Release.key
apt-key add Release.key
Добавим в список пакетов (/etc/apt/sources.list или отдельным файлом в папку /etc/apt/sources.list.d) строчку:
deb https://dl.winehq.org/wine-builds/debian/ DISTRO main
где DISTRO — имя вашего дистрибутива (у меня wheezy)
Собственно установка:
# apt-get update
# apt-get install --install-recommends winehq-stable
При попытке установить пакет wine на wheezy возникла ошибка:
"The method driver /usr/lib/apt/methods/https could not be found."
Репозиторий winehq использует протокол https для загрузки.
Решается установкой нужного транспорта на apt:
# apt-get install apt-transport-https
Установим полезный скрипт winetricks (с сайта, т.к. в репозитории может быть сильно устаревшим):
# wget https://raw.githubusercontent.com/Winetricks/winetricks/master/src/winetricks
# chmod +x winetricks
# cp winetricks /usr/bin
Для пользователя (usr1cv8), от которого запущен сервер 1С и будет запускаться wine настраиваем его окружение:
# su - usr1cv8
$ winecfg
Установим библиотеку для работы с VBScript.
$ winetricks wsh56vb
Со временем может выйти более новая версия библиотеки, тогда будет сообщение типа: "Calling wsh56 is deprecated, please use wsh57 instead".
В этом случае устанавливаем указанную версию библиотеки (в данном случае wsh57vb).
Для платформы x64 сперва создаем окружение win32 (требуется для VBScript).
Здесь создается отдельная папка (на свой вкус, я сделал в домашней папке пользователя 1С) ~/.wine32 с библиотеками своей архитектуры.
$ WINEARCH=win32 WINEPREFIX=~/.wine32 winecfg
$ WINEPREFIX=~/.wine32 winetricks wsh56vb
Теперь о том, как я это использую
У меня есть задачи разбирать полученные СМС и по полученным совпадениям создавать и заполнять тот или иной документ.
Для этого я создаю правила обработки, в котором задаю регулярное выражение. При анализе текста СМС в случае совпадения с регулярным выражением я разбиваю текст СМС на группы (match) и подгруппы (submatch) и использую эти значения для заполнения нужного мне документа.
Скрипт VBScript и его вызов приведен на скриншотах к статье.
Командная строка вызова скрипта:
$ wine cscript.exe z:ИмяФайлаСкрипта z:ИмяФайлаШаблона z:ИмяФайлаАнализируемогоТекста > ИмяФайлаРезультата 2> ИмяФайлаОшибкок
где
- ИмяФайлаСкрипта — полное имя файла VBScript-скрипта
- ИмяФайлаШаблона — полное имя файла, в которое записывается шаблон регулярного выряжения
- ИмяФайлаАнализируемогоТекста — полное имя файла, в которое записывается анализируемый текст
- ИмяФайлаРезультата — файл, в который перенаправляем вывод работы скрипта (например через WShell.Echo)
- ИмяФайлаОшибкок — файл, в который будет записаны возможные ошибки обработки скрипта
- Первые 3 файла предваряем буквой диска "z:" (z — это корень файловой системы для wine).
Примечания:
- Код выполняется на сервере, т.е. можно использовать в качестве регламентного задания 1С.
- Описанный способ так же работает и в Windows, но для этого возможно понадобятся разрешения администратора на выполнение скриптов (csсript.exe).
- Работа ведется через файлы (соответственно медленнее, чем через COM-объекты, вызываемые из 1С в Windows).
гораздо проще использовать командную строку линукса, тот же grep
есть ВК под линукс
https://infostart.ru/public/183084/
реализация на языке 1с8https://infostart.ru/public/328736/
и использование без компонент xpatchhttps://infostart.ru/public/280340/
У меня есть задачи разбирать полученные СМС и по полученным совпадениям создавать и заполнять тот или иной документ.
Для этого я создаю правила обработки, в котором задаю регулярное выражение. При анализе текста СМС в случае совпадения с регулярным выражением я разбиваю текст СМС на группы (match) и подгруппы (submatch) и использую эти значения для заполнения нужного мне документа.
Немного не по теме, но 🙂
В эпоху расцвета машинного обучения, вместо того, чтобы
е…ямучаться с регулярками проще взять питон и накидать простенькую модель и обучить их на ваших СМСках, делается это не сложно, уже давно свет увидел очень хорошую либу для машинки, называется keras — высокоуровная обертка над парой фрейморков для машнки, которая позволяет решать некоторые задачи машинного обучения, в вашем случае она более чем подходит, классификация текста вообще за вечер делается 🙂(2) Когда я думал как мне реализовать регулярные выражения в Linux я рассматривал варианты использовать имеющиеся консольные утилиты типа grep, sed, awk. Но тогда мне бы пришлось знать принципы работы этих утилит.
А так на данный момент у меня на входе есть просто «регулярное выражение» (оно и в африке «регулярное выражение») и текст для анализа. При этом для Linux и Windows на входе одно и тоже.
Не хотелось бы мне grep настраивать и использовать на винде.
И чем проще grep не ясно. Приведите пример для решения моей задачи.
(3)
1. ВК под Linux. Я читал эту статью. Даже скачал компоненту, но при подключении её даже в винде у меня возникло какое-то исключение (сейчас не вспомню). А в статье внизу приписочка «Основные планы на ближайшее будещее — сделать linux-версию» (орфография автора сохранена) и это было написано в 2014 году.
2. Реализация на языке 1С — во первых не весь синтаксис регулярных выражений поддерживается, во вторых это отдельная конфигурация, которую нужно встроить себе.
3. Наверное имелось ввиду xpath, а не xpatch. На сколько я понимаю это для работы с XML, но никак не для регулярных выражений.
(4) Хм… интересная тема с машинным обучением. Я совсем не в теме, но частенько слышу. Может стоит попробовать. Смущает, что нужно разворачивать целую среду для работы. В любом случае после самого анализа СМС нужно ещё и интегрировать с 1С.
(5) Читал эту статью, но просто проверки соответствия мне мало.
(6) если с grep, sed, awk проблемы то можно использовать nodejs имхо все же проще и быстрее работать будет чем предложенный вариант.
Замерил время (в миллисекундах) затрачиваемое на вычисление регулярного выражения (прикрепил график).
БОльшая часть приходится именно на выполнение скрипта (500..1000 мс).
Попробовал сперва тестировать текст с помощью решения из комментария (5).
Но в ответ на все имеющиеся рабочие шаблоны ошибка «Значение не соответствует образцу».
Вот например:
(.*) (d{2}).(d{2}).(d{2}) (d{2}):(d{2}) покупка (d+.?d*)р (.*) Баланс: (d+.?d*)
Ошибка проверки данных XDTO:
Значение: ‘VISA0000 22.04.18 16:16 покупка 80р M-N EVSEY Баланс: 100.00р’ не соответствует простому типу: {sample-my-package}testtypes
Значение не соответствует образцу
При том, что текст соответствует данному шаблону (можно проверить на популярном «online regexp tester», который 101).
(11) Сам же себе отвечаю по вопросу проверки регулярного выражения с помощью XDTO.
Мои текущие регулярные выражения описывают не всю строку текста, а до последнего совпадения.
На приведенном мной примере для работы через XDTO шаблон должен быть таким (буква «р» на конце):
(.*) (d{2}).(d{2}).(d{2}) (d{2}):(d{2}) покупка (d+.?d*)р (.*) Баланс: (d+.?d*)р
Проверка с помощью XDTO сильно ускорит быстродействие. Т.е. все проверки делаются с помощью XDTO, а разбор текста на группы скриптом только 1 раз.
Зато оно того стоит)