gifts2017

Jabber клиент (xmpp) NativeAPI внешняя компонента (ВК) для 1С (версия 2.1) платформы x32, x64 (работает на клиенте и сервере)

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

Внешняя компонента для 1С предприятие, по технологии NativeAPI (не требует регистрации в системе как COM компоненты). Это Jabber клиент для 1С (xmpp протокол). Работает на платформах x32 и x64 на клиенте и сервере а так же на сервере приложений (в том числе в фоновом сеансе и регламентных заданиях).

1. Видео о том, что примерно можно реализовать с помощью компоненты

2. Видео по работе с компонентой

Для работы компоненты нужно объявить переменную и подключить ее 

Например: 

Перем Об;
Процедура ПриОткрытии(Отказ)
	
	ПодключитьВнешнююКомпоненту("C:\JabberClient.dll", "Jabber", ТипВнешнейКомпоненты.Native);
	Об = Новый("AddIn.Jabber.JabberClient");
	Результат = Об.Создать("jabber.ru", "5222", "test_my_jabber", "test_my_jabber");
	//ПодключитьОбработчикОжидания("ПроверитьСообщения",1); Можно подключить обработчик и получать все приходящие сообщения или обрабатывать очередь вручную
	
КонецПроцедуры

Дальше работаем как с обычным объектом. 

Описание функций:

ОтправитьСообщение(Получатель@сервер, ТекстСообщения) //Отправка сообщения возвращает Булево значение
ПолучитьСообщения() //Получение массива со структурой сообщений в формате 1с
СписокПользователей() // Возвращает список пользователей в формате 1с
Соединиться() //Подключение возвращает Булево значение
Подключен() //Проверка состояния подключения возвращает Булево значение
Отключиться() //Отключение возвращает Булево значение
Создать(Сервер, порт, Логин, Пароль) //Создание экземпляра клиента возвращает Булево значение
Уничтожить() //Уничтожение экземпляра клиента при закрытии возвращает Булево значение
Пауза() // Аналог Sleep(), ожидает количество миллисекунд, например Об.Пауза(1000) = 1 сек.
Версия() // Информация о файле

В архиве описание, компонента и тестовая база - пример работы с компонентой.

01.11.2015 Добавлена новая команда:

СписокПользователей() // Возвращает список пользователей

Возвращает строку которую на сервере нужно перевести в массив 1с с помощью функции 

"Массив = ЗначениеИзСтрокиВнутр(Результат)"

Упрощена процедура обработки входящих сообщений, теперь "ПолучитьСообщения()" возвращает массив в котором каждый элемент это структура 1С - тоесть Массив[0] будет содержать в себе Структуру - "ОтКого" и "ТекстСообщения", пример:

&НаКлиенте
Процедура ПроверитьСообщения()
	
	Результат = Об.ПолучитьСообщения();
	Если Значениезаполнено(Результат) Тогда
		Массив = ПроверитьСообщенияНаСервере(Результат);
		Для Каждого Сообщение Из Массив Цикл
			Сообщить("Сообщение от: " + Сообщение.ОтКого + ", " + Сообщение.ТекстСообщения);
		КонецЦикла;
	КонецЕсли;
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПроверитьСообщенияНаСервере(Результат)
	
	Возврат ЗначениеИзСтрокиВнутр(Результат);
	
КонецФункции

12.11.2015 Добавлены обработчики исключений с сообщением об ошибке (теперь больше не ложит платформу и сообщает причину по которой произошла обшибка)

Изменен способ обработки событий. Проведена оптимизация. Теперь сообщения поступают при возникновении события входящего сообщения.

Обработка происходит назначением события обычной или управляемой формы 1С "ВнешнееСобытие", пример:

&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)

         Сообщить(Событие + " " + Источник + " " + Данные);

КонецПроцедуры

Также в компоненту добавлен обработчик события ошибок клиента, если произойдет ошибка, в обрабтчик событий "ВнешнееСобытие" поступит событие "Ошибка клиента", с источником "Клиент" или "Ошибка" с источником "Компонента" и данными с сообщением об ошибке.

23.12.2015 

