Разработка и Конфигурация · 11 мин
Как в 1С скачать файл по ссылке
Как в 1С скачать файл по ссылке: HTTPСоединение, ПолучитьФайлССервера, обработка ошибок, HTTPS, прокси и типичные ошибки. Примеры кода на встроенном языке.
Задача скачать файл по ссылке возникает в 1С регулярно: загрузить курсы валют, получить изображение номенклатуры с сайта поставщика, забрать отчёт из веб-сервиса или выгрузку из облачного хранилища. Во встроенном языке платформы для этого есть два основных подхода — объект HTTPСоединение с запросом HTTPЗапрос и более простой метод ПолучитьФайлССервера из библиотеки сетевых функций.
Выбор зависит от ситуации: если нужно просто забрать файл по прямой ссылке без авторизации и особых заголовков, достаточно нескольких строк кода. Если же сервер требует авторизацию, работу через прокси, передачу заголовков или обработку редиректов — понадобится полноценное HTTP-соединение с настройкой параметров.
Ниже разобраны оба способа с готовыми примерами кода, обработкой ошибок, особенностями HTTPS и типичными проблемами, с которыми сталкиваются разработчики и администраторы при загрузке файлов из 1С.
Какой способ выбрать для загрузки файла
В платформе 1С:Предприятие 8.3 есть два рабочих механизма загрузки файлов по URL. Первый — связка HTTPСоединение + HTTPЗапрос: универсальный вариант, который даёт полный контроль над запросом. Второй — метод ПолучитьФайлССервера (в типовых конфигурациях на базе БСП есть также функция ПолучитьФайлИзИнтернета), который скрывает детали, но подходит только для простых сценариев.
Критерии выбора простые. Если ссылка ведёт на публичный файл без авторизации и редиректов — достаточно простого метода. Если нужно передать токен в заголовке, работать с API, обработать перенаправления или скачать файл через прокси с авторизацией — используйте HTTPСоединение.
Сравнение вариантов
Полный контроль: заголовки, авторизация, прокси, таймауты. Требует больше кода и ручной обработки ошибок.
Минимум кода для простых ссылок. Не подходит для авторизации, нестандартных заголовков и тонкой настройки.
Готовая функция с обработкой ошибок и прокси в типовых конфигурациях. Доступна только в решениях на базе Библиотеки стандартных подсистем.
Скачивание файла через HTTPСоединение
Основной и самый гибкий способ. Идея: создаём соединение с сервером, формируем GET-запрос к нужному ресурсу и сохраняем ответ напрямую в файл на диске. Платформа сама запишет тело ответа в указанный путь, что удобно для больших файлов.
Пример кода для обычного HTTP:
АдресСервера = "example.com";
ПутьНаСервере = "/files/price.csv";
ИмяФайла = "C:\Temp\price.csv";
Соединение = Новый HTTPСоединение(АдресСервера, 80);
Запрос = Новый HTTPЗапрос(ПутьНаСервере);
Попытка
Ответ = Соединение.Получить(Запрос, ИмяФайла);
Если Ответ.КодСостояния = 200 Тогда
Сообщить("Файл загружен: " + ИмяФайла);
Иначе
Сообщить("Ошибка сервера: " + Ответ.КодСостояния);
КонецЕсли;
Исключение
Сообщить("Ошибка загрузки: " + ОписаниеОшибки());
КонецПопытки;
Обратите внимание: адрес сервера указывается без протокола и без пути — только домен. Путь к файлу передаётся отдельно в HTTPЗапрос. Это частая ошибка новичков: они передают полный URL в конструктор соединения и получают ошибку разбора адреса.
- 1Разберите ссылку: выделите протокол, домен и путь к файлу
- 2Создайте HTTPСоединение с указанием домена и порта (80 для HTTP, 443 для HTTPS)
- 3Сформируйте HTTPЗапрос с путём к файлу на сервере
- 4Вызовите метод Получить, передав запрос и путь для сохранения файла
- 5Проверьте код ответа 200 и наличие файла на диске
Загрузка по HTTPS с защищённым соединением
Большинство современных серверов работают только по HTTPS, и это меняет код: в конструктор HTTPСоединения нужно передать объект защищённого соединения. Без него попытка обратиться к 443 порту завершится ошибкой.
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение(
"example.com", // сервер
443, // порт
, // пользователь (не задан)
, // пароль (не задан)
, // прокси (не задан)
30, // таймаут в секундах
ЗащищенноеСоединение
);
Конструктор ЗащищенноеСоединениеOpenSSL без параметров использует системное хранилище сертификатов. Если сервер использует самоподписанный сертификат (часто встречается на внутренних корпоративных ресурсах), потребуется указать сертификат клиента или файл доверенных сертификатов — иначе соединение будет отклонено.
Авторизация, заголовки и прокси
Если ресурс требует авторизацию, есть два варианта. Базовая авторизация (логин и пароль) передаётся прямо в конструктор HTTPСоединения — третьим и четвёртым параметрами. Токен или API-ключ обычно передаётся в заголовке запроса:
Запрос = Новый HTTPЗапрос(ПутьНаСервере);
Запрос.Заголовки.Вставить("Authorization", "Bearer " + Токен);
Запрос.Заголовки.Вставить("Accept", "application/octet-stream");
Для работы через корпоративный прокси создаётся объект ИнтернетПрокси и передаётся в соединение. В типовых конфигурациях настройки прокси обычно уже хранятся в базе, и их можно получить через функциональность БСП.
Отдельный момент — редиректы. Если сервер отвечает кодом 301 или 302, платформа не всегда переходит по новому адресу автоматически. Проверяйте код состояния и при необходимости извлекайте новый адрес из заголовка Location, затем повторяйте запрос по нему.
Простой способ: ПолучитьФайлССервера
Для разовой загрузки публичного файла код можно сократить. В типовых конфигурациях на базе БСП есть функция ПолучитьФайлИзИнтернета, которая принимает полный URL, параметры прокси и возвращает структуру с результатом: статус успеха, путь к файлу или текст ошибки. Она сама обрабатывает HTTPS и редиректы.
Преимущество — минимум кода и встроенная диагностика. Недостаток — меньше гибкости: нестандартные заголовки и специфическую авторизацию через неё реализовать сложнее. Для задач вроде «скачать прайс по прямой ссылке» это оптимальный вариант.
В самописных конфигурациях без БСП аналогичную обёртку имеет смысл написать самостоятельно один раз и использовать во всех механизмах обмена — это упростит поддержку кода.
Перед сохранением файла формируйте имя через КаталогВременныхФайлов() и уникальный идентификатор. Это исключает конфликты при параллельных загрузках и не засоряет рабочие каталоги. После обработки временный файл удаляйте явно.
Проверка результата и обработка ошибок
Успешное выполнение метода Получить ещё не гарантирует, что вы получили нужный файл. Минимальный набор проверок: код состояния 200, файл существует на диске, его размер больше нуля и соответствует ожиданиям. Для критичных загрузок полезно сверять размер с заголовком Content-Length или контрольную сумму, если сервер её предоставляет.
Коды ответа стоит обрабатывать раздельно: 401 и 403 означают проблему с доступом, 404 — файл не найден, 5xx — сбой на стороне сервера, при котором имеет смысл повторить попытку позже. Любую ошибку фиксируйте в журнале регистрации с указанием URL — это сильно упрощает разбор инцидентов.
Как проверить результат
200 (или 206 для частичной загрузки)
4xx/5xx — файл не загружен, разбираться с доступом или сервером
Больше нуля, совпадает с Content-Length
Нулевой размер или расхождение с заголовком
Открывается ожидаемой программой, структура корректна
Внутри HTML с текстом ошибки вместо данных
Нет записей об исключениях за время загрузки
Ошибки таймаута, сертификата или разрыва соединения
Типичные ошибки и ограничения
Большинство проблем при загрузке файлов в 1С сводится к нескольким повторяющимся причинам. Их знание экономит часы отладки.
Отдельно стоит упомянуть ограничения. Код, выполняемый на клиенте, скачивает файл на клиентский компьютер, а код на сервере — на сервер 1С. В файловой базе разницы нет, а в клиент-серверном варианте путь должен быть доступен именно с сервера. Для передачи файла с сервера на клиент используется механизм помещения файлов (ПоместитьФайл / НачатьПомещениеФайла).
Также учитывайте права: учётная запись, под которой работает агент сервера 1С, должна иметь доступ к каталогу сохранения и разрешение на исходящие соединения. Брандмауэр и антивирус на сервере нередко блокируют такие запросы — при «необъяснимых» ошибках соединения проверяйте их в первую очередь.
Частые вопросы
Как скачать файл, если в ссылке есть кириллица или пробелы?
Закодируйте путь функцией КодироватьСтроку(Путь, СпособКодированияСтроки.КодировкаURL) перед передачей в HTTPЗапрос. Домен при этом кодировать не нужно — только путь и параметры запроса.
Можно ли скачать файл в фоновом задании?
Да, HTTPСоединение работает в фоновых заданиях на сервере без ограничений. Это рекомендуемый подход для больших файлов и регламентных загрузок, чтобы не блокировать сеанс пользователя. Файл сохраняйте на сервере и передавайте результат через временное хранилище.
Что делать, если сервер отдаёт файл только после нажатия кнопки на странице?
Такая ссылка обычно формируется скриптом, и прямой GET-запрос не сработает. Изучите через инструменты разработчика в браузере, какой реальный запрос отправляется при скачивании, и воспроизведите его из 1С, включая нужные заголовки и, возможно, cookies.
Как скачать большой файл, не загружая его целиком в память?
Метод Получить с указанием имени файла записывает ответ сразу на диск, минуя память, — этого достаточно для большинства случаев. Если сервер поддерживает докачку, можно использовать заголовок Range для загрузки по частям.
Почему загрузка работает из браузера, но не из 1С?
Чаще всего причины: серверу нужны cookies или конкретный User-Agent, срабатывает редирект, который 1С не обрабатывает, либо корпоративный прокси/брандмауэр блокирует запросы от 1С. Сравните запросы через инструменты разработчика браузера и добавьте недостающие заголовки.
Где хранить скачанные файлы в типовой конфигурации?
Для долговременного хранения используйте механизм присоединенных файлов (справочники присоединённых файлов объектов), а не папки на диске. Временные файлы после обработки удаляйте, чтобы не переполнять каталоги сервера.
Что важно запомнить
Для загрузки файла по ссылке в 1С используйте HTTPСоединение с методом Получить, для HTTPS добавляйте ЗащищенноеСоединениеOpenSSL. Разделяйте домен и путь, задавайте таймаут, проверяйте код ответа 200 и размер файла. Ошибки фиксируйте в журнале регистрации, а временные файлы удаляйте после обработки.