Меню

ORM: Работа с пользователями через API D7 1С-Битрикс

Просмотров: 2692

Заметка написана на основе старого черновика, и все описанное было проверено на чистой установке 1С-Битрикс. Примеры работают корректно. Плюс, данная статья будет периодически дополняться.

Работа с пользователями через API D7 1С-Битрикс
Может показаться, что проще воспользоваться старым методом CUser::GetList, который получит все поля, включая пользовательские, за один раз.
Кода действительно будет меньше, но старый метод — это адаптер для новых. Под капотом произойдет использование D7, но медленнее: потребуется время на "включение адаптера".

Выборка данных в новом ядре

Для выборки данных используется статический метод нужного класса: getList(). На вход принимается массив параметров:

$res = \Запрос\К нужному классу::getList([
    'order' => // массив- сортировка
    'select' => // массив- выбираемые поля
    'filter' => // массив- фильтр
    'group' =>  // массив- группировка, order должен быть пустой
    'limit' => // число- ограничение выбираемого кол-ва
    'offset' => // число- смещение первого столбца в результате
    'count_total' => // число- дает возможность получить кол-во элементов через метод getCount()
    'runtime' =>  // массив полей сущности, создающихся динамически
    'data_doubling' => // булево (ум. false) - получение одинаковых записей
    'cache' => array( // массив-  кеширование запроса запроса
        'ttl' => 1000,
        'cache_joins' => true
    ),
]);

Обратите внимание на параметр 'select'. Если вам нужны не все поля выборки, передайте в него конкретные поля, например, название и ID:

$res = \Запрос\К нужному классу::getList([
    'select' => [
        'ID',
        'NAME'
    ]
]);

Если нужны все поля, передайте звездочку:

$res = \Запрос\К нужному классу::getList([
    'select' => [
        '*'
    ]
]);

Получить информацию обо всех пользователях

Для получения информации обо всех пользователях используется класс Bitrix\Main\UserTable. Так как нужно получить все поля и всех пользователей, достаточно передать в выборку только select со звездочкой:

use Bitrix\Main\UserTable;

$arUsers = UserTable::getList([
    'select' => [
        '*'
    ]
])->fetchAll();

foreach ($arUsers as $user) {
    echo '<pre>';
    print_r($user);
    echo '</pre>';
}

В выводе print_r($user); вы увидите все поля, кроме пользовательских и особенного поля "Номер телефона для регистрации".

Получить поле "Номер телефона для регистрации"

Чтобы получить номер телефона для регистрации, нужно использовать класс Bitrix\Main\UserPhoneAuthTable. Добавим это поле в нашу распечатку пользователей:

use Bitrix\Main\UserTable;
use Bitrix\Main\UserPhoneAuthTable;

$arUsers = UserTable::getList([
    'select' => [
        '*'
    ]
])->fetchAll();

foreach ($arUsers as $user) {
    // Дополучаем номер для регистрации
    $user['PHONE_NUMBER'] = UserPhoneAuthTable::getList([
        'filter' => [
            '=USER_ID' => $user['ID']
        ],
        'select' => [
            'PHONE_NUMBER'
        ],
    ])->fetch();

    echo '<pre>';
    print_r($user);
    echo '</pre>';
}

Теперь это поле будет в общей распечатке всех полей пользователя.

Получение пользовательских полей

Добавим в распечатку пользовательские поля. Для этого нужен класс Bitrix\Main\UserFieldTable:

use Bitrix\Main\UserTable;
use Bitrix\Main\UserPhoneAuthTable;
use Bitrix\Main\UserFieldTable;

$arUsers = UserTable::getList([
    'select' => [
        '*'
    ]
])->fetchAll();

