gifts2017

1C + jabber

Опубликовал Алексей Анатольевич (X.Leshiy) в раздел Обмен - Обмен с другими системами

Использование протокола xmpp для информационных сообщений из 1С без подключения внешних dll.

Не так давно в компании в которой я работаю, внедрили 1С:Документооборот.

Система хорошая (после выпуска версии 1.2.2.6) и нужная, спору нет.

Исторически так сложилось, что в компании развернут и используется jabber сервер.

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

Да вот беда, с протоколом xmpp 1C работать не умеет.

Не проблема, берем в руки напильник!

 

Первой мыслью было использовать внешнюю компоненту от товарища Душелова.

Сказано - сделано.

 

Грабли №1:

При работе на сервере в виде регламентного задания сервер вешается намертво (ни одна база не отвечает до перезагрузки)

Грабли №2:

При попытке отправить сообщения со стороны клиента первые 2-4 сообщения уходят, затем сессия вешается, как и в случае сервера, но хотя бы можно убить сессию.

Внешнюю компоненту, выдернутую из демобазы СЭД Аналитикс постигла та же участь.

 

В причинах разбираться, не было ни времени, ни желания.

Или в компонентах проблема, или в сервере, или на сервере jabbera.

 

Поиски в интернете натолкнули на мысль о php.

 

Итак, рецепт.

 

Берем библиотеки http://webi.ru/webi_files/xmpp_webi.html

 

В файле config.ini.php прописываем настройки сервера, аккаунт для отправки и пр.

 

Кладем файлы config.ini.phpxml.class.php, xmpp.class.php в отдельную папку на сервере, на котором крутится 1С.

Например "\\server\e$\AddIn\jabber\"

На сервере устанавливаем php (если не установлен), настраиваем ассоциации для открытия php файлов.

 

Теперь возьмемся за конфигуратор.

 

Создаем общий модуль с настройками сервер и вызов сервера.

 

Напишем в нем функцию.

