При автоматизации бизнес-процессов часто возникает задача выгрузки отчетов из 1С напрямую в мессенджер Битрикс24. Обычная отправка текста через вебхуки не вызывает сложностей, однако передача физических файлов (например, сформированных XLS-отчетов — поможет универсальный генератор Excel-файлов из любых данных 1С) требует особого подхода. В этой статье мы разберем, почему стандартный метод im.message.add не подходит для прямой загрузки файлов и как реализовать корректную цепочку запросов через Disk API.
Многие разработчики начинают с попытки использовать метод im.message.add и параметр ATTACH, пытаясь передать туда двоичные данные или Base64-строку. Проанализируем ситуацию: параметр LINK в массиве ATTACH предназначен исключительно для формирования визуальных карточек. Он ожидает прямую публичную ссылку на файл, который уже где-то размещен в интернете. Если передать туда локальный путь или закодированный файл, Битрикс24 вернет ошибку 400 или просто проигнорирует вложение — для других каналов связи есть автоматическая отправка уведомлений из 1С в мессенджеры.
Для того чтобы файл отобразился в чате именно как «загруженный файл» со скрепкой и возможностью предпросмотра, нам необходимо использовать функционал Диска Битрикс24.
Для успешной отправки файла нам потребуется реализовать последовательную цепочку из трех HTTP-запросов — для отладки таких процессов есть отладка программного кода 1С в режиме Предприятие. Рассмотрим этот процесс по шагам:
Первым делом выясним, куда именно Битрикс24 разрешит нам положить файл. Для этого используем метод im.disk.folder.get. Рассмотрим пример формирования запроса в 1С:
&НаСервере
Процедура ПолучитьПапкуЧата(ИдентификаторЧата)
АдресХоста = "ваша_компания.bitrix24.ru";
КлючВебхука = "ваш_токен";
IDПользователя = "ваш_id";
Соединение = Новый HTTPСоединение(АдресХоста, , , , , 60, Новый ЗащищенноеСоединениеOpenSSL);
// Для группового чата ID передается как chat123, для личного - просто ID пользователя
ПараметрыЗапроса = "CHAT_ID=" + ИдентификаторЧата;
АдресРесурса = "/rest/" + IDПользователя + "/" + КлючВебхука + "/im.disk.folder.get?" + ПараметрыЗапроса;
Запрос = Новый HTTPЗапрос(АдресРесурса);
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
// Извлекаем ID папки из JSON
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоИзСтроки());
РезультатСтруктура = ПрочитатьJSON(ЧтениеJSON);
IDПапки = РезультатСтруктура.result.ID;
ЧтениеJSON.Закрыть();
КонецЕсли;
КонецПроцедуры
Это самый ответственный этап. Метод disk.folder.uploadfile требует передачи данных в формате multipart/form-data. Разберем, как правильно подготовить двоичные данные в 1С. Нам нужно сформировать тело запроса, которое включает в себя границы (boundary) и само содержимое файла.
Выясним причину частой ошибки PARAMS_ERROR: она возникает, если неверно указаны имена полей в теле POST-запроса или если типы данных не соответствуют ожидаемым — разобраться поможет инструмент логирования и анализа HTTP-запросов. Посмотрим на пример формирования такого запроса:
&НаСервере
Функция ЗагрузитьФайлНаДиск(IDПапки, ПутьКФайлу, ИмяФайла)
Разделитель = "----" + Формат(ТекущаяДата(), "ДФ=yyyyMMddHHmmss");
// Читаем файл в двоичные данные
ФайлДД = Новый ДвоичныеДанные(ПутьКФайлу);
// Формируем тело запроса
ПотокТела = Новый ПотокВПамяти;
ЗаписьДанных = Новый ЗаписьДанных(ПотокТела);
// Поле ID папки
ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);
ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""id""");
ЗаписьДанных.ЗаписатьСтроку("");
ЗаписьДанных.ЗаписатьСтроку(Строка(IDПапки));
// Секция файла
ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);
ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""fileContent""; filename=""" + ИмяФайла + """");
ЗаписьДанных.ЗаписатьСтроку("Content-Type: application/vnd.ms-excel"); // Для XLS
ЗаписьДанных.ЗаписатьСтроку("");
ЗаписьДанных.Закрыть();
// Объединяем заголовки и двоичные данные файла
РезультатДД = ОбъединитьДвоичныеДанные(ПотокТела.ЗакрытьИПолучитьДвоичныеДанные(), ФайлДД);
// Завершаем разделитель
ПотокФинала = Новый ПотокВПамяти;
ЗаписьФинала = Новый ЗаписьДанных(ПотокФинала);
ЗаписьФинала.ЗаписатьСтроку("");
ЗаписьФинала.ЗаписатьСтроку("--" + Разделитель + "--");
ЗаписьФинала.Закрыть();
РезультатДД = ОбъединитьДвоичныеДанные(РезультатДД, ПотокФинала.ЗакрытьИПолучитьДвоичныеДанные());
// Отправка запроса
Запрос = Новый HTTPЗапрос("/rest/" + IDПользователя + "/" + КлючВебхука + "/disk.folder.uploadfile");
Запрос.Заголовки.Вставить("Content-Type", "multipart/form-data; boundary=" + Разделитель);
Запрос.УстановитьТелоИзДвоичныхДанных(РезультатДД);
// ... логика отправки через HTTPСоединение ...
КонецФункции
Важный момент: Битрикс24 также позволяет передавать файл в формате Base64 внутри JSON-запроса, если использовать параметр fileContent[0] (имя файла) и fileContent[1] (Base64-строка). Однако для больших Excel-отчетов multipart/form-data является более стабильным и производительным вариантом.
После того как файл загружен, он уже находится в хранилище, но пользователи его еще не видят. Нам нужно "привязать" его к сообщению. Проанализируем параметры метода im.disk.file.commit. Нам понадобятся CHAT_ID и UPLOAD_ID (идентификатор файла, полученный на предыдущем шаге).
&НаСервере
Процедура ЗафиксироватьФайлВЧате(IDФайла, IDЧата, ТекстСообщения)
АдресРесурса = "/rest/" + IDПользователя + "/" + КлючВебхука + "/im.disk.file.commit";
ПараметрыСтруктура = Новый Структура;
ПараметрыСтруктура.Вставить("CHAT_ID", IDЧата);
ПараметрыСтруктура.Вставить("UPLOAD_ID", IDФайла);
ПараметрыСтруктура.Вставить("MESSAGE", ТекстСообщения);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ПараметрыСтруктура);
СтрокаТела = ЗаписьJSON.Закрыть();
Запрос = Новый HTTPЗапрос(АдресРесурса);
Запрос.Заголовки.Вставить("Content-Type", "application/json");
Запрос.УстановитьТелоИзСтроки(СтрокаТела);
// Отправляем POST запрос и файл появляется в чате
КонецПроцедуры
Мы рассмотрели полный цикл взаимодействия 1С с Битрикс24 для передачи файлов. Помните следующие правила:
HTTPСоединение с поддержкой ЗащищенноеСоединениеOpenSSL, так как облачный Битрикс24 работает по HTTPS.im (Чат и уведомления) и disk (Диск).chat перед числовым идентификатором (например, chat45).PARAMS_ERROR, убедитесь, что числовые значения (например, ID папки) передаются именно как числа, а не как строки в кавычках (в формате JSON это критично).Реализовав эту последовательность, вы сможете настроить автоматическую отправку любых XLS-отчетов по расписанию, что значительно упростит получение оперативной информации для пользователей вашей системы — для этого есть модуль интеграции 1С и Битрикс24 с чат-ботами.