При необходимости загрузить файл с внешнего веб-сервера разработчики часто используют стандартную функцию КопироватьФайл. Однако, если файл находится на защищенном узле (HTTPS) и сервер требует ввода логина и пароля, этот метод работать не будет. У функции КопироватьФайл отсутствуют параметры для передачи учетных данных и настройки криптографических протоколов.
Рассмотрим подробнее, как корректно организовать скачивание файла средствами 1С с использованием штатных объектов платформы, а также разберем причины возникновения частой ошибки SSL connect error.
Для скачивания файлов с аутентификацией по защищенному протоколу необходимо использовать специализированные объекты платформы — HTTPСоединение и ЗащищенноеСоединениеOpenSSL. Главное правило: нельзя передавать полный URL одной строкой, его нужно разделить на имя сервера, порт и относительный адрес ресурса.
Разберем по шагам правильное построение запроса:
443).ЗащищенноеСоединениеOpenSSL.HTTPСоединение, передавая имя пользователя и пароль.Получить, указав относительный путь к файлу на сервере и путь для сохранения на диске.Посмотрим на пример практической реализации кода:
// Указываем параметры подключения
ИмяСервера = "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. Существует несколько основных причин этой проблемы:
cacert.pem) может не содержать нужного доверенного корневого сертификата.КодироватьСтроку.Если встроенные средства платформы выдают ошибку шифрования, а обновить платформу 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. Механизмы Библиотеки Стандартных Подсистем (БСП)
В конфигурациях, использующих БСП, рекомендуется задействовать общий модуль ПолучениеФайловИзИнтернета. В нем предусмотрена обработка авторизации, прокси-серверов и перенаправлений, что упрощает написание кода.