При интеграции 1С с сайтами поставщиков и торговыми площадками автозапчастей разработчики часто сталкиваются с ситуацией: отправляется стандартный GET-запрос к странице каталога или поисковой выдаче по артикулу, но в полученном HTML-коде цены отсутствуют. Разберем по шагам, почему так происходит, какие существуют способы решения этой задачи и как правильно реализовать получение цен в платформе 1С:Предприятие.
Проанализируем ситуацию, когда простой запрос через MSXML2.XMLHTTP или HTTPСоединение возвращает тело страницы без стоимостных показателей. Для этого есть три основные причины:
Самый надежный, быстрый и отказоустойчивый способ взаимодействия с торговыми площадками — использование предоставленного API или веб-сервисов. Если поставщик предоставляет точку подключения к веб-сервису (например, сервис с расширением .asmx), следует работать напрямую через протокол SOAP.
Рассмотрим, как подключиться к SOAP веб-сервису в платформе 1С без изменения метаданных конфигурации, используя динамическое создание прокси:
// Создаем объект определений WSDL веб-сервиса
АдресWSDL = "http://service.autopiter.ru/price.asmx?WSDL";
WSОпределения = Новый WSОпределения(АдресWSDL);
// Получаем имя сервиса и точки подключения из схемы
ИмяСервиса = WSОпределения.Сервисы[0].Имя;
ИмяТочкиПодключения = WSОпределения.Сервисы[0].ТочкиПодключения[0].Имя;
// Создаем WSПрокси для выполнения операций
WSПрокси = Новый WSПрокси(WSОпределения, WSОпределения.Сервисы[0].URIПространстваИмен, ИмяСервиса, ИмяТочкиПодключения);
// Вызываем метод сервиса (например, поиск по артикулу с передачей учетных данных)
// Имена методов и параметров определяются структурой WSDL конкретного сервиса
Попытка
Результат = WSПрокси.GetPrice("wht005437", Логин, Пароль);
// Обработка полученных данных
Исключение
Сообщить("Ошибка при обращении к веб-сервису: " + ОписаниеОшибки());
КонецПопытки;
Преимущество такого подхода заключается в том, что формат обмена стандартизирован, а изменения верстки сайта поставщика не нарушат работу алгоритма загрузки цен.
Если веб-сервис недоступен или требуется сымитировать работу пользователя на сайте, приходится выполнять программную авторизацию и сохранять полученные сессионные куки. Разберем типичные ошибки, возникающие при формировании запросов в 1С:
Соответствие для HTTP-заголовков нельзя передавать строку самого метода (например, POST / HTTP/1.1). Заголовки должны состоять исключительно из пар ключ-значение.Set-Cookie содержит не только значение куки, но и директивы безопасности (path, domain, HttpOnly). Их нельзя передавать обратно в неизменном виде. Серверу в заголовке Cookie нужно отдавать только пары Имя=Значение.HTTPЗапрос и HTTPОтвет вместо методов с промежуточными временными файлами на диске.Посмотрим на корректный пример выполнения авторизации и последующего запроса данных через HTTPСоединение:
Сервер = "www.autopiter.ru";
РесурсАвторизации = "/login";
РесурсЦен = "/goods/wht005437";
// Создаем защищенное соединение при работе по HTTPS
SSL = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение(Сервер, 443,,,, 30, SSL);
// Подготавливаем POST-запрос авторизации
ЗапросАвторизации = Новый HTTPЗапрос(РесурсАвторизации);
ЗапросАвторизации.Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");
ЗапросАвторизации.Заголовки.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)");
ТелоЗапроса = "user_name=" + Логин + "&user_password=" + Пароль + "&action=do_enter";
ЗапросАвторизации.УстановитьТелоИзСтроки(ТелоЗапроса, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
ОтветАвторизации = Соединение.ОтправитьДляОбработки(ЗапросАвторизации);
// Извлекаем полученные Cookie из ответа сервера
СтрокаКук = "";
Если ОтветАвторизации.Заголовки.Свойство("Set-Cookie") Тогда
СтрокаКук = ОтветАвторизации.Заголовки["Set-Cookie"];
// Очищаем директивы безопасности для обратной отправки
ПозицияТочкиСЗапятой = СтрНайти(СтрокаКук, ";");
Если ПозицияТочкиСЗапятой > 0 Тогда
СтрокаКук = Лев(СтрокаКук, ПозицияТочкиСЗапятой - 1);
КонецЕсли;
КонецЕсли;
// Выполняем GET-запрос страницы товара с передачей полученной сессии
ЗапросТовара = Новый HTTPЗапрос(РесурсЦен);
ЗапросТовара.Заголовки.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)");
Если ЗначениеЗаполнено(СтрокаКук) Тогда
ЗапросТовара.Заголовки.Вставить("Cookie", СтрокаКук);
КонецЕсли;
ОтветТовара = Соединение.Получить(ЗапросТовара);
Если ОтветТовара.КодСостояния = 200 Тогда
HTMLСтраницы = ОтветТовара.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
// Обработка полученного текста страницы
КонецЕсли;
Если цены подгружаются динамически, а открытого API нет, проанализируем сетевую активность страницы через инструменты разработчика в браузере (вкладка Network):
Fetch/XHR, которые возвращают структуру JSON или фрагмент разметки с ценой.Важное замечание: использование устаревших COM-объектов браузера (таких как InternetExplorer.Application) не рекомендуется. Движок Internet Explorer не поддерживает современные стандарты JavaScript, на которых построены современные веб-сайты, что приводит к ошибкам выполнения скриптов и невозможности построить актуальное DOM-дерево с ценами.