Pull to refresh

Интеграция 1С и Megaplan или почему веб-сервисы это хорошо

Reading time 4 min
Views 13K
На Хабре уже много статей про 1С и ее «плохую» способность по интеграции с другими системами. И я соглашусь с ними, интегрировать 1С и Megaplan оказалась задачей, куда менее приятность чем я предполагал в начале.

В статье я не расскажу как взять и настроить синхронизацию через API с помощью веб-сервиса от начала и до конца. Но расскажу ключевые моменты после которых найти не достающею информацию будет не проблема.

Предыстория

Я попал в отдел 1С в котором была своя, написанная сотрудниками конфигурация по приему и управлению задачами «PM». Время шло конфигурация развивалась и обрастала новым функционалом и отказаться от нее уже не было возможности, так как она стала единым центром по приему и обработки задач, уже не только отдела 1С, но и всех IT отделов холдинга(на момент написания статьи обсуждается внедрение в систему Административно хозяйственного отдела и отдела эксплуатации зданий). В конфигурации была настроена синхронизация с LDAP, всеми базами холдинга, автоматическими уведомлениями по skype и другое.

История

Был взят заместитель технического директора, который в красках расписал преимущества Megaplana и убедил руководство, что нам жизненно необходимо его внедрить. После затяжных объяснений, что от «РМ» мы отказаться не можем, мне была поставлена задача синхронизировать нашу конфигурацию и Megaplan. Вооружившись львиной долей терпения я начал изучать возможности и сразу понял, что у Megaplana есть только API и надо копать туда. После нескольких дней поиска и экспериментов было ясно, что только средствами 1С это сделать не возможно.

Тут-то и начинается объяснение почему веб-сервисы это хорошо.

К сожалению у нас уже был настроен один веб-сервер, к которому я и подключил свой веб-сервис. По этой причине настройку самого веб-сервера я рассказать не смогу.

Настройка часть 1: Настройка веб-сервисной части.

Спасибо Megaplan, библиотеки api есть и даже все работают, поэтому нам остается только настроить только модели данных. В качестве примера добавление комментария.

Описываем метод которым будем вызывать из 1С

	/**
	 * Marks comment as read
	 *
	 * @access	public
	 * @param	object $data
	 * @return	array
	 */	
	public function comment_create($data)
	{
		$options = array(
			'method'		=> 'post',
			'useHttps'		=> true,
		);
		return $this->send_request(__FUNCTION__, $data, $options);
	}


Описываем модель метода

	require APPPATH.'controllers/common/common_types.php';
	$types = array_merge_recursive(
		$types,
		array(
			// api methods
			'methods' => array (
				'comment_create' => array(
					'type'			=> 'public',
					'returnType'	=> 'CommentEditReturn',
					'description'	=> 'create comment',
					'params'		=> array(
						'data'	=> array(
							'varName'	=> '$data',
							'varType'	=> 'CommentEditInput',
						),
					)
				),
			),

			// api custom types for api methods
			'types' => array(
				'CommentCreateModel' => array(
					'Text'			=> 'string',
					'Work'			=> 'int',
					'WorkDate'		=> 'string',
					'Attaches'		=> 'CommentAttachment[]',
				),
				'CommentAttachment' => array(
					'Add'	=> 'CommentAttachmentItem[]',
				),
				'CommentAttachmentItem' => array(
					'Name'			=> 'string',
					'Context'		=> 'string',
				),
			),
		)
	);


Дальше допустим ваш веб-сервис виден по адресу вашДомен/api/comments/get_wsdl и при переходе вы видите XML с описанием вашего веб-сервиса.

Настройка часть 2: Настройка 1С части.

Дальше добавляем веб-сервис в нашу конфигурацию, открываем, смотрим и действительно все методы, что мы описали есть и никуда не делись. У меня конечно методом больше.


И наконец самое увлекательное пишем код на 1С.

//Добавление комментария
Функция ДобавитьКомментарий(Задача,Текст,ДатаДобавления=Неопределено,РабочееВремя=Неопределено) Экспорт 
	Попытка	
		Ответственный=ПараметрыСеанса.ТекущийПользователь;	
		ВозвращаемоеЗначение = Мегаплан.АутентификацияПоЗадачам(Ответственный.ЛогинМегаплана,Ответственный.ПарольМегаплана,"");
		Если ВозвращаемоеЗначение.status.code = "ok" Тогда 
			Сервис = WSСсылки.WSMegaPlanComments.СоздатьWSПрокси("urn:comments","commentsService","commentsPort");
			ВходнойПараметрСозданияЗадачи = Сервис.ФабрикаXDTO.Создать(Сервис.ФабрикаXDTO.Тип("urn:comments", "CommentEditInput"));
			ВходнойПараметрСозданияЗадачи.AccessId = ВозвращаемоеЗначение.data.AccessId; 
			ВходнойПараметрСозданияЗадачи.SecretKey = ВозвращаемоеЗначение.data.SecretKey;
			ВходнойПараметрСозданияЗадачи.SubjectType="task";
			ВходнойПараметрСозданияЗадачи.SubjectId=Формат(ВернутьИдЗадачи(Задача),"ЧГ=0");
			СтруктураЗадачи = Сервис.ФабрикаXDTO.Создать(Сервис.ФабрикаXDTO.Тип("urn:comments", "CommentCreateModel")); 
			СтруктураЗадачи.Text= ЗаменитьНедопустимыеСимволыXML(Текст);
			СтруктураЗадачи.Work=РабочееВремя; 
			СтруктураЗадачи.WorkDate=Формат(ДатаДобавления,"ДФ='dd.MM.yyyy hh:mm:ss'");
			ВходнойПараметрСозданияЗадачи.Model=СтруктураЗадачи;
			ВозвращаемоеЗначение = Сервис.comment_create(ВходнойПараметрСозданияЗадачи);
			Возврат ВозвращаемоеЗначение;
		Иначе
			Возврат "Описание ошибки: Логин или пароль не верны.";
		КонецЕсли;
	Исключение
		Возврат "Описание ошибки:"+ Символы.ПС + ОписаниеОшибки();
	КонецПопытки;
КонецФункции

//Авторизация
Функция АутентификацияПоЗадачам(Логин, Пароль, СекретыйКлюч) Экспорт
	Попытка
		Сервис = WSСсылки.WSMegaPlanTasks.СоздатьWSПрокси("urn:tasks","tasksService","tasksPort");
		ВходнойПараметрАвторизации = Сервис.ФабрикаXDTO.Создать(Сервис.ФабрикаXDTO.Тип("urn:tasks", "AuthorizationData"));
		ВходнойПараметрАвторизации.Login = Логин; 
		ПреобразованныйПароль = "";
		md5(Пароль, ПреобразованныйПароль);
		ВходнойПараметрАвторизации.Password = ПреобразованныйПароль;
		ВходнойПараметрАвторизации.OneTimeKey = СекретыйКлюч; 
		Возврат Сервис.authorize(ВходнойПараметрАвторизации);
	Исключение
		Причина = ИнформацияОбОшибке();
		Возврат "Ошибка авторизации:"+ Символы.ПС + Причина.Описание;
	КонецПопытки;
КонецФункции


Собственно все. Теперь осталось только прикрутить вызов функции куда вам нужно и все. Megaplan получает наши комментарии из 1С.
Tags:
Hubs:
+2
Comments 5
Comments Comments 5

Articles