Выгрузки на торговые площадки. Инструкция для программиста 1С-Битрикс

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

Сравнение выгрузок на различные Торговые площадки

Задача для программиста: сделать выгрузку (так называемый прайс-лист, фид данных, экспорт каталога) для всех торговых площадок, выбранных заказчиком.
Каков результат выгрузки? Это чаще всего xml-файл, доступный по определённому адресу на вашем сервере и обновляемый через какие-либо промежутки времени.

Часть 1 – Яндекс.Маркет

Первое, что приходит в голову, если вспоминать о торговых площадках – это Яндекс.Маркет. И, что приятно, по объёму и подробности документации его превосходит разве что Google Merchant Center.

Итак, с чего начать?
Проверим то, что уже есть в Битриксе.
Зайдя в административную часть Битрикса в меню Магазин -> Экспорт данных, мы с радостью обнаруживаем заветную строчку Yandex. 
Переходим в раздел, начинаем заполнять поля.

Первое препятствие. Какой тип описания выбрать – vendor.model или упрощённый? Покопавшись в документации, приходим к выводу, что vendorCode нет в требованиях Яндекса, поэтому выбираем упрощенный вариант.
Запускаем Экспорт в Битриксе. Выгрузка есть, но она не подходит, так как нет многих пунктов, обязательных для раздела Одежды (Яндекс.Гардероб).

Например:
  • Нельзя задать категорию в Яндекс.Маркете, которой соответствует данный товар;
  • Если ваше свойство статичное (например, пол Женский) и, соответственно, нигде явным образом не задаётся – то и в выгрузке вы его не получите;
  • Нет вывода «старой цены»;
  • Цены можно выбирать только из тех, что доступны неавторизованному пользователю;
  • Нельзя поменять название параметра;
  • Нельзя выгружать товары только в наличии или только с фото;
  • Нельзя устанавливать ставки на различные категории товаров;
  • И много другое.

Итак, стандартная выгрузка нас не устраивает. Какие остаются варианты?

Вариант А. Купить приложение на Маркетплейсе.

Вариант Б. Кастомизировать выгрузку.

Вариант А подходит, если у вас нет никаких сверхъестественных взаимодействий в вашем каталоге.
Например, в магазине из примера была особенность – фотографии товара были только у одного торгового предложения для определённого цвета (причём это предложение могло быть в нулевом количестве). То есть, у вас есть платье синего и зелёного цвета, каждый цвет есть для размеров 44 и 46. Только вот картинки для зелёного есть только у размера 44 (которого нет в наличии), а для синего – у 46. Шанс, что покупной модуль умеет правильно обрабатывать подобную ситуацию довольно мал. И не потому, что модуль плохой, а потому что таких ситуаций – тысячи, и каждая индивидуальна для отдельно взятого сайта.  Но если ваш сайт всё же остался стандартным - устанавливайте себе пробную версию, проверяйте – возможно, вам повезёт и никаких лишних трудозатрат не будет.

Но это не наш случай. Значит, останавливаемся на варианте Б. Возникает вопрос – и сколько времени придётся потратить, чтобы кастомизировать эту выгрузку? Вопрос хороший и во многом зависит от программиста. Но если вы один раз действительно хорошо её кастомизируете – так, что можно будет менять набор параметров изменением парой строк – то переделывание выгрузки на другие магазины, сайты или типы выгрузок будет занимать у вас всего пару часов, а то и меньше.

Часть 2 – Как работает стандартная выгрузка


Буквально в первых строчках Google приносит вот эту ссылку . Исходя из неё, можно смело начинать – идти в /bitrix/php_interface/include/catalog_export/ и копировать файлы yandex_run и yandex_setup, заменив «yandex» на то, что нужно. Содержимое этих файлов нужно скопировать из модуля catalog (адрес прописан в самих файлах, например, /bitrix/modules/catalog/load/yandex_run.php ).
В setup-файле содержатся настройки, которые открываются при редактировании профиля. Если кратко – можно добавлять свои вкладки и поля, значения которых будут передаваться в файл, непосредственно производящий выгрузку.
Добавлять вкладки можно, добавив в конец файла код
$tabControl->BeginNextTab();
// код
$tabControl->EndTab();

