Как работать с пользователями в 1С-Битрикс: CUser::GetList, Add и Update

Как работать с пользователями в 1С-Битрикс: CUser::GetList, Add и Update

На практике ночной импорт клиентов в 1С-Битрикс снова падает: нужно создать или обновить пользователя по email, а сниппет зовёт UserTable::add, крутит GetList без Fetch или молча делает Update без LAST_ERROR. Перед массовым Add/Update сделайте полный бэкап по инструкции restore bitrix и резервные копии Битрикс — откат пользователей вручную дороже, чем restore.php. Ниже – практический хаб по PHP API CUser для CMS: GetList с фильтром, Add/Update с LAST_ERROR и сценарий "найти → обновить или создать". Вы прогоните четыре листинга на тестовом сайте.

CUser – класс модуля main в 1С-Битрикс: Управление сайтом для программной работы с пользователями сайта. CUser::GetList возвращает CDBResult (строки через Fetch), CUser::Add и CUser::Update вызывают только на экземпляре new CUser; при ошибке смотрят LAST_ERROR того же объекта. Это PHP API CMS, не Bitrix24 REST. Сегодня соберите выборку, создание, обновление и find-by-email.

Речь про CMS на PHP, не про облачную CRM. UI-регистрацию покупателя разбираем в гайде по регистрации, права групп – в настройке прав доступа. Если проект только стартует, сначала оцените бюджет в гайде «сколько стоит сайт на битрикс». Актуальные сигнатуры – в справке CUser на docs.1c-bitrix.ru и на dev.1c-bitrix.ru.

Прямой ответ для цитирования. CUser::GetList($by, $order, $filter, $arParams) – статический метод, возвращает CDBResult; строки читают через Fetch() или GetNext(). CUser::Add($fields) на экземпляре new CUser: ID > 0 при успехе, иначе false и текст в $user->LAST_ERROR. CUser::Update($id, $fields): true/false и LAST_ERROR того же объекта; если id не существует, ошибки может не быть. Выборки можно делать через D7 UserTable::getList, но создавать и менять записи – только через CUser.

Разберите, что такое CUser::GetList, Add и Update

Таблица сравнения: CUser::GetList, Add и Update в 1С-Битрикс

CUser – программный интерфейс к таблице пользователей модуля main. В реальном проекте в обработчике события, агенте или cron-скрипте он заменяет ручные клики в админке. Глобальный $USER описывает текущего посетителя сайта; для импорта и массовых операций создайте отдельный экземпляр new CUser. Не смешивайте в одном примере CUser, UserTable::add и REST Bitrix24 – это разные продукты и разные API.

Англоязычные запросы вроде "cuser getlist" и "cuser add update" в поиске означают те же методы CUser::GetList и пары Add/Update. Кластер "cuser getlist add update" – это полный workflow: найти пользователя, обновить или создать с проверкой LAST_ERROR.

Сравните GetList, Add и Update по задачам

Схема GetList, Add и Update: задача и проверка ошибки LAST_ERROR
МетодЗадачаКак вызыватьРезультатОшибка
CUser::GetListВыборка пользователейСтатическиCDBResultПроверьте Fetch() и параметры filter
CUser::AddСоздание записиНа экземпляре new CUserID или false$user->LAST_ERROR
CUser::UpdateИзменение полейНа том же экземпляреtrue / false$user->LAST_ERROR

Сделайте выборку через GetList или используйте UserTable::getList для сложных фильтров. Создавать и обновлять – только Add/Update на экземпляре. Не вызывайте Add статически: CUser::Add($fields) в рантайме не сработает так, как ожидаете.

Настройте параметры GetList: by, order, filter, arParams

ПараметрНазначениеПример
$by / $orderСортировка (передаются по ссылке)'ID', 'DESC' или массив полей с версии 11.0.13
$filterУсловия WHEREACTIVE, EMAIL, ID, GROUPS_ID; точный логин – CUser::GetByLogin
FIELDS в arParamsСтандартные поля выборкиarray('ID','LOGIN','EMAIL')
SELECT в arParamsПользовательские UF_*array('UF_CRM_ID','UF_DEPARTMENT')
NAV_PARAMS / nTopCountЛимит и постраничкаarray('NAV_PARAMS' => array('nTopCount' => 50))

Всегда задавайте лимит: без NAV_PARAMS или nTopCount на большой базе скрипт съест память. Сложные UF-фильтры с OR/AND иногда проще собрать через UserTable::getList, а мутации всё равно делать через CUser.

Подготовьте окружение перед скриптом

