Пользователи backend
Пользователи БУС (Битрикс Управление Сайтом), они же пользователи "backend", тесно связаны с пользователями портала битрикс24 (коробочной версии).
Пользователь создается через портал битрикс24 (коробочная версия). Обычно через приглашение сотрудника по email.
При регистрации и изменении пользователя коробки происходит перехват события и запрос к api создания пользователя БУС.
POST https://bgs-group.eu/api/user/
token=#TOKEN#&crm_user_id=#CRM_ISER_ID#
API на самом деле запускает механизм импорта пользователя, который подтягивает его данные из CRM и создает пользователя в БУС (если не нашел уже существующего):
//local/app/Rest/UserEntity.php
try {
//user will be imported in bitrix and created if necessary
$result = UserTableImport::importUser($crmUserId);
return ['data' => ['success' => $result]];
}
Импорт
Импорт получает данные пользователя из CRM и сверяет их с данными в локальной таблице bgs_crm_users.
Если данных в локальной таблице нет - то происходит также регистрация нового пользователя БУС:
//local/app/Crm/User/Tables/UserTableImport.php
CrmUserRegistration::register($crmUserId);
Если пользователь CRM не активен - то проиходит только деактивация пользователя в БУС:
//local/app/Crm/User/Tables/UserTableImport.php
// deactivate user if non-active at crm but still active at imported list
if (!!$importedUser && !!boolval($importedUser['ACTIVE'])) {
self::deactivateUser($crmUserId);
}
continue;
Если пользователя коробки перенесли в отдел CRM в структуре компании, то пока ничего не делаем с ним в БУС:
//local/app/Crm/User/Tables/UserTableImport.php
// skip if user was moved to CRM department
if (self::isUserAtCrmDepartment($userData)) {
continue;
}
Далее происходит удаление строки из локальной таблицы, с последующим добавлением новой строки:
//local/app/Crm/User/Tables/UserTableImport.php
// if user exists delete from import table
if (!!$importedUser) {
self::deleteUser($crmUserId);
}
self::addUser($userData);
Раз в день (в зависимости от настроек cron), происходит импорт всех пользователей по тому же механизму.
Регистрация
Пользователь регистрируется автоматически при выполнении механизма импорта пользователя.
BGSGroup\User\CrmUserRegistration::register($crmUserId);
При этом, если пользователь уже существует в таблице b_user (проверка по crm_user_id), то сразу возвращается объект, содержащий его локальный ID
//local/app/User/CrmUserRegistration.php
if ($bxUserId = self::getBitrixUserByID($crm_user_id)) {
return (object)['id' => $bxUserId];
}
В противном случае идет попытка найти пользователь по email. В случае успеха ему привязывается внешний ID, и возвращается объект с локальным ID
//local/app/User/CrmUserRegistration.php
// set crm user ID if bx user was found by EMAIL and return data with bx ID
if ($bxUserId = self::getBitrixUserByEmail($user['EMAIL'])) {
self::setBitrixUserCrmID($bxUserId, $crm_user_id);
return (object)['id' => $bxUserId];
}
Если же пользователь так и не был найден, создается новый, используя стандартный API битрикс (CUser::Add, включая стандартные события OnBeforeUserRegister и OnAfterUserRegister).
//local/app/User/CrmUserRegistration.php
$registerResult = UserRegistration::register($user);
После этого вызывается метод, который выполняет процессы, связанные с созданием пользователя (отправка уведомлений и прочее). Например, пользователь получает пароль для входа в backend в чате портала (как уведомление):

//local/app/User/CrmUserRegistration.php
self::afterRegister($registerResult, $crm_user_id);
Авторизация
При авторизации срабатывает событие, которое синхронизирует данные пользователя (имя, фамилию, фото) с данными в локальной таблице bgs_crm_users.
//bitrix/php_interface/include/EventHandlers/CrmUserRegistration.php
AddEventHandler("main", "OnAfterUserLogin", [
'\BGSGroup\EventHandlers\CrmUserCheckRights',
"checkUserData"
]);
Здесь же проверяются группы пользователя, если у него стоит галочка в форме редактирования пользователя БУС:

Группы устанавливаются в зависимости от отделов, к которым принадлежит пользователь на портале. Настройка привязки групп к отделам происходит в настройках в backend (вкладка `Bitrix24):