&НаСервере
Процедура ОтправитьСообщениеСервером(ТЗ, ИмяФайла) Экспорт
    ТекТекст = Новый ТекстовыйДокумент;      
    ТекСтрока  = "; ТекТекст.ДобавитьСтроку(ТекСтрока);
    ТекСтрока  = "include_once("+Символ(34)+"xmpp.class.php"+Символ(34)+");"; ТекТекст.ДобавитьСтроку(ТекСтрока);
    ТекСтрока  = "$webi = new XMPP($webi_conf);"; ТекТекст.ДобавитьСтроку(ТекСтрока);
    ТекСтрока  = "$webi->connect();"; ТекТекст.ДобавитьСтроку(ТекСтрока);

    Для Каждого ТЗСтрока из ТЗ Цикл
        АдресатJabber = СокрЛП(ТЗСтрока.АдресатJabber);
        СообщениеJabber = СокрЛП(ТЗСтрока.СообщениеJabber);
        ТекСтрока = "$webi->sendMessage("+Символ(34)+АдресатJabber+Символ(34)+", "+Символ(34)+СообщениеJabber+Символ(34)+");";
        ТекТекст.ДобавитьСтроку(ТекСтрока);
    КонецЦикла;
 
    ТекСтрока  = "?>"; ТекТекст.ДобавитьСтроку(ТекСтрока);
    Попытка
        ТекТекст.Записать("\\server\e$\AddIn\jabber\"+ИмяФайла+".php","UTF-8");
        sender= "\\server\e$\AddIn\jabber\"+ИмяФайла+".php";
        ЗапуститьПриложение(sender);
    Исключение
        ЗаписьЖурналаРегистрации("Отправка в Jabber", УровеньЖурналаРегистрации.Ошибка, , "", "Отправка в jabber завершилась неудачей.");
    КонецПопытки;         
КонецПроцедуры

ТЗ это таблица значений с адресами в виде аккаунт@сервер и сообщениями.

ИмяФайла это имя файла который будет запущен php интерпретатором.

Вот и всё, регламентным заданием на сервере можно формировать таблицу с адресами и сообщениями и отправлять в jabber.

Решение может и не самое изящное, зато простое и работает.

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Ийон Тихий (cool.vlad4) 17.03.12 10:21
А я для пыха использую http://code.google.com/p/xmpphp/
- клиентам часто требуется организовать уведомления о заказах с интернет магазинов. Собственно jabber для этого очень даже.
То, что xmpp компоненты вешают 1С, - возможная причина частый опрос клиентов сервером (на проверку соединения). Тут либо надо отключать это на сервере, либо урезать функционал компоненты. Другая причина - неправильное освобождение ресурсов(компонентой. либо в 1С коде не прописано). Из-за этого 1С вообще может крашится. На самом деле я рекомендую использовать jabber в 1С - только таким образом как у вас в статье (т.е. только для регламентных процедур - отправка сообщений по событию) - я как раз сейчас что-то такое и делаю. Для клиентов лучше использовать или какой-нибудь web клиент, либо Miranda. Для 1С-ки компонент можно использовать старый, но мне больше всех понравился - http://jabbercom.sourceforge.net/ - com server - документация, все есть(единственно, были замечены некоторые небольшие расхождения между ней и компонентой, видимо автор просто не обновил доки).
X.Leshiy; +1 Ответить
2. Ийон Тихий (cool.vlad4) 17.03.12 10:30
мКлиентJabber = Новый COMОбъект("JabberCOM.JabberSession");
ДобавитьОбработчик мКлиентJabber.OnConnect, OnConnect;
ДобавитьОбработчик мКлиентJabber.OnMessage, OnMessage;
ДобавитьОбработчик мКлиентJabber.OnException, OnException;
ДобавитьОбработчик мКлиентJabber.OnCommError, OnCommError;
ДобавитьОбработчик мКлиентJabber.OnAuthError, OnAuthError;
ДобавитьОбработчик мКлиентJabber.OnXML, OnXML;
ДобавитьОбработчик мКлиентJabber.OnXMLTag, OnXMLTag;
ДобавитьОбработчик мКлиентJabber.OnDisconnect, OnDisconnect;
ДобавитьОбработчик мКлиентJabber.OnRosterStart, OnRosterStart;
и т.д. событий там до хера. Описание событий есть в доках. Например OnMessage - при поступлении сообщения. Также есть возможность внедрять свой xml код. В таком случае удобно событие
Процедура OnXML(Direction, txt)

// Direction = 0 --> Исходящие
// Direction = 1 --> Входящие

// dString = ?(Direction = 1 ,"SENT: ", "RECV: ");
//Сообщить(dString + txt);

КонецПроцедуры
пишу по памяти, - многое не помню. В этой компоненте главное правильно отключать соединение при завершении работы, иначе 1С-как может упасть.
3. Алексей Анатольевич (X.Leshiy) 17.03.12 10:57
Спасибо, попробую и этот вариант :)
4. Dmitry Dmitry (Dimasik2007) 20.03.12 23:25
Если есть небольшие навыки по работе в Visual Studio, то можно написать свой джаббер-бот (тут)
З.Ы. Мы шли одинаковыми путями)
5. sound sound (sound) 22.03.12 11:49
Тоже у себя замутил, а ничо так прикольно получилось, еще бы подключение работало побыстрей вообще бы было супер.
6. Алексей Анатольевич (X.Leshiy) 22.03.12 11:55
Подключение да, медленное.

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

Пока устраивает :)
7. KV1s (KroVladS) 16.05.12 16:56
ЗапуститьПриложение(sender);
Не работает в серверном режиме.

Не пробовал конектить этот php класс с OpenFire+SSL?
8. Алексей Анатольевич (X.Leshiy) 16.05.12 17:06
(7) KV1s, Что значит не работает? Замечательно работает. На сервере, где стоит 1С сервер, должен быть установлен php и задано соответствие для файлов с расширением .php.

