Call 26.1000.0–26.1100.0: реакции, история звонков и замена записей
Ломающее обновление
Удалены или изменены публичные API — прикладной код может перестать работать.
В звонках Битрикс24 за две версии появились реакции, размытие фона в браузере, индикатор качества связи и история звонков в Sync, а Follow-up научился повторять анализ и заменять запись. Тем, кто дорабатывал звонки, придётся поработать: удалены прежние Vue-расширения интерфейса звонка, два PHP-метода и контракт фильтра журнала. И проверьте гостевые звонки, потому что опция guest_outgoing_call_enabled больше ничего не запрещает.
Новое
Реакции, фон и качество связи
В 26.1000.0 участники звонка могут отправлять анимированные реакции, отметка видна у участника, а шесть быстрых реакций подстраиваются под историю использования. Отправку включает флаг ReactionsFlag или персональная настройка call_reactions_enabled, входящие реакции видны и без флага. Для своего интерфейса call.component.reactions экспортирует ReactionsService и ReactionsPicker, а AJAX-действия контроллера Reaction отдают быстрый список, аналитику и подсказку (через REST они недоступны).
Размытие и замена фона в браузере требуют WebBackgroundFlag, Chromium с WebGL2 и обработкой кадров, а ещё устройство должно пройти проверку производительности. Сервис — backgroundBlurService из call.lib.background-blur. Галерея call.Desktop.Background.getWeb отдаёт гостям конференции и анонимам поставляемые картинки, а темы портала — пользователям intranet и extranet.
Индикатор QoS показывает качество соединения и причину ухудшения. Его включает QosFlag или настройка call_qos_enabled, мобильному клиенту дополнительно нужен MobileQosFlag. После тайм-аута ответа медиатракт теперь восстанавливается.
История звонков в Sync
В 26.1100.0 у страницы /sync/calls/ есть поиск по участникам, фильтры входящих, исходящих и пропущенных, отметки Follow-up и подгрузка списка. Страница работает при Settings::isSyncPresetEnabled(), иначе пользователя отправит на /sync/. Строки пока не кликабельны. У сотрудника, который ушёл из чата, запись может остаться без участников.
Встроить список к себе можно через расширение call.application.sync-calls-page:
BX.Runtime.loadExtension('call.application.sync-calls-page').then(({ SyncCallsPage }) => {
const page = SyncCallsPage.mount(document.getElementById('calls'), { pageTitle: 'Звонки' });
// page.unmount() убирает приложение
});
Повторный mount() в тот же контейнер заменяет уже смонтированное приложение. Для своей сборки есть SyncCallsPage.createApp().
На PHP Bitrix\Call\Service\FollowUpReader::listByChat() отдаёт завершённые звонки чата, в том числе без AI-результата, с курсором (startDate, id). Bitrix\Call\Public\Service\SyncChatService::createChat() создаёт чат и возвращает Result с chat, chatId и dialogId. Права пользователя оба сервиса не проверяют, это работа вызывающего кода.
Флаг SyncPrimaryCallFlag (по умолчанию выключен) переводит главную кнопку звонка в групповом чате на модуль syncconnector, без него флаг не работает. В личных чатах звонит по-прежнему call.
Follow-up без потерянных записей
С 26.1000.0 Follow-up восстанавливает анализ, который отключился после ошибки, и дозапрашивает у медиасервиса недостающие файлы. Проверка идёт раз в час, не больше 12 попыток и 12 часов после конца звонка. Если запись удалили намеренно, повтора и новых файлов звонка не будет, пока не появится новая запись. call.Call.isAutoStartRecordingAvailableInChat проверяет, можно ли включить автозапись: права на чат, настройки AI и число реальных участников.
В 26.1100.0 медиасервис может вызвать call.CallController.restartFollowUp с типами анализа, onlyFailed, force, purge (удаляет текстовые результаты) и источником stored или delivery. Это служебный callback для операторов, а не метод для интеграций. При замене записи Диск сохраняет ссылку и добавляет файлу новую версию. Пустая повторная транскрипция не затирает прежнюю, а итоговое сообщение не дублируется.
Что сломается
Удалённые PHP-методы
GuestCallPolicy::canStartCall() удалён в 26.1000.0. Остались проверки с контекстом canStartCallInChat() и canStartCallInEntity(), но общего запрета, который давал старый метод, они не заменяют.
TrackService::doNeedDownloadTrack() тоже удалён, условие собирается из двух методов:
use Bitrix\Call\Track\TrackService;
$service = TrackService::getInstance();
$needDownload = !$service->isDownloaded($track) && $service->hasDownloadSource($track);
Гостевые исходящие звонки
С 26.1000.0 опция guest_outgoing_call_enabled не запрещает гостям исходящие звонки, а Settings::isGuestOutgoingCallEnabled() всегда возвращает true. Гость по-прежнему звонит только участникам своего чата. Если вы закрывали гостям звонки этой опцией, проверьте права через GuestCallPolicy.
Старый интерфейс звонка
В 26.1100.0 удалены расширения call.application.call, call.component.view.call, call.component.view.conference, call.component.view.picture-in-picture, call.lib.media-registry и блоки прежнего Vue-интерфейса call.component.block.* и call.component.ui.*. Пропали экспорты MediaStreamRegistry из call.core и CallReactionsFeed из call.component.reactions. В call.store остался только useCallIncomingStore, а useCallStore, useUsersStore, useMediaStore, useUiStore и useRecordingStore удалены. Штатный интерфейс теперь подключает LegacyCallViewAdapter из call.view. Свой код, собранный на удалённых расширениях, придётся переписать.
Журнал звонков и REST
CallLogService::buildQueryFilter()возвращает?JournalQueryFilter, а не массив ORM-фильтра. Условия накладываются черезapplyTo(Query $query),nullзначит «совпадений нет», запрос можно не выполнять.- AJAX
call.CallLog.listна неизвестный статус или неверный тип фильтра отвечаетINVALID_FILTER_VALUE, PHP-сервис бросаетInvalidFilterValueException. Для стабильной пагинации передавайтеlastStatusTimeвместе сlastId. - REST
call.channel.public.listтребует членства вCALL_CHAT_ID, иначеNO_ACCESS. ВUSERSможно передать только участников чата. - Собственный TURN с неверным адресом или пустыми реквизитами теперь считается выключенным, и клиент уходит на стандартный. Адрес — hostname или IP с необязательным портом, без префикса
turn:илиstun:.
Deprecated
Settings::isGuestOutgoingCallEnabled() устарел в 26.1000.0. В 26.1100.0 JS-класс Call из call_api.js получил @deprecated: обычные звонки исполняет CallLegacy из call-api-legacy.js, но Call пока на месте.
БД
В 26.1000.0 b_call_session получила RECORD_DESTROYED CHAR(1) со значением N по умолчанию. Прежние включённые опции переехали в feature flags без перезаписи уже заданных значений, посайтовые настройки реакций в перенос не попали.
В 26.1100.0 появились b_call_userlog.DIRECTION VARCHAR(16) и b_call_userlog_index.USER_ID INT. Индексы журнала (DIRECTION, USER_ID, STATUS_TIME, ID) и (STATUS, USER_ID, STATUS_TIME, ID) заменили (USER_ID, STATUS), поисковый индекс получил (USER_ID, USERLOG_ID), b_call_user — (USER_ID, CALL_ID). Старые строки дозаполняются в фоне, и пока заполнение идёт, журнал читается корректно.
Мелочи и находки
- Push о пропущенном групповом звонке с 26.1000.0 открывает чат. В 26.1100.0 пересчёт и публикация счётчика объединены.
- Из CLI доставка результатов и очистка временных файлов выполняются сразу. Ошибки сохранения записи и привязки к Диску теперь возвращаются вызывающему коду, расширение файла определяется по MIME.
- Кнопка продолжения Follow-up проверяет доступ к звонку. В 26.1100.0 исправлена ошибочная привязка бота к обычному пользователю, учётная запись при этом не удаляется.
- Браузер отличает системное отключение микрофона от отсутствия звука.
call.lib.media-logэкспортируетMediaLogдля диагностики, идентификаторы устройств в нём хешируются. В годовых итогахcall.parsed_callsсчитает звонки участника с AI-обзоромOVERVIEW. - Перечень сторонних библиотек и лицензий появился в 26.1000.0, в 26.1100.0 он подключён к
/bitrix/admin/copyright.php.
Устаревшие и удалённые API в этой версии
| Символ | Статус | Чем заменять |
|---|---|---|
Bitrix\Call\Settings::isGuestOutgoingCallEnabled()
|
Deprecated | — |
Call (call.core/call_api.js)
|
Deprecated |
CallLegacy (call.core/call-api-legacy.js)
|
Bitrix\Call\Service\GuestCallPolicy::canStartCall()
|
Удалено | — |
Bitrix\Call\Track\TrackService::doNeedDownloadTrack()
|
Удалено |
!Bitrix\Call\Track\TrackService::isDownloaded($track) && Bitrix\Call\Track\TrackService::hasDownloadSource($track)
|
call.application.call
|
Удалено | — |
call.component.view.call
|
Удалено | — |
call.component.view.conference
|
Удалено | — |
call.component.view.picture-in-picture
|
Удалено | — |
call.lib.media-registry
|
Удалено | — |
call.core: MediaStreamRegistry
|
Удалено | — |
call.component.reactions: CallReactionsFeed
|
Удалено | — |
call.store: useCallStore
|
Удалено | — |
call.store: useUsersStore
|
Удалено | — |
call.store: useMediaStore
|
Удалено | — |
call.store: useUiStore
|
Удалено | — |
call.store: useRecordingStore
|
Удалено | — |