====== Запуск на сервере 1С Предприятия (windows) ======
===== Тестовый стенд =====
* Windows XP
* 1С:Предприятие 8.2 (8.2.15.289)
* Тип базы: **серверная**
* Web сервер Apache 2.2
* Версия компонента: 1.0.15.5
в версии компонента **1.0.15.5** присутствуют два важных свойства:
* **РежимSOAPОповещений** - тип Булево - при влючении отправляет все события на вебсервис по адресу указанному в следующем параметре.
* **АдресSOAPсервера** - тип - Строка - адрес опубликованного веб сервиса для приема внешних событий компоненты.
===== Цели =====
- Запустить копонент на сервере 1С Предприятия
- Сконфигурировать web - сервис, который мог бы обрабатывать данные cdr записей, передаваемых копонентом
===== Запуск компонента на сервере =====
==== Подготовка конфигурации ====
- Создаем информационную базу с пустой конфигурацией
- Добавляем в конфигурацию обработку SDK_test_tools_v1_0_15_*
==== Описание нового XDTO пакета ====
* Добавляем новый XDTO пакет (в дереве метаданных **"Общие" -- "XDTO пакеты"**, **Щелчок правой кнопкой мыши -- Добавить**)
* Укажем имя пакета **XDTO_MIKO**
* URI пространство имен **http://1C_MIKO_Asterisk.ru**
{{ :doc:1cajam:dobavlenie_novogo_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 сервиса:
// Обработчик операции сервиса
Функция 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Узел)
//ПРИМЕР ОТВЕТА
//
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 знаяения
КонецФункции // ВернутьСоставнойТип()
* На вкладке "**Прочее**" сервиса необходимо указать пространство имен, ранее созданный XDTO пакет, имя файла публикации:
{{ :doc:1cajam:vkladka_prochee_servisa.jpg? |}}
**На этом конфигурирование web сервиса завершено.**
==== Публикация web - сервиса ====
Предполагается, что имеется настроенный web сервер.
* Главное меню "Администрирование" - "Публикация на web сервере"
{{ :doc:1cajam:publikacija_na_web.jpg? |}}
* Задаем имя публикации, тип сервера, что публикуем
* Задаем имя сервиса, а также его адрес
* После публикации сервиса в каталоге публикации будет сформирован файл default.vrd со следующим содержимым:
=== Проверка работоспособности сервиса ===
* Добавим объект метаданных "WSСсылка" (**"Общие" - "WS - ссылки"** - добавить)
* Задать имя "WSСсылка", указать URL источника "http://...ip_server.../TestComponenta/ws/1C_MIKO_Asterisk.1cws?wsdl"
* Элемент ненумерованного спискаСоздать тестовую внешнюю обработку, обработчик кнопки **выполнить**:
Прокси =WSСсылки.WSСсылка.СоздатьWSПрокси("http://1C_MIKO_Asterisk.ru","MIKO_Alam","MIKO_AlamSoap");
Ответ = Прокси.EventListner("MikoAjamEvent","Cdr","");
* Если все было корректно выполнено, то будет возвращен составной тип
Теперь описание сервиса доступно по ссылке: **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Нажатие(Компонент)
Если Компонент = Неопределено Тогда
Сообщить("Компонент не подключен, сначала инициализируйте его");
Возврат;
КонецЕсли;
Попытка
Компонент.Хост = "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(Результат);
ЗаписьЖурналаРегистрации("Результат команды "+Результат);
// Сообщить("Результат команды "+Элемент.Имя+" "+Результат);
Исключение
ЗаписьЖурналаРегистрации("Исключение при разлогинивании");
// Сообщить("Исключение при разлогинивании");
КонецПопытки;
КонецПроцедуры
===== Коментарии =====
~~DISQUS~~