Парсинг YML-фідів для імпорту товарів в 1С-Bitrix
YML (Yandex Market Language) — це XML-формат, який Яндекс.Маркет розробив для товарних фідів. Поставщики часто надають саме YML: формат задокументований, структура відома, дані достатньо повні. Це простіше, ніж парсити довільний Excel, але своїх нюансів хватає.
Структура YML-фіду
YML-фід має стандартну структуру:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE yml_catalog SYSTEM "shops.dtd">
<yml_catalog date="2024-01-15 10:30">
<shop>
<name>Назва магазину</name>
<currencies>
<currency id="RUR" rate="1"/>
</currencies>
<categories>
<category id="1">Електроніка</category>
<category id="2" parentId="1">Смартфони</category>
</categories>
<offers>
<offer id="12345" available="true">
<url>https://shop.ru/product/12345</url>
<price>29990</price>
<currencyId>RUR</currencyId>
<categoryId>2</categoryId>
<picture>https://shop.ru/img/12345.jpg</picture>
<name>Смартфон Samsung Galaxy A54</name>
<vendor>Samsung</vendor>
<vendorCode>SM-A546</vendorCode>
<description>Опис товару</description>
<param name="Колір">Чорний</param>
<param name="Об'єм пам'яті">128 ГБ</param>
</offer>
</offers>
</shop>
</yml_catalog>
Ключові елементи:
-
offer id— унікальний ідентифікатор товару у поставщика (аналог XML_ID у Bitrix). -
available— наявність: true/false. -
categoryId— посилання на категорію. -
param— характеристики товару (довільна кількість).
Парсинг категорій та побудова дерева
Категорії у YML утворюють ієрархію через атрибут parentId. При імпорту потрібно створити відповідну структуру розділів в інфоблоці Bitrix.
Алгоритм:
- Завантажити всі категорії в асоціативний масив
[id => ['name' => ..., 'parentId' => ...]]. - Рекурсивно побудувати дерево.
- Для кожної категорії: знайти розділ за
XML_ID = 'yml_cat_{id}'або створити новий. - Зберегти маппінг
[yml_id => bitrix_section_id].
$sectionId = CIBlockSection::GetList(
[],
['IBLOCK_ID' => $iblockId, 'XML_ID' => 'yml_cat_' . $cat['id']],
false,
['ID']
)->Fetch()['ID'];
if (!$sectionId) {
$bs = new CIBlockSection();
$sectionId = $bs->Add([
'IBLOCK_ID' => $iblockId,
'XML_ID' => 'yml_cat_' . $cat['id'],
'NAME' => $cat['name'],
'IBLOCK_SECTION_ID' => $parentBitrixId,
'ACTIVE' => 'Y',
]);
}
Імпорт товарів (offers)
Основний цикл обробки:
foreach ($xml->shop->offers->offer as $offer) {
$xmlId = (string)$offer['id'];
$available = (string)$offer['available'] === 'true';
// Збір параметрів
$params = [];
foreach ($offer->param as $param) {
$params[(string)$param['name']] = (string)$param;
}
$fields = [
'IBLOCK_ID' => $iblockId,
'NAME' => (string)$offer->name,
'XML_ID' => $xmlId,
'ACTIVE' => $available ? 'Y' : 'N',
'IBLOCK_SECTION_ID' => $sectionMap[(string)$offer->categoryId] ?? null,
'PROPERTY_VALUES' => [
'VENDOR' => (string)$offer->vendor,
'ARTICLE' => (string)$offer->vendorCode,
// характеристики з param
],
];
// Пошук існуючого товару
$existId = getElementByXmlId($xmlId, $iblockId);
$el = new CIBlockElement();
if ($existId) {
$el->Update($existId, $fields);
} else {
$el->Add($fields);
}
// Оновлення ціни
updatePrice($existId ?: $el->LAST_ID, (float)$offer->price);
}
Завантаження зображень
YML містить посилання на зображення (<picture>). Завантаження та прив'язка до товару:
$imageUrl = (string)$offer->picture;
$tmpFile = CFile::MakeFileArray($imageUrl); // Bitrix завантажить файл
if ($tmpFile) {
$el->Update($productId, ['PREVIEW_PICTURE' => $tmpFile]);
}
Завантаження зображень — найповільніша частина імпорту. При фіді на 10 000 товарів — завантаження 10 000 зображень. Оптимізація: перевірити, змінилося ли зображення (за хешем URL або вмісту), не завантажувати повторно.
Типи офертів YML
YML підтримує кілька типів офертів з різними обов'язковими полями:
| Тип | Атрибут | Особливість |
|---|---|---|
| Простий | type="simple" або без атрибута |
Всі категорії |
| Одяг | type="vendor.model" |
Поля vendor, model, розмірна сітка |
| Книги | type="book" |
Поля author, publisher, ISBN |
| Медіа | type="audiobook" |
Специфічні медіа-поля |
У більшості випадків поставщики використовують простий тип. Специфічні типи трапляються в нішевих каталогах.
Графік розробки
| Варіант | Склад | Термін |
|---|---|---|
| Базовий імпорт | Товари, ціни, категорії | 2–3 дні |
| Повний із характеристиками | Маппінг param у властивості, зображення | 4–5 днів |
| Багатопоставщикова система | UI, розклад, журнали, дедублікація | 7–10 днів |







