В процессе разработки часто возникает необходимость автоматизировать получение данных из внешних источников. Одной из типичных задач является программное скачивание файлов (сертификатов, прайс-листов, изображений) с веб-сайтов. В этой статье мы подробно разберем, как реализовать этот механизм в 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-запроса: " + ОписаниеОшибки());
КонецПопытки;
Иногда при попытке скачать файл сервер возвращает коды состояния 301 (Moved Permanently), 302 (Found) или 307/308. Это означает, что файл перемещен, и нам нужно выполнить повторный запрос по новому адресу. Выясним причину, почему стандартное соединение не всегда срабатывает автоматически.
Платформа 1С не всегда прозрачно следует по цепочке редиректов. Если вы получили КодСостояния в диапазоне 3xx, необходимо вручную извлечь новый адрес. Проанализируем, как это сделать:
Location.Location относительный (начинается с "/"), конструируем полный URL, используя текущий домен сервера.HTTPСоединение для нового домена.Пример обработки заголовка Location:
НовыйАдрес = Ответ.Заголовки.Получить("Location");
Если НовыйАдрес <> Неопределено Тогда
// Здесь логика повторного запроса по адресу НовыйАдрес
Сообщить("Файл перемещен по адресу: " + НовыйАдрес);
КонецЕсли;
Многие современные веб-серверы настроены на блокировку запросов от «роботов» или неизвестных клиентов. Если ваше 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". Нам нужно распарсить это значение и использовать его при сохранении файла на диск вместо случайного имени, сгенерированного функцией ПолучитьИмяВременногоФайла().
В некоторых случаях встроенных средств 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 можно применить платформу для создания программных роботов.