Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
doc:1cajam:serverwindows [2012/02/29 08:38] a.portnov |
doc:1cajam:serverwindows [2014/11/14 22:32] (текущий) |
||
---|---|---|---|
Строка 18: | Строка 18: | ||
- Сконфигурировать web - сервис, который мог бы обрабатывать данные cdr записей, передаваемых копонентом | - Сконфигурировать web - сервис, который мог бы обрабатывать данные cdr записей, передаваемых копонентом | ||
- | ===== Запуск копонента на сервере ===== | + | ===== Запуск компонента на сервере ===== |
==== Подготовка конфигурации ==== | ==== Подготовка конфигурации ==== | ||
Строка 25: | Строка 25: | ||
==== Описание нового XDTO пакета ==== | ==== Описание нового XDTO пакета ==== | ||
- | * Элемент ненумерованного спискаДобавляем новый XDTO пакет (в дереве метаданных **"Общие" -- "XDTO пакеты"**, **Щелчок правой кнопкой мыши -- Добавить**) | + | * Добавляем новый XDTO пакет (в дереве метаданных **"Общие" -- "XDTO пакеты"**, **Щелчок правой кнопкой мыши -- Добавить**) |
- | * Элемент ненумерованного списка Укажем имя пакета **XDTO_MIKO** | + | * Укажем имя пакета **XDTO_MIKO** |
- | * Элемент ненумерованного списка URI пространство имен **http://1C_MIKO_Asterisk.ru** | + | * URI пространство имен **http://1C_MIKO_Asterisk.ru** |
{{ :doc:1cajam:dobavlenie_novogo_xdto_paketa.jpg? |}} | {{ :doc:1cajam:dobavlenie_novogo_xdto_paketa.jpg? |}} | ||
- | * Элемент ненумерованного спискаДобавим новый тип значений для пакета, отредактируем его свойства как на картинке: | + | * Добавим новый тип объекта для пакета, отредактируем его свойства как на картинке: |
- | {{ :doc:1cajam:redaktirovanie_svojstv_xdto_paketa.jpg? |}} | + | {{ :doc:1cajam:redaktirovanie_svojstv_xdto_paketa_1.jpg? |}} |
* Добавим новый web - Сервис (в дереве метаданных **"Общие" -- "web - Сервис"**, **Щелчок правой кнопкой мыши -- Добавить**) | * Добавим новый web - Сервис (в дереве метаданных **"Общие" -- "web - Сервис"**, **Щелчок правой кнопкой мыши -- Добавить**) | ||
Строка 45: | Строка 45: | ||
{{ :doc:1cajam:svojstva_parametra_operacii_servisa.jpg? |}} | {{ :doc:1cajam:svojstva_parametra_operacii_servisa.jpg? |}} | ||
+ | * Сформируем обработчик для операции web сервиса: | ||
+ | <code 1C> | ||
+ | |||
+ | |||
+ | // Обработчик операции сервиса | ||
+ | Функция EventListner(Источник, Событие, Данные) | ||
+ | // полученные данные необходимо декодировать: | ||
+ | Данные = URLDecode(Данные); | ||
+ | // запишем в журнал регистрации | ||
+ | ЗаписьЖурналаРегистрации("EventListner" + Данные); | ||
+ | |||
+ | // пример разбора записи | ||
+ | onCDR(Данные); | ||
+ | // возвращаем xml структуру: | ||
+ | Возврат ВернутьРезультатXDTO(Истина, 0); | ||
+ | |||
+ | КонецФункции | ||
+ | |||
+ | // Преобразование переданной строки из URLencoded версии | ||
+ | // (необходимо декодировать данные) | ||
+ | Функция URLDecode(стр) | ||
+ | Хекс=Новый Массив; | ||
+ | Хекс.Добавить("0"); | ||
+ | Хекс.Добавить("1"); | ||
+ | Хекс.Добавить("2"); | ||
+ | Хекс.Добавить("3"); | ||
+ | Хекс.Добавить("4"); | ||
+ | Хекс.Добавить("5"); | ||
+ | Хекс.Добавить("6"); | ||
+ | Хекс.Добавить("7"); | ||
+ | Хекс.Добавить("8"); | ||
+ | Хекс.Добавить("9"); | ||
+ | Хекс.Добавить("A"); | ||
+ | Хекс.Добавить("B"); | ||
+ | Хекс.Добавить("C"); | ||
+ | Хекс.Добавить("D"); | ||
+ | Хекс.Добавить("E"); | ||
+ | Хекс.Добавить("F"); | ||
+ | рез=""; | ||
+ | |||
+ | ДлиннаСтроки = СтрДлина(стр); | ||
+ | Для сч=1 по ДлиннаСтроки Цикл | ||
+ | чар=Сред(стр,сч,1); | ||
+ | Если чар = "%" И сч+2<=ДлиннаСтроки Тогда | ||
+ | Сим1 = Сред(стр,сч+1,1); | ||
+ | Сим2 = Сред(стр,сч+2,1); | ||
+ | |||
+ | Ном1 = Хекс.Найти(Сим1); | ||
+ | Ном2 = Хекс.Найти(Сим2); | ||
+ | Если Ном1 = Неопределено | ||
+ | ИЛИ Ном2 = Неопределено Тогда | ||
+ | рез = рез + чар; | ||
+ | // тогда найденная комбинация не является спецсиволом | ||
+ | Продолжить; | ||
+ | КонецЕсли; | ||
+ | |||
+ | кс = 16 * Ном1 + Ном2; | ||
+ | КорректныйСимвол = Символ(кс); | ||
+ | |||
+ | рез = рез + КорректныйСимвол; | ||
+ | // сдвинем счетчик на два символа | ||
+ | сч = сч + 2; | ||
+ | иначе | ||
+ | рез = рез + чар; | ||
+ | КонецЕсли; | ||
+ | КонецЦикла; | ||
+ | |||
+ | Возврат рез; | ||
+ | |||
+ | КонецФункции // () | ||
+ | |||
+ | // пример разбора зипаси CDR | ||
+ | Процедура onCDR(Знач XMLУзел) | ||
+ | //ПРИМЕР ОТВЕТА | ||
+ | //<generic | ||
+ | //event='Cdr' | ||
+ | //privilege='cdr,all' | ||
+ | //sequencenumber='53045' | ||
+ | //file='cdr_manager.c' | ||
+ | //line='189' | ||
+ | //func='manager_log' | ||
+ | //accountcode='' | ||
+ | //source='263' | ||
+ | //destination='263' | ||
+ | //destinationcontext='from-internal' | ||
+ | //callerid='"WORK Nikolay Beketov" <263>' | ||
+ | //channel='SIP/263-0000013b' | ||
+ | //destinationchannel='SIP/263-0000013c' | ||
+ | //lastapplication='Dial' | ||
+ | //lastdata='SIP/263,,tr' | ||
+ | //starttime='2011-11-25 16:51:41' | ||
+ | //answertime='' | ||
+ | //endtime='2011-11-25 16:51:43' | ||
+ | //duration='2' | ||
+ | //billableseconds='0' | ||
+ | //disposition='NO ANSWER' | ||
+ | //amaflags='DOCUMENTATION' | ||
+ | //uniqueid='1322225501.545' | ||
+ | //userfield='' | ||
+ | // /> | ||
+ | XMLУзел=ПолучитьЧтениеXML(XMLУзел); | ||
+ | Если XMLУзел=Неопределено Тогда | ||
+ | Возврат; | ||
+ | КонецЕсли; | ||
+ | |||
+ | privilege = XMLУзел.ПолучитьАтрибут("privilege"); | ||
+ | accountcode = XMLУзел.ПолучитьАтрибут("accountcode"); | ||
+ | source = XMLУзел.ПолучитьАтрибут("source"); | ||
+ | destination = XMLУзел.ПолучитьАтрибут("destination"); | ||
+ | |||
+ | КонецПроцедуры | ||
+ | |||
+ | |||
+ | // возвращаем значение в виде XDTO пакета | ||
+ | Функция ВернутьРезультатXDTO(bool_result, error_code) | ||
+ | СоставнойТип = ФабрикаXDTO.Тип("http://1C_MIKO_Asterisk.ru", "Compound"); | ||
+ | СоставнойXDTO = ФабрикаXDTO.Создать(СоставнойТип); | ||
+ | |||
+ | СоставнойXDTO.error_code = error_code; | ||
+ | СоставнойXDTO.bool_result = bool_result; | ||
+ | |||
+ | Возврат СоставнойXDTO; // возврат XDTO знаяения | ||
+ | КонецФункции // ВернутьСоставнойТип() | ||
+ | |||
+ | |||
+ | |||
+ | </code> | ||
* На вкладке "**Прочее**" сервиса необходимо указать пространство имен, ранее созданный XDTO пакет, имя файла публикации: | * На вкладке "**Прочее**" сервиса необходимо указать пространство имен, ранее созданный XDTO пакет, имя файла публикации: | ||
{{ :doc:1cajam:vkladka_prochee_servisa.jpg? |}} | {{ :doc:1cajam:vkladka_prochee_servisa.jpg? |}} | ||
+ | |||
+ | **На этом конфигурирование web сервиса завершено.** | ||
+ | |||
+ | ==== Публикация web - сервиса ==== | ||
+ | |||
+ | Предполагается, что имеется настроенный web сервер. | ||
+ | |||
+ | * Главное меню "Администрирование" - "Публикация на web сервере" | ||
+ | |||
+ | {{ :doc:1cajam:publikacija_na_web.jpg? |}} | ||
+ | |||
+ | * Задаем имя публикации, тип сервера, что публикуем | ||
+ | * Задаем имя сервиса, а также его адрес | ||
+ | * После публикации сервиса в каталоге публикации будет сформирован файл default.vrd со следующим содержимым: | ||
+ | <code> | ||
+ | <?xml version="1.0" encoding="UTF-8"?> | ||
+ | <point xmlns="http://v8.1c.ru/8.2/virtual-resource-system" | ||
+ | xmlns:xs="http://www.w3.org/2001/XMLSchema" | ||
+ | xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||
+ | base="/TestComponenta" | ||
+ | ib="Srvr="fastwin7";Ref="TestComponenta";"> | ||
+ | <ws> | ||
+ | <point name="MIKO_Alam" | ||
+ | alias="1C_MIKO_Asterisk.1cws"/> | ||
+ | </ws> | ||
+ | </point> | ||
+ | </code> | ||
+ | |||
+ | === Проверка работоспособности сервиса === | ||
+ | |||
+ | * Добавим объект метаданных "WSСсылка" (**"Общие" - "WS - ссылки"** - добавить) | ||
+ | * Задать имя "WSСсылка", указать URL источника "http://...ip_server.../TestComponenta/ws/1C_MIKO_Asterisk.1cws?wsdl" | ||
+ | * Элемент ненумерованного спискаСоздать тестовую внешнюю обработку, обработчик кнопки **выполнить**: | ||
+ | <code 1с> | ||
+ | |||
+ | Прокси =WSСсылки.WSСсылка.СоздатьWSПрокси("http://1C_MIKO_Asterisk.ru","MIKO_Alam","MIKO_AlamSoap"); | ||
+ | Ответ = Прокси.EventListner("MikoAjamEvent","Cdr","<generic event='Cdr' privilege='cdr,all' sequencenumber='53045' file='cdr_manager.c' line='189' func='manager_log' accountcode='' source='263' destination='263' destinationcontext='from-internal' callerid='"WORK Nikolay Beketov" <263>' channel='SIP/263-0000013b' destinationchannel='SIP/263-0000013c' lastapplication='Dial' lastdata='SIP/263,,tr' starttime='2011-11-25 16:51:41' answertime='' endtime='2011-11-25 16:51:43' duration='2' billableseconds='0' disposition='NO ANSWER' amaflags='DOCUMENTATION' uniqueid='1322225501.545' userfield='' />"); | ||
+ | |||
+ | </code> | ||
+ | * Если все было корректно выполнено, то будет возвращен составной тип | ||
+ | Теперь описание сервиса доступно по ссылке: **http://...ip_server.../TestComponenta/ws/1C_MIKO_Asterisk.1cws?wsdl** | ||
+ | |||
+ | ==== Запуск компонента ==== | ||
+ | Для работы с компонентом на сервере, все необходимые процедуры и функции следует описать в серверном модуле и вызывать к примеру по расписанию | ||
+ | |||
+ | Пример работы на сервере может выглядеть следующим образом: | ||
+ | <code 1С> | ||
+ | // основная | ||
+ | Процедура ТестКомпонентаНаСервере() Экспорт | ||
+ | |||
+ | Компонент = Неопределено; | ||
+ | Инициализировать(Компонент); | ||
+ | |||
+ | Если НЕ Компонент = Неопределено Тогда | ||
+ | LoginНажатие(Компонент); | ||
+ | PingНажатие(Компонент); | ||
+ | |||
+ | ЗаписьЖурналаРегистрации("Все успешно отработало!"); | ||
+ | Иначе | ||
+ | ЗаписьЖурналаРегистрации("Компонент = Неопределено!"); | ||
+ | КонецЕсли; | ||
+ | |||
+ | КонецПроцедуры | ||
+ | |||
+ | Процедура Инициализировать(Компонент) | ||
+ | СсылкаНаАрхив = ПоместитьВоВременноеХранилище(Обработки.SDK_test_tools_v1_0_15_2.ПолучитьМакет("AddInWindows32"), Новый УникальныйИдентификатор); | ||
+ | Попытка | ||
+ | ПодключитьВнешнююКомпоненту(СсылкаНаАрхив,"Comp" ,ТипВнешнейКомпоненты.Native); | ||
+ | Компонент = Новый ("AddIn.Comp.MikoAjam"); | ||
+ | ЗаписьЖурналаРегистрации("Компонент успешно инициализирован!"); | ||
+ | // Предупреждение("Компонент телефонии успешно инициализирован"); | ||
+ | Исключение | ||
+ | ЗаписьЖурналаРегистрации("Исключение при инициализации!"); | ||
+ | // Сообщить("Исключение при инициализации"); | ||
+ | КонецПопытки; | ||
+ | КонецПроцедуры | ||
+ | |||
+ | Процедура LoginНажатие(Компонент) | ||
+ | Если Компонент = Неопределено Тогда | ||
+ | Сообщить("Компонент не подключен, сначала инициализируйте его"); | ||
+ | Возврат; | ||
+ | КонецЕсли; | ||
+ | |||
+ | Попытка | ||
+ | Компонент.Хост = "asterisk.adress.ru"; | ||
+ | Компонент.Порт = "8088"; | ||
+ | Компонент.Таймаут = 5; | ||
+ | Компонент.DigestАвторизация = Ложь;; | ||
+ | Компонент.РежимSSL = Ложь; | ||
+ | Компонент.РежимSOAPОповещений = Истина; | ||
+ | | ||
+ | // далее укажем адрес сервиса (обратите внимание на формат адреса, тут нет постфикса **"?wsdl"**) | ||
+ | Компонент.АдресSOAPсервера = "http://....ip_adres..../TestComponenta/ws/1C_MIKO_Asterisk.1cws"; | ||
+ | |||
+ | Результат=""; | ||
+ | Если Компонент.Login("cdruser","cdrpassword",Результат) Тогда | ||
+ | ЗаписьЖурналаРегистрации( "Результат соединения: "+Результат + "" + Компонент.ВерсияКомпонента); | ||
+ | // Сообщить("Результат соединения: "+Результат); | ||
+ | Иначе | ||
+ | ЗаписьЖурналаРегистрации("Авторизация не удалась."+ "" + Компонент.ВерсияКомпонента); | ||
+ | // Предупреждение("Авторизация не удалась."); | ||
+ | КонецЕсли; | ||
+ | |||
+ | |||
+ | Исключение | ||
+ | ЗаписьЖурналаРегистрации("Исключение при логине на сервере Asterisk"); | ||
+ | // Сообщить("Исключение при логине на сервере Asterisk"); | ||
+ | КонецПопытки; | ||
+ | |||
+ | КонецПроцедуры | ||
+ | |||
+ | Процедура PingНажатие(Компонент) | ||
+ | |||
+ | Если Компонент = Неопределено Тогда | ||
+ | Сообщить("Компонент не подключен"); | ||
+ | Возврат; | ||
+ | КонецЕсли; | ||
+ | |||
+ | Попытка | ||
+ | respose =""; | ||
+ | |||
+ | Если Компонент.Ping(respose) Тогда | ||
+ | ЗаписьЖурналаРегистрации("Результат пинга: "+respose); | ||
+ | //Сообщить("Результат пинга: "+respose+Символы.ПС); | ||
+ | Иначе | ||
+ | ЗаписьЖурналаРегистрации("Ошибка команды Ping. "+respose); | ||
+ | //Сообщить("Ошибка команды Ping. "); | ||
+ | КонецЕсли; | ||
+ | |||
+ | Исключение | ||
+ | ЗаписьЖурналаРегистрации("Исключение при пинге!"); | ||
+ | //Сообщить("Исключение при пинге"); | ||
+ | КонецПопытки; | ||
+ | |||
+ | КонецПроцедуры | ||
+ | |||
+ | Процедура LogoffНажатие(Компонент) | ||
+ | Если Компонент = Неопределено Тогда | ||
+ | Сообщить("Компонент не подключен"); | ||
+ | Возврат; | ||
+ | КонецЕсли; | ||
+ | |||
+ | Попытка | ||
+ | Результат=""; | ||
+ | Компонент.Logoff(Результат); | ||
+ | ЗаписьЖурналаРегистрации("Результат команды "+Результат); | ||
+ | // Сообщить("Результат команды "+Элемент.Имя+" "+Результат); | ||
+ | Исключение | ||
+ | ЗаписьЖурналаРегистрации("Исключение при разлогинивании"); | ||
+ | // Сообщить("Исключение при разлогинивании"); | ||
+ | КонецПопытки; | ||
+ | |||
+ | КонецПроцедуры | ||
+ | </code> | ||
+ | |||
+ | ===== Коментарии ===== | ||
+ | ~~DISQUS~~ | ||