Парсинг 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. При імпорті потрібно створити відповідну структуру розділів в інфоблоці. Алгоритм:
- Завантажити всі категорії в асоціативний масив
[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) та робота із зображеннями
Основний цикл обробки — обхід усіх оферів в 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 — і забудьте про ручний імпорт назавжди.







