Это старая версия документа!
в версии компонента 1.0.15.5 присутствуют два важных свойства:
// Обработчик операции сервиса Функция 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 знаяения КонецФункции // ВернутьСоставнойТип()
На этом конфигурирование web сервиса завершено.
Предполагается, что имеется настроенный web сервер.
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>
Прокси =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='' />");
Теперь описание сервиса доступно по ссылке: http://...ip_server.../TestComponenta/ws/1C_MIKO_Asterisk.1cws?wsdl
Для работы с компонентом на сервере, все необходимые процедуры и функции следует описать в серверном модуле и вызывать к примеру по расписанию
Пример работы на сервере может выглядеть следующим образом:
// основная Процедура ТестКомпонентаНаСервере() Экспорт Компонент = Неопределено; Инициализировать(Компонент); Если НЕ Компонент = Неопределено Тогда LoginНажатие(Компонент); PingНажатие(Компонент); ЗаписьЖурналаРегистрации("Все успешно отработало!"); Иначе ЗаписьЖурналаРегистрации("Компонент = Неопределено!"); КонецЕсли; КонецПроцедуры Процедура Инициализировать(Компонент) СсылкаНаАрхив = ПоместитьВоВременноеХранилище(Обработки.SDK_test_tools_v1_0_15_2.ПолучитьМакет("AddInWindows32"), Новый УникальныйИдентификатор); Попытка ПодключитьВнешнююКомпоненту(СсылкаНаАрхив,"Comp" ,ТипВнешнейКомпоненты.Native); Компонент = Новый ("AddIn.Comp.MikoAjam"); ЗаписьЖурналаРегистрации("Компонент успешно инициализирован!"); // Предупреждение("Компонент телефонии успешно инициализирован"); Исключение ЗаписьЖурналаРегистрации("Исключение при инициализации!"); // Сообщить("Исключение при инициализации"); КонецПопытки; КонецПроцедуры Процедура LoginНажатие(Компонент) Если Компонент = Неопределено Тогда Сообщить("Компонент не подключен, сначала инициализируйте его"); Возврат; КонецЕсли; Попытка Компонент.Хост = "sip.miko.ru"; Компонент.Порт = "8088"; Компонент.Таймаут = 5; Компонент.DigestАвторизация = Ложь;; Компонент.РежимSSL = Ложь; // Компонент.SOAPEvents = Истина; Компонент.РежимSOAPОповещений = Истина; // далее укажем адрес сервиса (обратите внимание на формат адреса, тут нет постфикса **"?wsdl"**) Компонент.АдресSOAPсервера = "http://....ip_adres..../TestComponenta/ws/1C_MIKO_Asterisk.1cws"; Результат=""; Если Компонент.Login("cdr","mikocdr",Результат) Тогда ЗаписьЖурналаРегистрации( "Результат соединения: "+Результат + "" + Компонент.ВерсияКомпонента); // Сообщить("Результат соединения: "+Результат); Иначе ЗаписьЖурналаРегистрации("Авторизация не удалась."+ "" + Компонент.ВерсияКомпонента); // Предупреждение("Авторизация не удалась."); КонецЕсли; Исключение ЗаписьЖурналаРегистрации("Исключение при логине на сервере Asterisk"); // Сообщить("Исключение при логине на сервере Asterisk"); КонецПопытки; КонецПроцедуры Процедура PingНажатие(Компонент) Если Компонент = Неопределено Тогда Сообщить("Компонент не подключен"); Возврат; КонецЕсли; Попытка respose =""; Если Компонент.Ping(respose) Тогда ЗаписьЖурналаРегистрации("Результат пинга: "+respose); //Сообщить("Результат пинга: "+respose+Символы.ПС); Иначе ЗаписьЖурналаРегистрации("Ошибка команды Ping. "+respose); //Сообщить("Ошибка команды Ping. "); КонецЕсли; Исключение ЗаписьЖурналаРегистрации("Исключение при пинге!"); //Сообщить("Исключение при пинге"); КонецПопытки; КонецПроцедуры Процедура LogoffНажатие(Компонент) Если Компонент = Неопределено Тогда Сообщить("Компонент не подключен"); Возврат; КонецЕсли; Попытка Результат=""; Компонент.Logoff(Результат); ЗаписьЖурналаРегистрации("Результат команды "+Результат); // Сообщить("Результат команды "+Элемент.Имя+" "+Результат); Исключение ЗаписьЖурналаРегистрации("Исключение при разлогинивании"); // Сообщить("Исключение при разлогинивании"); КонецПопытки; КонецПроцедуры