Как программно скачать файл по ссылке в 1С

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

В процессе разработки часто возникает необходимость автоматизировать получение данных из внешних источников. Одной из типичных задач является программное скачивание файлов (сертификатов, прайс-листов, изображений) с веб-сайтов. В этой статье мы подробно разберем, как реализовать этот механизм в 1С:Предприятии 8, используя возможности протокола HTTP, и обсудим важные нюансы, такие как работа с защищенными соединениями и обработка переадресаций. При необходимости регулярно скачивать файлы по расписанию можно использовать инструмент автоматического сбора файлов по HTTP, FTP и почте.

Базовый алгоритм получения файла

Для того чтобы скачать файл, нам необходимо выполнить несколько последовательных шагов. Мы будем использовать встроенные объекты платформы HTTPСоединение и HTTPЗапрос. Давайте проанализируем ситуацию, когда файл доступен по прямой ссылке или ссылке, требующей защищенного соединения SSL. Для предварительной отладки GET-запросов и проверки ответов сервера отлично подойдёт удобная консоль HTTP-запросов.

Рассмотрим пример кода, который позволяет загрузить файл и сохранить его во временный каталог на диске:


// 1. Инициализируем параметры соединения
Сервер = "web.se-ecatalog.ru";
Порт = 443; // Стандартный порт для HTTPS

// 2. Создаем защищенное соединение (необходимо для сайтов, работающих по HTTPS)
Защита = Новый ЗащищенноеСоединениеOpenSSL();

// 3. Устанавливаем соединение с сервером
Соединение = Новый HTTPСоединение(Сервер, Порт, , , , , Защита);

// 4. Подготавливаем путь к файлу на сервере
АдресРесурса = "/certificates/default/download/319";

// 5. Определяем место сохранения файла на локальном диске
ИмяФайла = ПолучитьИмяВременногоФайла("pdf");

// 6. Формируем запрос
Запрос = Новый HTTPЗапрос(АдресРесурса);

// 7. Отправляем GET-запрос и сохраняем результат в файл
Попытка
    Ответ = Соединение.Получить(Запрос, ИмяФайла);
    Если Ответ.КодСостояния = 200 Тогда
        Сообщить("Файл успешно скачан: " + ИмяФайла);
    Иначе
        Сообщить("Ошибка при скачивании. Код состояния: " + Ответ.КодСостояния);
    КонецЕсли;
Исключение
    Сообщить("Произошла ошибка при выполнении HTTP-запроса: " + ОписаниеОшибки());
КонецПопытки;

Работа с переадресацией (Redirect)

Иногда при попытке скачать файл сервер возвращает коды состояния 301 (Moved Permanently), 302 (Found) или 307/308. Это означает, что файл перемещен, и нам нужно выполнить повторный запрос по новому адресу. Выясним причину, почему стандартное соединение не всегда срабатывает автоматически.

Платформа 1С не всегда прозрачно следует по цепочке редиректов. Если вы получили КодСостояния в диапазоне 3xx, необходимо вручную извлечь новый адрес. Проанализируем, как это сделать:

  1. Проверяем заголовки ответа сервера.
  2. Ищем заголовок Location.
  3. Если путь в Location относительный (начинается с "/"), конструируем полный URL, используя текущий домен сервера.
  4. Если путь абсолютный, создаем новое HTTPСоединение для нового домена.

Пример обработки заголовка Location:


НовыйАдрес = Ответ.Заголовки.Получить("Location");
Если НовыйАдрес <> Неопределено Тогда
    // Здесь логика повторного запроса по адресу НовыйАдрес
    Сообщить("Файл перемещен по адресу: " + НовыйАдрес);
КонецЕсли;

Важность заголовка User-Agent

Многие современные веб-серверы настроены на блокировку запросов от «роботов» или неизвестных клиентов. Если ваше HTTPСоединение возвращает ошибку 403 (Forbidden) или 404, хотя в браузере ссылка открывается, скорее всего, дело в отсутствии заголовков. Чтобы имитировать действия обычного пользователя, добавим заголовок User-Agent в наш объект HTTPЗапрос.


Запрос = Новый HTTPЗапрос(АдресРесурса);
Запрос.Заголовки.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36");

Определение реального имени файла

Часто в URL отсутствует расширение и понятное имя файла (например, /download/319). Чтобы сохранить файл под его «настоящим» именем, которое передает сервер, нужно обратиться к заголовку Content-Disposition. Рассмотрим подробнее, как извлечь эти данные:

В заголовках ответа может содержаться строка вида attachment; filename="instruction.pdf". Нам нужно распарсить это значение и использовать его при сохранении файла на диск вместо случайного имени, сгенерированного функцией ПолучитьИмяВременногоФайла().

Использование системных объектов WinHTTP

В некоторых случаях встроенных средств 1С бывает недостаточно (например, при специфических настройках прокси или сложной аутентификации). Тогда мы можем воспользоваться объектом WinHttp.WinHttpRequest.5.1. Это системный COM-объект Windows, который имеет встроенную поддержку автоматического следования по редиректам.


WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
WinHttp.Open("GET", "https://web.se-ecatalog.ru/certificates/default/download/319", Ложь);
WinHttp.Option(6) = Истина; // Разрешить автоматическую переадресацию
WinHttp.Send();

Если WinHttp.Status = 200 Тогда
    // Получаем тело ответа как двоичные данные
    Данные = WinHttp.ResponseBody;
    // Далее сохраняем данные в файл через объект "ЗаписьДанных" или "ДвоичныеДанные"
КонецЕсли;

Заключение и рекомендации

Подведем итог. Для стабильной работы механизма скачивания файлов в 1С рекомендуем всегда использовать защищенное соединение (даже если сейчас сайт работает по HTTP, он может перейти на HTTPS в будущем). Обязательно проверяйте КодСостояния ответа. Если файл скачивается пустым или в формате HTML вместо PDF, проверьте заголовок Content-Type — возможно, сервер вернул страницу с ошибкой или форму авторизации вместо ожидаемых двоичных данных.

Используя предложенные методы, мы обеспечиваем надежное взаимодействие 1С с внешними веб-сервисами и корректную обработку динамического контента. При необходимости автоматизировать сложные сценарии работы с сайтами без прямого API можно применить платформу для создания программных роботов.

← На главную