Парсинг XML-фідів постачальників для 1С-Бітрікс

Наша компанія займається розробкою, підтримкою та обслуговуванням рішень на Бітрікс та Бітрікс24 будь-якої складності. Від простих односторінкових сайтів до складних інтернет-магазинів, CRM систем з інтеграцією 1С та телефонії. Досвід розробників підтверджено сертифікатами від вендора.
Пропоновані послуги
Показано 1 з 1 послугУсі 1626 послуг
Парсинг XML-фідів постачальників для 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

Парсинг XML-фідів поставщиків для 1С-Bitrix

XML-фід поставщика — це структурований файл з актуальними даними про товари: цінами, остатками, описами, характеристиками. На відміну від Excel-прайса, XML передбачуваний: у нього є схема, і його можна парсити надійно. Але «передбачуваний» не означає «стандартний» — кожен поставщик вигадує свій XML-формат.

Формати XML-фідів

Трапляються кілька поширених структур:

Простий плоский XML:

<products>
  <product>
    <id>12345</id>
    <name>Товар А</name>
    <price>1500.00</price>
    <stock>10</stock>
  </product>
</products>

Ієрархічний із категоріями:

<catalog>
  <categories>
    <category id="1" name="Електроніка"/>
  </categories>
  <offers>
    <offer id="12345" category_id="1">
      <name>Товар А</name>
      <param name="Колір">Чорний</param>
    </offer>
  </offers>
</catalog>

З простором імен:

<feed xmlns:g="http://base.google.com/ns/1.0">
  <entry>
    <g:id>12345</g:id>
    <g:price>1500 RUB</g:price>
  </entry>
</feed>

Інструменти парсингу в PHP

SimpleXML — для невеликих файлів (до 50 МБ):

$xml = simplexml_load_file($filePath);
foreach ($xml->offers->offer as $offer) {
    $id = (string)$offer['id'];
    $price = (float)$offer->price;
}

XMLReader — для великих файлів (сотні тисяч товарів). Читає файл як потік, не завантажує в пам'ять цілком:

$reader = new XMLReader();
$reader->open($filePath);
while ($reader->read()) {
    if ($reader->nodeType === XMLReader::ELEMENT && $reader->name === 'offer') {
        $node = new SimpleXMLElement($reader->readOuterXml());
        // обробка одного елемента
    }
}

При фіді на 500 000 позицій XMLReader — єдиний робочий варіант. SimpleXML при такому розмірі виснажить пам'ять PHP.

XPath — для навігації по складних структурах:

$nodes = $xml->xpath('//catalog/offers/offer[@available="true"]');

Атрибути та вкладені параметри

Багато поставщиків зберігають характеристики товара як список елементів <param>:

<offer id="111">
  <param name="Бренд">Samsung</param>
  <param name="Гарантія">12 місяців</param>
  <param name="Колір">Сріблистий</param>
</offer>

Парсинг таких параметрів:

$params = [];
foreach ($offer->param as $param) {
    $name = (string)$param['name'];
    $value = (string)$param;
    $params[$name] = $value;
}
// $params['Бренд'] === 'Samsung'

Потім маппінг $params['Бренд'] → властивість BRAND в інфоблоці Bitrix.

Маппінг у властивості інфоблоку

Властивості товара в Bitrix зберігаються в таблицях b_iblock_element_property (рядки та числа), b_iblock_element_prop_s{N} (оптимізоване зберігання). Запис через API:

CIBlockElement::SetPropertyValueCode($elementId, 'BRAND', $params['Бренд']);
// або масово при Add/Update:
'PROPERTY_VALUES' => [
    'BRAND'    => $params['Бренд'],
    'WARRANTY' => $params['Гарантія'],
]

Для властивостей-списків (тип LIST) значення повинне бути ID елемента списку. Якщо такого значення немає — додати через CIBlockPropertyEnum::Add().

Синхронізація: оновлення проти повної перезагрузки

Повна перезагрузка — простіше. Деактивувати все, створити/оновити за даними фіду, не знайдене залишається неактивним. Проблема: при великому каталозі (50K+ позицій) — довго та навантажує базу.

Інкрементальна синхронізація — оновлювати лише змінене. Вимагає порівняння з попереднім станом. Підходи:

  • Хеш рядка даних: якщо md5(serialize($currentData)) !== $savedHash — оновити.
  • Поле modified у фіді: оновлювати лише якщо дата змін новіша.

Розклад та сповіщення

Фід обробляється за розкладом через cron. Типовий розклад для цін та остатків — кожні 2–4 години, для описів та характеристик — раз на день.

0 */3 * * * /usr/bin/php /home/bitrix/www/local/cron/supplier_xml_import.php

Після кожного запуску — запис у журнал: скільки оновлено, скільки помилок, час виконання. При помилці (файл недоступний, неправильний XML) — сповіщення адміністратору.

Графік розробки

Варіант Склад Термін
Один поставщик, простий XML Парсер + оновлення цін/остатків 2–3 дні
Складний XML з параметрами Маппінг характеристик у властивості 3–5 днів
Система для кількох поставщиків Налаштовувані маппінги, UI 6–10 днів