im · Веб-мессенджер 26.800.0 Заметное

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

5 мин чтения

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

Дерево чатов: чат как часть проекта

Центральное новшество — Chat\Tree\ChatTreeAttachmentManager с методами attachToParent(), detachFromParent(), validateAttach(), validateDetach() и парой экшенов Chat::attachToParentAction / detachFromParentAction. Рядом ChatTreeScope / ChatTreeScopeFactory, ChatAncestorFilter и асинхронное UnlinkDepartmentFromDescendantsMessage.

Идея: у чата появляется родитель, а у проекта — набор дочерних чатов. Отсюда же переименования в чтении — операции стали работать не «по типу чата», а «по области дерева»:

  • Controller\Chat::readByTypeAction → readByRecentSectionAction(CurrentUser $user, Reader $reader, string $recentSection, ?int $parentId = null)
  • ReadService::readByType → readByTreeScope(ChatTreeScope $scope, ...)
  • AnchorCollection::fillParents → fillChatData, AnchorProvider::getParentMap → getChatDataMap

Это ломающие переименования: старых имён нет.

Со стороны socialnetwork под то же самое приехали сообщения ChildChatAttachedToProject / ChildChatDetachedFromProject и события OnAfterAttach/DetachChildExternalChatSonetGroup.

Лента и IM перестали считать прочтения раздельно

Новая таблица b_sonet_log_im_message (LOG_ID, IM_CHAT_ID, IM_MESSAGE_ID, GROUP_ID, DATE_CREATE, PK по log+chat) и сервис LogImMessageLinkService связывают запись ленты с сообщением чата. К ним — хендлеры на чтение и удаление, события OnAfterReadMessages/ReadAllMessagesExternalChatSonetGroup, OnAfterReadAllChats, OnSocNetLogDelete / OnSocNetGroupDelete для зачистки связей.

Раньше это была вечная жалоба: пост прочитан в ленте, а счётчик в чате горит (или наоборот). Теперь связь материализована, и прочтение с одной стороны гасит счётчик с другой. В im появились Integration\Socialnetwork\EventHandler\ContentViewedHandler и LiveFeedReadAllHandler — а массовый сброс счётчиков они делают через CUserCounter::clearLiveFeedCodes(), который завезли в main 26.650.0 того же батча.

Кто вошёл по ссылке — теперь известно

Новая таблица b_im_sharing_link_member (SHARING_LINK_ID, USER_ID, ENTITY_TYPE, ENTITY_ID, DATE_CREATE, BLOCKED, unique по link+user) и SharingLinkMemberService.

Практический смысл в колонке BLOCKED: до этого ссылка была бинарной — либо живёт для всех, либо отозвана целиком. Теперь можно заблокировать конкретного вошедшего, не выкидывая остальных и не переиздавая ссылку.

Права на удаление чата, кстати, сделаны не колонкой таблицы, а параметром чата MANAGE_DELETE (Chat::getManageDelete() / setManageDelete()).

Markdown и превью коллабы

  • Features::isMarkdownAvailable() плюс парсер в JS (im/v2/lib/parser/src/markdown/*: converter, block/inline/list/table rules). Разметка разбирается на клиенте.
  • Recent\PreviewSource\{CollabPreviewSourcePiggyback, PointerService, Resolver} и две новые колонки в b_im_recent: PREVIEW_SOURCE_CID, PREVIEW_SOURCE_MID. В списке чатов у коллабы показывается осмысленное превью, а не последнее служебное сообщение. Recent::raiseChat() получил совместимый ?CollabPreviewSourcePiggyback $previewSource = null.

Что сломается

im:

  • readByTypeAction, ReadService::readByType, AnchorCollection::fillParents, AnchorProvider::getParentMap — переименованы (см. выше).
  • CopilotChat::sendBanner() — второй аргумент был ?string $copilotName, стал bool $force = false. Имя сдвинулось. Позиционный вызов передаст строку туда, где ждут булев флаг — самый неприятный вид поломки, потому что PHP её проглотит при нестрогих типах.
  • Features::__construct снова переехал: collabPreviewSourceEnabled и isMarkdownAvailable вставлены перед isCopilotDraftChatAvailable, а в конец добавлены isAttachChatToProjectAvailable и isReplyWithMediaAvailable. Второй релиз подряд — если вы собираете Features позиционно, перестаньте.
  • FavoriteChat::sendBanner() без аргументов → sendBanner(?int $authorId = null, bool $force = false).

socialnetwork:

  • V2\Public\Dto\Project\Feature::__construct — добавлен ?string $type = null.
  • ProjectProvider::__construct — добавлены три nullable-зависимости (?ProjectAccessService, ?ProjectNotificationSettingsService, ?Landing\Service\Project).
  • Удалены JS-компоненты socialnetwork/v2/components/elements/ui-date-picker и ui-radio.

Совместимо: у ExternalChat-событий добавлены параметры с дефолтами (AfterReadAllMessagesEvent + $lastMessageId = 0, AfterUsersAddEvent + ?AddUsersConfig, FilterUsersByAccessEvent + FilterContext $context = Interactive).

Ещё в socialnetwork

Заметки коллабы: Collab\Controller\Note, таблица b_sonet_collab_note (COLLAB_ID, COLLECTION_ID, CREATED_BY, unique по COLLAB_ID — то есть одна заметка на коллабу), сервисы BindingService, CollabKnowledgeService, PermissionProjectionService и асинхронная раскладка прав. Плюс AddBotCommand / AddBotHandler для проектов, ProjectsTrialService, передача владельца проекта и новые методы ProjectProvider.

В SQL-установщике im почти все CREATE TABLE переписаны на CREATE TABLE IF NOT EXISTS (и индексы pgsql на IF NOT EXISTS), а агентам проставлен existError: false. Такая ручная защита от повторного выполнения — ровно то, что снимает переход на UpdateSystem\Migration, куда другие модули батча уже уехали.

Что делать

  1. Проверьте позиционные вызовы Features::__construct и CopilotChat::sendBanner — это два главных источника тихих поломок.
  2. Ищите в коде readByType / fillParents / getParentMap — переименованы.
  3. Если делали свою связку «пост ленты ↔ чат», сравните с LogImMessageLinkService: скорее всего свою таблицу можно списать.

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

im 26.900.0 Ломающее Свежее

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

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

1 мин
im 26.700.0 Безопасность

im 26.700.0: гостевой доступ переписан с нуля — REST-метод joinByCode удалён

Вход гостя в чат по ссылке перестал быть «REST-методом плюс правилом в urlrewrite» и стал полноценной областью авторизации на уровне ядра. Заодно у гостевых ссылок появился срок жизни, а у неактивных гостей — агент очистки. Если вы что-то строили поверх гостевых чатов, этот релиз ломающий.

4 мин
voximplant 26.700.0 Ломающее Свежее

Voximplant 26.700.0: оценку качества связи убрали, у notifyAdmins() появился тип

Модуль телефонии voximplant 26.700.0 вышел в коробочный Битрикс24 11 сентября 2026 года, по данным официального канала «Битрикс24 changelog». Из карточки звонка убрали оценку качества связи вместе с её JS-событиями, у `Im::notifyAdmins()` появился тип параметра, а публичные константы `SipStatusInfor...

3 мин
ui 26.687.0 Рутинное Свежее

UI 26.687.0: триал VibePlus в облаке и дизайн чипа TintedBitrixGpt

`Bitrix\UI\Controller\InfoHelper` при активации демо сначала спрашивает у модуля bitrix24, включён ли старт VibePlus, и если да, запускает триал VibePlus вместо обычного демо тарифа. Ветка срабатывает только при подключённом модуле bitrix24 и определённой константе `BX24_HOST_NAME`. В `ui.system.chi...

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

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

на связи

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

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

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

Войти