Налаштування об'єднання дублікатів у CRM Бітрікс24
Знайти дублікати — половина роботи. Друга половина — об'єднати їх так, щоб не втратити історію дзвінків, угоди, завдання та кастомні поля. Саме тут більшість компаній стикаються з реальними проблемами: після злиття зникають активності, неправильно вибирається «головна» картка, пов'язані угоди переносяться не туди.
Механізм об'єднання у Бітрікс24 працює через клас CCrmEntityMerger — він послідовно переносить пов'язані об'єкти, а потім видаляє поглинені записи. Важливо розуміти порядок операцій, щоб не отримати «битих» зв'язків.
Ручне об'єднання через інтерфейс
Базовий сценарій: CRM → Контакти → Знайти дублікати → вибрати групу → Об'єднати. Система показує картки поруч і пропонує вибрати, яке значення кожного поля залишити в результуючому записі.
Підводні камені ручного режиму:
- При об'єднанні компаній пов'язані контакти автоматично переносяться до «головної» — перевірте, що вибрали правильну.
- Файли з поглинених карток переносяться, але їхній вихідний шлях у
b_disk_objectзмінюється — якщо є зовнішні посилання на файли, вони зламаються. - Користувацькі поля типу «список» об'єднуються лише якщо увімкнено опцію «множинний вибір»; одиночні значення беруться з головного запису, решта втрачаються.
Налаштування правил злиття
У розділі CRM → Налаштування → Дублікати → Правила об'єднання задається логіка вибору значень при конфлікті полів:
| Правило | Поведінка |
|---|---|
| Головний запис | Береться значення з вибраної «головної» картки |
| Більш заповнений | Береться непорожнє значення; при конфлікті — з головного |
| Об'єднання | Застосовується для множинних полів (телефони, email) |
| Останній за датою | Береться значення із запису з пізнішою датою зміни |
Для більшості завдань оптимально: ключові ідентифікатори (код ЄДРПОУ, телефон, email) — «об'єднання»; статусні поля (відповідальний, стадія) — «головний запис»; текстові примітки — «більш заповнений».
Програмне об'єднання через API
При масовому очищенні бази ручний режим не підходить. REST-метод для злиття контактів:
// Об'єднання: запис 1001 поглинає 1002 і 1003
$response = CRest::call('crm.contact.merge', [
'id' => 1001,
'victims' => [1002, 1003],
'fields' => [
'PHONE' => 'merge', // об'єднати телефони
'EMAIL' => 'merge', // об'єднати email
'ASSIGNED_BY_ID' => 'primary', // відповідальний з головного
],
]);
Для компаній — аналогічно crm.company.merge. Метод синхронний; при об'єднанні понад 5 поглинених записів може спрацювати таймаут — розбивайте на пари.
Усередині Бітрікса на рівні PHP (коробочна версія):
$merger = new CCrmEntityMerger(CCrmOwnerType::Contact);
$merger->Merge(
1001, // ID головного запису
[1002, 1003], // жертви
$fields, // правила полів
$errorMessage
);
Перенесення пов'язаних об'єктів
Це критична частина, яку легко пропустити. При злитті автоматично переносяться:
- Угоди (поле
CONTACT_IDоновлюється) - Активності: дзвінки, листи, зустрічі з таблиці
b_crm_activity - Завдання через зв'язок
b_tasks_member - Часова шкала (
b_crm_timeline)
Не переносяться автоматично:
- Зв'язки через користувацькі блоки смарт-процесів (SPA) — потрібен окремий скрипт оновлення
- Зовнішні зв'язки зі сторонніх інтеграцій (дані в кастомних таблицях)
- Чати у Відкритих лініях — історія прив'язана до лінії, а не до контакту
Для смарт-процесів оновлення зв'язків потрібно виконувати вручну через crm.item.update з новим contactId.
Відкат об'єднання
Вбудованого відкату немає. Після злиття поглинені записи позначаються як видалені (прапорець DELETED=Y у b_crm_contact), але фізично залишаються в БД кілька днів до очищення кошика.
Часове вікно для відновлення: CRM → Налаштування → Кошик — поглинені картки потрапляють туди і доступні для відновлення протягом 30 днів (налаштовується). Після відновлення зв'язки з головним записом не відновлюються автоматично — їх доведеться перепризначити вручну.
Перед запуском масового злиття завжди робіть резервну копію таблиць b_crm_contact, b_crm_company, b_crm_deal та таблиць активностей.







