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

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

Как получить файл по ссылке в 1С

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

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

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

Важно понимать архитектурный момент: код, выполняемый на сервере 1С, скачивает файл на диск сервера, а не на компьютер пользователя. Если файл нужен пользователю локально, после загрузки на сервер его передают на клиент через временное хранилище или методы работы с файлами. Это частая причина «пропадающих» файлов у начинающих разработчиков.

Какие способы загрузки файла по ссылке существуют в 1С

Платформа и типовые библиотеки предлагают несколько вариантов. У каждого своя область применения, и смешивать их без необходимости не стоит.

Сравнение вариантов

HTTPСоединение + метод Получить

Универсальный способ для сервера и толстого клиента. Полный контроль над запросом, заголовками и авторизацией. Требует написания кода.

НачатьПолучениеФайлаССервера

Клиентский метод для передачи уже скачанного файла пользователю. Сам по ссылке из интернета не ходит — работает в паре с серверной загрузкой.

ПолучениеФайловИзИнтернет (БСП)

Готовая функция из Библиотеки стандартных подсистем. Учитывает настройки прокси из 1С, возвращает структуру с результатом. Подходит, если конфигурация на БСП.

ПолучитьФайлИзИнтернета (устаревшие механизмы)

Встречается в старых конфигурациях. Для новых разработок лучше использовать HTTPСоединение напрямую.

Если конфигурация построена на БСП (УТ, ERP, БП и другие типовые), разумнее всего использовать её механизмы — они уже учитывают прокси-сервер, заданный администратором в настройках программы. Для самописных решений или внешних обработок проще и прозрачнее работать с HTTPСоединение напрямую.

Загрузка файла через HTTPСоединение: базовый пример

Классическая схема состоит из четырёх шагов: разобрать URL, создать соединение, сформировать запрос, выполнить метод Получить() с указанием пути для сохранения файла. Метод Получить с параметром «ИмяВыходногоФайла» пишет тело ответа сразу на диск, не загружая его целиком в память как строку — это важно для больших файлов.

Процедура СкачатьФайлПоСсылке(АдресСервера, ПутьНаСервере, ИмяФайла)

Соединение = Новый HTTPСоединение(АдресСервера, 80);

Запрос = Новый HTTPЗапрос(ПутьНаСервере);

Ответ = Соединение.Получить(Запрос, ИмяФайла);

Если Ответ.КодСостояния = 200 Тогда

Сообщить("Файл сохранён: " + ИмяФайла);

Иначе

ВызватьИсключение "Ошибка загрузки, код: " + Ответ.КодСостояния;

КонецЕсли;

КонецПроцедуры

Обратите внимание: URL вида http://example.com/files/price.xlsx нужно разбить на две части — адрес сервера (example.com) передаётся в конструктор соединения, а путь ресурса (/files/price.xlsx) — в HTTPЗапрос. Передавать полный URL целиком в конструктор нельзя, это одна из самых частых ошибок.

Код состояния проверять обязательно. Сервер может вернуть 404 (файл не найден), 301/302 (перенаправление), 403 (доступ запрещён) — и в выходной файл при этом запишется HTML-страница ошибки. Если не проверить КодСостояния, программа «успешно» сохранит мусор вместо данных.

Разбор URL и работа с HTTPS

Большинство современных ресурсов работают по HTTPS, и для них обычного соединения недостаточно — нужен объект ЗащищенноеСоединениеOpenSSL и порт 443. Попытка обратиться к HTTPS-ресурсу через обычное соединение на 80 порт часто приводит к редиректу или ошибке.

ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(

Новый СертификатКлиентаWindows(),

Новый СертификатыУдостоверяющихЦентровWindows());

Соединение = Новый HTTPСоединение("example.com", 443, , , , 60,

ЗащищенноеСоединение);

Для разбора произвольной ссылки удобно написать небольшую функцию, определяющую протокол, хост и путь. Платформа не содержит встроенного «парсера URL» в явном виде, поэтому в типовых конфигурациях есть свои аналоги (например, функции работы со строками в общих модулях БСП).

Авторизация, заголовки и таймауты

Многие ссылки требуют авторизации: базовая HTTP-аутентификация, токен в заголовке или cookie. Базовая авторизация задаётся параметрами конструктора HTTPСоединение (логин и пароль — третий и четвёртый параметры). Токены передаются через заголовки запроса.

Запрос = Новый HTTPЗапрос("/api/files/123");

Запрос.Заголовки.Вставить("Authorization", "Bearer " + Токен);

Запрос.Заголовки.Вставить("User-Agent", "1C-Enterprise");

Ответ = Соединение.Получить(Запрос, ИмяФайла);

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

Порядок действий для загрузки по ссылке
  1. 1
    Разберите URL: определите протокол (http/https), хост и путь к ресурсу.
  2. 2
    Создайте HTTPСоединение с нужным портом; для HTTPS добавьте ЗащищенноеСоединениеOpenSSL.
  3. 3
    Сформируйте HTTPЗапрос, добавьте заголовки авторизации, если они требуются.
  4. 4
    Вызовите метод Получить() с указанием пути для сохранения файла.
  5. 5
    Проверьте КодСостояния ответа — продолжайте обработку только при 200.
  6. 6
    Проверьте, что файл существует и его размер больше нуля.

