Im 26.1400.0: поиск по чатам, личные закрепы и очистка истории
Ломающее обновление
Удалены или изменены публичные API — прикладной код может перестать работать.
В Im 26.1400.0 мессенджер научился искать сообщения по всем чатам, закреплять сообщения для себя и очищать историю для себя или для всех. Большинство функций выключено опциями, но несколько изменений заденут интеграции сразу: из сообщения пропал viewedCount, курсор закрепов теперь считает по ID сообщения, а у папок нет поля visible.
Новое
Включите поиск сообщений
Поиск работает через модуль search и включается двумя независимыми опциями: message_search_available и message_search_indexing_enabled, обе по умолчанию N. Запрос принимает от 3 до 300 символов и отдаёт до 50 результатов, по умолчанию 20, с повторной проверкой прав и доступной истории. Метод помечен Scope::NOT_REST, поэтому через внешний REST и гостям он недоступен.
Индекс обновляют отправка, правка, удаление, смена участников и очистка истории. Системные уведомления, исчезающие сообщения, чаты с автоудалением и черновики Copilot в него не попадают, имена файлов тоже. Если индексирование выключено, общая переиндексация удалит записи im. После включения запустите полную переиндексацию, иначе старые сообщения не найдутся.
Закрепляйте сообщения для себя
im.v2.Chat.Message.pinPersonal, unpinPersonal и im.v2.Chat.Pin.personalTail работают с личными закрепами: до 20 на пользователя в чате. Права на общий закреп для них не нужны, достаточно доступа к сообщению. События personalPinAdd и personalPinDelete получает только владелец. Опция personal_pin_available (по умолчанию N) прячет лишь интерфейс, серверные методы работают и без неё.
Панель закрепов показывает общие и личные вместе, фильтрует и ищет по ним, в API для этого есть filter.searchMessage. Когда человек снимает общий закреп, в чат уходит системное сообщение. Отключить его можно опцией message_unpin_notification_disabled=Y, для ботов, системного пользователя, комментариев и открытых линий оно не пишется.
Очищайте историю для себя или для всех
im.v2.Chat.clearHistory прячет историю только для вызвавшего, im.v2.Chat.clearHistoryForAll прячет для всех и ставит физическое удаление в очередь. В личном диалоге обе операции доступны участнику. В обычных и открытых чатах, каналах и коллабах очистить для себя может участник, для всех — менеджер и выше, остальные типы чатов запрещены. Отдельной опции нет.
Скрытое исчезает из чтения, счётчиков, закрепов, напоминаний и комментариев сразу, ещё до фонового удаления. Граница учитывается и в старых API, и в подписанных ссылках на файлы. Клиент узнаёт об очистке из Pull-событий ChatHistoryDeletedForSelf и ChatHistoryDeletedForAll, а превью коллабы в списке чатов пересчитывается после очистки и смены mute.
Папки, задачи и BitrixGPT
Папки чатов можно скрывать, возвращать и переставлять. im.v2.Folder.saveList принимает порядок вместе с showFolderIds и hideFolderIds и отвечает FOLDER_SORT_STALE_SCREEN, если клиент прислал устаревший список. Папку «Все» скрыть нельзя. Опции folder_scoped_pins_available или пользовательская folder_scoped_pins_available_user (обе N) включают закрепы чатов внутри папки, до 45 на папку. Папке встреч нужны meetings_folder_available=Y и модуль calendar.
Перед созданием задачи из чата AI может проверить дубли: нужны ai_task_dedup_enabled=Y, AI text engine, промпт task_duplicate_check_prompt и модуль tasks. Совпадение не запрещает создать задачу, ошибка AI тоже. Из расшифровки теперь можно создать несколько задач.
Для своих сценариев с Copilot есть Bitrix\Im\V2\Public\Provider\Copilot\AnswerProvider::get(): статус pending, completed, failed или stopped, готовый текст и блоки. Обработчик события OnCopilotMessageRegenerate может вернуть решение о повторной генерации, допустимую причину отказа и текст до 200 символов.
Управляйте участниками из кода
AddMembersCommand и DeleteMembersCommand из Bitrix\Im\V2\Public\Command\Chat\Member меняют состав GroupChat и возвращают результат. Команды доверенные (withContextUser(0)): права вызывающего проверяйте сами. ChatMembersProvider отдаёт участников DTO и страницами ID до 1000 записей.
Что сломается
Запрашивайте viewedCount отдельно
Поле viewedCount убрали из сообщения. Число просмотров теперь отдают im.v2.Chat.Message.tailViewers и im.v2.Chat.Message.Reaction.tail с параметром includeViewedCount=Y:
const response = await BX.ajax.runAction('im.v2.Chat.Message.tailViewers', {
data: { messageId: 1024, includeViewedCount: 'Y' },
});
В PHP удалены Message::setViewedCount(), MessageCollection::fillViewedCount() и ViewProvider::getViewedCountForMessages(), одиночный ViewProvider::getViewedCount() остался. В меню сообщения просмотры и реакции теперь показаны одним списком без дублей.
Обновите работу с закрепами и папками
В im.v2.Chat.Pin.tail курсор LAST_ID теперь хранит ID сообщения, а не закрепа. Старый im.chat.pin.get по-прежнему листает по ID закрепа. Общих закрепов в чате не больше 20, включая те, что лежат в недоступной участнику истории. Двадцать первый получит PIN_LIMIT_REACHED с limit=20.
У папок поле visible заменили три: hiddenBySystem, hiddenByUser, canHide, а BaseFolder::isVisible() удалён. Своим реализациям Folder нужен метод isPrimaryRoot(). SystemFolder::isAvailable() стал final, наследники переопределяют isAvailableOnPortal() и при необходимости isAvailableForUser().
Поправьте задачи и видеокружки
TaskItem::getByMessageId() заменён на getAllByMessageId(): array: к сообщению может быть привязано несколько задач. TranscribedTaskHandler::handle() возвращает TaskCreationOutcome, зависимости его конструктора изменились.
Скачивание и сохранение видеокружков проверяет опцию video_note_download_available. Если она не задана, в облаке доступ есть, в коробке нет. Пакет файлов с запрещённым видеокружком целиком получит VIDEO_NOTE_DOWNLOAD_RESTRICTED, это касается и старого сохранения на свой Диск. Даже при включённой опции скачать могут только внутренние пользователи и боты.
Deprecated
BX.Messenger.v2.Lib.MessageMenu.prototype.getPinItem() заменяется на getPinItems(): MenuItemOptions[]. Старый метод знает только про общий закреп.
БД
Личные закрепы лежат в b_im_link_pin_personal (ORM LinkPinPersonalTable), пара (MESSAGE_ID, AUTHOR_ID) уникальна. В b_im_folder добавлено HIDDEN_BY_USER, по умолчанию N.
Мелочи и находки
- При переполнении Диска загрузка файла в чат возвращает
DISK_QUOTA_EXCEEDEDсinfoHelperCode, а интерфейс отличает квоту от слишком большого файла и сетевой ошибки. Индексирование опубликованных в чате файлов на Диске включаетdisk_im_head_indexing_enabled=Y: до 10 файлов за публикацию, настройка от 0 до 100. - Остановка ответа BitrixGPT может вернуть
generating: запрос принят, но генерация ещё идёт. НеобязательныйmessageIdостанавливает ответ на конкретный вопрос. - Поиск эмодзи (
emoji_search_available) и запись голосовых (voice_message_recording_available, от 800 мс) выключены по умолчанию. - Итоги года при модуле
intranetсчитают каналы, сообщения и полученные реакции. Check-in требуетstafftrack:CheckInSettingsProvider::isCheckInAvailable(), гостевые звонки зависят от политикиcall. - Регистрация бота проверяет соответствие ID и логина, а откат ошибочной регистрации обычного пользователя не удаляет его учётную запись.
Bot::isBotUser()проверяет тип пользователя.ChatAvatar::getOriginalFile()отдаёт оригинал аватара сSRC. CBPIMNotifyActivity::ValidateProperties()больше не требует от неадминистратора, чтобы отправитель совпадал с автором шаблона: его можно задать выражением, группой или отделом.
Устаревшие и удалённые API в этой версии
| Символ | Статус | Чем заменять |
|---|---|---|
BX.Messenger.v2.Lib.MessageMenu.prototype.getPinItem()
|
Deprecated |
BX.Messenger.v2.Lib.MessageMenu.prototype.getPinItems()
|
Bitrix\Im\V2\Message::setViewedCount()
|
Удалено | — |
Bitrix\Im\V2\MessageCollection::fillViewedCount()
|
Удалено | — |
Bitrix\Im\V2\Reading\View\ViewProvider::getViewedCountForMessages()
|
Удалено |
Bitrix\Im\V2\Reading\View\ViewProvider::getViewedCount()
|
Bitrix\Im\V2\Folder\BaseFolder::isVisible()
|
Удалено | — |
Bitrix\Im\V2\Link\Task\TaskItem::getByMessageId()
|
Удалено |
Bitrix\Im\V2\Link\Task\TaskItem::getAllByMessageId()
|