Один из главных способов коммуникации сотрудников внутри портала Битрикс24 — это чаты. Чаты могут быть как между двумя сотрудниками и носить характер диалога, так групповыми, в которых могут принимать участие целый ряд сотрудников. Останавливаться на разновидностях чатов, механизме их создания мы сегодня не будем. Сегодня немного о другом.
У каждого группового чата есть владелец. Он же — модератор. Это сотрудник компании, который создал данный чат. Он обладает пожалуй, что одним, но достаточно важным преимуществом над остальными участниками — это возможность исключать сотрудников из чата. К слову, мне не совсем понятно, чем руководствовались разработчики, оставляя возможность «рядовым» участникам менять название и иконку, а также приглашать в закрытый чат новых сотрудников. Но как гласить народная мудрость: «Жираф — большой, а компании 1С-Битрикс — виднее».
Рано или поздно, но может возникнуть потребность в замене модератора. Причин для этого может быть масса: сотрудник уволен, находится в длительной командировке или отпуске. И здесь вас ожидает неприятный сюрприз. При всем своем широком функционале Битрикс24 не имеет штатного механизма смены модератора чата. Решений здесь может быть несколько:
Первое решение мне импонирует больше остальных. Второе — не импонирует совсем, но скорее всего подойдет если вы пользуетесь облачной версией Битрикс24. Если кратко, то у Б24 существует бот-платформа, работающая на базе REST API, в которую входит целый ряд методов по работе с мессенджером. Один из них — im.chat.setOwner, который как раз и решает поставленную задачу. Подробнее смотрите в официальной документации. И, наконец, третий вариант. Это решение нравится с технической точки зрения и именно его мы будем использовать.
Нам понадобится метод CIMChat::SetOwner. Исходный код выглядит следующим образом:
//    /bitrix/modules/im/classes/general/im_chat.php:1806
    public function SetOwner($chatId, $userId, $checkPermission = true)
    {
        $chatId = intval($chatId);
        $userId = intval($userId);
        $chat = IM\Model\ChatTable::getById($chatId)->fetch();
        if (!$chat)
            return false;
        if ($checkPermission && $chat['AUTHOR_ID'] != $this->user_id)
            return false;
        if ($userId == $chat['AUTHOR_ID'])
            return true;
        $arRelation = self::GetRelationById($chatId);
        if (!isset($arRelation[$userId]))
            return false;
        IM\Model\ChatTable::update($chatId, Array('AUTHOR_ID' => $userId));
        IM\Model\RelationTable::update($arRelation[$userId]['ID'], Array('MANAGER' => 'Y'));
        if (isset($arRelation[$chat['AUTHOR_ID']]))
        {
            IM\Model\RelationTable::update($arRelation[$chat['AUTHOR_ID']]['ID'], Array('MANAGER' => 'N'));
        }
        if (CModule::IncludeModule('pull'))
        {
            \Bitrix\Pull\Event::add(array_keys($arRelation), Array(
                'module_id' => 'im',
                'command' => 'chatOwner',
                'params' => Array(
                'dialogId' => 'chat'.$chatId,
                'chatId' => $chatId,
                'userId' => $userId
                ),
                'extra' => \Bitrix\Im\Common::getPullExtra()
            ));
        }
        return true;
    }
Функция принимает 3 значения:
$chatId — уникальный идентификатор чата$userId — идентификатор нового владельца чата$checkPermission — проверка прав. передаем false чтобы выполнять операцию мог не только модератор чатаЕсли с получением ID пользователя у нас не возникает проблем (указан в ссылке на карточку сотрудника), то с идентификатором чата сложнее.
Первый способ. Откройте окно чата, в режиме просмотра исходного кода выполните поиск по запросу CHAT_ID. В ряде случаев этот способ будем крайне полезен, но есть альтернатива.

Второй способ. Более простой и в данном контексте — правильный. Отправьте служебную команду /getChatId в диалоговое окно чата. Результат будет следующим:

С получением ID чата разобрались. Собираем рабочий скрипт.
В итоге наш скрипт будет представлять из себя форму с двумя полями и одной кнопкой. Создадим форму:
<form method="post" action="?change_chat_owner=YES">
<div class="form-control">
  <div class="form-group">
    <label>ID чата</label>
    <input type="text" class="form-control" id="chatId" name="chatId">
  </div>
    <div class="form-group">
    <label>ID нового владельца</label>
    <input type="text" class="form-control" id="userId" name="userId">
  </div>
  </div>
  <button type="submit" id="send" name="send" class="btn btn-primary">Сменить владельца чата</button>
</form>
В обработчике учтем необходимость отправки уведомления о смене модератора в чат.
Код будет следующим:
if (CModule::IncludeModule('im')) {
    $chatId          = $_POST['chatId'];
    $userId          = $_POST['userId'];
    $checkPermission = false;
    $change          = CIMChat::SetOwner($chatId, $userId, $checkPermission);
    if ($change == 1) {
    /*отправляем уведомление*/
    $ar = Array(
    "TO_CHAT_ID" => $chatId, // ID чата
    "SYSTEM" => Y,
    "MESSAGE" => "Администратор изменил владельца чата."
     );
     CIMChat::AddMessage($ar);
     echo 'Владелец чата успешно изменен!';
     } else {
     echo 'В процессе выполнения скрипта возникла ошибка. ';
     }
}
Их немного, но они есть:
Если эти условия не соблюдены — скрипт работать не будет. Кроме того, я не проверял его работоспособность без полных прав. Такие скрипты по определению должны быть закрыты для рядовых пользователей правами доступа.
Вот в общем-то и все. Уверен, что данный механизм будет полезен для вас!
А можно просто сделать SQL запрос даже через админку Битрикса
UPDATE b_im_chat SET AUTHOR_ID=user-id WHERE ID=chat-idВыработал следующую схему:
1) Добавляем нужного Пользователя в чат;
2) Получаем ID чата указав «/getDialogId» (без кавычек);
3) Заходим в административную часть: Настройки / Производительность / Таблицы / в фильтре находим нужный чат по ID чата (п.2) / нажимаем на ≡ (тройное равно) / Изменить / AUTHOR_ID присваиваем ID пользователя (п.1) / Сохранить;
4) Там же нажимаем на значение ID в чате / отобразиться список участников / нужно изменить старого владельца (указав в поле MANAGER значение N) и изменить нового владельца (указав в поле MANAGER значение Y) / перезапустить десктопное приложение (видимо информацию о чатах приложение получает только при запуске).
Не находи ничего в фильтре в таблицах. Пишу номер ID и пусто.
Немного актуализирую вашу схему, так как у меня не получилось по вашей сделать: 1) Добавляем нужного Пользователя в чат и узнаем его ID (можно посмотреть в ссылке на профиле); 2) Узнаем ID чата: Зайти в нужный чат, нажать на участников (справа появиться окно с пользователями), нажать «Скопировать ссылку на чат» — в этой ссылке будет айди чата в конце ссылки (...chat324 — здесь айди 324) 3) Заходим в административную часть: Настройки / Производительность / Таблицы / в фильтре находим «b_im_chat», дальше по айди из пункта 2 находим нужный чат / нажимаем на ≡ (тройное равно) / Изменить / AUTHOR_ID присваиваем ID пользователя… Подробнее »
Спасибо! Это сработало!
В админке есть Командная PHP-строка,
Пишем:
CModule::IncludeModule ('im');
$CIMChat = new CIMChat (1);
echo $CIMChat->SetOwner ([ID чата], [ID Нового владельца], false);