Добавлена поддержка шифрования (TLS/SSL). Теперь будет работать с серверами, которые раньше сообщали "Ошибка 605: TLS required"

24.12.2015 

Добавлена компонента для работы на сервере x64, а так же отлажена работа не сервере приложений, в фоновом режиме и регламентном задании.

Добавлена команда ПолучитьСообщения() для получения сообщений в ручном режиме с сервера - возвращает строку которую нужно перевести на сервере в массив со структурой сообщений, пример работы на сервере:

&НаСервере
Процедура СоздатьНаСервере()
	
	ПодключитьВнешнююКомпоненту("ОбщийМакет.JabberClient64", "JabberClient64", ТипВнешнейКомпоненты.Native);
	Об = Новый("AddIn.JabberClient64.JabberClient");
	
	Попытка
		Результат = Об.Создать("jabber.ru", "5222", "test_my_jabber2@jabber.ru", "test_my_jabber2");
		Результат = Об.ПолучитьСообщения();
		Если ЗначениеЗаполнено(Результат) Тогда
			МассивСообщений = ЗначениеИзСтрокиВнутр(Результат);
		
			Для Каждого Сообщение Из МассивСообщений Цикл
				Сообщить("Сообщение от: " + Сообщение.Отправитель + ", текст сообщения: " + Сообщение.Сообщение);
			КонецЦикла;
		КонецЕсли;
		
		Результат = Об.ОтправитьСообщение("test_my_jabber1@jabber.ru", "Тестовое сообщение из 1С!");
		Результат = Об.Уничтожить();
		Об = Неопределено;
	Исключение
		Сообщить("Произошла ошибка!");// Подробнее в ИнформацияОбОшибке() и ОписаниеОшибки();
    КонецПопытки;
КонецПроцедуры

Так же добавлена возможность подключение к серверу по IP адресу и выбор возможности подключаться с шифрованием или без, в связи с этим доработана процедура Создать(). Теперь она ваыглядит так:

ВнешняяКомпонента.Создать("IP_адрес_сервера_или_имя_домена", "Порт_подключения_к_серверу", "логин@домен", "пароль", Шифрование);
//Пример
Результат = Об.Создать("192.168.1.1", "5222", "test_my_jabber2@jabber.ru", "test_my_jabber2", Ложь); // Без шифрования
//Пример 2
Результат = Об.Создать("jabber.ru", "5222", "test_my_jabber2@jabber.ru", "test_my_jabber2", Истина); // С шифрованием

Пример работы с компонентой на клиенте и сервере x64 в демонстрационной базе в архиве.

Пример работы регламентного задания, которое на сервере слушает входящие сообщения в чате и обрабатывает их, а также каждые 10 минут переподключается:

Процедура ПроверкаСообщенийВЧате() Экспорт
	
	УчетнаяЗаписьЧата = Справочники.УчетныеЗаписиЧата.СистемнаяУчетнаяЗаписьЧата;
	Пользователь = УчетнаяЗаписьЧата.ИмяПользователя + "@" + УчетнаяЗаписьЧата.Домен;
	Пароль = УчетнаяЗаписьЧата.Пароль;
	Сервер = УчетнаяЗаписьЧата.Сервер;
	Порт = УчетнаяЗаписьЧата.Порт;
	
	ПодключитьВнешнююКомпоненту("ОбщийМакет.JabberCli64_dll", "JabberCli64_dll", ТипВнешнейКомпоненты.Native);
	Робот = Новый("AddIn.JabberCli64_dll.JabberClient");
	
	Если Робот.Создать(Сервер, Порт, Пользователь, Пароль, Ложь) Тогда
		Для ъ=1 По 600 Цикл // 600 циклов по одной секунде = ~10 минут
			ПроверитьСообщения(Робот);
			ОтправитьСообщения(Робот);
			Робот.Пауза(1000); // Ожидаем 1 секунду
		КонецЦикла;
		Робот.Уничтожить();
		Робот = Неопределено;		
	КонецЕсли;	
	
КонецПроцедуры

26.12.2015

Исправлены мелкие недочеты. Переписана база-пример по работе с компонентами (добавлены детальные комментарии).

