Интеграция со СБИС по CommerceML с массовыми преобразованиями на лету

ЗаказчикАгросервис «Стратегия» — интернет-магазин запчастей для сельскохозяйственной техники. ЗадачаРазработать интернет-магазина с каталогом продукции, синхронизированным с внешней системой учета СБИС. Автоматизировать разделы «Аналоги» (кроссы) и «С этим товаром покупают»…

Выбор инструментов

Для интеграции сайта и СБИС на этот раз мы использовали протокол CommerceML.

7677291abceb683876f18f3534c31fbd.png

Данный формат полностью идентичен интеграции с 1С, имеет ряд преимуществ, но вместе с ним и наследует все недостатки.

Кстати, ранее мы уже публиковали кейс с интеграцией СБИС и онлайн-каталога тут. Тогда мы использовали API СБИС и выгрузку в формате YML (Yandex Market Language). В этот раз была задача выгрузить штатные для СБИС связи «Аналогов» и «С этим товаром покупают», а в формате .yml этого сделать нельзя.

d0d8a85fe328e53b2261c232fbeb5785.jpg

Кроме того, если работать с выгрузкой каталога СБИС в YML-формате, то необходимо сначала создать отдельный прайс-лист товаров. То есть из имеющегося каталога СБИС добавить товарные позиции в прайс-лист, например, «для сайта» и уже данный прайс-лист использовать в выгрузке.

Как оказалось, данное решение очень неудобное, ведь администратору СБИС постоянно нужно помнить, что при добавлении товара в основную номенклатуру его также нужно добавить и в прайс-лист для выгрузки на сайт. Это простое действие, но оно отнимает много времени и приносит неудобства, плюс заставляет держать в памяти саму необходимость процесса.

По стандарту CommerceML можно легко выгрузить практически все, что есть в товарной карточке, в привычном формате, пакетом, состоящим из файлов:

  • import.xml;
  • offers.xml;
  • prices.xml;
  • rests.xml.

Их обработка возможна штатным функционалом платформы 1С-Битрикс.

a0c728aef0d9fc3b0ba9de93dd07d014.jpg

Но для решения наших задач этот способ не подходит — ведь нам предстоит не просто загрузить как есть, а применить множественные преобразования значений при загрузке каталога. Для этого мы используем решение «Импорт из XML, YML, JSON. Загрузка каталога товаров 1С-Битрикс» от наших многолетних партнеров — компании Esolutions.

70bc4186804963a2f850fd8bf6a3d508.jpg

Сначала, произведя необходимые настройки в СБИС, мы получаем пакет нужных нам файлов штатным способом в привычном формате с удобной настройкой расписания.

e514f87e3bf616e73c3a5938f1c4b091.jpg

Выгрузка возможна также в ручном режиме в один клик.

c1197aa2764f7bd6f0231e20e8da6e83.png

Настройка импорта

При импорте многие моменты необходимо «подкручивать», ведь то, что есть в СБИС, не всегда прямо идентично тому, что мы хотим видеть на сайте. Вот лишь несколько преобразований, которые мы применили при обработке стандартных файлов, полученных через CommerceML:

  • Удаление родительской категории из иерархии. Внутри СБИС нужная нам номенклатура хранится по пути «Интернет-магазин/Категория/Подкатегория». На сайте же родительская категория «Интернет-магазин» нам не нужна.
    ade3ddd3f58299927cdcac58e17670f8.png
  • Отбор только нужных свойств из полученных с автоматической публикацией их в детальной карточке товара и в фильтре.
    d8bad6e2920c66e5245ff53bbc478423.png
    Нужные свойства отмечаются »!» в начале имени, после попадания на сайт этот префикс удаляется. В результате получается простой, масштабируемый и понятный всем отбор необходимых свойств.


    9a06c5c873cc6a906227e8d0e8c0bab7.png

  • Использование одного и того же текста в анонсе и детальном описании. PHP-преобразованием мы получаем первые 200 символов из описания карточки товара СБИС и публикуем его в анонс, а полное описание попадает в детальное описание товара.
    6caec6634632d5a11f6d584cad0df417.png
  • Изменение формата валюты, отбор нужного склада, суммирование остатков по складам и запись отдельных значений по каждому складу. Стандартной интеграцией не получить остатки по каждому складу в отдельности: модуль всегда проведет суммирование и запишет в качестве значения доступного количества сумму. Поэтому если вам нужно показать наличие в конкретном пункте выдачи, стандартная выгрузка вам не подойдет.

Импорт значений свойств «Аналоги» и «С этим товаром покупают»

Одной из самых важных задач, поставленных перед нами заказчиком, была выгрузка значений свойств товара «Аналоги» и «С этим товаром покупают». Они относятся к штатному функционалу СБИС, позволяющему для каждого товара выбрать позиции из уже имеющейся номенклатуры в качестве аналогов или сопутствующих. Но, как оказалось, выгрузить значения этих свойств стандартным способом невозможно. И мы чуть не потеряли заказчика, так импорт связей «Аналоги» и «С этим товаром покупают» был ключевым требованием.

