Как получить цены товаров с сайта поставщика в 1С?

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

При интеграции 1С с сайтами поставщиков и торговыми площадками автозапчастей разработчики часто сталкиваются с ситуацией: отправляется стандартный GET-запрос к странице каталога или поисковой выдаче по артикулу, но в полученном HTML-коде цены отсутствуют. Разберем по шагам, почему так происходит, какие существуют способы решения этой задачи и как правильно реализовать получение цен в платформе 1С:Предприятие.

Причины отсутствия цен в исходном HTML-коде страницы

Проанализируем ситуацию, когда простой запрос через MSXML2.XMLHTTP или HTTPСоединение возвращает тело страницы без стоимостных показателей. Для этого есть три основные причины:

  1. Динамическая подгрузка данных через JavaScript: современная веб-разработка активно использует клиентские скрипты. Сервер отдает базовый каркас HTML-страницы, а сами данные о ценах и наличии запрашиваются браузером асинхронно отдельными запросами (XHR / Fetch) и встраиваются в структуру DOM уже после загрузки документа. При прямом скачивании HTML через 1С скрипты не выполняются, поэтому целевых данных в тексте ответа нет.
  2. Необходимость перехода в конкретную карточку товара: на страницах общего поиска по артикулу может отображаться только перечень модификаций и ссылок, а точная цена содержится внутри карточки отдельного предложения или конкретного склада поставщика.
  3. Персонализация цен и требование авторизации: оптовые поставщики часто скрывают цены от неавторизованных пользователей или показывают базовую розничную стоимость. Для отображения индивидуальной колонки цен требуется передавать идентификатор сессии (куки) или ключ авторизации.

Вариант 1. Использование официального веб-сервиса SOAP / WSDL

Самый надежный, быстрый и отказоустойчивый способ взаимодействия с торговыми площадками — использование предоставленного 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", Логин, Пароль);
    // Обработка полученных данных
Исключение
    Сообщить("Ошибка при обращении к веб-сервису: " + ОписаниеОшибки());
КонецПопытки;

Преимущество такого подхода заключается в том, что формат обмена стандартизирован, а изменения верстки сайта поставщика не нарушат работу алгоритма загрузки цен.

Вариант 2. Исправление ошибок при авторизации через HTTPСоединение

Если веб-сервис недоступен или требуется сымитировать работу пользователя на сайте, приходится выполнять программную авторизацию и сохранять полученные сессионные куки. Разберем типичные ошибки, возникающие при формировании запросов в 1С:

  1. Некорректный синтаксис в заголовках: в объекте Соответствие для HTTP-заголовков нельзя передавать строку самого метода (например, POST / HTTP/1.1). Заголовки должны состоять исключительно из пар ключ-значение.
  2. Неправильная передача Cookie: заголовок ответа сервера Set-Cookie содержит не только значение куки, но и директивы безопасности (path, domain, HttpOnly). Их нельзя передавать обратно в неизменном виде. Серверу в заголовке Cookie нужно отдавать только пары Имя=Значение.
  3. Использование устаревших методов: рекомендуется использовать связку 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);
    // Обработка полученного текста страницы
КонецЕсли;

Вариант 3. Анализ внутренних XHR-запросов и парсинг карточек

Если цены подгружаются динамически, а открытого API нет, проанализируем сетевую активность страницы через инструменты разработчика в браузере (вкладка Network):

  1. Откроем карточку требуемого товара в обычном браузере.
  2. Найдем в списке сетевых запросов вызовы с типом Fetch/XHR, которые возвращают структуру JSON или фрагмент разметки с ценой.
  3. Скопируем адрес конечной точки, параметры запроса (ID товара, регион, склад) и необходимые заголовки.
  4. Реализуем в 1С отправку прямого HTTP-запроса к этой внутренней точке API. Это позволит получать чистые данные без необходимости скачивать и разбирать тяжелый HTML-код страницы.

Важное замечание: использование устаревших COM-объектов браузера (таких как InternetExplorer.Application) не рекомендуется. Движок Internet Explorer не поддерживает современные стандарты JavaScript, на которых построены современные веб-сайты, что приводит к ошибкам выполнения скриптов и невозможности построить актуальное DOM-дерево с ценами.

← На главную