Парсинг характеристик товаров для наполнения 1С-Битрикс
Характеристики — основа фильтрации каталога. Без правильно заполненных свойств (b_iblock_element_property) умный фильтр Битрикса не работает, фасетный поиск даёт нулевой результат, и покупатель не может отобрать нужные товары. Парсинг характеристик технически сложнее парсинга описаний: нужно не просто вытащить текст, а распознать структуру «название параметра — значение» и правильно положить данные в свойства инфоблока.
Форматы характеристик на источниках
Таблица спецификаций бывает нескольких типов:
HTML-таблица (<table>) — классика, парсится через XPath //table//tr. Первая ячейка строки — название, вторая — значение.
Список dl/dt/dd — часто используется в современных магазинах. Парсим пары dt+dd.
JSON-LD или микроразметка schema.org — идеальный вариант. Данные уже структурированы, не нужно парсить HTML:
preg_match('/<script type="application\/ld\+json">(.*?)<\/script>/s', $html, $m);
$data = json_decode($m[1], true);
JS-переменные — данные в window.productData или __REDUX_STATE__. Извлекаем regex'ом.
Нормализация названий характеристик
Разные источники называют одно и то же по-разному: «Вес», «Масса нетто», «Weight (kg)». Прямой маппинг в свойство инфоблока без нормализации создаёт хаос.
Решение: таблица алиасов property_aliases:
CREATE TABLE parser_property_aliases (
alias VARCHAR(255),
canonical_name VARCHAR(255),
property_code VARCHAR(100)
);
При парсинге каждое найденное название ищем в таблице алиасов. Если не найдено — логируем как «неизвестное свойство» для ручной проверки и добавления в словарь.
Маппинг на свойства инфоблока
Свойства инфоблока (b_iblock_property) имеют типы: S (строка), N (число), L (список), E (привязка к элементу). Для характеристик обычно используют:
-
S— текстовые значения («Цвет: красный») -
N— числовые с единицей измерения (задаётся вPROPERTY_TYPE = N,USER_TYPE =пусто) -
L— фиксированный список значений (для фильтра важно)
Для фасетного фильтра Битрикса (bitrix:catalog.smart.filter) значения типа L работают быстрее, чем S — они индексируются в b_iblock_element_prop_enum.
Создание значения типа L при импорте:
// Получаем или создаём enum-значение
$propEnum = CIBlockPropertyEnum::GetList([], [
'PROPERTY_ID' => $propId,
'VALUE' => $parsedValue
])->Fetch();
if (!$propEnum) {
CIBlockPropertyEnum::Add(['PROPERTY_ID' => $propId, 'VALUE' => $parsedValue]);
}
Работа с единицами измерения
Источники дают «10 кг», «10kg», «10 килограммов». Нужен парсер единиц: разделяем число и единицу, нормализуем единицу к стандарту. Простой regex: /^([\d.,]+)\s*(.*)$/.
Числовые значения свойств в Битриксе хранятся как строки в b_iblock_element_property.VALUE — единицы измерения лучше вынести в отдельное свойство или добавлять к CODE свойства (WEIGHT_KG).
Кейс: электроника, 15 000 SKU, 120+ типов характеристик
Задача: наполнить свойства для умного фильтра по ноутбукам, телефонам, телевизорам — три инфоблока с разными наборами свойств.
Реализация:
- Парсинг с сайта производителя через JSON-LD (70% товаров) + HTML-таблица (30%)
- Словарь алиасов из 380 записей, собранный за первые 3 дня разработки
- Все числовые характеристики — тип
N, списочные (бренд, цвет, страна) — типL - Параллельный запуск 5 воркеров через PHP-CLI, каждый обрабатывает свою категорию
Результат: умный фильтр заработал корректно по 48 параметрам после 2 итераций отладки словаря алиасов.
Таймлайн работ
| Этап | Срок |
|---|---|
| Анализ структуры характеристик источника | 4–8 часов |
| Разработка парсера характеристик | 2–3 дня |
| Создание словаря алиасов, нормализация | 1–2 дня |
| Настройка свойств инфоблока под фильтр | 1 день |
| Импорт данных, отладка типов свойств | 1–2 дня |
| Проверка работы умного фильтра | 4–8 часов |
Итого: 7–12 рабочих дней — это одна из самых трудоёмких задач наполнения каталога.







