Налаштування трансформації даних при парсингу для 1С-Бітрікс
Дані з зовнішніх джерел ніколи не відповідають структурі вашого каталогу. Назви великими літерами, ціни з символом валюти в рядку, розміри в дюймах замість сантиметрів, категорії не співпадають з розділами інфоблоку. Без шару трансформації між парсером та імпортером дані потрапляють у каталог «як є» — і ламають фільтри, сортування, відображення карток.
Типові трансформації
Нормалізація тексту:
- Приведення регістру:
ШУРУПОВЕРТ BOSCH GSR 18V→Шуруповёрт Bosch GSR 18V. Функціяmb_convert_case()з режимомMB_CASE_TITLEпрацює для більшості випадків, але ламає абревіатури. Потрібен whitelist слів, які не трансформуються (артикули, бренди). - Видалення лишніх пробілів, неразривних пробілів (
\xC2\xA0), символів нульової ширини. - Заміна HTML-сутностей:
&→&,"→".
Нормалізація цін:
- Видобування числа з рядка:
"1 299,00 руб."→1299.00. Регулярне вираження:preg_replace('/[^\d,.]/', '', $price), затім заміна коми на крапку. - Конвертація валют за фіксованим курсом або через API Центробанку.
- Округлення до копійок:
round($price, 2).
Нормалізація характеристик:
- Одиниці вимірювання:
"120 мм"→ значення120, одиницямм. Парсинг через regex:/^([\d.,]+)\s*([а-яА-Яa-zA-Z]+)$/u. - Булеві значення:
"Да","Yes","+","true","1"→Yдля властивостей типу «прапорець» у Бітрікс. - Списочні значення: маппінг зовнішнього значення на XML_ID варіанту властивості. Таблиця відповідностей у БД або конфігураційному масиві.
Маппінг категорій
Структура категорій джерела не співпадає з розділами інфоблоку. Рішення — таблиця маппінгу:
$categoryMap = [
'Электроинструмент/Дрели' => 15, // ID розділу інфоблоку
'Электроинструмент/Шуруповёрты' => 16,
'Ручной инструмент/Отвёртки' => 22,
];
$sectionId = $categoryMap[$externalCategory] ?? DEFAULT_SECTION_ID;
Для нових категорій, відсутніх у маппінгу, — складайте товари в розділ «Без категорії» та логуйте. Автоматичне створення розділів небезпечно: одна помилка у даних джерела — і у каталозі з'являються сміттєві розділи.
Обробка зображень
Зображення з зовнішніх джерел потребують обробки перед завантаженням у Бітрікс:
-
Зміна розміру — джерело відправляє зображення 4000×3000, а у каталозі потрібно не більше 1200×1200. Використовуйте
\Bitrix\Main\File\Image\Imagickабо GD для зміни розміру до завантаження. - Формат — конвертація WebP в JPEG, якщо Бітрікс налаштований без підтримки WebP.
- Водяні знаки — видалення неможливе без втрати якості, але можна відсікти кропом, якщо знак у кутку.
- Дубли — один товар з п'ятьма однаковими фото. Порівняння по md5 файлу перед завантаженням.
Валідація перед імпортом
Трансформовані дані потрібно валідувати перед записом в інфоблок:
| Поле | Правило | Дія при порушенні |
|---|---|---|
NAME |
Не пустое, 3–255 символів | Пропустити елемент, записати в лог |
XML_ID |
Унікальне, не пустое | Пропустити (дубль) |
PRICE |
Число > 0 | Встановити 0, позначити для перевірки |
SECTION_ID |
Існуючий розділ | Помістити в «Без категорії» |
PREVIEW_PICTURE |
Файл існує, розмір < 10 МБ | Імпортувати без картинки |
Валідація реалізується як окремий етап пайплайну — між трансформацією та імпортом. Елементи, які не пройшли валідацію, потрапляють у окрему таблицю parser_rejected з указанням причини відхилення.
Конфігурація трансформацій
Правила трансформації повинні бути конфігурованими, а не зашитими в код. Формат конфігурації:
$transformRules = [
'NAME' => [
['type' => 'trim'],
['type' => 'mb_title_case'],
['type' => 'max_length', 'value' => 255],
],
'PRICE' => [
['type' => 'extract_number'],
['type' => 'multiply', 'value' => 1.2], // Наценка 20%
['type' => 'round', 'value' => 2],
],
'PROPERTY_WEIGHT' => [
['type' => 'extract_number'],
['type' => 'convert_unit', 'from' => 'kg', 'to' => 'g'],
],
];
Кожне правило — окрема функція-трансформер. Ланцюг правил застосовується послідовно. Такий підхід дозволяє змінювати логіку трансформації без правки коду парсера.







