Задача

Связать базу пользователей на сайте с базой клиентов в облачной CRM.

Общее количество контактов на момент начала проекта было около 40 тысяч человек. 80% информации хранилось в дополнительных полях, которые не передаются при использовании стандартного компонента синхронизации сайта на 1С Битрикс с Битрикс24.

Синхронизация должна быть в обе стороны, при этом не только при создании, но и при любом обновлении клиента Ранее у Клиента уже работала синхронизация, которая частично связала данные между двумя системами. Основным недостатком имеющегося решения было то, что генерировалось большое количество дублей, данные часто портились или просто пропадали. Облачная CRM регулярно падала или выдавала непредсказуемый результат по API из-за чего синхронизация тоже регулярно падала.

Синхронизация происходила 1 раз в сутки и создавала большую нагрузку на сервер, что практически останавливало работу сайта.

На разрешение создающихся конфликтов был нанят отдельный человек на полную ставку. Необходимо было создать надежный и быстрый механизм синхронизации, позволяющий избавиться от ручного труда по исправлению конфликтов синхронизации.

Дополнительно требовалось автоматически решать возникающие конфликты, проверять на дубли и автоматически дополнять неполные данные.

Решение

В процессе проектирования было создано описание сущности клиента и сделано независимое ядро системы синхронизации, в котором была зашита «золотая» модель клиента. Все внешние системы (сайт, CRM и другие системы для подключения в будущем) являются просто хранилищами данных. Для каждой из систем пишется свой интерфейс, в зависимости от применяемой в конкретной системе модели данных, особенностей и ограничений в её работе.

Все внешние хранилища связываются не напрямую друг с другом, а обмениваются данными только с эталонной моделью в ядре.

Логика синхронизации получилась следующая:

  1. В одном из хранилищ запись изменена, синхронизация ставится в очередь.
  2. Измененная запись загружается в эталонную модель в ядре и проверяется на целостность
  3. В случае обнаружения неполных данных, они дополняются по внутренним правилам. При необходимости «битые» данные запрашиваются в других хранилищах.
  4. После загрузки и проверки данных, они выгружаются в остальные хранилища из эталонной модели
  5. В случае появления конфликтов, они разрешаются по внутренним правилам в ядре. Если решить конфликт не получилось, создается инцидент и отправляется уведомление ответственному сотруднику.

Для контроля работы ядра и разрешения конфликтов был создан веб-интерфейс, совмещенный с панелью управления сайтом.

Результат

Сразу после внедрения новой синхронизации количество конфликтов сократилось с десятков в день до 2-3 в месяц. Через 6 месяцев работы остались только единичные конфликты. По всем новым клиентам конфликты более не возникали.

Скорость обновления данных во всех системах сократилась с 1-2 суток до 10-20 минут. Отказы CRM обрабатываются автоматически и синхронизация возобновляется самостоятельно после восстановления API облачной CRM. Сразу после внедрения CRM была очищена от дублей и более они не появлялись.

Через 3 года работы интеграция была дополнена синхронизацией заказов из интернет-магазина.