Налаштування дедуплікації товарів при автонаповненні 1С-Бітрікс

Наша компанія займається розробкою, підтримкою та обслуговуванням рішень на Бітрікс та Бітрікс24 будь-якої складності. Від простих односторінкових сайтів до складних інтернет-магазинів, CRM систем з інтеграцією 1С та телефонії. Досвід розробників підтверджено сертифікатами від вендора.
Пропоновані послуги
Показано 1 з 1 послугУсі 1626 послуг
Налаштування дедуплікації товарів при автонаповненні 1С-Бітрікс
Проста
~1 робочий день
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Розробка на базі Бітрікс, Бітрікс24, 1С для компанії Development of an Online
    585
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    751
  • image_crm_dolbimby_434_0.webp
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    657
  • image_crm_technotorgcomplex_453_0.webp
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    989

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

Пакетна дедублікація існуючого каталогу

Якщо каталог уже містить дубли — потрібна разова чистка. Алгоритм:

  1. Виконати вивантаження всіх елементів: ID, NAME, XML_ID, ключові властивості.
  2. Нормалізувати назви.
  3. Згрупувати по нормалізованій назві + бренду.
  4. У кожній групі вибрати «мастер-запис» (найповніша карточка, найбільший ID або пріоритетне джерело).
  5. Перенести замовлення, привязки, властивості з дублів на мастер-запис.
  6. Деактивувати дубли (ACTIVE = 'N'), не видаляти.

Не видаляйте дубли відразу. Деактивуйте та залишіть на 2–4 тижні. Якщо виявиться помилка в алгоритмі — елементи можна відновити.