Первой сложностью стало то, что связка внутри СБИС происходит по собственному коду товара (он имеет вид X2126858), но в файл выгружается внешний код вида 19a9fa22–5156–4b66–8444–3c6546b18f6f, а в 1С-Битрикс связь товаров происходит через ID товара, назначаемого на сайте.

А еще выяснилось, что по протоколу CommerceML значения полей «Аналоги» и «С этим товаром покупают» не передаются совсем.

Изучая документацию, мы обнаружили, что секция «С этим товаром покупают» может быть выгружена при обращении к товару через API. Нужно лишь знать внешний код товара. Получить его можно из списка товаров прайс-листа.

91b5952c3e76c1f70efdf28b071dd6d5.jpgНа первый взгляд, это решение подходило, но оказалось, чтобы получить эти данные, необходимо сначала получить id прайс-листа, его же в свою очередь можно получить, зная id точки продаж, а точку продаж можно создать если у вас есть лицензия на тариф «Профи» сервиса «Для магазинов (розница)» на СБИС. На момент написания кейса, стоимость тарифа составляла 15 000 р./год. Платить столько, чтобы получить ID точки продаж и зависимый от нее ID прайс-листа вместе с лишним для нас функционалом магазина, настройкой кассы и многим другим ненужным, сочли неуместным и мы, и заказчик.

В процессе мозгового штурма пришла идея: «не может ли внешний код товара, полученный через интеграцию по протоколу CommerceML, совпадать с внешним кодом из недосягаемого без лицензии прайс-листа? Чтобы проверить это, мы создали пробную интеграцию, получили API-ключи и отправили запрос на получение подробной информации по товару с внешним кодом 16013ac4–60f9–46e6–995e-8ac838f98aa9.

82372ad6e5e5d478819ca86458aeac24.png

Полученный ответ вселил в нас уверенность в правильности пути.

11485cd9bb40b6ac04e7354605721ae9.jpg

В секции related_products мы получили массив, в котором наряду с прочей информацией есть нужные нам внешние коды товаров, связанных с запрашиваемым в поле «С этим товаром покупают». Ура!

Но радость оказалась преждевременной. На момент реализации нами данного решения API СБИС не позволяла выгрузить таким способом еще и «Аналоги».а вопрос в поддержку СБИС, почему мы не можем их получить, пришел шаблонный ответ о возможном дополнении функционала API в дальнейшем.

В итоге в шаге от успеха, уперевшись в стену, выстроенную СБИСовцами, мы приняли решение присвоить каждому товару дополнительный номер — штрихкод. Это можно легко сделать с помощью стандартного функционала СБИС.

Далее мы создали для всех товаров в СБИС новые свойства «Аналоги (штрихкоды…)» и «С этим товаром покупают (штрихкоды…)». В их поля вручную вписали штрихкоды товаров — аналогичных и покупаемых совместно — относящихся к конкретной карточке. Эти свойства импортируются на сайт как обычные характеристики.

2c36976c3b16b4fa6ed277a5125b0053.png

Этот же штрихкод товара мы решили использовать как уникальный идентификатор, единый для сайта и СБИС. Поэтому в настройках импорта задали замену внешнего кода товара, получаемого из стандартной выгрузки, на штрихкод. А также прописали использование значения штрихкода в качестве символьного кода элемента каталога. Это, помимо прочего, обеспечивает единообразие url товарных карточек.

9029b6347335de304be50d2119846c91.png

Штрихкод стал универсальным номером товара, по которому его легко можно найти и в публичном интерфейсе сайта, и в его административной части, и в СБИС.

В результате при импорте на сайте создаются товарные карточки, у каждой из которых в качестве внешнего кода указан ее уникальный штрихкод, а в отдельных свойствах перечислены штрихкоды связанных товаров. Затем модуль импорта находит эти товары на сайте по значению штрихкода и в штатное для »1С-Битрикс» поле карточки типа «Привязка к элементам» вписывает присвоенный на сайте ID этих товаров, создавая необходимые связи.

6431669ae9921fbfbe47fd6139ff63f4.png

5641869ab68e7a46d1decb6656976567.jpg

194ba38c0896e2458a78816bdafd7715.jpg

Таким образом, задачу решили, хотя и не так красиво, как хотелось бы. Однако у нашего решения есть и плюс — без него, при использовании API, нужно было бы запрашивать информацию по каждому товару отдельно, а, значит, при ассортименте каталога в 5000 позиций нам пришлось бы отправлять на сервер СБИС 5000 запросов и получать 5000 ответов. Это увеличило бы время импорта на порядок.

Автоматизированное присваивание стикеров товарам

Автоматизация стикеров — специальных меток для товарных карточек — частично уже решена командой «Аспро» — разработчиком решения «Аспро: Максимум», на котором мы реализовали наш проект. Ребята, как и мы, постоянно ищут возможности автоматизировать рутинные процессы, и имеют в своем арсенале простое, но очень удобное решение для автоматизации стикеров «Новинка» и «Специальное предложение».

