Выгрузки на торговые площадки: инструкция для программиста 1С-Битрикс
Екатерина И.
Про пользу размещения товаров на различных торговых площадках и их принципиальные отличия читайте в нашей предыдущей статье.
Каков результат выгрузки? Это чаще всего xml-файл, доступный по определённому адресу на вашем сервере и обновляемый через какие-либо промежутки времени.
Итак, с чего начать?
Проверим то, что уже есть в Битриксе.
Зайдя в административную часть Битрикса в меню Магазин -> Экспорт данных, мы с радостью обнаруживаем заветную строчку Yandex.
Переходим в раздел, начинаем заполнять поля.
Первое препятствие. Какой тип описания выбрать – vendor.model или упрощённый? Покопавшись в документации, приходим к выводу, что vendorCode нет в требованиях Яндекса, поэтому выбираем упрощенный вариант.
Запускаем Экспорт в Битриксе. Выгрузка есть, но она не подходит, так как нет многих пунктов, обязательных для раздела Одежды (Яндекс.Гардероб).
Например:
Итак, стандартная выгрузка нас не устраивает. Какие остаются варианты?
Вариант А. Купить приложение на Маркетплейсе.
Вариант Б. Кастомизировать выгрузку.
Вариант А подходит, если у вас нет никаких сверхъестественных взаимодействий в вашем каталоге.
Например, в магазине из примера была особенность – фотографии товара были только у одного торгового предложения для определённого цвета (причём это предложение могло быть в нулевом количестве). То есть, у вас есть платье синего и зелёного цвета, каждый цвет есть для размеров 44 и 46. Только вот картинки для зелёного есть только у размера 44 (которого нет в наличии), а для синего – у 46. Шанс, что покупной модуль умеет правильно обрабатывать подобную ситуацию довольно мал. И не потому, что модуль плохой, а потому что таких ситуаций – тысячи, и каждая индивидуальна для отдельно взятого сайта. Но если ваш сайт всё же остался стандартным - устанавливайте себе пробную версию, проверяйте – возможно, вам повезёт и никаких лишних трудозатрат не будет.
Но это не наш случай. Значит, останавливаемся на варианте Б. Возникает вопрос – и сколько времени придётся потратить, чтобы кастомизировать эту выгрузку? Вопрос хороший и во многом зависит от программиста. Но если вы один раз действительно хорошо её кастомизируете – так, что можно будет менять набор параметров изменением парой строк – то переделывание выгрузки на другие магазины, сайты или типы выгрузок будет занимать у вас всего пару часов, а то и меньше.
Буквально в первых строчках 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>), в одном параметре может сочетаться несколько свойств, например:
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 для значения.
Далее пишем функцию, которая принимает на вход свойства товара и торгового предложения (в этот массив можно добавить и цены, названия и всё, что ещё нужно), проходит через наш массив параметров и применяет их к этим свойствам.Конечно, это не панацея, и наверняка может найтись ситуация, когда нужно будет дописывать костыли. Но бОльшую часть вышеперечисленных проблем она вполне решает. Разве что с картинками нужно будет ещё немного повозиться, но это решается достаточно просто.
Но, конечно, у всех есть свои особенности, потому что только сам Яндекс.Маркет знает, как обрабатывать свою выгрузку, а остальные – кто во что горазд. Поэтому к фразе «нам подходит выгрузка для Яндекс.Маркета» стоит относится скептически и заранее предполагать, что придётся долго и мучительно выдавливать информацию из менеджеров этой площадки. Или включать свой «третий глаз» и догадываться об их проблемах с выгрузкой по получившемуся каталогу.
Куда мы выгружали:
Все выгрузки работают и приносят стабильные заказы какие-то в большей степени, какие-то в меньшей.
Мы можем сделать для вас выгрузку на любые торговые площадки, и заниматься их ведением. Для этого заполните форму ниже.
Сравнение выгрузок на различные Торговые площадки
Задача для программиста: сделать выгрузку (так называемый прайс-лист, фид данных, экспорт каталога) для всех торговых площадок, выбранных заказчиком.Каков результат выгрузки? Это чаще всего 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 знаками после запятой. И что делать, если на нашем сайте этот вес хранится в граммах?
Писать свою функцию-обработчик параметров.
Итак, мой способ:
И к слову о весе – параметр <weight> (вес брутто) принимает значение только в килограммах, с 3 знаками после запятой. И что делать, если на нашем сайте этот вес хранится в граммах?
Писать свою функцию-обработчик параметров.
Итак, мой способ:
- Изменяем функцию yandex_get_value(), чтобы она возвращала не строку, а массив с ключами ID, CODE, NAME, VALUE.
- Пишем массив с нужными нам параметрами согласно документации Яндекс.Маркета. Каждый элемент имеет вид:
'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 вашего товара начинается со «знакомых» магазину слов (юбка, платье, блузка и т.д.) – они обрежутся. И добавится название категории. Только вот слова «блуза» он не знал, из-за чего возникли товары с названиями «блузка блуза». А также названия «Валери» и «Валерия» для него являются одинаковыми.
Все выгрузки работают и приносят стабильные заказы какие-то в большей степени, какие-то в меньшей.
Мы можем сделать для вас выгрузку на любые торговые площадки, и заниматься их ведением. Для этого заполните форму ниже.
Оцените статью
18.08.2015
Понравилась статья?
Поделитесь ссылкой с друзьями и коллегами!
Статьи по теме
Мы работаем по одному из двух форматов:
- аренда команды (от 2 человек, не менее 3 месяцев);
- итерации с фиксированной ценой (1-3 месяца длительностью).
ИНТЕРВОЛГА предоставляет:
- регулярные онлайн-планерки с заказчиком;
- квалифицированных специалистов;
- организованную команду (находятся в одном помещении, что упрощает решение рабочих вопросов);
- полную прозрачность и регулярность отчетов о результатах.
Ключевые услуги:
- нагруженный интернет-магазин;
- личный кабинет;
- оптовые продажи — B2B-платформа;
- маркетплейс;
- технический аудит сайта;
- Битрикс24 — корпоративные HR-порталы;
- Битрикс24 — построение CRM-системы;
- Битрикс24 — личные кабинеты сотрудников;
- Битрикс24 — аудит портала;
- 1С — интеграция с другими системами;
- 1С — доработка системы;
- маркетинг — комплексное интернет-продвижение;
- маркетинг — продвижение для B2B.
Хотите получать лучшие статьи от INTERVOLGA раз в месяц?
Подпишитесь на рассылку — спамить не будем