На Хабре уже много статей про 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С.
Автор: grehosh