Разработка и Конфигурация · 10 мин
Как получить файл по HTTP в 1С: пошаговая инструкция с примерами кода
Как получить файл по HTTP в 1С: HTTPСоединение, метод Получить, работа с прокси, SSL, сохранение во временный файл и обработка ошибок. Примеры кода на встроенном языке.
Задача скачать файл по HTTP возникает в 1С постоянно: загрузка курсов валют, получение прайсов поставщиков, обмен с веб-сервисами, скачивание обновлений и отчётов из внешних систем. Встроенный язык платформы предоставляет для этого объектную модель HTTP: HTTPСоединение, HTTPЗапрос и HTTPОтвет. Никаких внешних компонент и сторонних утилит не требуется — всё работает штатно на клиенте и на сервере.
Ключевой момент, который нужно понять сразу: в 1С есть два разных способа получения файла. Первый — метод Получить() объекта HTTPСоединение, который сразу сохраняет ответ сервера в файл на диске. Второй — получение ответа в виде строки или двоичных данных через HTTPЗапрос с последующей самостоятельной записью. Выбор зависит от размера файла, необходимости контроля заголовков и того, где выполняется код — на клиенте или на сервере.
Ниже разобраны оба подхода с рабочими примерами кода, настройка прокси и SSL, обработка ошибок и типичные проблемы: редиректы, авторизация, кодировки и ограничение размера ответа.
Базовый способ: HTTPСоединение и метод Получить
Самый простой вариант — создать соединение с сервером и вызвать метод Получить(), передав адрес ресурса и путь к файлу, куда сохранить результат. Платформа сама выполнит GET-запрос и запишет тело ответа на диск.
Соединение = Новый HTTPСоединение("example.com", 80);
Соединение.Получить("/files/price.zip", "C:\Temp\price.zip");Первый параметр конструктора — имя сервера без протокола (без «http://»), второй — порт. Если порт не указан, используется 80 для HTTP и 443 для HTTPS. Метод Получить() принимает адрес ресурса на сервере и имя выходного файла. Третьим необязательным параметром можно передать структуру заголовков запроса.
Важно понимать: метод не выбрасывает исключение при ответе сервера с кодом ошибки вроде 404. Если страница не найдена, сервер вернёт HTML с текстом ошибки — и этот HTML будет молча записан в ваш файл. Поэтому для надёжного кода лучше использовать вариант с HTTPЗапросом, где код ответа доступен для проверки.
Получение файла через HTTPЗапрос с контролем ответа
Более управляемый способ — сформировать объект HTTPЗапрос и выполнить его методом Получить() соединения. Тогда в переменной окажется объект HTTPОтвет, у которого можно прочитать код состояния, заголовки и тело.
Соединение = Новый HTTPСоединение("example.com", 443,,,,, Новый ЗащищенноеСоединениеOpenSSL);
Запрос = Новый HTTPЗапрос("/files/report.xlsx");
Ответ = Соединение.Получить(Запрос, "C:\Temp\report.xlsx");
Если Ответ.КодСостояния <> 200 Тогда
ВызватьИсключение "Ошибка загрузки, код " + Ответ.КодСостояния;
КонецЕсли;Если файл нужен не на диске, а в памяти — например, чтобы передать его в хранилище значения или сразу обработать, — вызывайте Получить() без второго параметра и читайте тело ответа: Ответ.ПолучитьТелоКакДвоичныеДанные() для бинарных файлов или Ответ.ПолучитьТелоКакСтроку() для текстовых (XML, JSON, CSV).
Двоичные данные затем сохраняются стандартно: ДвоичныеДанные.Записать(ИмяФайла). Строку можно записать через объект ТекстовыйДокумент с явным указанием кодировки, что важно для CSV и XML от поставщиков.
HTTPS, авторизация и прокси
Для защищённого соединения в конструктор HTTPСоединение передаётся объект ЗащищенноеСоединениеOpenSSL. В простейшем виде достаточно создать его без параметров — платформа использует системные настройки проверки сертификатов. Если сервер использует самоподписанный сертификат, соединение завершится ошибкой проверки, и это корректное поведение: отключать проверку в продуктивном коде небезопасно.
Basic-авторизация задаётся параметрами конструктора: третий и четвёртый параметры — имя пользователя и пароль. Для прокси используется объект ИнтернетПрокси, который передаётся шестым параметром. У него можно задать сервер, порт, учётные данные прокси или включить использование системных настроек.
Прокси = Новый ИнтернетПрокси(Истина);
Прокси.Установить("http", "proxy.local", 3128, "user", "pass");
Соединение = Новый HTTPСоединение("example.com", 443, "логин", "пароль", Прокси, 30, Новый ЗащищенноеСоединениеOpenSSL);Сохранение файла: диск, временный файл или хранилище
Куда сохранять результат, зависит от контекста выполнения. В серверном коде каталог C:\Temp может быть недоступен или указывать на сервер, а не на компьютер пользователя. Универсальное решение — ПолучитьИмяВременногоФайла(): платформа создаст уникальное имя во временном каталоге текущего окружения, и файл гарантированно не перезапишет чужие данные.
Если файл нужно передать с сервера на клиент, используйте помещение во временное хранилище: ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайла), УникальныйИдентификаторФормы). На клиенте данные забираются по адресу хранилища. Для длительного хранения файл кладут в реквизит справочника типа «ХранилищеЗначения» — типовой механизм присоединенных файлов.
- 1Сформируйте HTTPСоединение с нужным портом, SSL и при необходимости прокси
- 2Создайте HTTPЗапрос с адресом ресурса и нужными заголовками
- 3Получите имя временного файла через ПолучитьИмяВременногоФайла()
- 4Выполните Соединение.Получить(Запрос, ИмяФайла) внутри Попытка/Исключение
- 5Проверьте Ответ.КодСостояния — должно быть 200 (или 206 для частичной загрузки)
- 6Прочитайте файл как ДвоичныеДанные и поместите в хранилище или обработайте
- 7Удалите временный файл после использования
Обработка ошибок, таймауты и редиректы
Сетевые вызовы обязательно оборачиваются в Попытка ... Исключение: разрыв соединения, недоступность DNS и истёкший таймаут вызывают исключения, а не возвращают код ошибки. Таймаут задаётся пятым параметром конструктора HTTPСоединение в секундах — по умолчанию он отсутствует, и при «зависшем» сервере сеанс может ждать очень долго. Для интерактивных операций разумно 20–60 секунд, для фоновых загрузок — больше.
Отдельная ловушка — редиректы. Многие серверы отвечают кодом 301 или 302 и заголовком Location. Платформа 1С по умолчанию не следует перенаправлениям автоматически: вы получите ответ с кодом 302 и пустым или служебным телом. Решение — проверять коды 3xx, читать заголовок Ответ.Заголовки.Получить("Location") и выполнять повторный запрос по новому адресу, ограничив число итераций.
Альтернативы и ограничения
Если сервер отдаёт файл только через API с токеном, перед запросом файла потребуется отдельный запрос авторизации (обычно POST с получением токена), а сам токен передаётся в заголовке Authorization: Bearer ... через коллекцию заголовков HTTPЗапроса. Для обмена по FTP или SFTP объект HTTPСоединение не подходит — используются внешние компоненты или вызов системных утилит.
Ограничения, о которых стоит помнить: очень большие файлы при чтении тела в память могут привести к перерасходу памяти сервера — для них предпочтителен метод Получить() с записью сразу в файл. В веб-клиенте прямая запись на диск недоступна, там работа идёт только через временное хранилище и диалоги сохранения. Также учитывайте, что на сервере 1С под Linux пути и разделители каталогов отличаются — используйте кроссплатформенные механизмы работы с файлами.
Сравнение вариантов получения файла
Самый короткий код, запись сразу на диск. Нет доступа к коду состояния — подходит только для доверенных стабильных источников
Полный контроль: код состояния, заголовки, редиректы, тело в памяти или в файл. Рекомендуемый вариант для продуктивного кода
Файл не касается диска, сразу помещается в хранилище. Ограничение — расход памяти на больших файлах
Проверка результата загрузки
После скачивания убедитесь, что получен именно файл, а не страница ошибки. Минимальный набор проверок: код состояния 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, пароли храните вне кода, а временные файлы удаляйте после обработки.