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

Ручний імпорт товарів з YML-фідів у 1С-Бітрікс часто перетворюється на хаос: криве кодування, дублікати та таймаути забирають час і нерви. Ми розробляємо парсери, які автоматизують завантаження каталогу, а наша команда реалізує проєкт під ключ — від аудиту фіда до впровадження та подальшої підтримки. У результаті ви отримуєте надійне рішення, яке стабільно працює та масштабується разом із вашим бізнесом.

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

Парсери та автонаповненняСередній~1-2 тижні
Часті запитання

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

Постачальник надіслав YML-файл на 50 000 товарів — а в Бітрікс потрібно завантажити все за вихідні. Стандартні інструменти не справляються: крива кодування, пропущені категорії, дублі оферів і таймаути при завантаженні картинок. Ми автоматизуємо цей процес так, щоб ви забули про ручний імпорт. За 10+ років роботи з Бітрікс ми обробили понад 500 000 товарів через YML-фіди та напрацювали перевірені рішення, які економлять до 70% часу на кожному імпорті.

Чому YML кращий за Excel для імпорту?

Excel-файли від постачальників часто містять об'єднані комірки, макроси, нестандартні формати дат і валют. YML (специфікація YML) — це строгий XML-формат, задокументований і легко парсимий. Він підтримує ієрархію категорій, множинні зображення, характеристики та ознаку наявності. На відміну від Excel, YML не вимагає ручних перетворень і дозволяє повністю автоматизувати імпорт.

Структура YML-фіду

YML — це XML-формат для товарних фідів від Яндекса. Постачальники часто надають саме YML: структура задокументована, даних достатньо для повноцінного імпорту. Це простіше, ніж парсити довільний Excel, але своїх нюансів вистачає.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE yml_catalog SYSTEM "shops.dtd">
<yml_catalog date="2025-03-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.ua/product/12345</url>
        <price>29990</price>
        <currencyId>RUR</currencyId>
        <categoryId>2</categoryId>
        <picture>https://shop.ua/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 в Бітрікс), available — ознака наявності, categoryId — посилання на категорію, param — довільні характеристики.

Парсинг категорій та побудова дерева

Категорії в YML утворюють ієрархію через атрибут parentId. При імпорті потрібно створити відповідну структуру розділів в інфоблоці. Алгоритм:

  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) та робота із зображеннями

Основний цикл обробки — обхід усіх оферів в XML. Для кожного створюється або оновлюється елемент інфоблоку. Особлива увага — завантаження зображень: при фіді на 10 000 товарів це 10 000 HTTP-запитів. Ми використовуємо перевірку хешу URL та паралельне завантаження через агенти, щоб скоротити час у 3–5 разів.

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,
        ],
    ];
    $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?

YML розрізняє кілька типів, кожен зі своїми обов'язковими полями:

Тип Атрибут Особливість
Простий type="simple" або без атрибута Всі категорії, базові поля
Одяг type="vendor.model" Поля vendor, model, розмірна сітка
Книги type="book" Поля author, publisher, ISBN
Аудіокниги type="audiobook" Специфічні медіа-поля

На практиці 80% постачальників використовують простий тип. Специфічні типи потребують додаткового маппінгу властивостей.

Як прискорити імпорт товарів із зображеннями?

Зображення — найвужче місце. Наш підхід: перед скачуванням порівнюємо хеш URL із попереднім імпортом (зберігаємо у властивості). Якщо URL не змінився — зображення не завантажуємо. Для нових товарів — фонові агенти з обмеженням 5 одночасних потоків. Це економить до 70% часу на партії з 50 000 товарів.

Типові помилки при парсингу та як їх уникнути

  • Проблема з кодуванням — YML приходить в UTF-8, а Бітрікс може очікувати windows-1251. Рішення: конвертація через iconv() перед парсингом.
  • Відсутні категорії — коли в YML вказано categoryId, якого немає в блоці категорій. Рішення: створювати відсутні категорії з позначкою «Тимчасова».
  • Дублі оферів — кілька записів з однаковим id. Рішення: використовувати XML_ID та перевіряти наявність перед додаванням.

Приклад з практики

Нещодавно налаштували імпорт для інтернет-магазину електроніки — 30 000 товарів від 5 постачальників. Основна проблема: різні схеми категорій (в одного — вкладеність 2 рівні, в іншого — 4). Вирішили через проміжний маппінг: таблиця-словник в HL-блоці. За 4 дні розробили універсальну обв'язку, яка зараз оновлює каталог щоденно по Cron.

Що входить в роботу

Етап Склад
Аналіз YML-фіду Перевірка структури, всіх типів оферів, кодування
Проектування Схема маппінгу категорій та властивостей
Розробка Скрипт імпорту з обробкою дублів, логуванням
Тестування Пробний імпорт на копії, перевірка помилок
Деплой та підтримка Налаштування агентів, документація, 1 місяць супроводу

Терміни розробки

Варіант Термін
Базовий імпорт (товари, ціни, категорії) 2–3 дні
Повний з характеристиками та зображеннями 4–5 днів
Багатопостачальницька система з UI та дедуплікацією 7–10 днів

Під ключ розробляємо як прості інтеграції, так і складні мульти-фіди. Хочете налаштувати парсинг YML під свій магазин? Зв'яжіться — оцінимо проект за 1 день. Гарантуємо якість та дотримання термінів. Замовте парсинг YML — і забудьте про ручний імпорт назавжди.

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

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

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1543
  • Розробка веб-сайту для компанії ФІКСПЕР
    Розробка веб-сайту для компанії ФІКСПЕР
    1060
  • Розробка віджета онлайн-запису для медичного центру
    Розробка віджета онлайн-запису для медичного центру
    837
  • Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    928
  • Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    865
  • Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    1223