При попытке загрузить файл по сетевой ссылке с помощью метода КопироватьФайл разработчики нередко сталкиваются с ошибкой: «Ошибка работы с Интернет: Удаленный узел не прошел проверку». Попытка прочитать XML напрямую по URL через ЧтениеXML.ОткрытьФайл также часто завершается фатальной ошибкой разбора: «Extra content at the end of the document». Разберем по шагам, почему возникают эти ошибки и как правильно скачивать и обрабатывать веб-файлы средствами платформы 1С:Предприятие.
Проанализируем ситуацию. Методы КопироватьФайл и ЧтениеXML.ОткрытьФайл являются высокоуровневыми. Они не предоставляют гибких настроек для управления протоколами безопасности SSL/TLS, заголовками запросов и кодами ответа сервера.
Основные причины сбоя проверки узла:
Что касается ошибки «Extra content at the end of the document» при прямом открытии через ЧтениеXML: когда удаленный сервер отклоняет запрос или требует авторизации, он возвращает не XML-файл, а HTML-страницу с ошибкой (например, 403 Forbidden, 401 Unauthorized или капчу). Парсер XML пытается разобрать полученный HTML-код как XML-структуру и выдает фатальную ошибку.
Рассмотрим подробнее стандартный и наиболее надежный способ скачивания файлов по протоколу 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Соединение с контролем статуса ответа и корректной настройкой сертификатов.