Как отправить файл Excel из 1С в чат Битрикс24 через вебхуки

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При автоматизации бизнес-процессов часто возникает задача выгрузки отчетов из 1С напрямую в мессенджер Битрикс24. Обычная отправка текста через вебхуки не вызывает сложностей, однако передача физических файлов (например, сформированных XLS-отчетов — поможет универсальный генератор Excel-файлов из любых данных 1С) требует особого подхода. В этой статье мы разберем, почему стандартный метод im.message.add не подходит для прямой загрузки файлов и как реализовать корректную цепочку запросов через Disk API.

Почему не работает простая отправка через ATTACH

Многие разработчики начинают с попытки использовать метод im.message.add и параметр ATTACH, пытаясь передать туда двоичные данные или Base64-строку. Проанализируем ситуацию: параметр LINK в массиве ATTACH предназначен исключительно для формирования визуальных карточек. Он ожидает прямую публичную ссылку на файл, который уже где-то размещен в интернете. Если передать туда локальный путь или закодированный файл, Битрикс24 вернет ошибку 400 или просто проигнорирует вложение — для других каналов связи есть автоматическая отправка уведомлений из 1С в мессенджеры.

Для того чтобы файл отобразился в чате именно как «загруженный файл» со скрепкой и возможностью предпросмотра, нам необходимо использовать функционал Диска Битрикс24.

Алгоритм решения задачи

Для успешной отправки файла нам потребуется реализовать последовательную цепочку из трех HTTP-запросов — для отладки таких процессов есть отладка программного кода 1С в режиме Предприятие. Рассмотрим этот процесс по шагам:

  1. Получение ID папки чата: Каждый чат имеет связанную с ним папку на Диске. Сначала нам нужно узнать её идентификатор.
  2. Загрузка файла: Мы физически загружаем файл в найденную папку.
  3. Регистрация файла в сообщении: Мы сообщаем Битрикс24, что загруженный файл нужно отобразить в конкретном диалоге.

Шаг 1: Получение ID папки для загрузки

Первым делом выясним, куда именно Битрикс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.Закрыть();
    КонецЕсли;
КонецПроцедуры

Шаг 2: Загрузка файла методом disk.folder.uploadfile

Это самый ответственный этап. Метод 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 является более стабильным и производительным вариантом.

Шаг 3: Публикация файла в чате (im.disk.file.commit)

После того как файл загружен, он уже находится в хранилище, но пользователи его еще не видят. Нам нужно "привязать" его к сообщению. Проанализируем параметры метода 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 для передачи файлов. Помните следующие правила:

Реализовав эту последовательность, вы сможете настроить автоматическую отправку любых XLS-отчетов по расписанию, что значительно упростит получение оперативной информации для пользователей вашей системы — для этого есть модуль интеграции 1С и Битрикс24 с чат-ботами.

← На главную