В современной веб-разработке авторизация по номеру телефона становится всё более популярной. Это удобно для пользователей — не нужно запоминать сложные пароли и логины, достаточно ввести свой номер и код подтверждения. 1С-Битрикс поддерживает такой способ аутентификации, но у многих разработчиков возникает вопрос: как программно найти пользователя по номеру телефона, который он использовал при регистрации?
На первый взгляд, задача кажется простой — достаточно поискать в полях PERSONAL_PHONE или PERSONAL_MOBILE таблицы пользователей. Однако это распространённая ошибка! Номер, используемый для авторизации, хранится совершенно в другом месте.
В этой статье мы подробно разберём:
-
Где именно в Битрикс хранится номер телефона для регистрации
-
Как правильно выполнить поиск с использованием D7 ORM
-
Готовые примеры кода для различных сценариев
Где хранится номер телефона для регистрации?
При включённой в настройках главного модуля опции «Разрешить регистрацию и авторизацию по номеру телефона» данные для входа сохраняются в отдельной таблице b_user_phone_auth. Поля профиля пользователя (PERSONAL_PHONE, PERSONAL_MOBILE, WORK_PHONE) к процессу авторизации не имеют отношения.
| Таблица | Поле | Назначение |
|---|---|---|
b_user_phone_auth
|
PHONE_NUMBER
|
Номер телефона, используемый для входа |
b_user_phone_auth
|
USER_ID
|
Связь с записью пользователя в таблице b_user
|
b_user
|
PERSONAL_PHONE
|
Личный телефон (заполняется в профиле, не участвует в авторизации) |
Нормализация номера телефона
В Битрикс для приведения номеров к единому формату используется встроенный метод \Bitrix\Main\UserPhoneAuthTable::normalizePhoneNumber(). Он сохраняет номер в формате E.164 (+7XXXXXXXXXX) на основе настроек страны из главного модуля.
Для поиска необходимо привести искомый номер к такому же формату:
use Bitrix\Main\UserPhoneAuthTable;
$searchPhone = "+70000000000";
$normalizedPhone = UserPhoneAuthTable::normalizePhoneNumber($searchPhone);Поиск пользователя по номеру регистрации
Пример 1: Базовый поиск с получением данных пользователя
Самый распространённый сценарий — найти пользователя и получить его данные:
use Bitrix\Main\UserPhoneAuthTable;
use Bitrix\Main\UserTable;
$searchPhone = "+70000000000";
$normalizedPhone = UserPhoneAuthTable::normalizePhoneNumber($searchPhone);
$phoneAuth = UserPhoneAuthTable::getList([
'filter' => ['=PHONE_NUMBER' => $normalizedPhone],
'select' => ['USER_ID']
])->fetch();
if ($phoneAuth) {
$user = UserTable::getList([
'filter' => ['=ID' => $phoneAuth['USER_ID']],
'select' => ['ID', 'LOGIN', 'NAME', 'LAST_NAME', 'EMAIL', 'DATE_REGISTER']
])->fetch();
echo "Пользователь найден:\n";
echo "ID: {$user['ID']}\n";
echo "Имя: {$user['NAME']} {$user['LAST_NAME']}\n";
echo "Логин: {$user['LOGIN']}\n";
echo "Email: {$user['EMAIL']}\n";
echo "Дата регистрации: {$user['DATE_REGISTER']}\n";
} else {
echo "Пользователь с номером {$searchPhone} не найден\n";
}Пример 2: Функция для получения пользователя по номеру телефона
Удобная функция-обёртка, которую можно переиспользовать в проекте:
use Bitrix\Main\UserPhoneAuthTable;
use Bitrix\Main\UserTable;
function getUserByPhone($phone): ?array
{
$normalized = UserPhoneAuthTable::normalizePhoneNumber($phone);
$phoneAuth = UserPhoneAuthTable::getList([
'filter' => ['=PHONE_NUMBER' => $normalized],
'select' => ['USER_ID']
])->fetch();
if (!$phoneAuth) {
return null;
}
return UserTable::getList([
'filter' => ['=ID' => $phoneAuth['USER_ID']],
'select' => ['ID', 'LOGIN', 'EMAIL', 'NAME', 'LAST_NAME', 'SECOND_NAME', 'PERSONAL_PHONE', 'DATE_REGISTER']
])->fetch();
}
// Использование
$user = getUserByPhone("+70000000000");
if ($user) {
echo "Найден: {$user['NAME']} {$user['LAST_NAME']}\n";
} else {
echo "Пользователь не найден\n";
}Пример 3: Проверка существования пользователя (без получения данных)
Если нужно только проверить, зарегистрирован ли пользователь, достаточно использовать getCount():
use Bitrix\Main\UserPhoneAuthTable;
function isUserExistsByPhone($phone): bool
{
$normalized = UserPhoneAuthTable::normalizePhoneNumber($phone);
$count = UserPhoneAuthTable::getCount([
'=PHONE_NUMBER' => $normalized
]);
return $count > 0;
}
// Использование
if (isUserExistsByPhone("+70000000000")) {
// Пользователь есть — можно отправлять SMS, предлагать вход и т.д.
echo "Пользователь зарегистрирован\n";
} else {
// Пользователя нет — можно предлагать регистрацию
echo "Пользователь не найден\n";
}Пример 4: Поиск по списку номеров
Массовый поиск пользователей по нескольким номерам:
use Bitrix\Main\UserPhoneAuthTable;
use Bitrix\Main\UserTable;
function findUsersByPhones(array $phones): array
{
// Нормализуем все номера
$normalizedPhones = array_map(
[UserPhoneAuthTable::class, 'normalizePhoneNumber'],
$phones
);
// Ищем записи в таблице авторизации
$phoneAuths = UserPhoneAuthTable::getList([
'filter' => ['=PHONE_NUMBER' => $normalizedPhones],
'select' => ['USER_ID', 'PHONE_NUMBER']
])->fetchAll();
if (empty($phoneAuths)) {
return [];
}
$userIds = array_column($phoneAuths, 'USER_ID');
// Получаем данные пользователей
$users = UserTable::getList([
'filter' => ['=ID' => $userIds],
'select' => ['ID', 'LOGIN', 'EMAIL', 'NAME', 'LAST_NAME']
])->fetchAll();
// Формируем результат: номер телефона => данные пользователя
$result = [];
foreach ($phoneAuths as $auth) {
foreach ($users as $user) {
if ($auth['USER_ID'] == $user['ID']) {
$result[$auth['PHONE_NUMBER']] = $user;
break;
}
}
}
return $result;
}
// Использование
$phones = ["+70000000000", "+71111111111", "+72222222222"];
$users = findUsersByPhones($phones);
foreach ($users as $phone => $user) {
echo "Телефон: {$phone} → {$user['NAME']} {$user['LAST_NAME']} (ID: {$user['ID']})\n";
}Отладка: просмотр номеров в таблице
Для диагностики можно вывести все номера, хранящиеся в таблице регистрации:
use Bitrix\Main\UserPhoneAuthTable;
$allPhones = UserPhoneAuthTable::getList([
'select' => ['USER_ID', 'PHONE_NUMBER'],
'limit' => 10,
'order' => ['USER_ID' => 'ASC']
]);
echo "Список зарегистрированных номеров (первые 10):\n";
while ($row = $allPhones->fetch()) {
echo "USER_ID: {$row['USER_ID']} | Телефон: {$row['PHONE_NUMBER']}\n";
}Полный рабочий пример
<?php
use Bitrix\Main\UserPhoneAuthTable;
use Bitrix\Main\UserTable;
/**
* Получить пользователя по номеру телефона
*/
function getUserByPhone($phone): ?array
{
$normalized = UserPhoneAuthTable::normalizePhoneNumber($phone);
$phoneAuth = UserPhoneAuthTable::getList([
'filter' => ['=PHONE_NUMBER' => $normalized],
'select' => ['USER_ID']
])->fetch();
if (!$phoneAuth) {
return null;
}
return UserTable::getList([
'filter' => ['=ID' => $phoneAuth['USER_ID']],
'select' => ['ID', 'LOGIN', 'EMAIL', 'NAME', 'LAST_NAME', 'DATE_REGISTER']
])->fetch();
}
/**
* Проверить существование пользователя по номеру телефона
*/
function isUserExistsByPhone($phone): bool
{
$normalized = UserPhoneAuthTable::normalizePhoneNumber($phone);
return UserPhoneAuthTable::getCount([
'=PHONE_NUMBER' => $normalized
]) > 0;
}
// ========== ИСПОЛЬЗОВАНИЕ ==========
$phoneToFind = "+70000000000";
// Вариант 1: получить данные
$user = getUserByPhone($phoneToFind);
if ($user) {
echo "✅ Пользователь найден:\n";
echo "ID: {$user['ID']}\n";
echo "Имя: {$user['NAME']} {$user['LAST_NAME']}\n";
echo "Логин: {$user['LOGIN']}\n";
echo "Email: {$user['EMAIL']}\n";
} else {
echo "❌ Пользователь не найден\n";
}
// Вариант 2: просто проверить существование
echo "\nПроверка существования: ";
echo isUserExistsByPhone($phoneToFind) ? "да" : "нет";
?>Возможные ошибки и их решение
Ошибка 1: Номер не найден, но пользователь существует
Симптом: пользователь регистрировался по телефону, но поиск ничего не находит.
Причина: номер не был приведён к нормализованному формату перед поиском.
Решение: всегда используйте UserPhoneAuthTable::normalizePhoneNumber() для приведения номера к формату, в котором он хранится в базе данных.
$normalized = UserPhoneAuthTable::normalizePhoneNumber($userInputPhone);Ошибка 2: Использование не тех полей для поиска
Симптом: код находит пользователя, но номер телефона не совпадает с искомым, или поиск работает некорректно.
Причина: поиск выполняется по полям PERSONAL_PHONE или PERSONAL_MOBILE, которые не имеют отношения к авторизации.
Решение: всегда используйте UserPhoneAuthTable для поиска по номеру, используемому при регистрации.
Заключение
Поиск пользователя по номеру телефона в 1С-Битрикс выполняется через таблицу b_user_phone_auth с использованием D7 ORM:
-
Номер для авторизации хранится в таблице
b_user_phone_auth, доступ к которой предоставляет классBitrix\Main\UserPhoneAuthTable -
Для нормализации номера используйте встроенный метод
UserPhoneAuthTable::normalizePhoneNumber() -
Для проверки существования достаточно
getCount()— не нужно получать полные данные пользователя, если они не требуются -
Поля
PERSONAL_PHONEиPERSONAL_MOBILEне используются для авторизации — они относятся к профилю пользователя
Представленные примеры кода готовы к использованию в реальных проектах. Адаптируйте их под свои задачи в зависимости от того, нужно ли вам просто проверить существование пользователя или получить его полные данные.