foreach ($arUsers as $user) {
    // Дополучаем пользовательские поля
    $user['UF_FIELDS'] = UserFieldTable::getList([
        'filter' => [
            'ID' => $user['ID']
        ],
        'select' => [
            '*'
        ],
    ])->fetchAll();

    // Дополучаем номер для регистрации
    $user['PHONE_NUMBER'] = UserPhoneAuthTable::getList([
        'filter' => [
            '=USER_ID' => $user['ID']
        ],
        'select' => [
            'PHONE_NUMBER'
        ],
    ])->fetch();

    echo '<pre>';
    print_r($user);
    echo '</pre>';
}

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

Для получения групп пользователя нужен класс Bitrix\Main\UserGroupTable. Давайте дополним нашу распечатку пользователя:

use Bitrix\Main\UserTable;
use Bitrix\Main\UserGroupTable;
use Bitrix\Main\UserPhoneAuthTable;
use Bitrix\Main\UserFieldTable;

$arUsers = UserTable::getList([
    'select' => [
        '*'
    ]
])->fetchAll();

foreach ($arUsers as $user) {
    // Дополучаем группы пользователя
    $user['GROUPS'] = UserGroupTable::getList([
        'filter' => [
            '=USER_ID' => $user['ID']
        ],
        'select' => [
            '*'
        ],
    ])->fetchAll();

    // Дополучаем пользовательские поля
    $user['UF_FIELDS'] = UserFieldTable::getList([
        'filter' => [
            'ID' => $user['ID']
        ],
        'select' => [
            '*'
        ],
    ])->fetchAll();

    // Дополучаем номер для регистрации
    $user['PHONE_NUMBER'] = UserPhoneAuthTable::getList([
        'filter' => [
            '=USER_ID' => $user['ID']
        ],
        'select' => [
            'PHONE_NUMBER'
        ],
    ])->fetch();

    echo '<pre>';
    print_r($user);
    echo '</pre>';
}

Получение пользователей из определнной группы

Рассмотрим пример использования фильтра в выборке UserTable::getList. Например, нам нужно получить всех пользователей, которые являются администраторами (с группой ID=1). Нужно получить только ID таких пользователей и EMAIL:

use Bitrix\Main\UserTable;
use Bitrix\Main\UserGroupTable;

// Получаем ID пользователей, которые входят в группу с ID 1 (администраторы)
$arAdmins = UserGroupTable::getList([
    'filter' => [
        '=GROUP_ID' => 1
    ],
    'select' => [
        'USER_ID'
    ],
])->fetchAll();

// Преобразуем полученный результат в простой массив ID пользователей
$arAdminsIds = array_column(
    $arAdmins,
    'USER_ID'
);

$arUsers = UserTable::getList([
    'filter' => [
        'ID' => $arAdminsIds
    ],
    'select' => [
        'ID',
        'EMAIL'
    ]
])->fetchAll();

foreach ($arUsers as $user) {
    echo '<pre>';
    print_r($user);
    echo '</pre>';
}

Можно пойти от обратного: если нужно получить всех пользователей, которые не являются администраторами, просто используйте отрицание в фильтре UserGroupTable::getList:

use Bitrix\Main\UserTable;
use Bitrix\Main\UserGroupTable;

// Получаем ID пользователей, которые НЕ входят в группу с ID 1 (администраторы)
$arNotAdmins = UserGroupTable::getList([
    'filter' => [
        '!=GROUP_ID' => 1
    ],
    'select' => [
        'USER_ID'
    ],
])->fetchAll();

// Преобразуем полученный результат в простой массив ID пользователей
$arNotAdminsIds = array_column(
    $arNotAdmins,
    'USER_ID'
);

$arUsers = UserTable::getList([
    'filter' => [
        'ID' => $arNotAdminsIds
    ],
    'select' => [
        'ID',
        'EMAIL'
    ]
])->fetchAll();

foreach ($arUsers as $user) {
    echo '<pre>';
    print_r($user);
    echo '</pre>';
}

Давайте воспользуемся методами add и delete. Например, хотим пользователей с ID 7 и 8 исключить из группы "Контент-редакторы" и добавить в группу "Администраторы"

use Bitrix\Main\UserTable;
use Bitrix\Main\UserGroupTable;

