gifts2017

1C + jabber + python

Опубликовал Владимир Казначеев (Mogidin) в раздел Администрирование - Сервисные утилиты

Отправка сообщений в jabber из 1С [Документооборота] при помощи python-скрипта.

Как уже было написано тут, 1С не умееет [пока?] работать с xmpp, внешние компоненты не приносят желаемого результата (и обычно доступны только для Windows).

У нас тоже сложилось так, что внутри используется jabber и не используется email (т.к. организация небольшая).

Собственно, поискав на инфостарте, ничего дельного кроме той статьи с работой ч\з php найти не получилось. Но душа больше лежит к питону, и к php нет особой приязни. Также, покопавшись в кишочках 1С:Документооборота, оказалось, что довольно легко внедрить отправку jabber-сообщений в имеющуюся систему уведомлений по email (с полной заменой отправки по email отправкой по xmpp). И не пришлось писать свой костыль для проверки новых задач и прочего, о чем хотелось бы получать уведомления.

Для начала нам потребуется собственно python 2й версии и библиотека pyxmpp.

В Linux установка делается в два счета:

# apt-get install python2.7 python-pyxmpp

В Windows все сложнее.

  1. Берем отсюда и устанавливаем питон (версия 2.7). В зависимости от выбранной разрядности (32 или 64-bit) берите далее подходящие пакеты. Добавляем каталог с установленным питоном в переменную окружения PATH (Панель управления - Система - Дополнительные параметры системы - Переменные среды - Системные переменные, ищем в списке Path и в конце её значений дописываем (в моем случае) ";D:\Python 2.7\").
  2. Ставим пакет dnspython. Брать здесь последний релиз для 2.х (Python 2.x Stable, берем zip-архив). Содержимое архива извлекаем в "[PythonDir]\Lib\site-packages\", заходим в появившуюся папку "dnspython-[version]", открываем окно консоли (кто не умеет - зажимаем Shift, щелкаем ПКМ, выбираем "Открыть окно команд"), выполняем команду setup.py install.
  3. Следующий пакет - M2Crypto. Брать здесь M2Crypto-[latest].win[32/amd64]-py2.7. Сейчас можно найти тут только для win32 (или посильнее погуглить). Запускаем исталлятор и кликаем по кнопкам "Далее".
  4. Следующий - libxml2. Брать здесь libxml2-python-[latest].win[32/amd64]-py2.7. Также запускаем и кликаем "Далее".
  5. И наконец сам pyxmpp. Брать здесь последний архив pyxmpp-[latest].tar.gz. С содержимым поступаем аналогично пункту 2, только выполняем последовательно следующие команды: configure.pysetup.py buildsetup.py install.

Теперь запускаем конфигуратор и лезем в кишочки. Покажу что я сделал в Документообороте.

Нас будет интересовать Общий модуль РаботаСУведомлениями. Я создал новый общий модуль с такими же настройками (Сервер, Внешнее соединение, Вызов сервера, Повторное использование - не использовать) и назвал его РаботаСУведомлениямиХМПП. Скопировал в свой модуль несколько процедур и функций из оригинала, потребовавшиеся в процессе работы (СобытиеЖурналаРегистрации, ДобавитьЗначениеВМассив, ОбработатьОшибкуОтправкиУведомления, УдалитьУведомлениеИзОчередиУведомлений), и добавил свои:

Функция ФайлУведомлений()
	Возврат "\\db1c\AddIn\jabber\send_message.txt";
КонецФункции

Функция ОтправитьУведомления()
	ВозниклаОшибкаПриОтправке = Ложь;

	КодВозврата=Неопределено;
	путь="\\db1c\AddIn\jabber\";
	ЗапуститьПриложение("python "+путь+"send_message.py",путь,Истина,КодВозврата);
	
	Если КодВозврата=0 Тогда
		ЗаписьЖурналаРегистрации(
			СобытиеЖурналаРегистрации(),
			УровеньЖурналаРегистрации.Информация,,,
			НСтр("ru = 'Уведомления успешно отправлены.'"));
	Иначе
		ЗаписьЖурналаРегистрации(
			СобытиеЖурналаРегистрации(),
			УровеньЖурналаРегистрации.Предупреждение,,,
			СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Ошибка при отправке уведомления о новых событиях. Код возврата: %1.'"),
				КодВозврата));
		ВозниклаОшибкаПриОтправке = Истина;
	КонецЕсли;
	
	Возврат ВозниклаОшибкаПриОтправке;
КонецФункции

