Как исправить ошибку «Удаленный узел не прошел проверку» при скачивании файлов в 1С?

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

При попытке загрузить файл по сетевой ссылке с помощью метода КопироватьФайл разработчики нередко сталкиваются с ошибкой: «Ошибка работы с Интернет: Удаленный узел не прошел проверку». Попытка прочитать XML напрямую по URL через ЧтениеXML.ОткрытьФайл также часто завершается фатальной ошибкой разбора: «Extra content at the end of the document». Разберем по шагам, почему возникают эти ошибки и как правильно скачивать и обрабатывать веб-файлы средствами платформы 1С:Предприятие.

Почему методы КопироватьФайл и ЧтениеXML завершаются ошибкой

Проанализируем ситуацию. Методы КопироватьФайл и ЧтениеXML.ОткрытьФайл являются высокоуровневыми. Они не предоставляют гибких настроек для управления протоколами безопасности SSL/TLS, заголовками запросов и кодами ответа сервера.

Основные причины сбоя проверки узла:

  1. Отсутствие корневого сертификата в доверенном хранилище. Если удаленный веб-сервер использует сертификаты национальных удостоверяющих центров (например, Минцифры), самоподписанные сертификаты или не отдает полную цепочку промежуточных сертификатов, платформа 1С не может подтвердить подлинность узла.
  2. Устаревшие версии протоколов TLS. Сервер может требовать TLS 1.2 или TLS 1.3, которые могут не поддерживаться старыми версиями платформы или устаревшими операционными системами без необходимых обновлений.
  3. Перехват HTTPS-трафика. Корпоративные антивирусы, файрволы или прокси-серверы выполняют SSL Inspection, подменяя сертификат сайта собственным локальным сертификатом, которому платформа 1С по умолчанию не доверяет.
  4. Несовпадение имени узла (SNI). Адрес в ссылке отличается от доменного имени, указанного в сертификате сервера.

Что касается ошибки «Extra content at the end of the document» при прямом открытии через ЧтениеXML: когда удаленный сервер отклоняет запрос или требует авторизации, он возвращает не XML-файл, а HTML-страницу с ошибкой (например, 403 Forbidden, 401 Unauthorized или капчу). Парсер XML пытается разобрать полученный HTML-код как XML-структуру и выдает фатальную ошибку.

Основное решение: использование HTTPСоединение и ЗащищенноеСоединениеOpenSSL

Рассмотрим подробнее стандартный и наиболее надежный способ скачивания файлов по протоколу HTTPS в 1С. Для этого используются объекты HTTPСоединение, HTTPЗапрос и ЗащищенноеСоединениеOpenSSL.

Посмотрим на пример правильной загрузки файла с проверкой кода состояния ответа:


Сервер = "example.com";
ПутьНаСервере = "/price.xml";
ИмяФайлаПриемника = "D:\price.xml";

// Настраиваем защищенное соединение
// Пустые параметры означают использование системного хранилища сертификатов
Защита = Новый ЗащищенноеСоединениеOpenSSL();

Попытка
    // Создаем защищенное соединение по порту 443 (HTTPS)
    Соединение = Новый HTTPСоединение(Сервер, 443,,,, 30, Защита);
    
    // Формируем запрос и задаем User-Agent, так как многие серверы блокируют стандартный заголовок 1С
    Запрос = Новый HTTPЗапрос(ПутьНаСервере);
    Запрос.Заголовки.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)");
    
    // Выполняем GET-запрос с сохранением ответа в локальный файл
    Ответ = Соединение.Получить(Запрос, ИмяФайлаПриемника);
    
    // Проверяем статус ответа сервера
    Если Ответ.КодСостояния = 200 Тогда
        // Файл успешно получен, переходим к чтению XML
        Чтение = Новый ЧтениеXML;
        Чтение.ОткрытьФайл(ИмяФайлаПриемника);
        
        Пока Чтение.Прочитать() Цикл
            // Обработка данных XML
        КонецЦикла;
        
        Чтение.Закрыть();
    Иначе
        Сообщить("Ошибка загрузки файла. Код ответа сервера: " + Ответ.КодСостояния);
    КонецЕсли;
Исключение
    Сообщить("Ошибка при выполнении HTTP-запроса: " + ОписаниеОшибки());
КонецПопытки;

Альтернативные способы обхода проверки сертификатов

Выясним причину, почему иногда стандартный механизм не срабатывает. Если узел использует самоподписанный сертификат, а добавить его в системное хранилище ОС или платформы нет возможности, можно применить обходные пути.

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

Данный объект операционной системы Windows позволяет отключить строгую проверку SSL-сертификатов с помощью специального флага Option(4) = 13056 (игнорирование недействительных дат, неизвестных центров сертификации и несовпадения имен):


HTTP = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
HTTP.Open("GET", "https://example.com/price.xml", Ложь);

// Отключаем проверку ошибок SSL (0x3300 = 13056)
HTTP.Option(4, 13056);
HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0");

HTTP.Send();

Если HTTP.Status = 200 Тогда
    Поток = Новый COMОбъект("ADODB.Stream");
    Поток.Type = 1; // adTypeBinary
    Поток.Open();
    Поток.Write(HTTP.ResponseBody);
    Поток.SaveToFile("D:\price.xml", 2); // adSaveCreateOverWrite
    Поток.Close();
КонецЕсли;

Вариант 2. Загрузка через системную утилиту cURL

В современных версиях Windows доступна встроенная утилита curl. Её можно вызвать через ЗапуститьПриложение с ключом -k (или --insecure), который разрешает небезопасные SSL-соединения:


Команда = "curl -k -o ""D:\price.xml"" ""https://example.com/price.xml""";
ЗапуститьПриложение(Команда, , Истина);

Таким образом, для стабильной работы обменов следует отказаться от простых методов копирования файлов по URL в пользу полноценного объекта HTTPСоединение с контролем статуса ответа и корректной настройкой сертификатов.

← На главную