Как сохранить файл или документ из Telegram в 1С?

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

При интеграции 1С с ботами Telegram часто возникает задача загрузки документов, фотографий или отчетов, отправленных пользователями в диалог с ботом. Для ее решения требуется реализовать двухэтапное взаимодействие с Telegram Bot API: сначала получить относительный путь к файлу на серверах Telegram, а затем скачать сам файл в локальный каталог или сохранить его в базе 1С. Рассмотрим подробно, как настроить этот процесс с использованием встроенных объектов 1С.

Этап 1. Получение пути к файлу через метод getFile

Когда пользователь отправляет боту документ или изображение, входящее сообщение содержит идентификатор файла — file_id. Чтобы узнать прямой путь для его загрузки, необходимо вызывать метод getFile Telegram Bot API.

Разберем по шагам формирование запроса и получение ответа в формате JSON:


Процедура СкачатьФайлИзТелеграм(FileID, ПутьДляСохранения)
    
    ТокенБота = Константы.КлючAPI.Получить();
    Сервер = "api.telegram.org";
    
    // Формируем ресурс для получения метаданных файла
    Ресурс = "bot" + ТокенБота + "/getFile?file_id=" + FileID;
    
    Соединение = Новый HTTPСоединение(Сервер, , , , , , Новый ЗащищенноеСоединениеOpenSSL);
    Запрос = Новый HTTPЗапрос(Ресурс);
    
    Ответ = Соединение.Получить(Запрос);
    
    Если Ответ.КодСостояния <> 200 Тогда
        ВызватьИсключение "Ошибка запроса к Telegram API: " + Ответ.КодСостояния;
    КонецЕсли;
    
    // Декодируем полученный JSON-ответ
    Чтение = Новый ЧтениеJSON;
    Чтение.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
    ОтветСтруктура = ПрочитатьJSON(Чтение, Истина);
    Чтение.Закрыть();
    
    FilePath = "";
    Если ОтветСтруктура.Получить("ok") = Истина Тогда
        FilePath = ОтветСтруктура["result"]["file_path"];
    Иначе
        ВызватьИсключение "Не удалось получить путь к файлу из Telegram";
    КонецЕсли;

Этап 2. Сохранение файла на диск

После успешного получения относительного пути file_path (например, documents/file_1.pdf или photos/file_2.jpg) выполняем запрос на скачивание файла. Проанализируем основные способы сохранения полученного содержимого на диске.

Способ 1. Передача пути сохранения в метод Получить()

Наиболее простой и прямой путь — передать путь к сохраняемому файлу вторым параметром в метод Получить() объекта HTTPСоединение. Платформа самостоятельно сохранит поток данных на диск:


    // Формируем ресурс скачивания
    РесурсФайла = "file/bot" + ТокенБота + "/" + FilePath;
    ЗапросФайла = Новый HTTPЗапрос(РесурсФайла);
    
    // Скачиваем ответ прямо в указанный файл
    Соединение.Получить(ЗапросФайла, ПутьДляСохранения);
    
КонецПроцедуры

Способ 2. Получение двоичных данных из HTTPОтвета

Если перед сохранением на диск требуется обработать файл в памяти или записать его в реквизит с типом ХранилищеЗначения, используем метод ПолучитьТелоКакДвоичныеДанные() объекта HTTPОтвет:


РесурсФайла = "file/bot" + ТокенБота + "/" + FilePath;
ЗапросФайла = Новый HTTPЗапрос(РесурсФайла);
ОтветФайла = Соединение.Получить(ЗапросФайла);
    
Если ОтветФайла.КодСостояния = 200 Тогда
    ДвоичныеДанные = ОтветФайла.ПолучитьТелоКакДвоичныеДанные();
    ДвоичныеДанные.Записать(ПутьДляСохранения);
КонецЕсли;

Способ 3. Прямая загрузка через объект ДвоичныеДанные

В современных версиях платформы 1С скачивание по прямой ссылка HTTPS можно выполнить с помощью конструктора объекта ДвоичныеДанные, передав абсолютный URL:


URLФайла = "https://api.telegram.org/file/bot" + ТокенБота + "/" + FilePath;
ДвоичныеДанные = Новый ДвоичныеДанные(URLФайла);
ДвоичныеДанные.Записать(ПутьДляСохранения);

Ограничения и важные нюансы

Выясним особенности работы с Telegram Bot API, которые следует брать во внимание при разработке:

  1. Ограничение на размер файла (20 МБ): Публичный сервер Telegram Bot API не позволяет получать файлы крупнее 20 МБ через метод getFile. Для работы с большими файлами потребуется использование собственного локального сервера Telegram Bot API (Local Bot API Server).
  2. Защищенное соединение SSL: При работе с серверами Telegram в объекте HTTPСоединение обязательно передавать объект Новый ЗащищенноеСоединениеOpenSSL.
  3. Права доступа: При выполнении кода на сервере 1С убедитесь, что учетная запись службы 1C:Enterprise Server имеет необходимые права на запись в целевой каталог файловой системы.
← На главную