Ежедневно cron-задание проверяет условия и принимает решение: установить, оставить или снять тот или иной стикер у каждого товара.

d3d7c4e67b198b9f7b6af4cdeccbc5fa.jpg

Мы же сконцентрировались на более важном для нас — на установке стикера «Есть аналоги». По каталоге Заказчика, для некоторых товаров, которых может не быть в наличии, есть аналоги. И нам нужно было реализовать автоматический поиск таких товаров и установку на них соответствующего стикера.

e9d88a8e4c6d3d6762c99129f6e48412.png

По аналогии с решением «Аспро» по «Новинкам» и «Спецпредложениям» мы настроили проверку в XML-файле, полученном от СБИС, наличия у конкретного товара данных в секции «Аналоги». Если значения в массиве более 0, то стикер устанавливается, равно 0 — отметка снимается.

Нанесение водяного знака на все изображения

В »1С-Битрикс» есть стандартная настройка инфоблока, позволяющая преобразовывать размер изображения и накладывать водяной знак при добавлении анонсной и детальной картинок.

4dc9f368e84129c3ed144bed25ea9de3.png

Но на дополнительные изображения штатно наложить водяной знак нельзя.

6fd42933db5afb8a40051cfce70620a7.jpg

Поэтому мы использовали функционал, внедренный в последней версии модуля импорта от Esolutions. При обработке свойств с изображениями теперь доступно наложение водяного знака на любые поля с типом «картинка».

c0de3142126f3914bd9b014ece82aec5.jpg

Благодаря этому все изображения товара обрабатываются однообразно и получают на выходе единый водяной знак.

Настройка «летающей» корзины

Разработанный нами сайт имеет все атрибуты стандартного интернет-магазина:

  • личный кабинет с данными покупателя, историей заказов, возможностью смены собственных данных;
  • функционал сохранения отдельных товаров в качестве «Избранных»;
  • полноценную корзину с возможностью оформления заказа, выбрав способ оплаты заказа и доставки.

Дополнительный требованием Заказчика стала реализация отображения «Летающей корзины» в публичной части сайта. Его целевая аудитория — в основном снабженцы и менеджеры по закупкам. Чаще всего они заходят в интернет-магазин с десктопных устройств на рабочем месте, набирают множество товаров и комплектуют сложные заказы. Поэтому им крайне необходимо видеть сразу всю корзину и управлять товарами в ней без дополнительного перехода на отдельную страницу в саму корзину.

Для удобства использования сайта на всех устройствах мы реализовали отображения корзины в трех режимах:

  • На десктопных устройствах с шириной экрана от 1200 пикселей показывается одновременно и обычный фиксированный виджет корзины, и боковой — расширенный. При этом боковая панель появляется только тогда, когда в корзину добавляется товар. Решение работает на Ajax и дружит с автокомпозитом.

    005910ef1847a873525f00513b06ca3a.png

    Боковая панель позволяет быстро управлять перечнем и количеством отложенных товаров, и при готовности — сразу перейти к оформлению заказа.

  • На десктопных устройствах шириной меньше 1200 пикселей будет показана только корзина в фиксированной нижней панели.

    b99a1016517850b6e868c9440294a263.png

    В ней отражается количество товаров и сумма заказа.

  • На мобильных устройствах показывается только число товаров у иконки, размещенной в фиксированной шапке.

    be82a6b0bc0b2ffe8923d06e76da4e0f.png

Результат

В рамках проекта интернет-магазина «Агросервис «Стратегия» были реализованы:

  1. Полностью автоматизированная система управления каталогом товаров из СБИС по протоколу CommerceML, обеспечивающая импорт на сайт подробной информация о товаре, включая описание, картинки, цены, складские остатки, свойства. Все редактирование каталога выполняется в системе учета СБИС, никаких дополнительных действий на стороне сайта не требуется.
  2. Массовые преобразования передаваемой номенклатуры из СБИС «на лету» в процессе импорта.
  3. Связка на сайте передаваемого товара из СБИС с другими позициями для наполнения блоков «Аналоги» и «С этим товаром покупают».
  4. Интеллектуальная установка стикеров «Новинка», «Специальное предложение» и «Есть аналоги».
  5. Автоматический отбор основного и дополнительных изображений, нанесение водяного знака на все картинки.
  6. Личный кабинет пользователя на сайте и уникальное кроссплатформенное отображение корзины товаров.

Итог

Разработанный digital-агентством «Винтра» сайт интернет-магазина полностью выполняет требования Заказчика и оптимизирован для удобства использования целевой аудиторией. Интеграция сайта со СБИС, реализованная с применением нестандартных решений, обеспечивает постоянную актуальность наполнения каталога и управление им в режиме одного окна.

Перейти на сайт

Полный текст статьи читайте на CMS Magazine