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

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

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


doc:1cajam:serverwindows

Различия

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

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

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
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='&​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 пакет, имя файла публикации:​     * На вкладке "​**Прочее**"​ сервиса необходимо указать пространство имен, ранее созданный 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=&​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.1330504685.txt.gz · Последние изменения: 2014/11/14 22:32 (внешнее изменение)