Я не знаю на чем у нас jabber крутится, по идее, должно работать на всех.
9. KV1s (KroVladS) 16.05.12 17:40
(8) X.Leshiy,

Конфигуратор выдаёт такую ошибку:
{ОбщийМодуль.jabber.Модуль(28,4)}: Процедура или функция с указанным именем не определена (ЗапуститьПриложение)
		 <<?>>ЗапуститьПриложение(sender); (Проверка: Сервер)

Синтаксис-помошник говарит:
Глобальный контекст (Global context)
ЗапуститьПриложение (RunApp)
......
Доступность:
Тонкий клиент, веб-клиент, толстый клиент.


Сервера нету :(
1С:Предприятие 8.2 (8.2.13.219)
10. KV1s (KroVladS) 16.05.12 17:51
Но это только пол беды сами PHP скрипты при запуске из CMD не отправляют сообшения :(

Понимаю что php скрипт не ваш но может что посовеуете, по логам видно что конект прошол и сообшение отправлено.. а ничего не приходит.
Version: Openfire 3.6.4

2012-05-16 17:29:56
Initializing class variables
2012-05-16 17:29:56
Trying to connect at server-2010:5223
2012-05-16 17:29:58
Connection made successfully at server-2010:5223
2012-05-16 17:29:58
Sending XML>>
<?xml version="1.0"?><stream:stream xmlns:stream="http://etherx.jabber.org/streams" version="1.0" xmlns="jabber:client" to="orion" xml:lang="en" xmlns:xml="http://www.w3.org/XML/1998/namespace">
2012-05-16 17:29:59
Sending XML>>
<message type="chat" from="helpdesk@domen" to="user@domen"><body>Тестовое сообщение</body></message>
2012-05-16 17:29:59
Sending XML>>
</stream:stream>
...Показать Скрыть
11. Алексей Анатольевич (X.Leshiy) 16.05.12 17:57
(10) KV1s, файл с сообщенем в UTF-8 кодировке? Это обязательно.
12. Алексей Анатольевич (X.Leshiy) 16.05.12 18:01
(9) KV1s,

Общий модуль с настройками Сервер и Вызов сервера.
Версия 1С 1.8.15.301 x64.
Клиент-серверный вариант.

У меня вот что выдает синтакс помощник:


Глобальный контекст (Global context)
ЗапуститьПриложение (RunApp)
Синтаксис:

ЗапуститьПриложение(<СтрокаКоманды>, <ТекущийКаталог>, <ДождатьсяЗавершения>, <КодВозврата>)
Параметры:

<СтрокаКоманды> (обязательный)

Тип: Строка.
Командная строка для запуска приложения либо имя файла, ассоциированного с некоторым приложением.
<ТекущийКаталог> (необязательный)

Тип: Строка.
Задает текущий каталог запускаемого приложения.
В режиме веб-клиента игнорируется.
<ДождатьсяЗавершения> (необязательный)

Тип: Булево.
Истина - дожидаться завершения запущенного приложения перед продолжением работы.
Значение по умолчанию: Ложь
<КодВозврата> (необязательный)

Тип: Число; Неопределено.
Параметр (если он указан) содержит код завершения работы системы - значение, передаваемое приложением операционной системе, если работа была завершена корректно, если такой код был получен. В противном случае возвращает Неопределено.
Для получения кода возврата значение параметра ДождатьсяЗавершения должно быть установлено в Истина, запускаемое приложение должно существовать и завершить свою работу корректно.
Описание:

Выполняет запуск внешнего приложения либо открытие файла с использованием ассоциированного с ним приложения.

Доступность:

Тонкий клиент, веб-клиент, сервер, толстый клиент.
Примечание:

В отличие от функции КомандаСистемы запуск приложения выполняется непосредственно, минуя командный интерпретатор.
Поведение метода зависит от используемой операционной системы и режима запуска. Используемые в реализации метода механизмы операционной системы допускают различные варианты использования. Например, в некоторых режимах метод может открывать html ссылки с помощью браузера "по умолчанию". Такие возможности не являются штатными т.к. не гарантируется их наличие во всех режимах запуска.
Для работы метода на веб-клиенте, необходимо предварительно подключить расширение работы с файлами.
Пример:

// открытие файла MS Excel
ЗапуститьПриложение("Таблица.xls");
13. KV1s (KroVladS) 16.05.12 18:02
14. KV1s (KroVladS) 16.05.12 18:03
(12) X.Leshiy,
Надо обновлять платформу????
15. Алексей Анатольевич (X.Leshiy) 16.05.12 18:30
(14) KV1s, ну я же не знаю, что у вас там и как, опишите подробнее.
16. KV1s (KroVladS) 17.05.12 09:05
(15) X.Leshiy,
1С:Предприятие 8.2 (8.2.13.219)
Сервер 1с
Надо обновлять платформу!!!
17. KV1s (KroVladS) 17.05.12 13:47
(10) KV1s,
Проблема была в методе шифрования. Исправил в xmpp.class.php
stream_socket_enable_crypto($this->stream, TRUE, STREAM_CRYPTO_METHOD_TLS_CLIENT);
Заменил на
stream_socket_enable_crypto($this->stream, TRUE, STREAM_CRYPTO_METHOD_SSLv3_CLIENT);


(9) KV1s,
В общем модуле
ЗапуститьПриложение(sender);
Заменил на
WshShell = Новый COMОбъект("WScript.Shell");
WshShell.Run(sender, 0, Истина);

и платформу обновлять не надо.

Всё отправляет :) Большое Спасибо :)