Передача скачанного файла пользователю

Когда загрузка выполняется на сервере, файл оказывается во временном каталоге сервера. Чтобы отдать его пользователю, типовой подход такой: поместить файл во временное хранилище как двоичные данные, передать адрес хранилища на клиент и там вызвать ПолучитьФайл или НачатьПолучениеФайла.

// Серверная процедура

ДвоичныеДанные = Новый ДвоичныеДанные(ИмяФайлаНаСервере);

АдресХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификаторФормы);

// Клиентская процедура

ПолучитьФайл(АдресХранилища, "price.xlsx", Истина);

Альтернатива — метод НачатьПолучениеФайлаССервера, который в современных версиях платформы работает асинхронно и не требует модальных вызовов, что важно для веб-клиента. Учтите, что во временном хранилище данные живут ограниченное время (обычно до конца жизни формы или сеанса), поэтому передавать файл нужно сразу после загрузки.

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

Обработка ошибок и типичные проблемы

Работа с сетью непредсказуема: сервер может быть недоступен, DNS — не резолвить имя, TLS-сертификат — оказаться просроченным. Весь код обращения по сети следует оборачивать в попытку/исключение и журналировать текст ошибки, иначе диагностика в регламентных заданиях превратится в гадание.

Типичные ошибки
01
Передача полного URL в конструктор HTTPСоединение — соединение создаётся с некорректным хостом и падает с ошибкой.
02
Отсутствие проверки КодСостояния — в файл сохраняется HTML-страница ошибки 404 или редиректа.
03
Игнорирование редиректов (301/302) — сервер отдаёт перенаправление, а код не следует по новому адресу из заголовка Location.
04
Отсутствие таймаута — сеанс зависает при недоступном сервере, блокируя регламентные задания.
05
Поиск скачанного файла на клиенте, хотя код выполнялся на сервере, — файл физически находится на диске сервера.

Отдельного внимания заслуживает прокси. Если сервер 1С выходит в интернет через корпоративный прокси, параметры прокси нужно передать в конструктор HTTPСоединение (объект ИнтернетПрокси) или использовать настройки из БСП. Симптом проблемы с прокси — таймауты и ошибки соединения при том, что ссылка в браузере открывается нормально.

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

После сохранения файла убедитесь, что он действительно содержит ожидаемые данные, а не страницу ошибки или пустышку. Минимальный набор проверок: существование файла, ненулевой размер, соответствие формата (например, XLSX начинается с сигнатуры ZIP, XML — с объявления XML).

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

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

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

200 (или 206 для частичного контента)

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

404, 403, 500 — файл не загружен, анализировать ответ сервера

Размер файла на диске
Норма

Больше нуля и сопоставим с ожидаемым

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

0 байт или несколько килобайт при ожидаемых мегабайтах

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

Сигнатура соответствует формату (PK для xlsx/zip, <?xml для XML)

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

HTML-разметка — сохранена страница ошибки или редиректа

Повторная загрузка
Норма

Файл стабильно скачивается при повторном запуске

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

Периодические таймауты — проблемы с сетью или прокси

Если файл открывается в 1С дальше (например, загружается табличный документ или разбирается XML), оборачивайте и этот этап в попытку — повреждённый или усечённый файл вызовет ошибку формата, которую нужно отличить от ошибки сети.

FAQ

Можно ли скачать файл по ссылке без программирования, штатными средствами?

В некоторых типовых конфигурациях есть готовые механизмы: загрузка курсов валют, обновление классификаторов, обмен с сайтом. Но универсальной кнопки «скачать по произвольной ссылке» в платформе нет — для произвольных URL нужен код на встроенном языке или внешняя обработка.

Почему код работает в файловой базе, но не работает в клиент-серверной?

В клиент-серверном варианте серверный код выполняется на сервере 1С, у которого может не быть доступа в интернет, других настроек прокси или нужных сертификатов. Проверьте выход в интернет именно с сервера и права учётной записи службы агента 1С.

Как скачать файл, если ссылка требует cookies или сессии?

Сначала выполните запрос авторизации (обычно POST с логином и паролем), получите cookie из заголовка Set-Cookie ответа и передавайте их в заголовке Cookie последующих запросов через то же HTTPСоединение.

Что делать с редиректами 301/302?

Платформа автоматически не следует перенаправлениям. При получении кода 301, 302, 303 или 307 прочитайте заголовок Location из ответа и выполните новый запрос по указанному адресу. Ограничьте число переходов (например, пятью), чтобы не попасть в циклический редирект.

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

До загрузки можно выполнить HEAD-запрос и посмотреть заголовок Content-Length. Если сервер его не отдаёт, контролируйте размер файла на диске после загрузки и удаляйте файл, превышающий допустимый порог.

Код выдаёт ошибку сертификата при HTTPS. Как исправить правильно?

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

Итог

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

Файл по ссылке в 1С скачивается через HTTPСоединение и метод Получить() с указанием выходного файла. Разделяйте URL на хост и путь, используйте ЗащищенноеСоединениеOpenSSL для HTTPS, всегда проверяйте код состояния и размер результата, задавайте таймаут и помните: серверный код сохраняет файл на сервере, а не у пользователя.