====== Запуск на сервере 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~~