Модуль main — ядро Битрикс: он отвечает за пользователей, группы, авторизацию и базовую модель прав. Понимание его API избавляет от костылей вроде прямых запросов в b_user и позволяет корректно управлять доступом, регистрацией и сессиями.
Классы для работы с пользователями
Основной инструмент — глобальный объект $USER (экземпляр CUser), доступный в контексте страницы, и класс CUser для CRUD-операций. Рядом есть D7-таблица \Bitrix\Main\UserTable для выборок в ORM-стиле.
$USER->GetID()— ID текущего пользователя;$USER->IsAuthorized()— авторизован ли;$USER->IsAdmin()— состоит ли в группе с полным доступом;$USER->GetUserGroupArray()— массив ID групп (включая группу «Все пользователи»).
$USER существует только на страницах, где инициализирован пролог. В агентах, cron-скриптах и обработчиках его может не быть — создавайте свой экземпляр: $USER = new CUser; или работайте через UserTable.Выборка пользователей
Старое API — CUser::GetList(), современное — UserTable::getList(). Второе предпочтительно для новых задач.
use Bitrix\Main\UserTable;
$rows = UserTable::getList([
'select' => ['ID', 'LOGIN', 'EMAIL', 'NAME', 'LAST_NAME'],
'filter' => ['=ACTIVE' => 'Y', '%EMAIL' => '@company.ru'],
'order' => ['LAST_NAME' => 'ASC'],
'limit' => 50,
])->fetchAll();
Пользовательские поля (UF_*) через UserTable напрямую не выбираются — для них используйте CUser::GetList() с параметром SELECT или отдельный запрос через $USER_FIELD_MANAGER. Проверка существования по логину/почте — тоже частая задача, решается фильтром выше.
Регистрация и изменение пользователя
Добавление — CUser::Add(), обновление — CUser::Update(). Метод возвращает ID при успехе либо false; текст ошибки лежит в $user->LAST_ERROR.
$user = new CUser;
$id = $user->Add([
'LOGIN' => 'ivanov',
'EMAIL' => 'ivanov@mail.ru',
'PASSWORD' => $pass,
'CONFIRM_PASSWORD' => $pass,
'NAME' => 'Иван',
'GROUP_ID' => [3, 6],
'ACTIVE' => 'Y',
'UF_CITY' => 'Казань',
]);
if (!$id) {
echo $user->LAST_ERROR;
}
Группы пользователей
Права в Битрикс раздаются в первую очередь через группы (b_group). Управление составом групп у пользователя:
- получить группы:
CUser::GetUserGroup($userId); - полностью переопределить:
CUser::SetUserGroup($userId, [3, 6, 8]); - добавить в группу, сохранив остальные:
CUser::AppendUserGroup($userId, [8]).
| Группа | ID по умолчанию |
|---|---|
| Администраторы | 1 |
| Все пользователи (в т. ч. неавторизованные) | 2 |
| Зарегистрированные | 4 |
Группа с ID 2 неявно присутствует у всех — на неё удобно вешать базовые права на публичные разделы.
Авторизация из кода
Программная авторизация нужна для SSO, автологина после регистрации и служебных сценариев.
$USER->Login($login, $password, $remember)— обычный вход с проверкой пароля;$USER->Authorize($userId)— принудительная авторизация по ID без пароля (для доверенных сценариев вроде токена или внешней аутентификации);$USER->Logout()— выход.
global $USER;
if (!is_object($USER)) $USER = new CUser;
$USER->Authorize($userId);
Authorize() обходит проверку пароля, поэтому вызывайте его только после того, как сами убедились в подлинности пользователя (проверили токен, подпись, ответ внешнего провайдера).Проверка прав доступа
Битрикс различает несколько уровней прав. Базовые проверки:
- доступ к модулю в админке —
$USER->CanDoOperation('view_all_users')илиCMain::GetUserRight('main', $USER->GetUserGroupArray()); - операции модуля — механизм
operations/tasks(CTask,COperation); - права на инфоблоки, файлы, разделы — через права соответствующих модулей.
Для проверки административного доступа к конкретному модулю:
$level = $APPLICATION->GetGroupRight('iblock');
if ($level < 'W') {
// нет прав на запись
}
Буквенные уровни (D — запрещено, R — чтение, W — запись, X — полный доступ) сравниваются как строки, что исторически работает корректно.
События модуля main
На жизненный цикл пользователя навешивается интеграционная логика — синхронизация с CRM, приветственные письма, начисление бонусов.
| Событие | Когда срабатывает |
|---|---|
OnBeforeUserAdd | перед добавлением — можно отменить |
OnAfterUserRegister | после успешной регистрации |
OnBeforeUserUpdate / OnAfterUserUpdate | изменение профиля |
OnAfterUserLogin / OnAfterUserLogout | вход/выход |
Регистрация обработчика — через \Bitrix\Main\EventManager::getInstance()->addEventHandler('main', 'OnAfterUserRegister', $callback) в init.php. События OnBefore* позволяют отменить операцию, вернув в объект-результат ошибку.
Итог
Модуль main даёт полный набор для работы с пользователями: CUser/UserTable для CRUD и выборок, группы для раздачи прав, Login/Authorize для авторизации и буквенные уровни доступа для проверок. Пароли хеширует само ядро, права строятся на группах, а события покрывают весь жизненный цикл аккаунта.
Когда учётные записи завязаны на CRM, единый логин между сервисами или сложную ролевую модель, ошибки в правах превращаются в утечки и инциденты. Мы в B2Bsite проектируем такие механизмы — от кастомной авторизации и SSO до интеграции пользователей с Битрикс24 и внешними системами.
Частые вопросы
Чем UserTable отличается от CUser::GetList()?
UserTable — это ORM-выборка с привычным синтаксисом select/filter/order, удобная для новых задач. CUser::GetList() старее, но умеет отдавать пользовательские поля UF_* напрямую, что через UserTable сделать сложнее.
Как авторизовать пользователя без пароля?
Методом $USER->Authorize($userId). Он пропускает проверку пароля, поэтому применять его можно только после собственной проверки подлинности — например, валидного токена или ответа внешнего провайдера SSO.
Нужно ли хешировать пароль перед CUser::Add()?
Нет. Передавайте пароль в открытом виде в поля PASSWORD и CONFIRM_PASSWORD — Битрикс сам применит алгоритм хеширования и соль. Запись готового хеша ломает восстановление доступа.
Как добавить пользователя в группу, не сбросив остальные?
Используйте CUser::AppendUserGroup($userId, [ID]). Метод SetUserGroup, наоборот, полностью заменяет список групп, поэтому им легко случайно лишить пользователя прав.
Почему $USER недоступен в агенте или cron?
Глобальный $USER создаётся прологом публичной страницы. В агентах и консольных скриптах пролога нет — создавайте объект сами через new CUser либо работайте с UserTable без привязки к текущей сессии.
Как проверить права на модуль в админке?
Через $APPLICATION->GetGroupRight('код_модуля'), который вернёт буквенный уровень (D, R, W, X). Сравнивайте его как строку: например, $level >= 'W' означает наличие прав на запись.
Где ловить факт регистрации нового пользователя?
На событии OnAfterUserRegister модуля main — оно срабатывает после успешного создания аккаунта через форму регистрации. Для программного добавления через CUser::Add() используйте OnAfterUserAdd.
Как получить все группы текущего пользователя?
Метод $USER->GetUserGroupArray() возвращает массив ID групп, включая неявную группу 2 (все пользователи). На неё удобно опираться при проверке базовых прав к публичным разделам.
Поможем с настройкой и поддержкой Для разработчиков
Поможем с настройкой, доработкой и поддержкой Для разработчиков.