Социальные сервисы (socialservices) 25.0.0 от 02.09.2025
- Разработчикам: Часовой пояс пользователя теперь берётся из поля "TIME_ZONE".
 - Разработчикам: Небольшие исправления и улучшения в коде.
 
Последний коммит принёс обновление модуля socialservices, отвечающего за интеграцию с внешними сервисами авторизации. Версия поднялась до 25.0.0. На первый взгляд, изменения минорные, но в них есть как минимум одно важное улучшение и один потенциальный "breaking change", который стоит иметь в виду.
1. Ключевое изменение: принудительное обновление токенов Google
В классе CSocServGoogleProxyOAuth была значительно переработана логика сохранения токена авторизации.
Что изменилось: Теперь перед добавлением или обновлением токена пользователя система принудительно удаляет все его старые токены для данного сервиса (Google). За это отвечает новый приватный метод deleteOldTokens.
Было (упрощенно):
        // bitrix/modules/socialservices/classes/general/googleproxy.php
// ...
$socservUser = UserTable::getList([...])->fetch();
if(!$socservUser) {
    UserTable::add($fields);
} else {
    UserTable::update($socservUser['ID'], $fields);
}
    
Старый код просто обновлял существующую запись или добавлял новую. Если по какой-то причине для пользователя существовало несколько записей (например, из-за сбоев), могли возникать коллизии.
Стало:
        // bitrix/modules/socialservices/classes/general/googleproxy.php
// ...
if (!empty($socservUserFields['USER_ID'])) {
    $this->deleteOldTokens($socservUserFields['USER_ID'], $socservUserFields['EXTERNAL_AUTH_ID']);
    // ... дальнейшая логика добавления/обновления ...
}
    
Новый подход гарантирует, что у пользователя в таблице b_socialservices_user будет только одна, самая актуальная запись для Google-аккаунта.
Зачем это нужно? Это повышает надёжность и предсказуемость механизма авторизации. Исключается ситуация, когда в базе "зависают" старые, неактуальные токены, которые могут быть ошибочно использованы системой. По сути, это исправление потенциальной, хоть и редкой, проблемы.
2. Архитектурный рефакторинг: работа с часовым поясом
Одно из самых значимых, хоть и не очевидных на первый взгляд, изменений — полный пересмотр механизма установки часового пояса пользователя при авторизации через соцсети. Это не просто удаление кода, а переход на штатный, более правильный механизм ядра.
Что произошло на самом деле?
1. Удалён старый механизм (явное изменение)
Из класса CSocServAuth исчез вот этот блок:
        // bitrix/modules/socialservices/classes/general/authmanager.php
if(isset($socservUserFields["TIME_ZONE_OFFSET"]) && $socservUserFields["TIME_ZONE_OFFSET"] !== null)
{
    CTimeZone::SetCookieValue($socservUserFields["TIME_ZONE_OFFSET"]);
}
    
Что он делал? Он брал из данных соцсети числовое смещение от UTC (например, 10800) и вручную устанавливал cookie для пользователя. Этот подход имел два недостатка:
- Неточность: Смещение не учитывает переход на летнее/зимнее время.
 - "Костыль": Модуль 
socialservicesвыполнял работу, которую должно делать ядро. 
2. Включился новый механизм (неявное изменение)
Теперь модуль socialservices просто передает массив данных пользователя ($socservUserFields) в стандартные методы ядра CUser::Add или CUser::Update. Внутри этих методов (в модуле main) заложена логика обработки стандартного поля пользователя TIME_ZONE.
Если в массиве $socservUserFields присутствует ключ TIME_ZONE с идентификатором (например, Europe/Moscow), ядро Битрикса автоматически:
- Сохранит этот идентификатор в профиле пользователя.
 - Корректно установит часовой пояс в сессии пользователя.
 
Это видно в коде CUser::Update (/bitrix/modules/main/classes/general/user.php, ~4089 строка), который обновляет параметры сессии:
        if (is_object($USER) && $USER->GetID() == $ID) {
    static $arSessFields = [
        //...
        'TIME_ZONE' => 'TIME_ZONE', // <-- Ядро знает про это поле
    ];
    foreach ($arSessFields as $key => $val) {
        if (isset($arFields[$val])) {
            $USER->SetParam($key, $arFields[$val]); // <-- И само обновляет сессию
        }
    }
}
    
3. Интересные находки
- Отказ от "костылей" в пользу ядра: Рефакторинг работы с часовым поясом — это отличный пример того, как модуль избавляется от частного решения и переходит на использование стандартных API платформы. Это делает систему в целом более стабильной и предсказуемой.
 - Чистота и порядок: Внедрение метода 
deleteOldTokensдля очистки старых токенов Google — это хороший рефакторинг, который изолирует одну конкретную задачу и делает код более читаемым.