Часто разработчики сталкиваются с ситуацией, когда необходимо программно скачать изображение или файл по ссылке из интернета. Самый простой и очевидный путь — использовать метод КопироватьФайл. Однако на практике этот метод может не срабатывать для ссылок, начинающихся с HTTPS. В браузере такая картинка открывается без проблем, а при попытке сохранить ее в 1С файл либо не сохраняется, либо система выдает ошибку: Ошибка работы с Интернет: Удаленный узел не прошел проверку. Давайте разберем эту ситуацию по шагам и выясним причину такого поведения, а также рассмотрим рабочие способы решения.
Проанализируем ситуацию подробнее. Метод КопироватьФайл является достаточно базовым инструментом платформы. Ошибка проверки удаленного узла обычно связана с сертификатами и протоколами безопасности. Выделим основные причины, почему встроенные механизмы могут давать сбой:
КопироватьФайл в некоторых случаях не передает SNI, и сервер возвращает сертификат по умолчанию, который не совпадает с доменом картинки.КопироватьФайл не всегда способен корректно пройти по цепочке редиректов при смене протокола.Рассмотрим основной и самый правильный способ обхода проблемы в 1С — использование объекта HTTPСоединение с явной настройкой защищенного соединения OpenSSL. Этот подход позволяет более гибко управлять запросом.
Посмотрим на пример рабочего кода, который решает проблему:
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("png");
// Настраиваем защищенное соединение с использованием системных сертификатов
ssl = Новый ЗащищенноеСоединениеOpenSSL(
Новый СертификатКлиентаWindows(СпособВыбораСертификатаWindows.Выбирать),
Новый СертификатыУдостоверяющихЦентровWindows()
);
// Создаем HTTP-соединение. Обязательно указываем порт 443 для HTTPS
HTTP = Новый HTTPСоединение("www.example.ru", 443,,,,,ssl);
// Выполняем GET-запрос и сохраняем результат во временный файл
Ответ = HTTP.Получить("/assets/system/shop/products/167/original/image.png", ИмяВременногоФайла);
В этом примере мы создаем объект ЗащищенноеСоединениеOpenSSL и передаем ему хранилище сертификатов Windows — СертификатыУдостоверяющихЦентровWindows. Платформа обратится к системному хранилищу ОС для проверки валидности сертификата узла.
Важное примечание: Если ваш сервер 1С работает под управлением Linux, рекомендуется использовать более универсальный кроссплатформенный объект СертификатыУдостоверяющихЦентровОС вместо Windows-специфичного.
Если проблема заключается в нарушенной цепочке доверия на самом сервере 1С, и нет возможности оперативно обновить системные сертификаты через сисадмина, мы можем использовать свой файл сертификата. Для этого в платформе существует объект СертификатыУдостоверяющихЦентровФайл.
Рассмотрим, как это применить:
C:\certs\mycert.pem).
ФайлСертификата = "C:\certs\mycert.pem";
ssl = Новый ЗащищенноеСоединениеOpenSSL(
Неопределено,
Новый СертификатыУдостоверяющихЦентровФайл(ФайлСертификата)
);
HTTP = Новый HTTPСоединение("www.example.ru", 443,,,,,ssl);
Если сертификаты проверять вообще не требуется и нужно скачать файл принудительно любой ценой, игнорируя ошибки безопасности (и если сервер работает на ОС Windows), можно воспользоваться COM-объектом WinHttp.WinHttpRequest.5.1.
Разберем по шагам логику этого подхода. Мы создаем COM-объект, отключаем проверку сертификатов (специальным флагом), выполняем запрос, а затем сохраняем полученные двоичные данные на диск с помощью объекта ADODB.Stream.
WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
WinHttp.Open("GET", "https://www.example.ru/image.png", Ложь);
// Игнорируем ошибки сертификата (13056)
WinHttp.Option(4, 13056);
WinHttp.Send();
Если WinHttp.Status = 200 Тогда
Stream = Новый COMОбъект("ADODB.Stream");
Stream.Type = 1; // Тип бинарные данные
Stream.Open();
Stream.Write(WinHttp.ResponseBody);
Stream.SaveToFile(ИмяВременногоФайла, 2);
Stream.Close();
КонецЕсли;
Этот метод не является универсальным и работает только в Windows-среде, но в ряде сложных случаев, когда настройка 1С и ОС недоступна, он может стать спасением.
Метод КопироватьФайл отлично подходит для простых задач и протокола HTTP или FTP. Однако для стабильной работы с современными веб-сайтами по протоколу HTTPS следует использовать HTTPСоединение в связке с ЗащищенноеСоединениеOpenSSL. Это позволяет правильно аутентифицировать сервер, корректно обрабатывать заголовки запроса и избегать распространенных проблем с защищенными соединениями.