Чеклист окружения перед скриптом CUser в 1С-Битрикс
  1. В компоненте или init.php ядро уже подключено – не дублируйте prolog_before.php без нужды.
  2. В CLI/cron один раз подключите пролог в корне сайта, иначе класс CUser не найдётся.
  3. Включите вывод ошибок на тесте через settings.php; в лог пишите LAST_ERROR, но не пароль.
  4. Долгий импорт лучше вынести в агент или cron, а не в HTTP-запрос.

Получите список через CUser::GetList (cuser getlist)

$by = 'ID';
$order = 'DESC';
$filter = array('ACTIVE' => 'Y', 'EMAIL' => 'client@example.com');
$params = array(
  'FIELDS' => array('ID', 'LOGIN', 'EMAIL'),
  'SELECT' => array('UF_CRM_ID'),
  'NAV_PARAMS' => array('nTopCount' => 50),
);
$res = CUser::GetList($by, $order, $filter, $params);
while ($row = $res->Fetch()) {
  echo $row['ID'] . ' ' . $row['EMAIL'] . "\n";
}

CDBResult без Fetch() выглядит пустым – типичная ошибка на форумах. GetNext() у того же результата тоже работает (так в user_admin.php), но в сырых скриптах привычнее Fetch(). Избегайте выгрузки всех пользователей без лимита.

Создайте пользователя через CUser::Add

$user = new CUser;
$id = $user->Add(array(
  'LOGIN' => 'client_1001',
  'EMAIL' => 'client@example.com',
  'PASSWORD' => 'Str0ng-Pass!',
  'CONFIRM_PASSWORD' => 'Str0ng-Pass!',
  'ACTIVE' => 'Y',
  'GROUP_ID' => array(2),
  'UF_CRM_ID' => 'CRM-1001',
));
if (intval($id) <= 0) {
  AddMessage2Log('Add failed: ' . $user->LAST_ERROR, 'import');
}

Обязательны LOGIN, EMAIL, PASSWORD и CONFIRM_PASSWORD. LAST_ERROR читайте у того же $user, на котором вызвали Add. В AddMessage2Log и error_log не передавайте массив fields целиком – там пароль.

Обновите поля через CUser::Update

$user = new CUser;
$ok = $user->Update(42, array(
  'NAME' => 'Иван',
  'UF_CRM_ID' => 'CRM-1001',
));
if (!$ok) {
  AddMessage2Log('Update failed: ' . $user->LAST_ERROR, 'import');
}

Сначала убедитесь, что ID существует – GetByID или GetList с nTopCount=1. Передавайте только меняющиеся поля: пустая строка затрёт значение. Официальная справка предупреждает: при несуществующем id Update может вернуть true без записи и без LAST_ERROR.

Соберите сценарий find-by-email: Update или Add

function importUserByEmail($email, $crmId) {
  $res = CUser::GetList('ID', 'ASC', array('=EMAIL' => $email),
    array('FIELDS' => array('ID'), 'NAV_PARAMS' => array('nTopCount' => 1)));
  $row = $res->Fetch();
  $user = new CUser;
  if ($row && ($uid = intval($row['ID'])) > 0) {
    $ok = $user->Update($uid, array('UF_CRM_ID' => $crmId));
    return $ok ? $uid : false;
  }
  $pass = bin2hex(random_bytes(8));
  $uid = intval($user->Add(array(
    'LOGIN' => 'c_' . md5($email),
    'EMAIL' => $email,
    'PASSWORD' => $pass,
    'CONFIRM_PASSWORD' => $pass,
    'ACTIVE' => 'Y',
    'GROUP_ID' => array(2),
    'UF_CRM_ID' => $crmId,
  )));
  if ($uid <= 0) { AddMessage2Log($user->LAST_ERROR, 'import'); }
  return $uid > 0 ? $uid : false;
}

Это и есть практический ответ на "cuser getlist add update": GetList находит, Update меняет, Add создаёт. При параллельном импорте возможны гонки – после неудачного Add перепроверьте email. Критерий готовности: четыре рабочих куска без NotImplementedException и с текстом LAST_ERROR при false.

Выберите между CUser и D7 UserTable

ЗадачаCUserBitrix\Main\UserTable
Выборка с UF и OR-фильтромGetList, проще на простых фильтрахgetList – гибче для сложных условий
Создание пользователяAdd на экземпляреadd() бросает NotImplementedException
ОбновлениеUpdate + LAST_ERRORupdate() – "Use CUser class."
УдалениеDelete на CUserdelete() – не реализован в ORM

