В примерах описан далеко не весь набор API, включены те методы, которые использованы в разработке Тикеты - система учета задач/Service Desk в 1С (интеграция с Trello, Мобильное приложение)
Токен и ключ можно после авторизации в сервисе Trello получить по адресу trello.com/app-key
Обработку открывать из любой конфигурации на управляемых формах, под любой версией платформы.
Обработка тестировалась на платформе 8.3.17
Чтение
Функция ВыполнитьЗапросКСерверу(ТекстЗапроса)
Соединение = Новый HTTPСоединение("api.trello.com",,,,,,Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос(ТекстЗапроса + "key=" + Ключ + "&token=" + Токен);
Результат = Соединение.Получить(Запрос);
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Результат.ПолучитьТелоКакСтроку());
РезультатЗапроса = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Возврат(РезультатЗапроса);
КонецФункции
Функция ДатаTrello(ДатаИсточник)
Если ДатаИсточник = Дата(1, 1, 1, 0, 0, 0) Тогда
Рез = "";
Иначе
Рез = XMLСтрока(ДатаИсточник) + ".000Z";
КонецЕсли;
Возврат(Рез);
КонецФункции
Доски пользователя
//Получаем ID пользователя по адресу электронной почты
ТекстЗапроса = "1/search/members/?query=" + ЭлектроннаяПочта + "&limit=1&onlyOrgMembers=false&";
РезультатЗапроса = ВыполнитьЗапросКСерверу(ТекстЗапроса);
Если ТипЗнч(РезультатЗапроса) = Тип("Массив") И (РезультатЗапроса.Количество() > 0) Тогда
IDПользователя = РезультатЗапроса[0].id;
Иначе
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "В Trello не найден пользователь по e-mail """ + ЭлектроннаяПочта + """";
Сообщение.Сообщить();
Возврат;
КонецЕсли;
//Получаем все доски пользователя
ТекстЗапроса = "1/members/" + IDПользователя + "/boards?filter=all&fields=all&lists=none&memberships=none&organization=true&organization_fields=name%2CdisplayName&";
РезультатЗапроса = ВыполнитьЗапросКСерверу(ТекстЗапроса);
Колонки доски
ТекстЗапроса = "1/boards/" + IDДоски + "/lists?";
РезультатЗапроса = ВыполнитьЗапросКСерверу(ТекстЗапроса);
Пользовательские поля доски
ТекстЗапроса = "1/boards/" + IDДоски + "/customFields?";
РезультатЗапроса = ВыполнитьЗапросКСерверу(ТекстЗапроса);
Карточки колонки
ТекстЗапроса = "1/lists/" + IDКолонки + "/cards?";
РезультатЗапроса = ВыполнитьЗапросКСерверу(ТекстЗапроса);
Комментарии и файлы карточки
Фильтр = "commentCard,addAttachmentToCard";
ТекстЗапроса = "1/cards/" + IDКарточки + "/actions/?limit=1000&filter=" + Фильтр + "&since=" + ДатаTrello(НачалоДня(ПериодСобытий.ДатаНачала)) + "&before=" + ДатаTrello(КонецДня(ПериодСобытий.ДатаОкончания)) + "&";
РезультатЗапроса = ВыполнитьЗапросКСерверу(ТекстЗапроса);
Действия с карточкой
Фильтр = "commentCard,addAttachmentToCard,addMemberToCard,removeMemberFromCard,updateCard,moveCardToBoard";
ТекстЗапроса = "1/cards/" + IDКарточки + "/actions/?limit=1000&filter=" + Фильтр + "&since=" + ДатаTrello(НачалоДня(ПериодСобытий.ДатаНачала)) + "&before=" + ДатаTrello(КонецДня(ПериодСобытий.ДатаОкончания)) + "&";
РезультатЗапроса = ВыполнитьЗапросКСерверу(ТекстЗапроса);
Скачивание прикрепленного файла (из ранее заполненной таблицы)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
Если Диалог.Выбрать() Тогда
КопироватьФайл(ТекущаяСтрока.ПутьКФайлу, Диалог.Каталог + "\" + ТекущаяСтрока.Комментарий);
КонецЕсли;
Запись
Функция ВыполнитьЗаписьНаСервере(ТекстЗапроса)
Соединение = Новый HTTPСоединение("api.trello.com",,,,,,Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос(ТекстЗапроса + "key=" + Ключ + "&token=" + Токен);
Результат = Соединение.Записать(Запрос);
Возврат(Результат.КодСостояния);
КонецФункции
Функция Дата1С(ДатаISO)
Если ДатаISO = Неопределено ИЛИ ПустаяСтрока(ДатаISO) Тогда
Возврат(Дата(1, 1, 1, 0, 0, 0));
КонецЕсли;
Возврат(XMLЗначение(Тип("Дата"), ДатаISO));
КонецФункции
Переместить на доску
ТекстЗапроса = "1/cards/" + IDКарточки + "/?idBoard=" + Результат.Значение + "&";
РезультатЗапроса = ВыполнитьЗаписьНаСервере(ТекстЗапроса);
Переместить в колонку
ТекстЗапроса = "1/cards/" + IDКарточки + "/?idList=" + Результат.Значение + "&";
РезультатЗапроса = ВыполнитьЗаписьНаСервере(ТекстЗапроса);
Установить тему
ТекстЗапроса = "1/cards/" + IDКарточки + "/?name=" + Тема + "&";
Результат = ВыполнитьЗаписьНаСервере(ТекстЗапроса);
Установить дату исполнения
ТекстЗапроса = "1/cards/" + IDКарточки + "/?due=" + ?(ДатаИсполнения = Дата(1, 1, 1, 0, 0, 0), "", ДатаTrello(УниверсальноеВремя(ДатаИсполнения))) + "&";
Результат = ВыполнитьЗаписьНаСервере(ТекстЗапроса);
Добавить комментарий
Соединение = Новый HTTPСоединение("api.trello.com",,,,,,Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос("1/cards/" + IDКарточки + "/actions/comments/?text=" + Комментарий + "&key=" + Ключ + "&token=" + Токен);
Результат = Соединение.ОтправитьДляОбработки(Запрос);
Добавить файл
ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ДиалогВыбора.МножественныйВыбор = Ложь;
Если ДиалогВыбора.Выбрать() Тогда
ПутьКФайлу = ДиалогВыбора.ПолноеИмяФайла;
Поз = СтрНайти(ПутьКФайлу, "\", НаправлениеПоиска.СКонца);
Если Поз > 0 Тогда
ИмяФайла = Прав(ПутьКФайлу, СтрДлина(ПутьКФайлу) - Поз);
ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ПутьКФайлу);
Соединение = Новый HTTPСоединение("api.trello.com",,,,,, Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос("1/cards/" + IDКарточки + "/attachments/?key=" + Ключ);
boundary = СтрЗаменить(Новый УникальныйИдентификатор,"-","");
МассивДД = Новый Массив;
Запрос.Заголовки.Вставить("Content-Type", "multipart/form-data; boundary=" + boundary);
ПереводСтроки = Символы.ВК + Символы.ПС;
Текст = "--" + boundary + ПереводСтроки;
Текст = Текст + "Content-Disposition: form-data; name=""token""" + ПереводСтроки + ПереводСтроки;
Текст = Текст + Токен + ПереводСтроки;
Текст = Текст + "--" + boundary + ПереводСтроки;
Текст = Текст + "Content-Disposition: form-data; name=""file""; filename=""" + ИмяФайла + """" + ПереводСтроки + ПереводСтроки;
МассивДД.Добавить(ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(ПолучитьБуферДвоичныхДанныхИзСтроки(Текст, КодировкаТекста.UTF8, Ложь)));
МассивДД.Добавить(ДвоичныеДанныеФайла);
Текст = ПереводСтроки;
Текст = Текст + "--" + boundary + "--" + ПереводСтроки + ПереводСтроки;
МассивДД.Добавить(ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(ПолучитьБуферДвоичныхДанныхИзСтроки(Текст, КодировкаТекста.UTF8, Ложь)));
ТелоДД = СоединитьДвоичныеДанные(МассивДД);
Запрос.УстановитьТелоИзДвоичныхДанных(ТелоДД);
Результат = Соединение.ОтправитьДляОбработки(Запрос);
Если Результат.КодСостояния = 200 Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Файл успешно добавлен");
Иначе
ПоказатьПредупреждение(, "Не удалось добавить файл !");
Конецесли;
КонецЕсли;
КонецЕсли;
Установка пользовательского поля
Соединение = Новый HTTPСоединение("api.trello.com",,,,,,Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос("1/cards/" + IDКарточки + "/customField/" + СтрокаТаблицы.ID + "/item?key=" + Ключ + "&token=" + Токен);
Запрос.Заголовки.Вставить("Content-Type", "application/json");
ЗаписьJSON = Новый ЗаписьJSON;
ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет, " ", Истина);
ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);
Если ЗначениеПоля = "" ИЛИ ЗначениеПоля = 0 ИЛИ ЗначениеПоля = Неопределено Тогда
Если Строка(СтрокаТаблицы.ТипЗначения) = "Строка" И СтрокаТаблицы.СписокЗначений.Количество() > 0 Тогда
СтруктураДанныхJSON = Новый Структура("idValue", "");
Иначе
СтруктураДанныхJSON = Новый Структура("value", "");
КонецЕсли;
ИначеЕсли СтрокаТаблицы.ТипЗначения = Новый ОписаниеТипов("Булево") И НЕ ЗначениеПоля Тогда
СтруктураДанныхJSON = Новый Структура("value", "");
Иначе
Если Строка(СтрокаТаблицы.ТипЗначения) = "Строка" И СтрокаТаблицы.СписокЗначений.Количество() > 0 Тогда
СтруктураДанныхJSON = Новый Структура("idValue", ЗначениеПоля);
Иначе
Если Строка(СтрокаТаблицы.ТипЗначения) = "Строка" Тогда
СтруктураДанныхПоля = Новый Структура("text", Строка(ЗначениеПоля));
ИначеЕсли Строка(СтрокаТаблицы.ТипЗначения) = "Число" Тогда
СтруктураДанныхПоля = Новый Структура("number", СтрЗаменить(СтрЗаменить(Строка(ЗначениеПоля), Символы.НПП, ""), ",", "."));
ИначеЕсли СтрокаТаблицы.ТипЗначения = Новый ОписаниеТипов("Булево") Тогда
СтруктураДанныхПоля = Новый Структура("checked", "true");
ИначеЕсли Строка(СтрокаТаблицы.ТипЗначения) = "Дата" Тогда
СтруктураДанныхПоля = Новый Структура("date", ДатаTrello(ЗначениеПоля));
КонецЕсли;
СтруктураДанныхJSON = Новый Структура("value", СтруктураДанныхПоля);
КонецЕсли;
КонецЕсли;
ЗаписатьJSON(ЗаписьJSON, СтруктураДанныхJSON);
СтрокаJS = ЗаписьJSON.Закрыть();
Запрос.УстановитьТелоИзСтроки(СтрокаJS, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Результат = Соединение.Записать(Запрос);