В процессе разработки часто возникает задача автоматизации получения данных из внешних источников. Это может быть загрузка прайс-листа в формате Excel, получение курсов валют или классификаторов. Если в браузере файл скачивается простым переходом по ссылке, то в коде 1С начинающие разработчики часто сталкиваются с трудностями, получая ошибки вроде 404 Not Found или 403 Forbidden. Рассмотрим подробно, как правильно организовать процесс скачивания файла, разберем типичные ошибки и изучим наиболее эффективные методы реализации задачи.
Проанализируем ситуацию, описанную в обсуждении. Пользователь пытался использовать объект HTTPСоединение, указывая в качестве пути к файлу полную ссылку, включая протокол https:// и имя домена. Это главная причина возникновения ошибки 404.
Разберем по шагам, как правильно разделять адрес при создании объекта соединения и выполнении запроса:
zubr-rus.ru.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Соединение удобен, но иногда сайт требует передачи дополнительных заголовков. Например, сервер может блокировать запросы, если не указан 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), разработку можно значительно упростить. В БСП существует специальная подсистема ПолучениеФайловИзИнтернета. Использование готовых функций библиотеки избавляет от необходимости вручную настраивать прокси-серверы и обрабатывать ошибки соединения.
Выясним преимущества метода ПолучениеФайловИзИнтернета.СкачатьФайлНаСервере:
Пример использования БСП:
ПараметрыЗагрузки = ПолучениеФайловИзИнтернета.ПараметрыСкачиванияФайла();
ПараметрыЗагрузки.Заголовки.Вставить("User-Agent", "1C-Enterprise");
Результат = ПолучениеФайловИзИнтернета.СкачатьФайлНаСервере(URLФайла, ПараметрыЗагрузки);
Если Результат.Статус Тогда
ПутьКФайлу = Результат.ПутьКФайлу;
// Дальнейшая обработка файла
Иначе
Сообщить("Не удалось скачать: " + Результат.СообщениеОбОшибке);
КонецЕсли;
Разберем ситуацию, когда код выполняется НаСервере. В этом случае возникают ограничения прав доступа к файловой системе сервера:
Права доступа: Если вы указываете путь типа C:\test\test.txt, убедитесь, что у пользователя ОС, от имени которого запущен процесс ragent (обычно это USR1CV8), есть права на запись в этот каталог. По умолчанию прав на корень диска C у сервиса 1С нет.
Временные файлы: Рекомендуется не прописывать пути жестко, а использовать функцию ПолучитьИмяВременногоФайла(). Это гарантирует, что файл будет создан в разрешенной для записи папке и не возникнет конфликта имен при одновременной работе нескольких пользователей.
В исходном вопросе ссылка заканчивалась на /download/, то есть прямого расширения .xlsx в URL не было. Проанализируем, как система понимает, что это файл Excel. Сайт передает информацию о типе файла в HTTP-заголовке Content-Disposition. Если вам нужно узнать "оригинальное" имя файла, которое задумал сервер, необходимо прочитать этот заголовок из объекта HTTPОтвет.
Подводя итог, можно сказать, что для успешного скачивания файла в 1С необходимо четко разделять адрес сервера и путь к ресурсу, использовать защищенное соединение для протокола HTTPS и учитывать контекст исполнения кода (серверный или клиентский) при работе с файловой системой.