К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как получить файл по HTTP в 1С: пошаговая инструкция с примерами кода

Как получить файл по HTTP в 1С: HTTPСоединение, метод Получить, работа с прокси, SSL, сохранение во временный файл и обработка ошибок. Примеры кода на встроенном языке.

Задача скачать файл по HTTP возникает в 1С постоянно: загрузка курсов валют, получение прайсов поставщиков, обмен с веб-сервисами, скачивание обновлений и отчётов из внешних систем. Встроенный язык платформы предоставляет для этого объектную модель HTTP: HTTPСоединение, HTTPЗапрос и HTTPОтвет. Никаких внешних компонент и сторонних утилит не требуется — всё работает штатно на клиенте и на сервере.

Ключевой момент, который нужно понять сразу: в 1С есть два разных способа получения файла. Первый — метод Получить() объекта HTTPСоединение, который сразу сохраняет ответ сервера в файл на диске. Второй — получение ответа в виде строки или двоичных данных через HTTPЗапрос с последующей самостоятельной записью. Выбор зависит от размера файла, необходимости контроля заголовков и того, где выполняется код — на клиенте или на сервере.

Ниже разобраны оба подхода с рабочими примерами кода, настройка прокси и SSL, обработка ошибок и типичные проблемы: редиректы, авторизация, кодировки и ограничение размера ответа.

Базовый способ: HTTPСоединение и метод Получить

Самый простой вариант — создать соединение с сервером и вызвать метод Получить(), передав адрес ресурса и путь к файлу, куда сохранить результат. Платформа сама выполнит GET-запрос и запишет тело ответа на диск.

1c
Соединение = Новый HTTPСоединение("example.com", 80);
Соединение.Получить("/files/price.zip", "C:\Temp\price.zip");

Первый параметр конструктора — имя сервера без протокола (без «http://»), второй — порт. Если порт не указан, используется 80 для HTTP и 443 для HTTPS. Метод Получить() принимает адрес ресурса на сервере и имя выходного файла. Третьим необязательным параметром можно передать структуру заголовков запроса.

Важно понимать: метод не выбрасывает исключение при ответе сервера с кодом ошибки вроде 404. Если страница не найдена, сервер вернёт HTML с текстом ошибки — и этот HTML будет молча записан в ваш файл. Поэтому для надёжного кода лучше использовать вариант с HTTPЗапросом, где код ответа доступен для проверки.

Получение файла через HTTPЗапрос с контролем ответа

Более управляемый способ — сформировать объект HTTPЗапрос и выполнить его методом Получить() соединения. Тогда в переменной окажется объект HTTPОтвет, у которого можно прочитать код состояния, заголовки и тело.

1c
Соединение = Новый HTTPСоединение("example.com", 443,,,,, Новый ЗащищенноеСоединениеOpenSSL);
Запрос = Новый HTTPЗапрос("/files/report.xlsx");
Ответ = Соединение.Получить(Запрос, "C:\Temp\report.xlsx");
Если Ответ.КодСостояния <> 200 Тогда
    ВызватьИсключение "Ошибка загрузки, код " + Ответ.КодСостояния;
КонецЕсли;

Если файл нужен не на диске, а в памяти — например, чтобы передать его в хранилище значения или сразу обработать, — вызывайте Получить() без второго параметра и читайте тело ответа: Ответ.ПолучитьТелоКакДвоичныеДанные() для бинарных файлов или Ответ.ПолучитьТелоКакСтроку() для текстовых (XML, JSON, CSV).

Двоичные данные затем сохраняются стандартно: ДвоичныеДанные.Записать(ИмяФайла). Строку можно записать через объект ТекстовыйДокумент с явным указанием кодировки, что важно для CSV и XML от поставщиков.

HTTPS, авторизация и прокси

Для защищённого соединения в конструктор HTTPСоединение передаётся объект ЗащищенноеСоединениеOpenSSL. В простейшем виде достаточно создать его без параметров — платформа использует системные настройки проверки сертификатов. Если сервер использует самоподписанный сертификат, соединение завершится ошибкой проверки, и это корректное поведение: отключать проверку в продуктивном коде небезопасно.

Basic-авторизация задаётся параметрами конструктора: третий и четвёртый параметры — имя пользователя и пароль. Для прокси используется объект ИнтернетПрокси, который передаётся шестым параметром. У него можно задать сервер, порт, учётные данные прокси или включить использование системных настроек.

1c
Прокси = Новый ИнтернетПрокси(Истина);
Прокси.Установить("http", "proxy.local", 3128, "user", "pass");
Соединение = Новый HTTPСоединение("example.com", 443, "логин", "пароль", Прокси, 30, Новый ЗащищенноеСоединениеOpenSSL);

Сохранение файла: диск, временный файл или хранилище

Куда сохранять результат, зависит от контекста выполнения. В серверном коде каталог C:\Temp может быть недоступен или указывать на сервер, а не на компьютер пользователя. Универсальное решение — ПолучитьИмяВременногоФайла(): платформа создаст уникальное имя во временном каталоге текущего окружения, и файл гарантированно не перезапишет чужие данные.

Если файл нужно передать с сервера на клиент, используйте помещение во временное хранилище: ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайла), УникальныйИдентификаторФормы). На клиенте данные забираются по адресу хранилища. Для длительного хранения файл кладут в реквизит справочника типа «ХранилищеЗначения» — типовой механизм присоединенных файлов.