22.02.2016

Версия 1.7. Добавлена работа с SSL серверами которые ранее выдавали ошибку проверки сертификата (например talk.goole.com). Параметр шифрования перенесен в свойства компоненты, теперь выставляется как

Об.ИспользоватьШифрование = Истина;

Добавлен параметр Онлайн (только чтение) отображает текущее состояние связи.

26.05.2016

Версия 1.8. Добавлена возможность работы с одного аккаунта одновременно. Теперь можно одновремнно работать из Jabber клиента и из Jabber компоненты (и даже из нескольких разных Jabber компонент которые подключены в разных местах Wink ). Для того чтобы сообщения приходили и в Jabber компоненту и в клиент, нужно на клиенте убрать ресурс и выставить приоритет 0, то же самое нужно сделать и в компоненте

Об.Ресурс = "";

Например настройки PSI:

Настройки PSI

Или QIP

Результат:

Если вы хотите чтобы входящие сообщения приходили только в клиент, минуя Jabber компоненту. То можете задать имя ресурса или выставить приоритет выше нуля в клиенте... Внимание!! Как только Jabber клиент будет отключен, все сообщения автоматически пойдут в Jabber компненту, т.к. она будет иметь следующий приоритет и все еще будет оставаться онайлн.

26.05.2016

Версия 2.0

Переаботан алгоритм. Теперь не нудно вызывать процедуры Создать() и Уничтожить(), это делает конструктор с деструктором при подулючении и отключении компоненты. Отлажена работа в фоновм задании и на сервере.

Переработаны параметры компоненты, теперь логин, пароль, сервер, порт указываются в свойствах компоненты.

ПодключитьВнешнююКомпоненту(ИмяФайлаКомпоненты, "JabCli32", ТипВнешнейКомпоненты.Native); //Подключаем компоненту
Об = Новый("AddIn.JabCli32.JabberClient"); //Вызываем класс из компоненты
Об.Сервер = "jabber.ru";
Об.Порт = 5222;
Об.Логин = "test_my_jabber2@jabber.ru";
Об.Пароль = "1qaz2wsx3edc";
Об.Ресурс = "";
Об.Подключиться();

30.11.2016 

Версия 2.1. Добавлена возможность работы с конференциями. (Обновлена база пример)

Новые функции:

СоздатьКонференцию(НазваниеКомнаты) // Создание/вход в команту
УдалитьКонференцию(НазваниеКомнаты) // Удаление/выход из команты
СписокКонференций() // возвращает список текущих конференций
КонференцСообщение(КонференцКомната, ТекстСообщения) //Отправка сообщения в конференц комнату возвращает Булево значение

ДобавитьПользователя(JabberID, ИмяВКонтактЛисте, Группа) // Добавляет пользователя в список

Использовать можно где угодно, в коммерческих целях в том числе!

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

