Разработка и Конфигурация · 11 мин
Как получить файл по ссылке в 1С
Как скачать файл по ссылке в 1С: HTTPСоединение, Получить, защищённое соединение, обработка ошибок и сохранение результата. Примеры кода на встроенном языке.
Задача скачать файл по ссылке возникает в 1С постоянно: загрузка курсов валют, прайсов поставщиков, картинок номенклатуры, ответов REST API, обновлений классификаторов. Во встроенном языке для этого есть несколько механизмов, и выбор зависит от того, где выполняется код (клиент или сервер), какой протокол используется (HTTP или HTTPS) и нужна ли авторизация.
Основной инструмент — объект HTTPСоединение совместно с объектами HTTPЗапрос и HTTPОтвет. Он универсален: позволяет задать заголовки, логин и пароль, таймаут, прокси и получить ответ как в виде файла на диске, так и в виде строки или двоичных данных. Для защищённых соединений дополнительно создаётся объект ЗащищенноеСоединениеOpenSSL.
Важно понимать архитектурный момент: код, выполняемый на сервере 1С, скачивает файл на диск сервера, а не на компьютер пользователя. Если файл нужен пользователю локально, после загрузки на сервер его передают на клиент через временное хранилище или методы работы с файлами. Это частая причина «пропадающих» файлов у начинающих разработчиков.
Какие способы загрузки файла по ссылке существуют в 1С
Платформа и типовые библиотеки предлагают несколько вариантов. У каждого своя область применения, и смешивать их без необходимости не стоит.
Сравнение вариантов
Универсальный способ для сервера и толстого клиента. Полный контроль над запросом, заголовками и авторизацией. Требует написания кода.
Клиентский метод для передачи уже скачанного файла пользователю. Сам по ссылке из интернета не ходит — работает в паре с серверной загрузкой.
Готовая функция из Библиотеки стандартных подсистем. Учитывает настройки прокси из 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Разберите URL: определите протокол (http/https), хост и путь к ресурсу.
- 2Создайте HTTPСоединение с нужным портом; для HTTPS добавьте ЗащищенноеСоединениеOpenSSL.
- 3Сформируйте HTTPЗапрос, добавьте заголовки авторизации, если они требуются.
- 4Вызовите метод Получить() с указанием пути для сохранения файла.
- 5Проверьте КодСостояния ответа — продолжайте обработку только при 200.
- 6Проверьте, что файл существует и его размер больше нуля.
Передача скачанного файла пользователю
Когда загрузка выполняется на сервере, файл оказывается во временном каталоге сервера. Чтобы отдать его пользователю, типовой подход такой: поместить файл во временное хранилище как двоичные данные, передать адрес хранилища на клиент и там вызвать ПолучитьФайл или НачатьПолучениеФайла.
// Серверная процедура
ДвоичныеДанные = Новый ДвоичныеДанные(ИмяФайлаНаСервере);
АдресХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификаторФормы);
// Клиентская процедура
ПолучитьФайл(АдресХранилища, "price.xlsx", Истина);
Альтернатива — метод НачатьПолучениеФайлаССервера, который в современных версиях платформы работает асинхронно и не требует модальных вызовов, что важно для веб-клиента. Учтите, что во временном хранилище данные живут ограниченное время (обычно до конца жизни формы или сеанса), поэтому передавать файл нужно сразу после загрузки.
Для больших файлов не читайте ответ методом ПолучитьТелоКакСтроку() — весь файл загрузится в оперативную память сервера. Всегда используйте вариант Получить() с именем выходного файла, а затем работайте с файлом на диске.
Обработка ошибок и типичные проблемы
Работа с сетью непредсказуема: сервер может быть недоступен, DNS — не резолвить имя, TLS-сертификат — оказаться просроченным. Весь код обращения по сети следует оборачивать в попытку/исключение и журналировать текст ошибки, иначе диагностика в регламентных заданиях превратится в гадание.
Отдельного внимания заслуживает прокси. Если сервер 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, всегда проверяйте код состояния и размер результата, задавайте таймаут и помните: серверный код сохраняет файл на сервере, а не у пользователя.