Пользователи в Битрикс D7: регистрация, авторизация, группы и свойства

Работа с пользователями — одна из самых частых задач в Битрикс-разработке. Рассмотрим как регистрировать, авторизовать и управлять пользователями через современный API.

Получение текущего пользователя

global $USER;

// Проверка авторизации
if ($USER->IsAuthorized()) {
    $userId   = $USER->GetID();
    $userEmail = $USER->GetEmail();
    $userName  = $USER->GetFirstName();
    
    // Проверка группы
    if ($USER->IsAdmin()) {
        echo 'Администратор';
    }
    if ($USER->IsInGroup(5)) {
        echo 'Пользователь в группе 5';
    }
}

Получение данных пользователя через D7

use Bitrix\Main\UserTable;

// Один пользователь
$user = UserTable::getById(42)->fetch();

// Список с фильтром
$users = UserTable::getList([
    'select' => ['ID', 'NAME', 'LAST_NAME', 'EMAIL', 'DATE_REGISTER'],
    'filter' => [
        'ACTIVE'  => 'Y',
        '%EMAIL'  => '@company.ru',  // LIKE
    ],
    'order'  => ['DATE_REGISTER' => 'DESC'],
    'limit'  => 50,
])->fetchAll();

// Получить пользователей группы
$users = UserTable::getList([
    'filter' => ['GROUPS.GROUP_ID' => 5],
])->fetchAll();

Регистрация пользователя

$user = new \CUser();

$userData = [
    'NAME'               => 'Иван',
    'LAST_NAME'          => 'Иванов',
    'EMAIL'              => 'ivan@example.com',
    'LOGIN'              => 'ivan@example.com',
    'PASSWORD'           => 'SecurePass123!',
    'CONFIRM_PASSWORD'   => 'SecurePass123!',
    'ACTIVE'             => 'Y',
    'GROUP_ID'           => [2], // группа "Пользователи"
];

$userId = $user->Add($userData);

if (intval($userId) > 0) {
    echo 'Пользователь создан: ' . $userId;
} else {
    echo 'Ошибка: ' . $user->LAST_ERROR;
}

Авторизация пользователя

global $USER;

// Авторизация по логину/паролю
$result = $USER->Login('ivan@example.com', 'password', 'Y');

if ($result !== true) {
    echo 'Ошибка входа: ' . $result['MESSAGE'];
} else {
    echo 'Авторизован: ' . $USER->GetID();
}

// Авторизация без пароля (для API)
$USER->Authorize($userId);

Обновление пользователя

$user = new \CUser();

$result = $user->Update($userId, [
    'NAME'      => 'Пётр',
    'LAST_NAME' => 'Петров',
    'PERSONAL_PHONE' => '+79001234567',
]);

if (!$result) {
    echo 'Ошибка: ' . $user->LAST_ERROR;
}

Пользовательские свойства (UF_)

// Получить значение свойства
$userData = \CUser::GetByID($userId)->Fetch();
echo $userData['UF_COMPANY']; // кастомное поле

// Обновить через D7
$user = new \CUser();
$user->Update($userId, ['UF_COMPANY' => 'ООО Ромашка']);

// Или напрямую через D7 UserTable
\Bitrix\Main\UserTable::update($userId, [
    'UF_COMPANY' => 'ООО Ромашка',
]);

Управление группами

// Добавить пользователя в группу
\CUser::SetUserGroup($userId, array_merge(
    \CUser::GetUserGroup($userId),
    [5] // ID группы
));

// Убрать из группы
$groups = \CUser::GetUserGroup($userId);
$groups = array_diff($groups, [5]);
\CUser::SetUserGroup($userId, array_values($groups));

Итог

Для выборок используйте UserTable::getList() — это быстрее и типизировано. Для изменений — new \CUser(), так как старый API обрабатывает события и кэш корректно. Никогда не обновляйте таблицу пользователей через raw SQL.