Наименование Файл Версия Размер
JabberNativeAPI_x32_x64 37
.rar 2,82Mb
30.11.16
37
.rar 2.1 2,82Mb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Дмитрий Шерстобитов (DitriX) 24.10.15 08:25
Во, вот теперь именно то, что нужно :) Огромное спасибо. И цену поставьте не 1$m, а 5 или 10, она достойна этого :)
2. Александр Синиченко (nytlenc) 24.10.15 15:04
3. Сергей Филькин (FSerg) 27.10.15 18:48
При попытке выполнить: Об.Соединиться();
платформа вылетает с ошибкой (Win 7 32bit Eng)
8.3.6.2100
4. Александр Синиченко (nytlenc) 28.10.15 03:29
(3) FSerg, Об.Создать("Сервер", "Порт", "Логин", "Пароль"); предварительно объявляли? Если да проверяйте внимательно параметры Логин, Пароль, Сервер, Порт, попробуйте с этими учетными данными предварительно авторизоваться с помощью обычного jabber клиента, авторизация проходит? Какой метод аутентификаци используется на сервере, PLAIN, SASL?
5. Сергей Филькин (FSerg) 10.11.15 13:49
(4) nytlenc, Обработку запускал из вашего же демо-примера.
На сервере протокол точно не PLAIN, потому что хотел делать это модных сейчас Slack и HipChat.
Но в любом случае, какой бы протокол и ответ сервера не был - не очень клево что валится платформа.
6. Александр Синиченко (nytlenc) 12.11.15 17:50
(5) FSerg, исправил компоненту, добавил обработчики исключений - теперь не валит платформу, а также выдает сообщение об ошибке, напишите почту в личку, я вышлю Вам (и все кто качал пишите в личку или на почту с указанием логина на infostart отправлю) новую компоненту, чтобы не перекачивать платно тут.
7. Василий Тёркин (1С_Мастер) 22.12.15 17:01
На линукс сервере компонента, к сожалению, подключаться отказывается. Жаль
8. Александр Синиченко (nytlenc) 23.12.15 04:31
(7) 1С_Мастер, Компонента писалась под Win x32, x64. Пока так и не смог добиться того, чтобы она заработала на сервере. И вообще пока не нашел ни одной компоненты xmpp которая работала бы на сервере.
9. Александр Синиченко (nytlenc) 25.12.15 04:06
(7) 1С_Мастер, Переработал компоненту, теперь работает и на сервере. Попробую теперь запустить ее на Linux.
10. zavedeev (zavedeev) 15.01.16 20:48
11. Александр Синиченко (nytlenc) 18.01.16 03:57
(10) zavedeev, исходники не даю. Нигде не написано, что в архиве есть исходники или их Вам дадут.
12. Александр Тарасюк (Aletar) 18.02.16 05:58
Добрый день.

Компонента работает. Но если имя пользователя на русском (у нас имя совпадает с учетной записью AD), то не происходит подключения к серверу (у нас openfire). При этом демонстрационная конфигурация говорит, что подключение выполнено, но при этом состояние оффлайн. Попытка подключения (кнопка Подключить) ситуацию не меняет. Если же при этом попробовать отправить сообщение, то платформа падает (версия 8.2.19.121).

Когда имя пользователя задано латиницей, все нормально.
13. Александр Синиченко (nytlenc) 18.02.16 09:26
(12) Aletar, добрый день. Я попробую разобраться в ситуации. Быть может дело в кодировке. Но это уже копаться надо в самой компоненте. Я напишу и выложу обновление как будет результат.
14. it it (it@1c-usoft.ru) 20.02.16 12:56
С talk.google.com не получается настроить. Кто то пробовал?
15. Александр Синиченко (nytlenc) 22.02.16 15:14
(12) Aletar, Проверено на jabber.ua совместно с TLS. Все работает прекрасно. Попробуйте зарегистрируйте там пользователей с русскими именами, код:

Компонента = ПолучитьМакетССервера(); //Получаем макет компоненты с сервера
	ИмяФайлаКомпоненты = ПолучитьИмяВременногоФайла("dll"); //Получаем имя файла в который сохраним компоненту
	Компонента.Записать(ИмяФайлаКомпоненты); //Сохраняем компоненту в файл
	ПодключитьВнешнююКомпоненту(ИмяФайлаКомпоненты, "j3321", ТипВнешнейКомпоненты.Native); //Подключаем компоненту
	Об = Новый("AddIn.j3321.JabberClient"); //Вызываем класс из компоненты
	
	Результат = Об.Создать("jabber.ua", "5222", "тест_май_джабер2@jabber.ua", "*************ПАРОЛЬ_Я_СКРЫЛ**********", Истина); // Создаем экземпляр Jabber клиента с шифрованием
	Об.ОтправитьСообщение("тест_май_джабер@jabber.ua", "Тестовое сообщение из 1С!");
	Результат = Об.ПолучитьСообщения(); // Обязательно получить сообщения прежде чем выходить в онлайн с помощью Об.Соединиться(), чтобы не потерять сообщения которые
	                                    // были отправлены нам в оффлайн. Команда Об.ПолучитьСообщения() выведет нас в онайн и сразу вернет список сообщений в "Резултат"
	Если ЗначениеЗаполнено(Результат) Тогда // Если есть какая-то строка, значит получили сообщения, будем обрабатывать
		Попытка
			МассивСообщений = ПеревестиСтрокуНаСервере(Результат); // Переводим получнную из компоненты строку в массив 1С	
			Для Каждого Сообщение Из МассивСообщений Цикл
				Лог = "Сообщение от: " + Сообщение.Отправитель + ", текст сообщения: " + Сообщение.Сообщение + Символы.ПС + Лог;
			КонецЦикла;
		Исключение
		КонецПопытки;
	КонецЕсли;
	
	Элементы.Подключиться.Доступность = Истина;
	Элементы.Отключиться.Доступность = Истина;
	Элементы.СписокПользователей.Доступность = Истина;
	Элементы.СостояниеКлиента.Доступность = Истина;
	Элементы.ОтправитьСообщение.Доступность = Истина;
	Элементы.Версия.Доступность = Истина;
