Налаштування єдиного профілю клієнта на 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С-Bitrix

Клієнт розміщує замовлення на сайті під одним email, потім телефонує в call-центр і називає інший номер телефону, потім входить з мобільного додатку як гість. У результаті в базі три різних «клієнти», а менеджер не бачить повної історії. Це класична проблема дублювання профілів, яку вирішує єдиний профіль клієнта — Customer Data Profile — у зв'язці з модулем sale та CRM Bitrix24.

Як зберігаються дані користувача в Bitrix

Ядро працює з двома незалежними сутностями: користувач (b_user) та покупець (b_sale_person_type + b_sale_order_user). При розміщенні анонімного замовлення створюється запис в b_sale_order з USER_ID = 0 та контактними даними в полях b_sale_order_props_value. При реєстрації чи авторизації замовлення прив'язуються до конкретного USER_ID, але зв'язок «гостьовські замовлення → зареєстрований користувач» не будується автоматично.

Крім того, якщо на проекті підключено модуль crm, кожне замовлення через подію OnSaleOrderSaved створює або оновлює сутність CCrmContact та CCrmDeal. Дублювання на рівні b_user негайно порождає дублювання контактів у CRM.

Механізм злиття профілів

Єдиний профіль будується через три компоненти:

1. Ідентифікація за детермінованими полями. Email та телефон — основні ключі злиття. У таблиці b_user поля EMAIL та PERSONAL_PHONE мають бути унікальними (індекс UQ_USER_EMAIL). Проблема в тому, що за замовчуванням Bitrix не забороняє двом користувачам мати однаковий телефон, якщо той зберігається в користувацьких властивостях через b_user_field.

2. Злиття через API користувачів. При виявленні дублю викликається CUser::Merge() — метод переносить усі замовлення, підписки, бонусні бали на основний облік та дезактивує дубль. Важливо попередньо перевірити залежні таблиці: b_sale_order, b_sale_fuser, b_rating_vote, b_forum_user, b_subscribe_subscriber.

// Злиття: усі дані дублю переходять до основного користувача
$result = CUser::Merge($masterUserId, $duplicateUserId);
if (!$result) {
    // Логування причини — найчастіше конфлікт поля UNIQUE в b_user
    $GLOBALS['APPLICATION']->GetException();
}

3. Таблиця b_sale_fuser (fake user). Це ключова таблиця для анонімних сесій. Кожний гість отримує запис в b_sale_fuser з USER_ID = NULL. При вході метод CSaleUser::DoAutoLogin() має прив'язати FUSER_ID до справжнього USER_ID. Якщо цей крок пропущено — кошик та незавершені замовлення залишаються «підвішеними» і не потрапляють у профіль.

Користувацькі поля як джерело проблем

Додаткові атрибути клієнта (дата народження, стать, переваги) зберігаються в b_uts_user — автоматично створюваній таблиці для користувацьких полів (UserTypeEntity з ENTITY_ID = 'USER'). При злитті через CUser::Merge() ці дані не переносяться автоматично — метод копіює тільки поля основної таблиці b_user. Необхідно вручну перенести значення з b_uts_user перед викликом злиття.

Прив'язка гостьовських дій після авторизації

Стандартний обробник OnAfterUserAuthorize спрацьовує при кожному вході. В ньому зручно реалізувати:

AddEventHandler('main', 'OnAfterUserAuthorize', function($fields) {
    if ($fields['USER_ID'] > 0) {
        // Переносимо кошик гостя на авторизованого користувача
        $fuserId = CSaleUser::GetAnonymousUserID();
        CSaleBasket::TransferBasket($fuserId, $fields['USER_ID']);
        // Прив'язуємо історію переглядів (b_catalog_viewed)
        // Переносимо відкладені товари (b_sale_basket з LID = 'Y')
    }
});

Що ми налаштовуємо

  • Аудит таблиці b_user на дублі за email та телефоном з пошуком через GROUP BY + HAVING COUNT(*) > 1
  • Скрипт дедупліцирації з пріоритизацією основного облику (за датою реєстрації чи кількістю замовлень)
  • Перенос даних з b_uts_user, b_sale_order, b_sale_fuser при злитті
  • Обробник OnAfterUserAuthorize для прив'язування гостьовських дій до профілю
  • Налаштування унікальних індексів на телефон, якщо він зберігається в b_user_field
  • Інтеграція з CRM: дедупліцирація CCrmContact за PHONE через CCrmContactHelper::FindDuplicate()