Один из главных способов коммуникации сотрудников внутри портала Битрикс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);