Как скопировать файл по HTTPS-ссылке с аутентификацией в 1С и исправить ошибку SSL connect error

Программист IT и автоматизация бизнеса
← На главную

При необходимости загрузить файл с внешнего веб-сервера разработчики часто используют стандартную функцию КопироватьФайл. Однако, если файл находится на защищенном узле (HTTPS) и сервер требует ввода логина и пароля, этот метод работать не будет. У функции КопироватьФайл отсутствуют параметры для передачи учетных данных и настройки криптографических протоколов.

Рассмотрим подробнее, как корректно организовать скачивание файла средствами 1С с использованием штатных объектов платформы, а также разберем причины возникновения частой ошибки SSL connect error.

Использование объекта HTTPСоединение и ЗащищенноеСоединениеOpenSSL

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

Разберем по шагам правильное построение запроса:

  1. Выделяем из ссылки имя хоста (домен) и путь к файлу.
  2. Указываем порт защищенного соединения (по умолчанию для HTTPS используется порт 443).
  3. Инициализируем объект защищенного соединения ЗащищенноеСоединениеOpenSSL.
  4. Создаем объект HTTPСоединение, передавая имя пользователя и пароль.
  5. Вызываем метод Получить, указав относительный путь к файлу на сервере и путь для сохранения на диске.

Посмотрим на пример практической реализации кода:


// Указываем параметры подключения
ИмяСервера = "office.matca.ru";
Порт = 443;
Логин = "ИмяПользователя";
Пароль = "Пароль";

// Создаем объект защищенного соединения SSL
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();

// Инициализируем соединение с сервером
HTTPСоединение = Новый HTTPСоединение(ИмяСервера, Порт, Логин, Пароль, , , ЗащищенноеСоединение);

// Путь к файлу на сервере (запрос) и имя целевого файла на диске
АдресРесурса = "/MatMed_DrugsV2/FileDownloader.php?doc_table=Doc_production&file_name=31468.tif";
ИмяФайлаПриемника = "C:\temp\downloaded_file.tif";

// Скачиваем файл
HTTPСоединение.Получить(АдресРесурса, ИмяФайлаПриемника);

Причины возникновения ошибки SSL connect error и особенности платформы

Проанализируем ситуацию, когда при выполнении метода вызовов возникают ошибки соединения вида SSL connect error. Существует несколько основных причин этой проблемы:

  1. Несовместимость версий TLS: В устаревших релизах платформы встроенный библиотечный модуль OpenSSL работает только со старыми протоколами (TLS 1.0 или TLS 1.1). Если целевой веб-сервер настроен исключительно на работу с современными протоколами TLS 1.2 или TLS 1.3, платформа не сможет установить соединение.
  2. Проблемы с цепочкой сертификатов: Если веб-сервер использует сертификат, выданный промежуточным или новым Удостоверяющим Центром, системное хранилище 1С (файл cacert.pem) может не содержать нужного доверенного корневого сертификата.
  3. Спецсимволы в адресе ресурса: Если в URL-параметрах присутствуют символы кириллицы или специальные знаки (например, проценты, пробелы), строку запроса необходимо предварительно кодировать с помощью функции КодироватьСтроку.

Альтернативные способы скачивания файлов

Если встроенные средства платформы выдают ошибку шифрования, а обновить платформу 1С нет возможности, можно применить альтернативные механизмы.

1. Использование COM-объекта WinHttp.WinHttpRequest.5.1

Этот способ использует системный стек Windows (Schannel) вместо встроенного OpenSSL, благодаря чему автоматически применяются актуальные TLS-протоколы и сертификаты из хранилища операционной системы:


WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
WinHttp.Open("GET", "https://office.matca.ru/path/to/file.tif", Ложь);
WinHttp.SetCredentials(Логин, Пароль, 0); // 0 - HTTPNtlmAuthScope_Request
WinHttp.Send();

Если WinHttp.Status = 200 Тогда
    Stream = Новый COMОбъект("Adodb.Stream");
    Stream.Type = 1; // Binary
    Stream.Open();
    Stream.Write(WinHttp.ResponseBody);
    Stream.SaveToFile("C:\temp\file.tif", 2); // 2 - SaveCreateOverWrite
    Stream.Close();
КонецЕсли;

2. Использование утилиты cURL или PowerShell

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


Команда = "curl -u """ + Логин + ":" + Пароль + """ -o ""C:\temp\file.tif"" ""https://office.matca.ru/path/to/file.tif""";
ЗапуститьПриложение(Команда, , Истина);

3. Механизмы Библиотеки Стандартных Подсистем (БСП)

В конфигурациях, использующих БСП, рекомендуется задействовать общий модуль ПолучениеФайловИзИнтернета. В нем предусмотрена обработка авторизации, прокси-серверов и перенаправлений, что упрощает написание кода.

← На главную