Как скачать файл по HTTP сразу в оперативную память в 1С без сохранения на диск?

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

При интеграции 1С с веб-сервисами и сторонними системами часто возникает задача получить данные из Интернета (текстовый файл, JSON или XML) и сразу обработать их в оперативной памяти без записи промежуточных файлов на диск. Рассмотрим, какие возможности для этого предоставляют различные версии платформы 1С:Предприятие и системные объекты ОС.

Ограничения и возможности штатных средств платформы 1С

Разберем различия в работе протокола HTTP между версиями платформ 8.2 и 8.3:

  1. Платформа 1С:Предприятие 8.2: Штатный объект HTTPСоединение в версии 8.2 не позволяет принимать содержимое ответа напрямую в переменную контекста. Метод Получить() строго требует указания пути к выходному файлу на диске. Поэтому получить данные сразу в ОЗУ только средствами 8.2 невозможно.
  2. Платформа 1С:Предприятие 8.3: Начиная с версии 8.3.4, механику работы с HTTP-запросами существенно переработали. Появились объекты HTTPЗапрос и HTTPОтвет. Метод Получить() объекта HTTPСоединение возвращает объект HTTPОтвет, из которого данные легко считываются прямо в оперативную память.

Посмотрим на пример работы с HTTP напрямую в ОЗУ на платформе 1С 8.3:


Соединение = Новый HTTPСоединение("example.com");
Запрос = Новый HTTPЗапрос("/data.txt");
Ответ = Соединение.Получить(Запрос);

Если Ответ.КодСостояния = 200 Тогда
    ТекстФайла = Ответ.ПолучитьТелоКакСтроку("UTF-8");
КонецЕсли;

Скачивание файла в ОЗУ в 1С 8.2 с помощью COM-объектов Windows

Если решение разрабатывается на базе платформы 1С 8.2 и требуется избежать создания временных файлов, проанализируем использование системных COM-объектов ОС Windows.

Для загрузки текстовых данных следует обращать внимание на используемые свойства COM-объекта:

  1. Свойство ResponseText: Предназначено для получения ответа в виде обычной текстовой строки. Это универсальный вариант для загрузки простых текстов, JSON и HTML.
  2. Свойство ResponseXML: Рассчитано исключительно на корректный XML-документ с соответствующим HTTP-заголовком Content-Type (text/xml или application/xml). Если запрашивается обычный текстовый файл, обращение к ResponseXML.XML вернет пустую строку.

Рассмотрим пример загрузки текстового файла в строку через COM-объект WinHttp.WinHttpRequest.5.1:


СтрокаURL = "http://example.com/file.txt";
HTTP = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
HTTP.Open("GET", СтрокаURL, Ложь);

Попытка
    HTTP.Send();
    Если HTTP.Status = 200 Тогда
        ТекстВПамяти = HTTP.ResponseText;
    Иначе
        Предупреждение("Не удалось получить данные. Код ответа: " + HTTP.Status);
    КонецЕсли;
Исключение
    Сообщить("Ошибка при выполнении HTTP-запроса: " + ОписаниеОшибки());
КонецПопытки;

Выбор COM-объекта и важные особенности

Выясним, какие COM-объекты лучше использовать в зависимости от задачи:

  1. WinHttp.WinHttpRequest.5.1 — наиболее надежный объект для решения сетевых задач в Windows. Он позволяет гибко настраивать таймауты, заголовки запроса и параметры работы с SSL/HTTPS.
  2. MSXML2.ServerXMLHTTP.6.0 — оптимизирован для серверной работы и многопоточной среды, устойчив при вызове из фоновых заданий 1С.
  3. Microsoft.XMLHTTP — устаревший объект, созданный для работы в клиентских сценариях и браузерах; может непредсказуемо кэшировать запросы на стороне сервера.

Обратите внимание: использование системных COM-объектов работает исключительно в операционной системе Windows. Если сервер 1С:Предприятия функционирует под управлением ОС Linux, вызов COM-объектов приведет к ошибке. Для кроссплатформенной работы на платформе 8.2 без создания файлов на диске единственным решением является использование внешних компонент (Native API), либо переход на платформу 1С 8.3.

← На главную