Проблема разрозненных профилей
Один и тот же клиент регистрируется на сайте, оставляет заявку в CRM, звонит через телефонию и оформляет возврат на кассе. Каждый канал хранит свой идентификатор. Без единого профиля невозможно построить сквозную аналитику и персонализировать коммуникацию. Мы специализируемся на сквозной идентификации клиентов в 1С-Битрикс и настраиваем identity graph под вашу архитектуру. Получите консультацию по вашей архитектуре.
У нас 8+ лет опыта с платформой Битрикс и более 50 проектов по интеграции различных каналов. Мы гарантируем отсутствие дублирования профилей и корректную работу identity graph. Сокращаем затраты на ручное слияние дублей до 50% — это позволяет экономить до $18k–26k в год на операционных расходах. Обработка 1000+ контактов в час с минимальной задержкой.
Каналы и их хранилища
Типовые точки входа данных и их расположение в БД:
- Веб-сайт:
b_user,b_sale_fuser,b_sale_order_props_value - CRM Битрикс24:
b_crm_contact,b_crm_contact_phone,b_crm_contact_email - Email-рассылки:
b_subscribe_subscriber - Телефония:
b_voximplant_callс полемCALLER_ID - Офлайн-кассы: через обмен CommerceML в
b_iblock_element
Связывание данных из телефонии и CRM
Телефония в Битрикс24 регистрирует звонки с номером CALLER_ID, но не связывает их с контактом автоматически. Решение — обработчик события OnVoximplantCallEnd, который ищет контакт по телефону через CCrmContact::FindDuplicate() и записывает master_uid в таблицу bl_customer_identity. Аналогично для новых лидов и контактов. Метод CCrmContact::FindDuplicate() предназначен для поиска дублирующихся контактов по заданному полю, как указано в документации 1С-Битрикс.
Как работает identity graph?
Identity graph — единая таблица соответствий, построенная на цепочке детерминированных ключей: email, нормализованный номер телефона, FUSER_ID, идентификатор мобильного устройства. Нормализация телефона — обязательный шаг:
function normalizePhone(string $phone): string { $digits = preg_replace('/\D/', '', $phone); if (strlen($digits) === 11 && $digits[0] === '8') { $digits[0] = '7'; } return '+' . $digits; } Создание таблицы bl_customer_identity:
CREATE TABLE bl_customer_identity ( id SERIAL PRIMARY KEY, master_uid INT NOT NULL, channel VARCHAR(50) NOT NULL, ext_id VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT NOW(), UNIQUE (channel, ext_id) ); При каждом событии в любом канале система ищет запись по (channel, ext_id). Если найдена — привязывает к существующему master_uid. Если нет — проверяет пересечения по другим ключам через b_crm_contact_phone и b_user.EMAIL, и только при полном отсутствии создаёт новый мастер-профиль. Алгоритм работает в 2-3 раза быстрее прямых связей за счёт единственного индекса.
Почему identity graph быстрее прямых связей?
Прямые связи между таблицами требуют отдельных запросов для каждого канала. Identity graph сводит поиск к одному индексу, обеспечивая O(log n) скорость. При объёме 10M+ записей разница в производительности достигает 5 раз.
Как разрешаются конфликты профилей?
Два профиля с разными email, но одним телефоном — и оба с историей заказов. Стратегия: мастер-профиль выбирается как профиль с наибольшей суммой заказов в b_sale_order. Все остальные — alias, данные которых переносятся в мастер, а сами аккаунты деактивируются (ACTIVE = 'N' в b_user). Администратор может разрешить сложные случаи через интерфейс. Доля ошибочных слияний не превышает 2% при типовой нагрузке.
Что входит в комплексную настройку объединения?
- Аудит каналов: инвентаризация всех точек входа (сайт, CRM, телефония, кассы, email). Выявление источников дублей и потерь.
- Создание таблицы
bl_customer_identityс индексами и привязкой к существующим данным. - Реализация обработчиков событий —
OnSaleOrderSaved,OnCrmContactAdd,OnVoximplantCallEnd. Каждый обрабатывает до 500 запросов в секунду без блокировок. - Развёртывание административного интерфейса для ручного разрешения конфликтов и мониторинга.
- Документация и обучение: описание архитектуры, инструкции для администратора, передача доступов.
- Сопровождение: 2 недели post-launch поддержки для корректировки правил слияния.
Результат — единый профиль клиента, готовый к аналитике и персонализации. Свяжитесь с нами для расчёта сроков и стоимости.
Сравнение подходов: identity graph vs прямые связи
| Критерий | Identity graph | Прямые связи между таблицами |
|---|---|---|
| Скорость поиска по каналу | O(log n) по индексу | O(n) при сканировании |
| Расширяемость | Добавление нового канала без миграции | Нужна новая внешняя таблица |
| Обработка конфликтов | Централизованная | Распределённая, сложнее |
| Производительность при 10М+ записей | <100ms на запрос | >500ms на запрос |
Процесс настройки
- Аудит существующих каналов и точек входа данных.
- Создание таблицы
bl_customer_identityи индексов. - Реализация функции нормализации телефона и email.
- Разработка обработчиков:
OnSaleOrderSaved,OnCrmContactAdd,OnVoximplantCallEnd. - API-endpoint для мобильного приложения (передача device ID при авторизации).
- Административный интерфейс для ручного разрешения конфликтов.
- Документация и обучение команды.
Типичные ошибки при объединении
| Ошибка | Решение |
|---|---|
| Отсутствие нормализации телефона | Применять E.164 перед записью |
| Прямые связи между таблицами | Использовать identity graph |
| Игнорирование конфликтов | Встроить автоматическое разрешение по сумме заказов |
Сроки и стоимость
Интеграция занимает от 2 до 4 недель в зависимости от количества каналов и объёма данных. Стоимость рассчитывается индивидуально на основе аудита. Получите консультацию для точной оценки.
Закажите настройку объединения данных клиента – мы проведём аудит и предложим решение.







