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

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Настройка дедупликации товаров при автонаполнении 1С-Битрикс
Простая
~1 рабочий день
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1177
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    811
  • 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 Appointment Booking Widget for a Medical Center
    564
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    747
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

Настройка дедупликации товаров при автонаполнении 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 недели. Если обнаружится ошибка в алгоритме — элементы можно восстановить.