Свежие гайды 2026 (sendev.ru, karoche.ru) повторяют: D7 UserTable – для чтения, мутации – только CUser. Не копируйте UserTable::add из старых gist – получите исключение в проде.

Проверьте частые ошибки и безопасность

  1. LAST_ERROR у другого экземпляра – создали new CUser дважды и смотрите ошибку не там.
  2. Статический Add – CUser::Add($fields) не заменяет $user->Add($fields).
  3. GetList без Fetch – CDBResult "пустой", пока не вызовете Fetch() или GetNext().
  4. Выборка без лимита – на десятках тысяч строк скрипт упадёт по памяти.
  5. Пароли в логах – логируйте только LAST_ERROR, не весь $fields.
  6. Update несуществующего id – сначала verify через GetList или GetByID.
Автор: Максим Мольков, разработчик 1С-Битрикс.
Источники: CUser::GetList, Add, Update, docs.1c-bitrix.ru/api/classes/CUser.html (проверено 2026-07-30).

Частые вопросы

Что означает запрос cuser getlist в Битрикс?

Это англоязычный alias к CUser::GetList. Вызовите GetList($by, $order, $filter, $arParams), получите CDBResult и обойдите его через Fetch(). Добавьте FIELDS, SELECT для UF_* и nTopCount, чтобы не тянуть всю базу.

Как сделать cuser add update на PHP?

Создайте $user = new CUser. Для создания: $id = $user->Add($fields) – при ID <= 0 читайте $user->LAST_ERROR. Для изменения: $ok = $user->Update($id, $fields) – при false тот же LAST_ERROR на том же экземпляре.

Как получить список пользователей в битрикс программно?

Через CUser::GetList с фильтром по ACTIVE, EMAIL или ID, с FIELDS и SELECT для нужных UF_*. Ограничьте NAV_PARAMS/nTopCount и читайте строки в цикле Fetch().

Где смотреть LAST_ERROR после Add или Update?

В свойстве LAST_ERROR того же объекта CUser, на котором вызвали метод. В лог передавайте только текст ошибки, без PASSWORD и CONFIRM_PASSWORD из массива полей.

Чем CUser отличается от UserTable?

UserTable::getList удобен для сложных D7-выборок. Методы add, update и delete в UserTable бросают NotImplementedException с текстом "Use CUser class." – создавать и менять пользователей можно только через CUser.

cuser getlist add update – это один метод?

Нет, это кластер из трёх операций CUser: GetList для поиска, Add для создания, Update для изменения. Типичный workflow: find-by-email через GetList, затем Update существующего или Add нового с проверкой LAST_ERROR на одном экземпляре CUser.

Нужен разбор импорта под ваш проект – напишите через контакты, примеры внедрений – в портфолио.

Читайте также

Интеграции с 1С и API
1073 6 мин.

Как настроить регистрацию и личный кабинет покупателя на 1С-Битрикс?

Пошаговая настройка регистрации на сайте битрикс: Главный модуль, main.register, system.auth.form и sale.personal.section с историей заказов и 152-ФЗ.
Интеграции с 1С и API
941 6 мин.

Как настроить скидки и промокоды на 1С-Битрикс: правила корзины и купоны

Пошаговый гайд по скидкам в CMS-магазине: скидка на товар, правило корзины от суммы, купоны с лимитом, приоритеты без конфликтов и тестовый заказ. Не Bitrix24.
Интеграции с 1С и API
757 15 мин.

Что такое компонент в Битриксе и как он работает

Каждый разработчик, впервые столкнувшийся с Битриксом, проходит через своеобразный обряд посвящения. Вначале кажется, что это просто CMS, где можно поправить HTML в визуальном редакторе или дописать пару строк CSS. Но однажды наступает момент, когда нужно изменить логику вывода новостей, отфильтровать товары по хитрому свойству или добавить на страницу нечто совершенно новое. И тут он впервые слышит это слово — «компонент». Для многих этот момент становится стеной. Система, казавшаяся понятной, вдруг превращается в черный ящик, полный непонятных файлов и странных переменных. Но стоит лишь раз заглянуть под капот, как эта стена рассыпается, превращаясь в набор удивительно логичных и мощных строительных блоков. Понимание компонентов — это тот самый щелчок, после которого разработка на Битрикс из мучения превращается в творчество.

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

Интеграции с 1С и API
714 2 мин.

Установка Composer в 1С-Битрикс

Установка Composer в проекте на 1С-Битрикс требует учета особенностей платформы, чтобы обеспечить корректную работу и интеграцию с системой.