Налаштування дедублікації товарів при автозаповненні 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 тижні. Якщо виявиться помилка в алгоритмі — елементи можна відновити.







