Настройка дедупликации товаров при автонаполнении 1С-Битрикс
Автонаполнение каталога из нескольких источников неизбежно порождает дубли. Один и тот же товар — «Bosch GSR 18V-50» — приходит от трёх поставщиков с разными названиями, артикулами и описаниями. Без дедупликации каталог разрастается, фильтры показывают одно и то же, а менеджеры тратят часы на ручную чистку. Разберём механизмы дедупликации на уровне Битрикс.
Уровни дедупликации
1. Точное совпадение по ключу. Самый надёжный метод. Если у товара есть уникальный внешний идентификатор — EAN, GTIN, артикул производителя — дедупликация тривиальна: проверяем наличие элемента с таким XML_ID или значением свойства PROPERTY_ARTICLE.
$existing = CIBlockElement::GetList(
[],
['IBLOCK_ID' => $iblockId, 'XML_ID' => $externalId],
false,
['nTopCount' => 1],
['ID']
)->Fetch();
if ($existing) {
// Обновляем существующий
(new CIBlockElement())->Update($existing['ID'], $arFields);
} else {
// Создаём новый
(new CIBlockElement())->Add($arFields);
}
Проблема: не все источники предоставляют стабильный уникальный идентификатор. Артикул поставщика ≠ артикул производителя. У одного товара может быть 3–5 разных артикулов от разных поставщиков.
2. Совпадение по комбинации полей. Если уникального ключа нет — ищем по комбинации: название + бренд + ключевая характеристика (объём, вес, размер).
$filter = [
'IBLOCK_ID' => $iblockId,
'%NAME' => $normalizedName,
'PROPERTY_BRAND' => $brand,
];
Перед сравнением названия нормализуются: приведение к нижнему регистру, удаление лишних пробелов, замена типографских символов.
3. Нечёткое сопоставление. Когда название у разных поставщиков различается: «Bosch GSR 18V-50 Professional» vs «Шуруповёрт Bosch GSR18V50». Используются алгоритмы нечёткого сравнения: similar_text(), расстояние Левенштейна, триграммы.
Нормализация перед сравнением
Качество дедупликации напрямую зависит от нормализации. Минимальный набор преобразований:
- Приведение к нижнему регистру:
mb_strtolower(). - Удаление спецсимволов: скобки, кавычки, дефисы, слеши.
- Удаление стоп-слов: «артикул», «арт.», «код», «модель».
- Нормализация пробелов: множественные пробелы → один.
- Удаление указаний единиц и размеров из названия (если они хранятся в отдельных свойствах).
function normalizeName(string $name): string
{
$name = mb_strtolower(trim($name));
$name = preg_replace('/[()«»"\'\/\-]/', ' ', $name);
$name = preg_replace('/\b(арт|артикул|код|модель)\b\.?/u', '', $name);
$name = preg_replace('/\s+/', ' ', $name);
return trim($name);
}
Стратегия слияния
Когда дубль найден — что делать с данными? Три стратегии:
| Стратегия | Логика | Когда использовать |
|---|---|---|
| Приоритет источника | Данные от источника с высшим приоритетом перезаписывают остальные | Есть один «эталонный» поставщик |
| Слияние полей | Пустые поля заполняются из альтернативного источника | Разные источники дополняют друг друга |
| Ручная модерация | Дубль помечается флагом, менеджер решает | Критичные данные, мало дублей |
На практике чаще всего используется комбинация: автоматическое слияние для некритичных полей (описание, фото) и маркировка для ручной проверки при расхождении цен или ключевых характеристик.
Реализация в Битрикс
Поле XML_ID элемента инфоблока — основной инструмент дедупликации. Индексируется по умолчанию, поиск по нему быстрый. Но для многоисточникового каталога одного XML_ID недостаточно.
Рекомендуемая схема: отдельный инфоблок-справочник parser_external_ids с полями:
-
NAME— внешний идентификатор (артикул поставщика). -
PROPERTY_SOURCE— источник (название поставщика). -
PROPERTY_ELEMENT_ID— ID основного элемента каталога. -
PROPERTY_MATCH_TYPE— тип совпадения (exact, fuzzy, manual).
При импорте парсер сначала ищет внешний ID в справочнике. Если найден — обновляет связанный элемент. Если нет — проверяет нечёткое совпадение по названию. Если совпадение найдено — создаёт связь в справочнике и обновляет элемент. Если нет — создаёт новый.
Пакетная дедупликация существующего каталога
Если каталог уже содержит дубли — нужна разовая чистка. Алгоритм:
- Выгрузить все элементы: ID, NAME, XML_ID, ключевые свойства.
- Нормализовать названия.
- Сгруппировать по нормализованному названию + бренду.
- В каждой группе выбрать «мастер-запись» (самая полная карточка, наибольший ID или приоритетный источник).
- Перенести заказы, привязки, свойства с дублей на мастер-запись.
- Деактивировать дубли (
ACTIVE = 'N'), не удалять.
Не удаляйте дубли сразу. Деактивируйте и оставьте на 2–4 недели. Если обнаружится ошибка в алгоритме — элементы можно восстановить.







