Парсинг YML-фідів для імпорту товарів у 1С-Бітрікс

Наша компанія займається розробкою, підтримкою та обслуговуванням рішень на Бітрікс та Бітрікс24 будь-якої складності. Від простих односторінкових сайтів до складних інтернет-магазинів, CRM систем з інтеграцією 1С та телефонії. Досвід розробників підтверджено сертифікатами від вендора.
Пропоновані послуги
Показано 1 з 1 послугУсі 1626 послуг
Парсинг YML-фідів для імпорту товарів у 1С-Бітрікс
Середня
~1-2 тижні
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Розробка на базі Бітрікс, Бітрікс24, 1С для компанії Development of an Online
    585
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    751
  • image_crm_dolbimby_434_0.webp
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    657
  • image_crm_technotorgcomplex_453_0.webp
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    989

Парсинг 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.

Алгоритм:

  1. Завантажити всі категорії в асоціативний масив [id => ['name' => ..., 'parentId' => ...]].
  2. Рекурсивно побудувати дерево.
  3. Для кожної категорії: знайти розділ за XML_ID = 'yml_cat_{id}' або створити новий.
  4. Зберегти маппінг [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 днів