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

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

Заметка написана на основе старого черновика, и все описанное было проверено на чистой установке 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 текущего пользователя

use Bitrix\Main\Engine\CurrentUser;
use Bitrix\Main\UserTable;
        
$Id = CurrentUser::get()->getId(); // ID юзера
        
$arUsers = UserTable::getList([
    'filter' => [
        'ID' => $Id
    ]
    'select' => [
        '*'
    ]
])->fetchAll();

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

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

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

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

CUser::Delete(
   'ID_Пользователя'
);

Блог-note: заметки разработчика

Создание скидки на общую сумму покупки в Битрикс корзине

Функционал интернет-магазина, работающего под управлением 1С Битрикс, позволяет задавать множество условий скидок в корз...

Вывести минимальную и максимальную цену в разделе каталога Битрикс.

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

Показать только один тип цены в каталоге Битрикс

Достаточно часто, при создании сайта на битрикс, можно столкнуться с такой проблемой: на сайте имеется несколько групп о...

Оптимизация jpeg и png картинок на cron, с помощью jpegoptim и optipng

Задача: на сайт каждый день проходит выгрузка из 1С с обновлением картинок. Нужно оптимизмровать эти картинки с помощью...

Рассылка новинок каталога в автоматическом режиме

Что бы реализовать рассылку новинок каталога на email-ы пользователей, можно воспользоваться событием OnBeforeIBlockElem...

Получить все товары из всех заказов пользователя. История купленных товаров.

Задача: нужно создать раздел, в персональном разделе пользователя, с историей всех купленных товаров. Не путать с истори...

Дополнительные картинки в новостях Битрикс, почти фотогалерея.

Частенько стоит задача, по мимо стандартных "Картинка для анонса" и "Детальная картинка", добавить в...

Удалить товары из корзины, если есть определенные товары.

Задача: если в корзину добавлены товары с определенным свойством, нужно удалить из корзины, все другие товары- предупред...

Как вывести картинки к разделам на базе _ext меню

Просто для эстетической красоты, нужно вывести в меню разделов сайта картинки или иконки. Достаточно популярный метод, э...