Автоматизация мониторинга цен конкурентов и построение собственного прайс-листа на основе внешних источников — частая задача в интернет-торговле. Разберем по шагам, как выстроить архитектуру сбора данных, загрузить номенклатуру с изображениями и настроить формулы пересчета цен в конфигурации 1С:Управление нашей фирмой 1.6.
При сборе данных напрямую со сторонних сайтов основной проблемой являются антибот-системы и лимиты на количество запросов. Проанализируем ключевые принципы эффективного парсинга:
Рассмотрим, как средствами встроенного языка получить данные страницы через объект HTTPСоединение и разобрать структурированный ответ.
Если сайт отдает чистый JSON через внутренний интерфейс, разберем пример чтения ответа:
Соединение = Новый HTTPСоединение("api.targetsite.com", 443, , , , 30, Новый ЗащищенноеСоединениеOpenSSL());
ЗапросHTTP = Новый HTTPЗапрос("/v1/catalog/products?category=123");
ЗапросHTTP.Заголовки.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)");
ОтветHTTP = Соединение.Получить(ЗапросHTTP);
Если ОтветHTTP.КодСостояния = 200 Тогда
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(ОтветHTTP.ПолучитьТелоКакСтроку());
ДанныеКаталога = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
КонецЕсли;
Если данные встроены в статический HTML, для извлечения фрагментов используем объект ЧтениеHTML или строим DOM-модель через ДокументHTML, исключая ненадежную обработку сырыми регулярными выражениями.
При первоначальном заполнении базы или появлении новых позиций необходимо загрузить базовые реквизиты и картинки. Рассмотрим по шагам процесс сохранения изображения товара в 1С:УНФ:
HTTPСоединение.Номенклатура.НоменклатураПрисоединенныеФайлы, помещая полученные двоичные данные в хранилище.Посмотрим на пример загрузки файла картинки:
СоединениеФайлов = Новый HTTPСоединение("images.targetsite.com", 443, , , , 30, Новый ЗащищенноеСоединениеOpenSSL());
ЗапросКартинки = Новый HTTPЗапрос("/img/item123.jpg");
ОтветКартинки = СоединениеФайлов.Получить(ЗапросКартинки);
Если ОтветКартинки.КодСостояния = 200 Тогда
КартинкаДвоичныеДанные = ОтветКартинки.ПолучитьТелоКакДвоичныеДанные();
ПрисоединенныйФайл = Справочники.НоменклатураПрисоединенныеФайлы.СоздатьЭлемент();
ПрисоединенныйФайл.ВладелецФайла = СсылкаНаНоменклатуру;
ПрисоединенныйФайл.Наименование = "Основное изображение";
ПрисоединенныйФайл.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе;
ПрисоединенныйФайл.ФайлХранилище = Новый ХранилищеЗначения(КартинкаДвоичныеДанные, Новый СжатиеДанных());
ПрисоединенныйФайл.Записать();
КонецЕсли;
Поиск номенклатуры только по наименованию приводит к регулярным ошибкам и дублям. Проанализируем надежный подход к связыванию данных:
СоответствиеНоменклатурыВнешнимИсточникам), в измерениях которого хранятся внешний идентификатор и ссылка на Справочник.Номенклатура (и Справочник.ХарактеристикиНоменклатуры при наличии). Это позволяет при повторных запусках парсера обновлять только цены существующих связок.После получения цен стороннего сайта задействуем штатный механизм ценообразования конфигурации. Разберем настройку по шагам:
Установка цен.[Цена конкурента] * 0.98 для дисконта в 2% или [Цена конкурента] + 150). Также настраиваем правила округления (до 1 рубля, до 10 рублей и т.д.).Установка цен либо обработку «Формирование цен», где по нажатию кнопки пересчитываются все зависимые цены на основании свежезагруженной цены конкурента.Если сайт конкурента защищен сложной капчей, требует эмуляции действий пользователя в браузере или работает на SPA-фреймворках (клиентский рендеринг JavaScript), целесообразно вынести сбор данных во внешний скрипт (Node.js, Python, C#):
HTTP-сервис или настраивается обращение через интерфейс OData.[ { "ID": "...", "Price": 12000 } ] в опубликованный HTTP-сервис базы 1С.Установка цен.Такая схема защищает базу 1С от зависаний фоновых заданий при сетевых сбоях и позволяет использовать специализированные инструменты для обхода комплексных веб-защит.