Процедура ПодготовитьФайлУведомлений(СформированныеУведомления)
	ПодготовленныеУведомления=Новый ТекстовыйДокумент;
	
	Для Каждого СформированноеУведомление Из СформированныеУведомления Цикл
		ПочтовыйАдресПолучателя = "";
		ВозниклаОшибкаПриОтправке = Ложь;
		АдресаЭлектроннойПочты = РаботаСУведомлениями.ПолучитьДанныеСпособаУведомления(
			Перечисления.СпособыУведомления.ПоПочте,
			СформированноеУведомление.Пользователь,
			Истина);
		
		Если АдресаЭлектроннойПочты.Количество() = 0 Тогда
			ЗаписьЖурналаРегистрации(
				СобытиеЖурналаРегистрации(),
				УровеньЖурналаРегистрации.Информация,,,
				СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'Уведомление не отправлено, так как не указан почтовый адрес у пользователя %1.'"),
					Строка(СформированноеУведомление.Пользователь)));
			ОбработатьОшибкуОтправкиУведомления(СформированноеУведомление);
			Продолжить;
		КонецЕсли;
		
		Для Каждого ПочтовыйАдресПолучателя Из АдресаЭлектроннойПочты Цикл
			ПодготовленныеУведомления.ДобавитьСтроку("[BEGIN]");
			ПодготовленныеУведомления.ДобавитьСтроку(ПочтовыйАдресПолучателя);
			ПодготовленныеУведомления.ДобавитьСтроку(СформированноеУведомление.ТекстУведомления);
			ПодготовленныеУведомления.ДобавитьСтроку("[END]");
		КонецЦикла;
	КонецЦикла;
	
	ПодготовленныеУведомления.Записать(ФайлУведомлений(),"UTF-8");
КонецПроцедуры

Функция ОтправитьУведомленияПоХМПП(СформированныеУведомления) Экспорт
	ПодготовитьФайлУведомлений(СформированныеУведомления);
	
	ВозниклаОшибкаПриОтправке=ОтправитьУведомления();
	
	Если ВозниклаОшибкаПриОтправке Тогда
		Для Каждого СформированноеУведомление Из СформированныеУведомления Цикл
			ОбработатьОшибкуОтправкиУведомления(СформированноеУведомление);
		КонецЦикла;
	Иначе
		Для Каждого СформированноеУведомление Из СформированныеУведомления Цикл
			Для Каждого Уведомление Из СформированноеУведомление.Уведомления Цикл
				УдалитьУведомлениеИзОчередиУведомлений(Уведомление);
			КонецЦикла;
		КонецЦикла;
	КонецЕсли;
КонецФункции

И небольшое изменение в самом модуле РаботаСУведомлениями:

Функция ОтправитьУведомления()
	
....

		КонецЦикла;
			
		//Для Каждого СформированноеУведомление Из СформированныеУведомления Цикл
		//	ОтправитьУведомление(СформированноеУведомление);
		//КонецЦикла;
		
	КонецЦикла;
	
	РаботаСУведомлениямиХМПП.ОтправитьУведомленияПоХМПП(СформированныеУведомления);
	
КонецФункции

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

[BEGIN]
адрес@получателя.сообщения
несколько
строчек
самого
сообщения
[END]

В самом скрипте задаются необходимые настройки для подключения и авторизации бота (естественно этот бот должен быть в контакт-листе пользователей):

SERVER = '10.10.0.200' # явно указанный ip-адрес jabber-сервера, если есть проблема с резолвингом имени. если все ок, можно вместо адреса оставить значение None
#SERVER = None
PORT = None # 5222 по умолчанию, если порт другой - указать его здесь явно
FROM_JID = 'bot@apk-mir.office-on-the.net/docflow' # аккаунт бота, от которого будет идти рассылка, с указанием ресурса (можно написать любое)
PASSWORD = 'randompassword' # и пароль от этого аккаунта

Возможно потребуется изменить настройки шифрования при подключении к jabber-серверу. У нас шифрование включено, поэтому в процедуре xmpp_do прописано:

c=Client(jid,password,server=server,port=port,auth_methods=['sasl:PLAIN'],tls_settings=streamtls.TLSSettings(require=True, verify_peer=False))

Если шифрование не используется, можно совсем убрать параметр tls_settings и в auth_methods убрать sasl: (тут я не уверен, надо проверять).

1Ска формирует файл сообщений в кодировке UTF-8 with BOM, можете предварительно создать тестовый файл, проверить работу скрипта.

Адреса (jid) пользователей в Документообороте вписаны в поле E-mail.

 

Вроде все описано. Пишите в комментарии, если что забыл, добавлю.

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
send_message.py
.py 1,69Kb
06.03.14
8
.py 1,69Kb 8 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Владимир Казначеев (Mogidin) 06.03.14 18:47
авторизация и отправка сообщений проходят практически моментально, без таких больших задержек, как в случае с php.
обработка ошибок при отправке практически никакая. если возникла какая то ошибка при отправке одного сообщения из списка - неотправленными считается весь список. хотя и ошибке тут возникнуть вроде бы и негде. только если сеть упала, или jabber не работает.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа