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-поля, которых нет в уже
загруженных данных сессии.
