Внимание!
Эта wiki об устаревших версиях
Документация к актуальной версии интеграции 1С и телефонии доступна по ссылке

Инструменты пользователя

Инструменты сайта


doc:1cajam:serverwindows

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
doc:1cajam:serverwindows [2012/02/29 08:26]
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 - Сервис"​**,​ **Щелчок правой кнопкой мыши -- Добавить**) 
 +    * На вкладке "​**Основные**"​ Имя зададим **MIKO_Alam** 
 +    * На вкладке "​**Операции**"​ добавим новую операцию:​ 
 + 
 +{{ :​doc:​1cajam:​svojstva_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='&​quot;​WORK Nikolay Beketov&​quot;​ &​lt;​263&​gt;'​  
 + //​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 пакет, имя файла публикации:​ 
 + 
 +{{ :​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=&​quot;​fastwin7&​quot;;​Ref=&​quot;​TestComponenta&​quot;;">​ 
 + <​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='&​quot;​WORK Nikolay Beketov&​quot;​ &​lt;​263&​gt;'​ 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~~
  
  
doc/1cajam/serverwindows.1330504016.txt.gz · Последние изменения: 2014/11/14 22:32 (внешнее изменение)