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

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


doc:1cajam:serverwindows

Запуск на сервере 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. Запустить копонент на сервере 1С Предприятия
  2. Сконфигурировать web - сервис, который мог бы обрабатывать данные cdr записей, передаваемых копонентом

Запуск компонента на сервере

Подготовка конфигурации

  1. Создаем информационную базу с пустой конфигурацией
  2. Добавляем в конфигурацию обработку SDK_test_tools_v1_0_15_*

Описание нового XDTO пакета

  • Добавляем новый XDTO пакет (в дереве метаданных «Общие» – «XDTO пакеты», Щелчок правой кнопкой мыши – Добавить)

  • Добавим новый тип объекта для пакета, отредактируем его свойства как на картинке:

  • Добавим новый web - Сервис (в дереве метаданных «Общие» – «web - Сервис», Щелчок правой кнопкой мыши – Добавить)
    • На вкладке «Основные» Имя зададим MIKO_Alam
    • На вкладке «Операции» добавим новую операцию:

  • Для операции необходимо добавить три параметра:

  • Сформируем обработчик для операции 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Узел)
		//ПРИМЕР ОТВЕТА
		//<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 знаяения
	КонецФункции // ВернутьСоставнойТип()
  • На вкладке «Прочее» сервиса необходимо указать пространство имен, ранее созданный XDTO пакет, имя файла публикации:

На этом конфигурирование web сервиса завершено.

Публикация web - сервиса

Предполагается, что имеется настроенный web сервер.

  • Главное меню «Администрирование» - «Публикация на web сервере»

  • Задаем имя публикации, тип сервера, что публикуем
  • Задаем имя сервиса, а также его адрес
  • После публикации сервиса в каталоге публикации будет сформирован файл default.vrd со следующим содержимым:
<?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>

Проверка работоспособности сервиса

  • Добавим объект метаданных «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","<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='' />");
  • Если все было корректно выполнено, то будет возвращен составной тип

Теперь описание сервиса доступно по ссылке: 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(Результат);
		ЗаписьЖурналаРегистрации("Результат команды "+Результат);
		// Сообщить("Результат команды "+Элемент.Имя+" "+Результат);
	Исключение
		ЗаписьЖурналаРегистрации("Исключение при разлогинивании");
		// Сообщить("Исключение при разлогинивании");
	КонецПопытки; 
 
КонецПроцедуры

Коментарии

doc/1cajam/serverwindows.txt · Последние изменения: 2014/11/14 22:32 (внешнее изменение)