Этот скрипт предназначён для массового удаления чатов в Bitrix24 коробочной версии по текстовому фильтру сообщений. Полезен, когда у вас накопились сотни или тысячи технических чатов — например, автоматически созданных при просрочке задач — которые засоряют список и не несут смысловой нагрузки.
Скрипт ищет чаты, в которых единственное пользовательское сообщение совпадает с заданным паттерном (по умолчанию — «просрочил задачу»), и удаляет такие чаты через штатный API Битрикс24 CIMChat::deleteChat(). Прямые SQL-DELETE не используются — корректно очищаются все связанные данные.
Требования
- Bitrix24 коробочная версия (on-premise)
- Права на запуск PHP-скриптов через браузер или CLI
- Модуль
imустановлен и активен
Скрипт
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
<?php /** * Одноразовый скрипт: удаление чатов, где единственное пользовательское сообщение — о просрочке задачи. * После выполнения — удалить этот файл. * * Запуск: php -f /path/to/cleanup_overdue_messages.php * Или через браузер: http://your-site.ru/local/tools/cleanup_overdue_messages.php */ define('NOT_CHECK_PERMISSIONS', true); define('NO_AGENT_CHECK', true); require_once $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php'; use Bitrix\Main\Loader; if (!Loader::includeModule('im')) { die('Module "im" not found'); } global $DB; echo "<pre>\n"; echo "=== Удаление чатов с единственным сообщением о просрочке ===\n\n"; // Шаг 1: находим все уникальные CHAT_ID с сообщением о просрочке // Паттерн '%просрочил%задачу%' покрывает и "просрочил задачу" и "просрочила задачу" $sql = " SELECT DISTINCT m.CHAT_ID FROM b_im_message m WHERE m.MESSAGE LIKE '%просрочил%задачу%' "; $result = $DB->Query($sql); $chatIdsToCheck = []; while ($row = $result->Fetch()) { $chatIdsToCheck[] = (int)$row['CHAT_ID']; } echo "Найдено чатов с сообщением о просрочке: " . count($chatIdsToCheck) . "\n\n"; $deleted = 0; $errors = 0; $skipped = 0; $deletedIds = []; // Шаг 2: для каждого чата проверяем — если пользовательских сообщений ровно 1, удаляем foreach ($chatIdsToCheck as $chatId) { // Считаем пользовательские сообщения (AUTHOR_ID > 0) $countSql = " SELECT COUNT(*) as CNT FROM b_im_message WHERE CHAT_ID = {$chatId} AND AUTHOR_ID > 0 "; $countResult = $DB->Query($countSql); $countRow = $countResult->Fetch(); $userMsgCount = (int)$countRow['CNT']; if ($userMsgCount !== 1) { $skipped++; continue; } // Получаем данные чата для удаления $chatSql = "SELECT ID, DISK_FOLDER_ID FROM b_im_chat WHERE ID = {$chatId}"; $chatResult = $DB->Query($chatSql); $chatRow = $chatResult->Fetch(); if (!$chatRow) { continue; } echo "Chat ID: {$chatId}\n"; try { \CIMChat::deleteChat([ 'ID' => (int)$chatRow['ID'], 'DISK_FOLDER_ID' => $chatRow['DISK_FOLDER_ID'], ]); echo " -> Удален\n"; $deleted++; $deletedIds[] = $chatId; } catch (\Throwable $e) { echo " -> ОШИБКА: " . $e->getMessage() . "\n"; $errors++; } } echo "\n=== Итого ===\n"; echo "Удалено чатов: {$deleted}\n"; echo "Пропущено (есть другие сообщения): {$skipped}\n"; echo "Ошибок: {$errors}\n"; if ($deletedIds) { echo "\nУдаленные ID чатов: " . implode(', ', $deletedIds) . "\n"; } echo "</pre>\n"; |
Как запустить
Разместите файл, например, по пути /local/tools/cleanup_overdue_messages.php и откройте в браузере или выполните через CLI:
|
1 |
php -f /path/to/cleanup_overdue_messages.php |
После выполнения обязательно удалите файл с сервера — оставлять служебные скрипты в публичном доступе небезопасно.
Как изменить фильтр
В строке SQL-запроса замените паттерн %просрочил%задачу% на нужный вам текст. Символ % означает любое количество любых символов (как * в поиске файлов).
