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 не будет опубликован. Обязательные поля помечены *