Настройка трансформации данных при парсинге для 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'],
],
];
Каждое правило — отдельная функция-трансформер. Цепочка правил применяется последовательно. Такой подход позволяет менять логику трансформации без правки кода парсера.