...Показать Скрыть
16. Александр Синиченко (nytlenc) 22.02.16 15:50
(14) it@1c-usoft.ru, Исправлено. Перекачайте компоненту будет работать с talk.google.com (не забудьте включить шифрование)
17. it it (it@1c-usoft.ru) 24.02.16 15:02
Соединение проходит нормально.
Все функции работают.
Но.
К аккаунту на talk.google.com подключент через qip. Сообщения проходят. Но сообщения на hangouts не проходят.
В чем может быть проблема?
18. Александр Синиченко (nytlenc) 28.02.16 15:48
(17) it@1c-usoft.ru, Нет не в курсе.
19. Алексей Б (windsurf) 15.05.16 20:39
Спасибо за Вашу разработку! Получилось запустить компоненту, но сильно не хватает пары вещей:
1) инфы о статусе контактов (онлайн/офлайн) - не понятно кому можем писать, а кому бессмысленно
2) На jabber сервере, кроме логина контакта, хранится и его представление (удобочитаемое имя) - вот его бы тоже вытаскивать
20. Александр Синиченко (nytlenc) 25.05.16 04:37
(19) windsurf, я попробую что-нибудь придумать.
21. Константин Манычев (kostyaCD) 10.11.16 16:32
Благодарю за компоненты и хотел бы узнать не поменялось ли что-то касательно Онлайн\Оффлайн. И интересует можно ли как-то отправлять свой статус на сервер, чтоб и остальные видели, что я в онлайне?
22. Александр Синиченко (nytlenc) 14.11.16 17:12
(21) kostyaCD, не поменялось ничего касательно оффлайн/онлайн, этот момент пока в разработке. По поводу статуса, клиент при подключении отправляет автоматически уведомление, что он онлайн и переходит в статус "Готов поболтать". Таким образом все видят что вы онлайн если подключены или оффлайн если нет.
23. Константин Манычев (kostyaCD) 22.11.16 13:14
Хм... Странно, вроде подключаюсь и могу писать, а на другом устройстве все-равно в оффе. И еще хотел спросить есть ли способ с помощью этой компоненты добавлять пользователей в контакт лист? Не нашел что-то такого метода.
24. Константин Манычев (kostyaCD) 24.11.16 12:20
И еще хотел спросить. Есть свой сервере, маковский. Не удается получить список существующих пользователей, я так понимаю потому-что оно там должно у них подтягивать всех кто на этом сервере. И не получить/отправить сообщение. Схожая проблема есть у клиента PSI+, но Spark работает и вроде нормально с этим сервером. На самом деле не сильно разбираюсь во всех этих джабберах и хотел поинтересоваться, может что-то подскажете, что им на сервере подкрутить или как компоненту поднастроить?
25. Александр Синиченко (nytlenc) 30.11.16 17:37
(23) Добавил функцию добавления пользователей в контакт лист. см. описание
26. Александр Синиченко (nytlenc) 30.11.16 17:37
(24) к сожалению на счет сервера не подскажу
27. sergej anonymous (ksv74) 08.12.16 23:20
Под какую платформу файл выгрузки?
Не получается загрузить.
Ошибка "Не верный формат для загрузки информационной базы"
28. Александр Синиченко (nytlenc) 09.12.16 09:29
(27) 8.3 попробуйте последнюю версию платформы
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа