im · Веб-мессенджер 26.1400.0 Ломающее

Im 26.1400.0: поиск по чатам, личные закрепы и очистка истории

6 мин чтения Устаревших API: 6
Узнавайте о ломающих изменениях Битрикса раньше, чем они доедут до прода: свежие разборы — в канале @bxmax_updates

Ломающее обновление

Удалены или изменены публичные 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()

Новая версия вышла — разбор уже в Telegram

В канале @bxmax_updates публикуем каждый свежий разбор: что сломается, что устарело и что появилось в API. Узнаете до того, как обновите прод.

Подписаться

Читайте дальше

im 26.1150.0 Заметное Свежее

Im 26.1150.0: коллабы в режиме новых проектов и запросы, которые больше не виснут после invalid_authentication

Im 26.1150.0 вышел в один день с [intranet 26.1750.0](/bitrix-updates/intranet/intranet-26-1750-0) и [socialnetwork 26.275.0](/bitrix-updates/socialnetwork/socialnetwork-26-275-0), публичный API в нём не менялся. Мессенджер иначе решает, когда показывать коллабы в режиме новых проектов, объясняет от…

3 мин
im 26.1100.0 Ломающее

Im 26.1000.0–26.1100.0: формы в сообщениях ботов, список команд и новый ответ delete/update

За один прогон в эталон приехали три версии im: 26.1000.0, 26.1050.0 и 26.1100.0. Боты получили формы прямо в сообщении и REST со списком команд чата, а `im.v2.Chat.Message.delete` и `update` теперь отвечают объектом вместо `true`. В 26.1100.0 закрыты две дыры, одна из них открывала доступ к файлам…

1 мин
im 26.900.0 Ломающее

im 26.900.0 + socialnetwork 26.150.0: инициатор в событиях внешних чатов и установщик на миграциях

В im 26.900.0 папки чатов научились работать с dialogId, мобильная синхронизация узнаёт об уволенных сотрудниках, у чата появился бэкенд навигации по датам, а установщик модуля переехал с SQL-файлов на `UpdateSystem\Migration`. Ломаются конструкторы десяти событий внешних чатов, несколько флагов в `…

1 мин
im 26.800.0 Заметное

im 26.800.0 + socialnetwork 26.100.0: чаты крепятся к проекту, markdown в сообщениях, учёт входов по ссылке

Большой парный релиз: `im` и `socialnetwork` едут одним батчем, потому что делают одну вещь — сращивают чаты с проектами. Чат теперь можно прикрепить к проекту как дочерний, лента знает о своих IM-сообщениях, а прочтение в одном месте гасит счётчик в другом. Плюс markdown и учёт участников шаринг-сс…

5 мин
Мы используем файлы cookie для улучшения работы сайта. Продолжая использовать сайт, вы соглашаетесь с нашей политикой конфиденциальности.
AI Домовой

AI Домовой История

на связи

пишет…

Можно закрыть чат и перейти на другую страницу. Когда ответ будет готов, на кнопке Домового появится отметка.

Нет истории чатов
AI Домовой

Нужна авторизация

Войдите, чтобы задавать вопросы AI Домовому.

Войти