Redmine — библиотека для интеграции с 1с

Библиотека, которая через REST API взаимодействует с Redmine. На текущий момент реализована работа проектами, задачами, учетом времени.

лого RedmineНаша небольшая команда в качестве трекера для работы с клиентами использует бесплатный достаточно популярный трекер Redmine. Почему  Redmine? — Потому что для нас проще было разместить трекер в сети, чем организовывать доступ к нашей инфраструктуре и использовать что-нибудь на основе 1с. Для синхронизации данных Redmine и 1с была написана эта обработка.

Все общение с Redmine идет через REST API, подробное описание которого можно найти по адресу http://www.redmine.org/projects/redmine/wiki/Rest_api. Общение идет через xml файлы. Разбор и формирование xml файлов реализовано с помощью XDTO пакетов. Пакет XDTO лежит в макете и при запуске обработки загружается, так что ничего добавлять в конфигурацию не придется. В архиве я прилагаю xsd схему, для тех, кому это будет интересно, и кто захочет внести в нее изменения. Я рекомендую для просмотра и редактирования xsd использовать  Liquid XML Studio.

Работу с обработки можно описать следующей схемой:

Схемма

В самой обработке есть управляемая форма где можно посмотреть примеры работы.

 

Подключение к Redmine

 

Для того чтобы подключится к Redmine, на необходимо включить использование Rest. Это можно сделать на закладке Администрирование — > Настройки — >закладка Аутентификация —> галочка веб сервис REST:

 фрагмент настройки 1

Затем получить ключ текущего пользователя, под которым вы зашли. Заходите в пункт «Моя учетная запись». В правой панели смотрите ваш API Ключ.

 фрагмент настройки 2

Данные о ключе и сервере прописываете в реквизиты обработки.

 

пример кода 1

После инициализации этих переменных, можно делать запросы к Redmine.

 

Пример получения данных

 

Для примера получим описание задачи. В примере в форме обработки это делается кодом:

пример кода 2

У меня в переменных формы НомерЗадачи, содержится «41», это идентификатор задачи в базе Redmine. В параметрах, я указал что хочу получать присоединенные файлы, по умолчанию они не выдаются. На выходе получаем структуру:

 пример структуры

Как обрабатывать эту структуры мы решаем в зависимости от того что мы делаем в нашей 1с конфигурации.

 