Вот только $webi->connect(); медлено происходит, секунд 10.

И ещё у Вас в статье редактор испортил строчку кода.
  ТекСтрока  = "; ТекТекст.ДобавитьСтроку(ТекСтрока);
следует заменить на 
   ТекСтрока  = "<?php"; ТекТекст.ДобавитьСтроку(ТекСтрока);
18. Алексей Анатольевич (X.Leshiy) 17.05.12 15:33
(17) KV1s, спасибо, ошибку исправил.
19. Алексей Анатольевич (X.Leshiy) 17.05.12 15:36
Черт, все равно не прошло "<?php", я так понимаю, автоматом редактор убирает потенциально опасные слова.
20. KV1s (KroVladS) 17.05.12 15:45
(19) X.Leshiy,
оформи тегом
[1C-CODE] [ /CODE]
21. Andrey Dyak (electronik) 18.05.12 15:58
Интересно интересно недавно столкнулся с похожей проблемой сервер намертво зависал буду пробовать
22. Алексей Анатольевич (X.Leshiy) 18.05.12 16:15
(21) electronik, обратите внимание что в публикации редактор скушал часть строки. Правильный вариант в коментарии №17.
23. denis denis (denek2004) 28.03.13 13:40
Для 1с 7.7 кто -нибудь подключал ?
24. Алексей Анатольевич (X.Leshiy) 28.03.13 13:57
А в чем проблема?

Принцип работы такой: формируется текстовый файл с php кодом с расширением .php, запускается с помощью интерпретатора. Чем он формируется, разницы нет.
25. pallid *** (white_sochi) 25.11.13 16:04
(2) cool.vlad4,У меня никак не срабатывает событие OnMessage, может там тоже какие то танцы с бубном, как и с отключением, не подскажете???
26. pallid *** (white_sochi) 25.11.13 16:12
А проблема падением базы решилась так:

JS = Новый COMОбъект("JabberCOM.JabberSession");
ДобавитьОбработчик JS.OnConnect, OnConnect;
ДобавитьОбработчик JS.OnMessage, OnMessage;
JS.Server = "jabber.ru";  
JS.Username = логин;
JS.Password = пароль;  
JS.Resource = "Script";   
JS.Priority = 1;
DoConnect = JS.DoConnect(Ложь,0); //Без присвоения падает
	
