Начнем по порядку, для того, чтобы это реализовать, необходимо использовать 4 метода, соответственно будет 4 токена, это методы:
Да, вот так все очень просто... Чтобы понять это, у меня ушло несколько дней.
Теперь мы начинаем по порядку, мой алгоритм был таков, начинаем с формирования отчета:
Конкретно у меня есть обработка с таблицей значений, где можно выбрать отчет, и дальше идет его поиск по имени.
ТабДок = Новый ТабличныйДокумент;
ПутьКФайлу = КаталогВременныхФайлов();
ИмяФайла = "Отчет " + Строка(МД_Отчет.Синоним) + " от " + Строка(Формат(ТекущаяДатаСеанса(),"ДФ=dd.MM.yy"));
_ТипФайлаТабличногоДокумента = ТипФайлаТабличногоДокумента.PDF;
ИмяТекФайла = ПутьКФайлу + ИмяФайла + ".PDF";
ТабДок.АвтоМасштаб = Истина;
Об_Отчет = Отчеты[МД_Отчет.Имя].Создать();
Отчет = Об_Отчет;
СхемаКомпоновкиДанных = Отчет.СхемаКомпоновкиДанных;
Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
ДанныеРасшифровкиКомпоновки = Новый ДанныеРасшифровкиКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровкиКомпоновки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровкиКомпоновки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабДок);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
МакетКомпоновки = КомпоновщикМакета.Выполнить(Отчет.СхемаКомпоновкиДанных, Настройки);
Данныерасшифровки = ДанныеРасшифровкиКомпоновки;
ТабДок.Записать(ИмяТекФайла,_ТипФайлаТабличногоДокумента);
После того как мы сформировали файл, который мы и будем отправлять, сделаем из него BASE64-строку, потому что битрикс с другими не может работать, и загрузим этот файл.
&НаСервере
Функция ЗагрузитьОтчетНаBX24(Чат,Base64,ИмяФайла,Соединение)
ЗапросЗагрузкаФайла = Новый HTTPЗапрос("rest/***/" + Чат.TOKENДиска + "/disk.storage.uploadfile.json?");
ЗапросЗагрузкаФайла.Заголовки.Вставить("Content-type", "application/json;charset=utf-8");
СтруктураJSON = Новый Структура("id,fileContent,generateUniqueName,data",Число(Чат.DiskId),Base64,Ложь,Новый Структура("NAME",ИмяФайла+".pdf"));
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
ЗаписатьJSON(Запись,СтруктураJSON);
JSON = Запись.Закрыть();
//СтрокаJSON = "{
// "id": ***,
// "fileContent": "***",
// "generateUniqueName": true,
// "data": {"Name": "Абоба.jpeg"}
// }";
ЗапросЗагрузкаФайла.УстановитьТелоИзСтроки(СтрЗаменить(JSON, " ",""),КодировкаТекста.UTF8);
Попытка
ОтветФайл = Соединение.ВызватьHTTPМетод("POST",ЗапросЗагрузкаФайла);
Исключение
ОбщегоНазначения.СообщитьПользователю(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
ВызватьИсключение;
КонецПопытки;
СтруктураОтвета = ***_ПрочитатьJSON(ОтветФайл.ПолучитьТелоКакСтроку());
Если СтруктураОтвета.Свойство("error") Тогда
ОбщегоНазначения.СообщитьПользователю(СтруктураОтвета.error_description);
ВызватьИсключение("Ошибка при загрузке файла",
КатегорияОшибки.ОшибкаСети, "error.client.config", "error.client.config additional info");
КонецЕсли;
Возврат СтруктураОтвета;
КонецФункции
Здесь очень важно!!! Потому что битрикс очень чувствителен к тому, что написано, допустим, между Тегом имени JSON и Значением, не должно быть пробела и в целом их не должно быть особо, а также обязательно иметь заголовок: "Content-type", "application/json;charset=utf-8".
Так же data - это не массив, то что написано в документации, это обман! Обман который стоил мне много нервов
На самом деле это должна быть структура, с полем NAME.
Вот пример разговора с инженерной линией поддержки:
Далее, мы отправляем сообщение в чат битрикс:
&НаСервере
Процедура ОтправитьСообщение(Чат,ИмяФайла,Соединение)
ЗапросСообщение = Новый HTTPЗапрос("rest/***/"+Чат.TOKEN
+"/im.message.add.json?DIALOG_ID="+Чат.ChatId+"&MESSAGE="+ИмяФайла);
Попытка
Ответ = Соединение.ВызватьHTTPМетод("POST",ЗапросСообщение);
Исключение
Ошибка = ОписаниеОшибки();
ОбщегоНазначения.СообщитьПользователю(Ошибка,,,,Истина);
КонецПопытки;
СтруктураОтвета = ***_ПрочитатьJSON(Ответ.ПолучитьТелоКакСтроку());
Если СтруктураОтвета.Свойство("error") Тогда
ОбщегоНазначения.СообщитьПользователю(СтруктураОтвета.error_description);
ВызватьИсключение("Ошибка при отправке сообщения",
КатегорияОшибки.ОшибкаСети, "error.client.config", "error.client.config additional info");
КонецЕсли;
КонецПроцедуры
После всего этого отправляем в чат сам файл
&НаСервере
Процедура КомитОтчетаBX24(Чат,UPLOAD_ID,Соединение)
ЗапросФайлКомит = Новый HTTPЗапрос("rest/***/"+Чат.TOKENКомита
+"/im.disk.file.commit.json?CHAT_ID="+
СтрЗаменить(Чат.ChatId,"chat","")+
"&UPLOAD_ID="+Строка(Формат(UPLOAD_ID,"ЧГ=0")));
Попытка
ОтветКомит = Соединение.ВызватьHTTPМетод("POST",ЗапросФайлКомит);
Исключение
ОбщегоНазначения.СообщитьПользователю(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
ВызватьИсключение;
КонецПопытки;
СтруктураОтвета = ***_ПрочитатьJSON(ОтветКомит.ПолучитьТелоКакСтроку());
Если СтруктураОтвета.Свойство("error") Тогда
ОбщегоНазначения.СообщитьПользователю(СтруктураОтвета.error_description);
ВызватьИсключение("Ошибка при отправке сообщения с файлом",
КатегорияОшибки.ОшибкаСети, "error.client.config", "error.client.config additional info");
Иначе
ОбщегоНазначения.СообщитьПользователю("Сообщение отправлено");
КонецЕсли;
КонецПроцедуры
Здесь тоже есть 1 прикол. Потому что в остальных методах мы отправляем ID чата в формате chat****, а именно в file.comit, мы отправляем без chat, иначе все ломается.
На этом все, я надеюсь эта статья будет вам полезна, я потратил кучу своего времени на изучение всего этого.
Прошу не судите строго, я начинающий, если есть, где покритиковать, то пишите, всегда открыт к диалогу.