Порядок действий для серверной загрузки
  1. 1
    Сформируйте HTTPСоединение с нужным портом, SSL и при необходимости прокси
  2. 2
    Создайте HTTPЗапрос с адресом ресурса и нужными заголовками
  3. 3
    Получите имя временного файла через ПолучитьИмяВременногоФайла()
  4. 4
    Выполните Соединение.Получить(Запрос, ИмяФайла) внутри Попытка/Исключение
  5. 5
    Проверьте Ответ.КодСостояния — должно быть 200 (или 206 для частичной загрузки)
  6. 6
    Прочитайте файл как ДвоичныеДанные и поместите в хранилище или обработайте
  7. 7
    Удалите временный файл после использования

Обработка ошибок, таймауты и редиректы

Сетевые вызовы обязательно оборачиваются в Попытка ... Исключение: разрыв соединения, недоступность DNS и истёкший таймаут вызывают исключения, а не возвращают код ошибки. Таймаут задаётся пятым параметром конструктора HTTPСоединение в секундах — по умолчанию он отсутствует, и при «зависшем» сервере сеанс может ждать очень долго. Для интерактивных операций разумно 20–60 секунд, для фоновых загрузок — больше.

Отдельная ловушка — редиректы. Многие серверы отвечают кодом 301 или 302 и заголовком Location. Платформа 1С по умолчанию не следует перенаправлениям автоматически: вы получите ответ с кодом 302 и пустым или служебным телом. Решение — проверять коды 3xx, читать заголовок Ответ.Заголовки.Получить("Location") и выполнять повторный запрос по новому адресу, ограничив число итераций.

Типичные ошибки
01
Указание протокола в имени сервера: HTTPСоединение("https://site.ru") приводит к ошибке разрешения имени — протокол писать нельзя
02
Отсутствие проверки КодСостояния: в файл записывается HTML-страница ошибки, и сбой обнаруживается только при разборе данных
03
Игнорирование редиректов: получен код 302, а файл пустой
04
Не задан таймаут — фоновое задание висит часами при недоступном сервере
05
Запись в фиксированный путь на сервере: при параллельных вызовах сеансы перезаписывают файл друг друга

Альтернативы и ограничения

Если сервер отдаёт файл только через API с токеном, перед запросом файла потребуется отдельный запрос авторизации (обычно POST с получением токена), а сам токен передаётся в заголовке Authorization: Bearer ... через коллекцию заголовков HTTPЗапроса. Для обмена по FTP или SFTP объект HTTPСоединение не подходит — используются внешние компоненты или вызов системных утилит.

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

Сравнение вариантов получения файла

Соединение.Получить(адрес, имя файла)

Самый короткий код, запись сразу на диск. Нет доступа к коду состояния — подходит только для доверенных стабильных источников

HTTPЗапрос + проверка ответа

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

Получение тела как двоичных данных

Файл не касается диска, сразу помещается в хранилище. Ограничение — расход памяти на больших файлах

Проверка результата загрузки

После скачивания убедитесь, что получен именно файл, а не страница ошибки. Минимальный набор проверок: код состояния 200, размер файла больше нуля, при наличии заголовка Content-Length — совпадение размера. Для архивов и документов полезно проверить сигнатуру: ZIP начинается с байтов «PK», PDF — с «%PDF». Если поставщик отдаёт контрольную сумму, сверяйте хеш через объект ХешированиеДанных.

Контрольные точки

Как проверить результат

Код состояния ответа
Норма

200 (или 206 при докачке)

Тревожный признак

404, 500, 302 без обработки — файл не получен

Размер полученного файла
Норма

Больше нуля, совпадает с Content-Length

Тревожный признак

Нулевой размер или явно маленький файл

Содержимое файла
Норма

Сигнатура соответствует формату (PK для ZIP, %PDF для PDF)

Тревожный признак

Внутри HTML с текстом ошибки сервера

Частые вопросы

Как скачать файл по HTTPS, если сертификат самоподписанный?

Платформа отклонит такое соединение при стандартной проверке. Правильное решение — добавить сертификат в доверенные на уровне ОС или указать файл сертификатов удостоверяющих центров в параметрах ЗащищенноеСоединениеOpenSSL. Полное отключение проверки сертификата допустимо только на тестовых стендах.

Почему вместо файла скачивается пустой файл или HTML?

Чаще всего сервер вернул редирект (301/302) или страницу ошибки, а код её не проверял. Проверьте Ответ.КодСостояния и заголовок Location. Также причиной бывает неверный адрес ресурса: путь указывается от корня сервера, без домена.

Как передать заголовки, например токен авторизации?

У объекта HTTPЗапрос есть свойство Заголовки — это соответствие. Установите нужное значение: Запрос.Заголовки.Вставить("Authorization", "Bearer " + Токен). Заголовки можно передать и третьим параметром метода Получить() в простом варианте.

Можно ли скачивать файлы в фоновом задании?

Да, и это рекомендуемый подход для больших файлов: HTTPСоединение полностью работает на сервере в фоновом задании. Сформируйте параметры подключения, запустите задание через ДлительныеОперации или ФоновыеЗадания.Выполнить, а результат верните через временное хранилище.

Чем ограничен размер скачиваемого файла?

Жёсткого ограничения в платформе нет. Практические пределы — свободная память при чтении тела в переменную и таймауты соединения. Для больших файлов используйте запись напрямую в файл методом Получить() и увеличьте таймаут соединения.

Как скачать файл, если сервер требует авторизацию по логину и паролю?

Передайте логин и пароль третьим и четвёртым параметрами конструктора HTTPСоединение — платформа сформирует Basic-аутентификацию. Если сервер использует форму входа или OAuth, потребуется предварительный запрос за токеном и передача его в заголовках.

Итог

Что важно запомнить

Используйте HTTPСоединение с HTTPЗапросом, всегда проверяйте КодСостояния, задавайте таймаут и обрабатывайте редиректы. Для HTTPS подключайте ЗащищенноеСоединениеOpenSSL, пароли храните вне кода, а временные файлы удаляйте после обработки.