Yandex Metrika
sanches.free 1 просмотр

GUID для пользователя Битрикс: колонка EXTERNAL_GUID и триггер для b_user

Зачем отдельный столбец

В типовой установке пользователь однозначно определяется числовым ID. Для связки с внешними системами или REST часто нужен неизменяемый ключ в формате GUID. Это не свойство профиля из коробки — разумнее завести отдельное поле в основной строке пользователя.

Колонка во входной таблице

В MySQL удобно хранить строковое представление UUID в CHAR(36) с набором ascii, чтобы не раздувать ключ и не смешивать collation.

ALTER TABLE `b_user`
  ADD COLUMN `EXTERNAL_GUID` CHAR(36) CHARACTER SET ascii COLLATE ascii_general_ci DEFAULT NULL AFTER `LOGIN`;

Стартовое значение NULL допустимо: триггер и разовое обновление зададут значение до перехода в промышленную эксплуатацию.

Генерация перед INSERT

Самый простой надёжный паттерн — триггер уровня строки до вставки. Если GUID уже передан явно из интеграции, поле можно не перезаписывать.

DELIMITER $$
DROP TRIGGER IF EXISTS `tr_bitrix_user_fill_external_guid`$$
CREATE TRIGGER `tr_bitrix_user_fill_external_guid`
  BEFORE INSERT ON `b_user`
  FOR EACH ROW
BEGIN
  IF NEW.EXTERNAL_GUID IS NULL OR NEW.EXTERNAL_GUID = '' THEN
    SET NEW.EXTERNAL_GUID = UUID();
  END IF;
END$$
DELIMITER ;

Существующие аккаунты

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

UPDATE `b_user`
SET `EXTERNAL_GUID` = UUID()
WHERE `EXTERNAL_GUID` IS NULL OR `EXTERNAL_GUID` = '';

Выборка в приложении Битрикс

Собственный столбец b_user после добавления доступен там же, где остальные поля учётной записи при выборке через CUser::GetList.

if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) {
    die();
}

$sortField = 'timestamp_x';
$sortDirection = 'desc';
$userFilter = ['ACTIVE' => 'Y', '!ID' => 1];
$userQuery = CUser::GetList($sortField, $sortDirection, $userFilter);

$accounts = [];
while ($account = $userQuery->Fetch()) {
    $accounts[] = [
        'id' => (int)$account['ID'],
        'login' => $account['LOGIN'],
        'external_guid' => $account['EXTERNAL_GUID'] ?? null,
    ];
}

При необходимости добавьте в фильтр роли сайта или группы; сам GUID не нужно отдельно регистрировать в API — строка уже лежит в таблице.

Что учесть

  • События синхронизации и переносы между стендами: дамп перенесёт значения колонки, конфликтов не будет при глобальной уникальности GUID.
  • На кластере триггеры должны существовать одинаково на мастере записи; схему лучше вести через миграции.
  • Если нужен двоичный формат без дефисов, подойдут BINARY(16) и пара UUID_TO_BIN / BIN_TO_UUID в MySQL 8 — тип колонки и триггер тогда задаются уже под бинарный вариант.

Не хотите копаться сами?

Починю за 1-3 дня. Без предоплаты — оплата по результату.

15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии