Как сохранить картинку по HTTPS в 1С, если метод КопироватьФайл не работает?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Часто разработчики сталкиваются с ситуацией, когда необходимо программно скачать изображение или файл по ссылке из интернета. Самый простой и очевидный путь — использовать метод КопироватьФайл. Однако на практике этот метод может не срабатывать для ссылок, начинающихся с HTTPS. В браузере такая картинка открывается без проблем, а при попытке сохранить ее в 1С файл либо не сохраняется, либо система выдает ошибку: Ошибка работы с Интернет: Удаленный узел не прошел проверку. Давайте разберем эту ситуацию по шагам и выясним причину такого поведения, а также рассмотрим рабочие способы решения.

Почему КопироватьФайл не справляется с HTTPS?

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

  1. Отсутствие промежуточного сертификата (AIA Fetching). Современные браузеры умеют "на лету" докачивать недостающие промежуточные сертификаты, если веб-сервер их не передал. Встроенные простые HTTP-клиенты 1С этого не умеют.
  2. Технология SNI (Server Name Indication). Если на одном IP-адресе находится много сайтов, серверу нужно понимать, какой сертификат отдавать. Метод КопироватьФайл в некоторых случаях не передает SNI, и сервер возвращает сертификат по умолчанию, который не совпадает с доменом картинки.
  3. Несовместимость версий TLS. Сервер может требовать только современные протоколы (TLS 1.2/1.3), а платформа 1С в базовых методах может пытаться использовать устаревшие.
  4. Скрытые перенаправления. Сервер может возвращать редирект (коды 301 или 302), перенаправляя запрос. КопироватьФайл не всегда способен корректно пройти по цепочке редиректов при смене протокола.

Решение 1: Использование объекта HTTPСоединение

Рассмотрим основной и самый правильный способ обхода проблемы в 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-специфичного.

Решение 2: Использование собственного файла сертификатов

Если проблема заключается в нарушенной цепочке доверия на самом сервере 1С, и нет возможности оперативно обновить системные сертификаты через сисадмина, мы можем использовать свой файл сертификата. Для этого в платформе существует объект СертификатыУдостоверяющихЦентровФайл.

Рассмотрим, как это применить:

  1. Экспортируем цепочку сертификатов нужного сайта (включая корневой и промежуточный) из браузера в формате Base64 (файл `.cer` или `.pem`).
  2. Сохраняем этот файл на сервере 1С (например, C:\certs\mycert.pem).
  3. В коде указываем этот файл при инициализации SSL.

ФайлСертификата = "C:\certs\mycert.pem";
ssl = Новый ЗащищенноеСоединениеOpenSSL(
    Неопределено,
    Новый СертификатыУдостоверяющихЦентровФайл(ФайлСертификата)
);
HTTP = Новый HTTPСоединение("www.example.ru", 443,,,,,ssl);

Решение 3: COM-объект WinHTTP (Альтернатива для Windows)

Если сертификаты проверять вообще не требуется и нужно скачать файл принудительно любой ценой, игнорируя ошибки безопасности (и если сервер работает на ОС 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. Это позволяет правильно аутентифицировать сервер, корректно обрабатывать заголовки запроса и избегать распространенных проблем с защищенными соединениями.

← На главную