Как прочитать XML-файл по ссылке с внешнего портала в 1С

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

Зачастую перед разработчиком 1С встает задача интеграции с внешними системами для получения оперативной информации. Одной из таких задач является загрузка XML-выгрузок, например, от портала CM.Expert или других агрегаторов данных. В этой статье мы разберем, как правильно организовать получение файла по ссылке, на какие нюансы стоит обратить внимание при работе с протоколом HTTPS и как эффективно обработать полученные данные, избегая типичных ошибок.

Использование объекта HTTPСоединение для загрузки XML

Для начала рассмотрим базовый механизм получения данных с веб-ресурса. В системе 1С основным инструментом для взаимодействия с внешними сайтами является объект HTTPСоединение. Если ссылка начинается с протокола https://, критически важно инициализировать защищенное соединение, иначе система вернет ошибку или не сможет установить связь с узлом.

Разберем по шагам создание правильного запроса. Проанализируем типичную ситуацию: при попытке выполнить простой GET-запрос без параметров защиты сервер может вернуть ошибку "failure when receiving data from the peer" или коды состояния 4xx. Это происходит из-за того, что современные порталы требуют обязательного шифрования трафика.

Для решения этой проблемы мы воспользуемся объектом ЗащищенноеСоединениеOpenSSL. Рассмотрим пример кода:


// Определим параметры подключения
АдресРесурса = "media.cm.expert";
ПутьКФайлу = "/stock/export/cmexpert/dealer.site/all/89ede89851183d76e25f6c2a75fb4062.xml";

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

// Устанавливаем соединение по порту 443 (HTTPS)
Соединение = Новый HTTPСоединение(АдресРесурса, 443, , , , , Защита);

// Подготавливаем запрос
Запрос = Новый HTTPЗапрос(ПутьКФайлу);

// Выполняем GET-запрос
Ответ = Соединение.Получить(Запрос);

Если Ответ.КодСостояния = 200 Тогда
    // Обработка успешного получения
    СодержимоеXML = Ответ.ПолучитьТелоКакСтроку();
Иначе
    Сообщить("Ошибка запроса: " + Ответ.КодСостояния);
КонецЕсли;

Оптимизация работы с большими файлами выгрузки

Выясним причину, по которой метод Получить() не всегда является оптимальным. Если XML-файл содержит данные о тысячах объектов (например, складской запас крупного автодилера), его размер может достигать десятков и сотен мегабайт. Попытка загрузить такой объем данных сразу в оперативную память через ПолучитьТелоКакСтроку() может привести к аварийному завершению работы сеанса 1С с ошибкой «Недостаточно памяти».

Проанализируем ситуацию: более надежным способом является предварительное сохранение файла на диск. Для этого мы заменим метод Получить() на ПолучитьФайл(). Это позволит системе записывать поток данных напрямую в файловую систему, минуя переполнение оперативной памяти.

Рассмотрим пример реализации:


ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xml");

Попытка
    Соединение.Получить(Запрос, ИмяВременногоФайла);
    // Теперь файл лежит на диске, и мы можем читать его порционно
Исключение
    Сообщить("Не удалось сохранить файл: " + ОписаниеОшибки());
КонецПопытки;

Технические нюансы: TLS, Редиректы и User-Agent

При работе с современными веб-сервисами, такими как инфраструктура Яндекса, необходимо учитывать дополнительные параметры сетевого взаимодействия:

  1. Протоколы TLS: Серверы могут требовать протокол версии 1.2 или выше. Если ваша 1С запущена на устаревшей ОС (например, Windows Server 2008), стандартное ЗащищенноеСоединениеOpenSSL() может не сработать. В таких случаях убедитесь, что в системе установлены все обновления безопасности.
  2. Заголовки запроса (User-Agent): Некоторые сервера блокируют запросы, если не указан заголовок User-Agent. Рекомендуется добавлять его в объект HTTPЗапрос, чтобы имитировать обращение браузера.
    Запрос.Заголовки.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)");
  3. Обработка редиректов: Если сервер возвращает код состояния 301 или 302, это означает, что файл перемещен. Объект HTTPСоединение в 1С не всегда переходит по ссылке автоматически. Проверьте заголовок "Location" в ответе и, если он присутствует, выполните новый запрос по новому адресу.

Эффективный парсинг XML-данных в 1С

После того как файл успешно скачан, его необходимо прочитать. Для работы с большими XML-выгрузками (такими как формат Auto.ru/CM.Expert) мы рекомендуем использовать объект ЧтениеXML вместо ДокументDOM. Объектная модель DOM загружает всё дерево XML в память, что крайне нерационально для линейных списков товаров или автомобилей.

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


Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(ИмяВременногоФайла);

Пока Чтение.Прочитать() Цикл
    // Проверяем начало элемента
    Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
        ИмяУзла = Чтение.Имя;
        
        // Например, ищем тег с данными автомобиля
        Если ИмяУзла = "offer" Тогда
            // Обрабатываем данные внутри оффера
            РассмотримДанныеОффера(Чтение);
        КонецЕсли;
    КонецЕсли;
КонецЦикла;

Чтение.Закрыть();

Важный момент: При создании объекта ЧтениеXML система автоматически определит кодировку (обычно UTF-8), если она корректно указана в заголовке файла. Это избавляет разработчика от ручного преобразования текстов.

Практические советы по оптимизации обновлений

Чтобы не скачивать один и тот же объемный файл при каждом запуске обработки, воспользуемся механизмом проверки изменений. Если вы сохраните дату последнего изменения файла, при следующем запросе можно добавить заголовок If-Modified-Since. Если данные на портале не менялись, сервер вернет код 304 (Not Modified), и вы сэкономите входящий трафик и время выполнения задачи.

Подводя итог, отметим: стабильное чтение XML по ссылке в 1С требует комплексного подхода — от правильной настройки ЗащищенноеСоединениеOpenSSL до выбора потокового метода обработки ЧтениеXML. Следуя этим рекомендациям, вы сможете построить надежную систему обмена данными с внешними порталами.

← На главную