$arUsers = UserTable::getList([
    'filter' => [
        'ID' => [
            7,
            8
        ]
    ],
    'select' => [
        'ID'
    ]
])->fetchAll();

foreach ($arUsers as $user) {
    // Удаляем из Контент-редакторов
    UserGroupTable::delete(array(
        "USER_ID" => $user['ID'],
        "GROUP_ID" => 10, // ID этой группы
    ));

    // Добавляем в администраторов
    UserGroupTable::add(array(
        "USER_ID" => $user['ID'],
        "GROUP_ID" => 1,
    ));
}

О текущем авторизованном пользователе

Некоторые аналоги старого метода CUser::GetID находятся в классе Bitrix\Main\Engine\CurrentUser

use Bitrix\Main\Engine\CurrentUser;

$Id = CurrentUser::get()->getId(); // ID юзера
$isAdmin = CurrentUser::get()->isAdmin(); // Админ ли он
$Login = CurrentUser::get()->getLogin(); // Его логин

Методом ::get, этого класса можно получить и другие поля пользователя. Но если вам нужно не одно конкретное поле, проще воспользоваться примерами выше, передав в фильтр ID текущего пользователя

Пример получения информации об одном пользователе

Достаточно использовать fetch() и не обязателен перебор массива foreach-eм, но можно и перебрать если того требует ваш вывод на странице.

use Bitrix\Main\Engine\CurrentUser;
use Bitrix\Main\UserTable;
        
$Id = CurrentUser::get()->getId(); // ID юзера
        
$arUser = UserTable::getList([
    'filter' => [
        'ID' => $Id
    ]
    'select' => [
        '*'
    ]
])->fetch(); // Получаем одну запись поэтому не fetchAll

echo '<pre>';
print_r($arUser);
echo '</pre>';

Если столкнетесь с проблемами, пишите в комментариях — буду дополнять заметку.

Михаил Базаров 04.09.2024
Методы add и delete есть у всех классов кроме UserTable. Здесь используем методы класса CUser:
Код
CUser::add(
   'ID_Пользователя',
   массив Полей
);

CUser::update(
   'ID_Пользователя',
   массив Полей
);

CUser::Delete(
   'ID_Пользователя'
);
Гость 01.10.2024
Добрый день. Подскажите , если мне необходимо создать у существующего пользователя своё кастомное поле , например , тип строка. Какой метод мне необходимо использовать?
Михаил Базаров 02.10.2024
Как-то так:
Код
$arFields = array(
    "ENTITY_ID" => 'USER',
    "FIELD_NAME" => 'UF_КОД_ПОЛЯ',
    "USER_TYPE_ID" => 'ТИП ПОЛЯ',
    ОСТАЛЬНЫЕ ПОЛЯ ПОЛЯ НАЗВАНИЕ ИТД
);
$obUserField  = new CUserTypeEntity;
$obUserField->Add($arFields);

Стоимость и сроки разработки сайтов и приложений

Окончательная стоимость и сроки разработки сайта формируются после обсуждения деталей на этапе заказа. Как правило, они редко выходят за обозначенные ниже рамки.

Интернет магазин: разработка с нуля от 400 000 руб.
от 5-ти недель

Cоздание интернет-магазина на 1С-Битрикс. Разработка с нуля, оптимизация кода под конкретный проект и требования. Реализация любого функционала без ограничений готовых решений.

Интернет-магазин на готовом решении от 100 000 руб.
от 7-ми дней

Готовое решение — вариант для тех, кто не хочет тратить много средств на индивидуальный проект, и не имеет серьезных требований к сайту. Запускается на одном из 200-та (на ваш выбор) готовых решений.

Мобильное приложение от 400 000 руб.
от 1-го месяца

Разработка кроссплатформенного мобильного приложения, которое не уступает нативным решениям как в производительности, так и пользовательском опыте. Публикуется в AppStore, GooglePlay и RuStore

Опросник на разработку. После ознакомления, задам уточняющие вопросы и оценю проект по стоимости и срокам разработки.