Но, честно говоря, вижу в этом смысл, только если вы собираетесь продавать ваш модуль. Если нет – то велик шанс потратить на это больше времени, чем потом получить пользы.

Кроме того, стандартная выгрузка имеет большой недостаток: при количестве товаров более 3000 начинает есть настолько много памяти на сервере, что сама выгрузка умирает.

Перейдём к главному блюду. Это run-файл – собственно, именно он создаёт результирующий файл выгрузки.

В начале файла идёт <title>Название выгрзки</title> - именно это название будет высвечиваться в списке экспортов.

Далее идут всякие вспомогательные вызовы. Из интересного можно отметить функции

yandex_replace_special – заменяет спецсимволы на их символы-мнемоники 
yandex_text2xml – также убирает или заменяет лишние спецсимволы
yandex_get_value – получает значения параметров из свойств товаров

Далее идут проверки свойств, полученных из настроек профиля – что, конечно, полезно, но нас особо не интересует
Смысловая часть начинается с @fwrite – запись в наш новый файл. Первой строкой задаётся тип и кодировка файла, затем идёт уже непосредственно xml-структура. Можно оставить как есть, можно прописать какие-то параметры вручную.
Не буду распространяться о подробной структуре YML, о которой можно прочитать здесь ( https://help.yandex.ru/partnermarket/yml/about-yml.xml ), коснусь лишь принципиальных моментов.

Разделы каталога/categories. 
(часть кода начинается с $intMaxSectionID = 0; )
Здесь создаётся массив категорий товаров на сайте. Если вы решили задавать у разделов пользовательское поле, в котором будете задавать категорию Яндекс.Маркета, то получать его можно как раз в этом месте.
 
Тип каталога
Каталог на сайте может быть 4 типов:
D - инфоблок является торговым каталогом
O - инфоблок содержит торговые предложения (SKU)
P - инфоблок товаров, имеющих торговые предложения, но сам торговым каталогом не является
X - инфоблок товаров, имеющих торговые предложения, при это сам инфоблок тоже является торговым каталогом.

То есть, для D и О – это каталог в одном ИБ, P и X – каталог в двух ИБ: товаров и торговых предложений.

Один и тот же код составления offer’а написан 4 раза в каждой ветке. Что довольно странно и неудобно для изменений. Особенно если ваш каталог X-типа: выгрузка будет проходить по веткам 2 и 4 или 3 и 4 (2 или 3  - в зависимости от типа цен). То есть, любые изменения придётся делать минимум в двух местах. Поэтому, если уж всё равно браться переписывать – то лучше все повторяющиеся части вынести в отдельные функции. Такие как: вычисление цены, поиск картинок, вывод названия и описания и так далее.
 
Название и описание товара
Здесь всё предсказуемо – название берётся из названия, описание – из описания. Но есть нюанс – в название – из названия торгового предложения, а описание – из анонса, при этом обрезается до 255 символов.  
 
Цены
Цены берутся с помощью GetOptimalPrice() для группы пользователей 2 – то есть, неавторизованных. Код во всех 4 ветках кода одинаков, поэтому можно смело выносить его в функцию и передавать нужные значения в качестве параметров.
 
Параметры
Это самая интересная часть. Стандартная выгрузка вполне неплохо справляется с извлеканием значений из битриксовых свойств с помощью функции yandex_get_value() , передавая ей в качестве параметров массив из свойств торгового предложения и товара. И возвращая на выходе строки вида
<param name=”Название свойства”>Значения свойства через запятую</param>
Ошибки здесь нет, но упущено множество нюансов. Название свойства может не совпадать с названием параметра Яндекс.Маркета, каждое новое значение свойства может быть в новом параметре (например, картинки из свойства MORE_PHOTO должны записываться в отдельные теги <picture></picture> ), в одном параметре может сочетаться несколько свойств, например:

<param name="Объем" unit="мл">150</param>

Единица измерения может содержаться в одном свойстве, а собственно значение – в другом. А что говорить, когда единицей измерения могут быть мл, а могут быть граммы – тогда в зависимости от этого нужно указывать разные названия параметра – Объём или Вес.
И к слову о весе – параметр  <weight> (вес брутто) принимает значение только в килограммах, с 3 знаками после запятой. И что делать, если на нашем сайте этот вес хранится в граммах?
Писать свою функцию-обработчик параметров.
Итак, мой способ:
  1. Изменяем функцию yandex_get_value() , чтобы она возвращала не строку, а массив с ключами ID, CODE, NAME, VALUE.
  2. Пишем массив с нужными нам параметрами согласно документации Яндекс.Маркета. Каждый элемент имеет вид:
array (
    'PROPS' => array(
          'WEIGHT' => array('weight', 'ves'),
          'WEIGHT_UNIT' => array('edinitsa_izm'),
    ),
    'CONDITION' => array(
          'WEIGHT_UNIT' => array('г', 'кг'),
    ),
    'MODIFICATION' => array(
          'WEIGHT' => 'gr_to_kg'
    ),
    'STR' => '<param name="Вес" unit="#WEIGHT_UNIT#">#WEIGHT#</param>',
),


Где STR содержит шаблон строки с заглушками, которые подставляются из соответствующих свойств из PROPS, при этом данная строка записывается, только если срабатывает CONDITION (если массив – то идёт сравнение, если строка – запускается функция с данным названием), применяя функцию-модификатор из MODIFICATION для значения.

Далее пишем функцию, которая принимает на вход свойства товара и торгового предложения (в этот массив можно добавить и цены, названия и всё, что ещё нужно), проходит через наш массив параметров и применяет их к этим свойствам.Конечно, это не панацея, и наверняка может найтись ситуация, когда нужно будет дописывать костыли. Но бОльшую часть вышеперечисленных проблем она вполне решает. Разве что с картинками нужно будет ещё немного повозиться, но это решается достаточно просто.

Часть 3 – Нам подходит выгрузка для Яндекс.Маркета», говорили они…

Что касается других площадок – то они так или иначе похожи на один из вышеперечисленных вариантов, с точностью до названия тегов.

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

Куда мы выгружали:
  • Яндекс.Маркет – всё, что можно было, сказано выше.
  • Товары@Mail.Ru – документация похуже Яндекса, но в целом удобоваримо. Гораздо меньше возможных параметров. Основное отличие описано выше.
  • Google Merchant Center – хорошая подробная документация, принцип построения как на Яндексе, никаких принципиальных проблем возникнуть не должно, разве что теперь картинки делятся на «главную» <g:image_link> и «дополнительные» <g:additional_image_link>
  • ТопШоп – в начале утверждали, что выгрузка для Яндекс.Маркета им подходит. После нескольких пробных выгрузок оказалось, что не совсем – нужно было вносить изменение, описанное выше. И дописывать возможные размеры в описание товара.
  • Madina.ru – подходит выгрузка для Яндекса. В нашем случае вынесена в отдельную выгрузку, так как нужно было использовать другой тип цен.
  • WikiMart – хоть выгрузка для Яндекса им действительно подходит, зато у них не совсем тривиальный способ объединения торговых предложений товара. А именно – по названию. То есть, ваши торгвые предложения могут оказаться «слепленными» с другими магазинами. Если у ваших товаров одинаковое название – это один товар. Если name вашего товара начинается со «знакомых» магазину слов (юбка, платье, блузка и т.д.) – они обрежутся. И добавится название категории. Только вот слова «блуза» он не знал, из-за чего возникли товары с названиями «блузка блуза». А также названия «Валери» и «Валерия» для него являются одинаковыми.


Все выгрузки работают и приносят стабильные заказы какие-то в большей степени, какие-то в меньшей.
Мы можем сделать для вас выгрузку на любые торговые площадки, и заниматься их ведением. Для этого заполните форму ниже.

Заявка на обновление, поддержку и сопровождение сайта 24x7
Иван
Иванов
+7 (905) 000 00 00
info@intervolga.ru
www.site.ru
Хочу подключить услугу "поддержка 24x7"