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 дней гарантии