Главная » API Битрикс » CUser » CUser::GetByID и получение данных текущего пользователя

CUser::GetByID и получение данных текущего пользователя

Схема получения данных пользователя в Битрикс: GetByID для конкретного ID, методы $USER для текущего

CUser::GetByID — самый частый способ получить данные конкретного пользователя, когда идентификатор уже известен: на странице профиля, в обработчике события, при выводе автора материала. Разберём метод и отдельно — работу с текущим авторизованным пользователем, которую с ним регулярно путают.

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

<?php

$result = CUser::GetByID($userId);

if ($user = $result->Fetch()) {
    echo $user['NAME'] . ' ' . $user['LAST_NAME'];
    echo $user['EMAIL'];
}

Метод возвращает объект выборки даже для одной записи — данные извлекаются через Fetch(), а не напрямую как массив. Если пользователя с таким ID не существует, Fetch() вернёт false.

Текущий авторизованный пользователь

Частая ошибка — вызывать GetByID для получения данных текущего посетителя. Для этого существует более прямой путь через глобальный объект:

<?php

global $USER;

if ($USER->IsAuthorized()) {
    $userId = $USER->GetID();
    $name   = $USER->GetFullName();
    $email  = $USER->GetEmail();
}

У объекта $USER уже загружены основные данные текущего пользователя без обращения к базе — вызов GetByID($USER->GetID()) для получения тех же самых стандартных полей избыточен и создаёт лишний запрос.

Нужна помощь с Битрикс?





    Когда GetByID всё-таки нужен для текущего пользователя

    Объект $USER не содержит UF-поля автоматически. Если нужны именно они — например, телефон или дополнительные данные профиля, — обращение к базе через GetByID оправдано:

    <?php
    
    global $USER;
    
    $userData = CUser::GetByID($USER->GetID())->Fetch();
    
    echo $userData['UF_PHONE'];

    Получение только нужных полей

    GetByID не принимает список полей для выборки — метод всегда возвращает полный набор. Если нужно ограничить объём данных или явно указать UF-поля, точнее использовать GetList с фильтром по ID:

    <?php
    
    $result = CUser::GetList(
        'ID', 'ASC',
        ['ID' => $userId],
        ['SELECT' => ['UF_PHONE']]
    );
    
    $user = $result->Fetch();

    Полное устройство фильтров и параметра SELECT у метода GetList — тема отдельного разбора, здесь же важно запомнить сам принцип: за конкретными полями идём к GetList, за полным набором данных одного пользователя — к GetByID.

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

    Если данные одного и того же пользователя запрашиваются несколько раз за хит (например, автор в списке из нескольких материалов одного и того же человека), стоит избегать повторных вызовов GetByID на каждый элемент списка — данные пользователя меняются нечасто, поэтому их можно кешировать в статической переменной в пределах одного запроса:

    <?php
    
    function getCachedUser(int $userId): ?array
    {
        static $cache = [];
    
        if (!isset($cache[$userId])) {
            $cache[$userId] = CUser::GetByID($userId)->Fetch() ?: null;
        }
    
        return $cache[$userId];
    }

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

    Обработка удалённого пользователя

    Если пользователь, на которого ссылается материал или заказ, был удалён из системы, GetByID вернёт объект выборки, у которого Fetch() даст false, — код, рассчитанный только на существующего пользователя, в этом случае упадёт с ошибкой при обращении к полям несуществующего массива. Для данных, отображаемых публично (например, автор комментария), стоит заранее предусмотреть текст-заглушку вместо падения при показе материалов от удалённых учётных записей:

    <?php
    
    $user = CUser::GetByID($authorId)->Fetch();
    $authorName = $user ? $user['NAME'] . ' ' . $user['LAST_NAME'] : 'Пользователь удалён';

    Частые ошибки

    • Обращение к массиву без Fetch(). Результат — объект выборки, а не готовый массив данных.
    • Лишний запрос для текущего пользователя. Основные поля уже доступны через методы $USER без обращения к базе.
    • Нет проверки на существование пользователя. Fetch() на несуществующем ID вернёт false, и обращение к полям несуществующего массива вызовет ошибку.

    Итог

    CUser::GetByID подходит для получения данных конкретного пользователя по известному идентификатору. Для текущего авторизованного посетителя быстрее и правильнее использовать методы глобального объекта $USER — обращение к базе через GetByID оправдано только тогда, когда нужны UF-поля, которых нет в уже загруженных данных сессии.

    Нужна помощь с Битрикс?

    Исправим ошибку, доработаем сайт, ускорим Битрикс или поможем разобраться с проблемой.

    Услуги
    База знаний