Зачастую перед разработчиком 1С встает задача интеграции с внешними системами для получения оперативной информации. Одной из таких задач является загрузка XML-выгрузок, например, от портала CM.Expert или других агрегаторов данных. В этой статье мы разберем, как правильно организовать получение файла по ссылке, на какие нюансы стоит обратить внимание при работе с протоколом HTTPS и как эффективно обработать полученные данные, избегая типичных ошибок.
Для начала рассмотрим базовый механизм получения данных с веб-ресурса. В системе 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");
Попытка
Соединение.Получить(Запрос, ИмяВременногоФайла);
// Теперь файл лежит на диске, и мы можем читать его порционно
Исключение
Сообщить("Не удалось сохранить файл: " + ОписаниеОшибки());
КонецПопытки;
При работе с современными веб-сервисами, такими как инфраструктура Яндекса, необходимо учитывать дополнительные параметры сетевого взаимодействия:
ЗащищенноеСоединениеOpenSSL() может не сработать. В таких случаях убедитесь, что в системе установлены все обновления безопасности.User-Agent. Рекомендуется добавлять его в объект HTTPЗапрос, чтобы имитировать обращение браузера.
Запрос.Заголовки.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)");
HTTPСоединение в 1С не всегда переходит по ссылке автоматически. Проверьте заголовок "Location" в ответе и, если он присутствует, выполните новый запрос по новому адресу.После того как файл успешно скачан, его необходимо прочитать. Для работы с большими 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. Следуя этим рекомендациям, вы сможете построить надежную систему обмена данными с внешними порталами.