Предупреждение("Соединение", 5); //Надо а то база падает

msg = Новый COMОбъект("JabberCOM.JabberMsg"); 

Предупреждение("Соединение", 5); //Надо а то база падает

msg.MsgType = 0;   
msg.Body = "text";  
msg.ToJID = "кому@jabber.ru";  
	
JS.SendMessage(msg);   
DoConnect = JS.DoConnect(Истина,0); //Без этого тоже падает
	  
Предупреждение("Выход", 5); //На всякий случай

JS.DoDisconnect(Истина); 
...Показать Скрыть
27. Алексей Дятко (masspi) 19.12.13 12:34
Скажите, не могли бы Вы немного подробнее описать механизм интеграции?
28. Владимир Казначеев (Mogidin) 26.02.14 17:29
Обзовите меня некропостером, но...
Насколько я понимаю, чтобы сервер смог что-то записать в файлик на "\\server\e$\AddIn\jabber\", нужно пользователю, под которым запущен сервер, дать права на запись на диск Е. Так?
29. Алексей Анатольевич (X.Leshiy) 26.02.14 17:37
(28) Mogidin, Да, без прав никак. Но, можно класть файлы на любую шару, не обязательно на сервер, если безопасность и все такое :)

У меня запись на E$ была, ну, потому что вот так сделал, потом просто не менял.
Никакого умысла :)
30. Pavel K (FlagmanGK) 12.04.14 13:57
У меня никак не получается отправить сообщение.. подскажите. что не так сделал?

Файл конфигурации:
<?php
/* UTF-8
user@domain
*/

$webi_conf['user']="login@gmail.com";
$webi_conf['pass']="password";
$webi_conf['host']="talk.google.com";
$webi_conf['port']=5222;
$webi_conf['domain']="gmail.com";


$webi_conf['logtxt']=true; // ведение лога false | true
$webi_conf['log_file_name']="loggerxmpp.log"; // файл лога
$webi_conf['tls_off'] = 1; // принудительное отключение шифрования. 1 - выключено, 0 - включено, если сервер поддерживает

?>


index.php
<?php
/* UTF-8
XMPP webi
http://webi.ru/webi_files/xmpp_webi.html

*/

include_once("xmpp.class.php");
$webi = new XMPP($webi_conf);

$webi->connect(); // установка соединения...

$webi->sendStatus('text status','chat',3); // установка статуса
$webi->sendMessage("login2@gmail.com", "soobshenie"); // отправка сообщения


while($webi->isConnected)
{
$webi->getXML();
}

?>


Запускается, окно висит, но при этом в сети "login" не появляется.

В логах пишет
2014-04-12 09:53:44
Initializing class variables

2014-04-12 09:53:44
Trying to connect at talk.google.com:5222

2014-04-12 09:53:44
Connection made successfully at talk.google.com:5222

2014-04-12 09:53:44
Sending XML>>
<?xml version="1.0"?><stream:stream xmlns:stream="http://etherx.jabber.org/streams" version="1.0" xmlns="jabber:client" to="gmail.com" xml:lang="en" xmlns:xml="http://www.w3.org/XML/1998/namespace">

2014-04-12 09:53:45
Received XML<<
<stream:stream from="gmail.com" id="59CEF98C7B349C48" version="1.0" xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client"><stream:features><starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls"><required/></starttls><mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><mechanism>X-OAUTH2</mechanism><mechanism>X-GOOGLE-TOKEN</mechanism></mechanisms></stream:features>

2014-04-12 09:53:45
Authenticating...

2014-04-12 09:53:45
Sending XML>>


2014-04-12 09:53:46
Sending XML>>
<presence><show>chat</show><status>text status</status><priority>3</priority></presence>

2014-04-12 09:53:47
Sending XML>>
<message type="chat" from="" to="login2@gmail.com"><body>soobshenie</body></message>

2014-04-12 09:53:47
Sending XML>>
</stream:stream>