Автоматизация
Внедрение битрикс24 бесплатно
При покупке лицензии у меня
Подробнее
Назад

Поиск пользователя по номеру телефона регистрации в 1С-Битрикс

Поиск пользователя по номеру телефона регистрации в 1С-Битрикс
Поиск пользователя по номеру телефона регистрации в 1С-Битрикс

В современной веб-разработке авторизация по номеру телефона становится всё более популярной. Это удобно для пользователей — не нужно запоминать сложные пароли и логины, достаточно ввести свой номер и код подтверждения. 1С-Битрикс поддерживает такой способ аутентификации, но у многих разработчиков возникает вопрос: как программно найти пользователя по номеру телефона, который он использовал при регистрации?

На первый взгляд, задача кажется простой — достаточно поискать в полях PERSONAL_PHONE или PERSONAL_MOBILE таблицы пользователей. Однако это распространённая ошибка! Номер, используемый для авторизации, хранится совершенно в другом месте.

В этой статье мы подробно разберём:

  • Где именно в Битрикс хранится номер телефона для регистрации

  • Как правильно выполнить поиск с использованием D7 ORM

  • Готовые примеры кода для различных сценариев

Где хранится номер телефона для регистрации?

При включённой в настройках главного модуля опции «Разрешить регистрацию и авторизацию по номеру телефона» данные для входа сохраняются в отдельной таблице b_user_phone_auth. Поля профиля пользователя (PERSONAL_PHONEPERSONAL_MOBILEWORK_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:

  1. Номер для авторизации хранится в таблице b_user_phone_auth, доступ к которой предоставляет класс Bitrix\Main\UserPhoneAuthTable

  2. Для нормализации номера используйте встроенный метод UserPhoneAuthTable::normalizePhoneNumber()

  3. Для проверки существования достаточно getCount() — не нужно получать полные данные пользователя, если они не требуются

  4. Поля PERSONAL_PHONE и PERSONAL_MOBILE не используются для авторизации — они относятся к профилю пользователя

Представленные примеры кода готовы к использованию в реальных проектах. Адаптируйте их под свои задачи в зависимости от того, нужно ли вам просто проверить существование пользователя или получить его полные данные.

Профессиональная разработка на Битрикс

Интеграции, доработки, поддержка. Решу любую задачу, связанную с поиском пользователей, авторизацией и не только.

Написать
Читайте по теме
Все статьи
Нужен надежный исполнитель?
Разрабатываем сайты, выполняем миграцию на Битрикс, дорабатываем функционал, сопровождаем проекты, а также занимаемся поисковым продвижением и комплексным маркетингом
Получить консультацию
Все статьи