Как скачать файл с сайта средствами 1С:Предприятие 8.3

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

В процессе разработки часто возникает задача автоматизации получения данных из внешних источников. Это может быть загрузка прайс-листа в формате Excel, получение курсов валют или классификаторов. Если в браузере файл скачивается простым переходом по ссылке, то в коде 1С начинающие разработчики часто сталкиваются с трудностями, получая ошибки вроде 404 Not Found или 403 Forbidden. Рассмотрим подробно, как правильно организовать процесс скачивания файла, разберем типичные ошибки и изучим наиболее эффективные методы реализации задачи.

Разбор типичной ошибки: URL и ресурс

Проанализируем ситуацию, описанную в обсуждении. Пользователь пытался использовать объект HTTPСоединение, указывая в качестве пути к файлу полную ссылку, включая протокол https:// и имя домена. Это главная причина возникновения ошибки 404.

Разберем по шагам, как правильно разделять адрес при создании объекта соединения и выполнении запроса:

  1. Хост (Сервер): Это имя сайта без протокола (без "http://"). Например, zubr-rus.ru.
  2. Ресурс (Путь): Это все, что идет после имени домена. Если ссылка выглядит как https://zubr-rus.ru/mprices/3/download/, то ресурсом будет /mprices/3/download/.

Посмотрим на пример кода, который исправляет эту ошибку:


// Неправильно:
// ПустьКФайлуНаСервере = "https://zubr-rus.ru/mprices/3/download/";

// Правильно:
ПутьКРесурсу = "/mprices/3/download/";
Сервер = "zubr-rus.ru";

// Создаем защищенное соединение (для https)
Защита = Новый ЗащищенноеСоединениеOpenSSL();

// Инициализируем соединение
Соединение = Новый HTTPСоединение(Сервер, 443, , , , , Защита);

// Выполняем получение файла
Соединение.Получить(ПутьКРесурсу, "C:\temp\price.xlsx");

Использование HTTP-запроса для расширенной настройки

Метод Получить объекта HTTPСоединение удобен, но иногда сайт требует передачи дополнительных заголовков. Например, сервер может блокировать запросы, если не указан User-Agent (информация о браузере). В таких случаях проанализируем использование объекта HTTPЗапрос.

Рассмотрим более профессиональный подход к решению задачи:


&НаСервере
Процедура СкачатьФайлРасширенный(ИмяСайта, ПутьНаСайте, ПутьДляСохранения)
    
    Защита = Новый ЗащищенноеСоединениеOpenSSL();
    Соединение = Новый HTTPСоединение(ИмяСайта, 443, , , , , Защита);
    
    Запрос = Новый HTTPЗапрос(ПутьНаСайте);
    // Имитируем запрос от обычного браузера
    Запрос.Заголовки.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36");
    
    Попытка
        Ответ = Соединение.Получить(Запрос, ПутьДляСохранения);
        Если Ответ.КодСостояния = 200 Тогда
            Сообщить("Файл успешно загружен!");
        ИначеЕсли Ответ.КодСостояния = 301 ИЛИ Ответ.КодСостояния = 302 Тогда
            // Обработка редиректа
            НовыйАдрес = Ответ.Заголовки.Получить("Location");
            Сообщить("Файл перемещен. Новый адрес: " + НовыйАдрес);
        Иначе
            Сообщить("Ошибка при загрузке. Код: " + Ответ.КодСостояния);
        КонецЕсли;
    Исключение
        Сообщить("Ошибка связи: " + ОписаниеОшибки());
    КонецПопытки;
    
КонецПроцедуры

Почему КопироватьФайл не всегда подходит?

В обсуждении упоминался метод КопироватьФайл. Важно понимать, что этот метод предназначен в первую очередь для работы с файловой системой или простыми сетевыми ресурсами. Хотя он теоретически поддерживает HTTP, у него есть существенные минусы:

Поэтому для работы с веб-сайтами всегда рекомендуется использовать HTTPСоединение.

Использование Библиотеки Стандартных Подсистем (БСП)

Если ваша конфигурация построена на базе БСП (как большинство современных решений 1С:ERP, УТ 11, БП 3.0), разработку можно значительно упростить. В БСП существует специальная подсистема ПолучениеФайловИзИнтернета. Использование готовых функций библиотеки избавляет от необходимости вручную настраивать прокси-серверы и обрабатывать ошибки соединения.

Выясним преимущества метода ПолучениеФайловИзИнтернета.СкачатьФайлНаСервере:

  1. Автоматический прокси: Система сама возьмет настройки прокси-сервера, указанные администратором в параметрах системы.
  2. Безопасность: Корректная работа с сертификатами и защищенными протоколами "из коробки".
  3. Диагностика: Ошибки автоматически фиксируются в Журнале регистрации.

Пример использования БСП:


ПараметрыЗагрузки = ПолучениеФайловИзИнтернета.ПараметрыСкачиванияФайла();
ПараметрыЗагрузки.Заголовки.Вставить("User-Agent", "1C-Enterprise");

Результат = ПолучениеФайловИзИнтернета.СкачатьФайлНаСервере(URLФайла, ПараметрыЗагрузки);

Если Результат.Статус Тогда
    ПутьКФайлу = Результат.ПутьКФайлу;
    // Дальнейшая обработка файла
Иначе
    Сообщить("Не удалось скачать: " + Результат.СообщениеОбОшибке);
КонецЕсли;

Важные нюансы серверного исполнения

Разберем ситуацию, когда код выполняется НаСервере. В этом случае возникают ограничения прав доступа к файловой системе сервера:

Права доступа: Если вы указываете путь типа C:\test\test.txt, убедитесь, что у пользователя ОС, от имени которого запущен процесс ragent (обычно это USR1CV8), есть права на запись в этот каталог. По умолчанию прав на корень диска C у сервиса 1С нет.

Временные файлы: Рекомендуется не прописывать пути жестко, а использовать функцию ПолучитьИмяВременногоФайла(). Это гарантирует, что файл будет создан в разрешенной для записи папке и не возникнет конфликта имен при одновременной работе нескольких пользователей.

Особенности работы с именами файлов

В исходном вопросе ссылка заканчивалась на /download/, то есть прямого расширения .xlsx в URL не было. Проанализируем, как система понимает, что это файл Excel. Сайт передает информацию о типе файла в HTTP-заголовке Content-Disposition. Если вам нужно узнать "оригинальное" имя файла, которое задумал сервер, необходимо прочитать этот заголовок из объекта HTTPОтвет.

Подводя итог, можно сказать, что для успешного скачивания файла в 1С необходимо четко разделять адрес сервера и путь к ресурсу, использовать защищенное соединение для протокола HTTPS и учитывать контекст исполнения кода (серверный или клиентский) при работе с файловой системой.

← На главную