40 Comments

  1. Yashazz

    Автор, мои вам респекты. Но такой вопрос — может быть, чисто случайно, вам встречались сведения по API для TFS? Всё хочу интегрироваться, а инфы мало… Если да, киньте, плз, в меня ссылкой.

    Reply ↓
  2. stoptime

    (1) Yashazz, Смотрел выступление на infostart event на эту тему. Может поищите, есть на ютуб канале Доржи Но там все сложно, через снегопад писали свои скрипты, и вспомогательный софт. Не мой уровень к сожалению.

    Reply ↓
  3. pumbaE

    Только задачи или и wiki тоже забираете?

    Reply ↓
  4. stoptime

    (3) pumbaE,

    Wiki не забираю. У всех объектов единообразный интерфейс, добавить нужное не сложно.

    Reply ↓
  5. PrinzOfMunchen

    (4) уже давно сделал интеграцию с 1С, только я делал через внешние источники данных. В связи с развитием ВИД, можно с их помощью уже не только получать данные из Redmine в 1С, но и из 1С писать напрямую в Redmine.

    Reply ↓
  6. stoptime

    (5) PrinzOfMunchen, Был в начале такой план, но у меня база лежит на внешнем хостинге.

    Reply ↓
  7. omut

    Нет в планах использовать redmine_contacts? Интересно было бы связать через пользователей 1С

    Reply ↓
  8. stoptime

    (7) omut, Есть в планах добавить пользователей и роли. чтобы с ними можно было работать.

    нужно немного разгрести дела, сесть и сделать. может на выходных сделаю

    Reply ↓
  9. omut

    (8) я использовал этот плагин. Логика работы была такая: пользователи 1С не являются пользователями редмайн, а являются контактами. Данные по контакту через апи добавлялись в редмайн (если такого контакта там еще не было) и автоматически привязывались к задачам. К сожалению, руки так же не дошли добить до конца интерфейс добавления задачи в 1С (

    Reply ↓
  10. phsin

    Спасибо, интересная разработка!

    Подскажите может вы делали интеграцию со spree https://github.com/spree/spree ?

    Reply ↓
  11. stoptime

    (10) Нет интеграцию с этой системой не делал. Посмотрел, там идет взаимодействие через json , поэтому тот прием который я использовал, чтобы сократить код до минимума не подойдет.

    Reply ↓
  12. phsin

    Нашел: Преобразование 1С->JSON->1С для обменов, Web-сервисов

    http://infostart.ru/public/308198/

    но если совсем обнаглеть, то хотелось бы для 7.7 😉

    Reply ↓
  13. stoptime

    (12) phsin, Про эту обработку знаю, хорошая вещь.

    а вот с 7.7 точно не будет, там таких плюшек как XDTO нет, собственно за счет их использования все получилось просто.

    да и я с 7.7 сейчас работаю преимущество только в проектах по переходу на 8. 🙂 какой то разработки на 7.7 уже года 3 не веду.

    Reply ↓
  14. stoptime

    (9) omut, Посмотрел плагин. у него есть API так что прикрутить можно. Единственное не понял в чем преимущество его пользования?

    Reply ↓
  15. omut

    (14) обратная связь от пользователей 1С без необходимости заводить их в качестве пользователей. Например, можно создавать новые задачи от пользователей, привязывать контакты к задаче. В этом случае будет видно, кто отправил условную заявку или создал обращение в ТП. Как показывает практика, клиентам, заказчикам и прочим пользователям 1С пользоваться багтрекингом затруднительно. А так они просто пишут прямо в 1С текст (или прикрепляют что-то, это уже как надо) и формируется задача с нужными настройками и информацией, кто ее отправил. Еще один плюс: пользователей 1С может быть много и всех их мы просто не знаем. Полезно прикрутить в качестве организации, например, подразделение. Так автоматически формируется структура организации клиента, привязываются сотрудники клиента и все это видно в выставленных задачах (обращениях). Ну и электронная почта, как еще один бонус для обратной связи. Адрес так же можно привязывать автоматом. Примерно такая схема.

    Reply ↓
  16. PrinzOfMunchen

    (6) ну так у нас тоже. Для ВИД это не проблема. Ты можешь через них к любой базе цепануться.

    Reply ↓
  17. Смешной 1С

    Подскажите, как получить все задачи? Сейчас, даже при простом запросе вида: redmine/issues.xml?project_id=7 я получаю только открытые задачи.

    Reply ↓
  18. stoptime

    (17) Смешной 1С,

    Можно уточнить запрос добавив отбор по всем статусам. Получится следующее redmine/issues.xml?project_id=7&status_id=*

    Reply ↓
  19. SerMaxim

    Коллеги, а у всех работает обновление проектов ? У меня хоть убиться не получается программно создавать/обновлять подчиненные проекты, т.е. те где указан parent_id. Может кто подскажет как решить проблему ?

    Reply ↓
  20. SerMaxim

    Пардон, нашел у себя ошибку — для сведений, в поле parent_id надо класть не идентификатор проекта, а номер родительского проекта. Собственно нашел еще ошибку одну — не всегда Redmine возвращает в ответ файл и необходимо исправить текст некоторых методов чтобы проверять — получен ли файл с сервера или нет. Если нет — то не надо считывать xml.

    Reply ↓
  21. lustin

    (0) поразбирался с обработкой — обратил внимание что с custom fields до конца не разобрались ?

    //Описание:Создает задачу по заданным параметрам и возвращает структуру с ее данными.
    //Параметры: Параметры — Структура — содержит параметры создаваемой задачи
    //Возвращаемое значение:
    //  Структура — созданная новая задача
    Функция НоваяЗадача(Параметры = Неопределено) Экспорт
    …
    ЗаполнитьЗначенияСвойств(текОбъект,Параметры,,»custom_fields»);
    
    

    Показать

    Reply ↓
  22. stoptime

    (21) lustin,

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

    Reply ↓
  23. Wanderer.nk

    (22)

    по прикреплению файлов: у Вас ошибка в схеме в разделе группы файлов, не хватает аттрибута Type

    Правильно будет

    <objectType name=»TypeUploads»>

    <property name=»type» type=»xs:string» lowerBound=»0″ form=»Attribute»/>

    <property xmlns:d4p1=»rm@rm.rarus.ru» ref=»d4p1:upload»/>

    </objectType>

    и

    текОбъект.type = «array»;

    нужно заменить на

    текОбъект.uploads.type = «array»;

    У меня все заработало 🙂

    2. По custom-fields:

    это свойство в процедуре УдалитьПустыеПоля(ОбрабатываемаяСтруктура) просто удаляется, если не заполнено.

    Как решение заменить в 405 строке

    ЗаполнитьЗначенияСвойств(текОбъект,Параметры,,»custom_fields»);

    на

    ЗаполнитьЗначенияСвойств(текОбъект,Параметры,,?(Параметры.Свойство(«custom_fields»),»custom_fields»,»»));

    PS: спасибо за обработку. Сэкономило день моего времени!

    Reply ↓
  24. purgin

    А есть создание задач?

    Reply ↓
  25. stoptime

    (24) создание задач — есть

    Reply ↓
  26. zorin

    Скажите пожалуйста, почему может возникать ошибка (на следующем шаге от точки останова) :

    {ВнешняяОбработка.RedmineAPI.МодульОбъекта(77)}: Ошибка при вызове метода контекста (ПрочитатьXML)

    ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеХМЛ,ТипДанныхXDTO);

    по причине:

    Ошибка разбора XML: — [1,50]

    Фатальная ошибка:

    Space required after the Public Identifier

    Reply ↓
  27. zorin

    Указанная ошибка возникает при нажатии » получить проект», «загрузить список проектов», «получить список задач», и т д

    Reply ↓
  28. zorin

    Все, спасибо, разобрался, это антивирус мешал!

    Reply ↓
  29. redscrest

    При количестве задач больше 999 в связи с тем что 1с вставляет в число 1000 разделитель в виде непрерывного пробела вы получите список задач который будет повторяться каждую тысячу элементов

    Reply ↓
  30. redscrest

    Поэтому в параметр offset надо писать строку а не число

    Reply ↓
  31. stoptime

    (30) Спасибо, поправлю

    Reply ↓
  32. ImHunter

    Внедряю у себя эту обработку в экспериментальном проекте.

    Пока что сделал рефакторинг и добавил реквизиты для опционального создания SSL-соединения. Создал новые ф-ии:

    // Функция — Получить соединение
    //
    // Возвращаемое значение:
    //  HTTPСоединение — Соединение с сервером RM
    //
    Функция СоздатьОбъектHTTPСоединение()
    
    ЗащСоед = ?(SSLИспользовать, Новый ЗащищенноеСоединениеOpenSSL(), Неопределено);
    Результат = Новый HTTPСоединение(
    РедмайнСервер, ?(РедмайнПорт<>0, РедмайнПорт, Неопределено),
    ?(Не ПустаяСтрока(SSLПользователь), SSLПользователь, Неопределено),
    ?(Не ПустаяСтрока(SSLПароль), SSLПароль, Неопределено), , 2, ЗащСоед, ИспользоватьАутентификациюОС
    );
    
    Возврат Результат;
    
    КонецФункции
    
    Функция СоздатьОбъектHTTPЗапрос(Путь, Параметры = Неопределено, ИмяФайла=Неопределено, ДопЗаголовоки = Неопределено)
    
    СтрокаПараметров = «»;
    
    Если Параметры<>Неопределено Тогда
    Для каждого текПараметр из Параметры Цикл
    //не заполненные параметры игнорируются
    ТекЗнач = текПараметр.Значение;
    Если ПустаяСтрока(ТекЗнач) Тогда
    Продолжить;
    КонецЕсли;
    СтрокаПараметров = СтрокаПараметров + ?(ПустаяСтрока(СтрокаПараметров), «», «&»)
    + текПараметр.Ключ + «=» + ?(ТипЗнч(ТекЗнач)=Тип(«Число»), Формат(ТекЗнач, «ЧН=0; ЧГ=»), ТекЗнач);
    КонецЦикла;
    КонецЕсли;
    СтрокаПараметров = ?(ПустаяСтрока(СтрокаПараметров), «», «?» + СтрокаПараметров);
    ТекстЗапроса = РедмайнПуть + «/» + Путь + «.xml» + СтрокаПараметров;
    //ЗАПРОС
    ЗапросКСайту = Новый HTTPЗапрос(ТекстЗапроса, ЗаголовокЗапроса(ДопЗаголовоки));
    
    Если Не ПустаяСтрока(ИмяФайла) Тогда
    ЗапросКСайту.УстановитьИмяФайлаТела(ИмяФайла);
    КонецЕсли;
    
    Возврат ЗапросКСайту;
    
    КонецФункции

    Показать

    И использовал их:

    Функция PostЗапрос(Путь, Параметры, ИмяФайла=Неопределено, ДопЗаголовоки = Неопределено)
    
    ЗапросКСайту = СоздатьОбъектHTTPЗапрос(Путь, Параметры, ИмяФайла, ДопЗаголовоки);
    РезультатИмяФайла = ПолучитьИмяВременногоФайла();//ПолучитьИмяТестовогоФайла();//
    Соединение = СоздатьОбъектHTTPСоединение();//Соединяем
    Соединение.ОтправитьДляОбработки(ЗапросКСайту, РезультатИмяФайла);
    Текст = Новый ЧтениеТекста(РезультатИмяФайла, КодировкаТекста.UTF8);
    Возврат Текст.Прочитать();
    
    КонецФункции

    Показать

    Reply ↓
  33. lastpioneer

    Подскажите, как вы задавали отбор, если нужно было выбрать задачи по двум Трекерам ? Если можно примерчик строки запроса

    Reply ↓
  34. lastpioneer

    И ещё, как отобрать задачи у которых не заполнен трекер или другое поле перечисления?

    Reply ↓
  35. stoptime

    Поидее передавать пустую строку, это если по API Redmıne оринтироватся, но нужно проверять. У мяня в сценарии использования такой вариант не используется.

    Reply ↓
  36. user886140

    Добрый день! возможно ли получить все задачи из redmine разом, в один xml файл? Пока получается только по 100 задач вытащить за раз.

    Reply ↓
  37. user886140

    (30) в параметр offset пишу строку но все равно после 1000 загружаются не корректные записи. как быть?

    Reply ↓
  38. stoptime

    (36) насколько я помню это ограничения самого API. В той версии котороую я использую больше 100 нельзя

    Reply ↓
  39. r2d255

    При нажатии на создать задачу :

    {ВнешняяОбработка.RedmineAPI.МодульОбъекта(404)}: Ошибка при вызове метода контекста (ЗаполнитьЗначенияСвойств)

    ЗаполнитьЗначенияСвойств(текОбъект,Параметры,,»custom_fields»);

    по причине:

    Недопустимое значение параметра (параметр номер ‘4’) (Поле ‘custom_fields’ объекта ‘Структура’ не обнаружено)

    Reply ↓
  40. lastpioneer

    (34) Сам спросил, сам ответил. Вдруг кто-то будет искать. Нужно указать в фильтре, вместо идентификатора, символы «!*»

    Например: …./redmine/issues.xml?key=d8f157…c8f0165851&&fixed_version_id=!*&&project_id=390

    Reply ↓

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *