pull · Push and Pull 26.100.0 Ломающее

Pull 26.0.0 и 26.100.0: sendBadges() удалён, protobuf.js в браузере стал minimal

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

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

Удалены или изменены публичные API — прикладной код может перестать работать.

Pull приехал двумя версиями подряд: 26.0.0 (сборка от 22 июля) и 26.100.0 (от 7 августа). Первая удалила CPushManager::sendBadges() и превратила MobileCounter::send() в заглушку, вторая заменила встроенный protobuf.js 2018 года на 7.6.5 в урезанной minimal-сборке. Читать стоит тем, кто сам шлёт бейджи через CPushManager или MobileCounter, и тем, чей JS пользуется глобальным protobuf на страницах с pull.

Уберите вызовы sendBadges() и MobileCounter::send()

В 26.0.0 из CPushManager (classes/general/pull_push.php) удалён метод sendBadges($userId = null, $appId = self::DEFAULT_APP_ID). Он был однострочной обёрткой над \Bitrix\Pull\MobileCounter::send(), и вызов из вашего кода теперь закончится фаталом Call to undefined method.

С MobileCounter::send() обошлись мягче. Метод на месте, сигнатура та же, но тело заменено на return false;, а в докблоке появился @deprecated со ссылкой на Bitrix\Pull\Push::add. Раньше он брал пользователя из глобального $USER, если $userId не передан, и вызывал Push::add() с 'badge' => 'Y'. Теперь вызов молча возвращает false, и пуш не уходит.

Туда же ушла реакция на сброс счётчика ленты. MobileCounter::onSonetLogCounterClear() больше не зовёт send(), а регистрацию обработчика socialnetwork:OnSonetLogCounterClear убрали из install/index.php. Снятия регистрации на уже установленных порталах в диффе не видно. Если апдейтер её не снял, обработчик будет вызываться вхолостую, так что проверьте b_module_to_module. Кто теперь шлёт бейдж при сбросе счётчика, дифф тоже не показывает. В пометке @deprecated сказано только, что отправку пушей перенесли в сервис Push.

Заменяйте прямым вызовом Push::add() с теми же параметрами, что раньше собирал send():

        <?php declare(strict_types=1);

namespace Vendor\Mobile\Push;

use Bitrix\Main\Loader;
use Bitrix\Pull\Push;

final class BadgeNotifier
{
    public function notify(int $userId): bool
    {
        if ($userId <= 0 || !Loader::includeModule('pull')) {
            return false;
        }

        Push::add($userId, [
            'module_id' => 'pull',
            'push' => ['badge' => 'Y'],
        ]);

        return true;
    }
}

    

Подстановки текущего пользователя из $GLOBALS['USER'], как в старом send(), здесь нет, $userId передаётся явно.

Проверьте, чем ваш JS пользуется в глобальном protobuf

В 26.100.0 рантайм pull/install/js/pull/protobuf/protobuf.js обновили с v6.8.6 (собран в феврале 2018) до v7.6.5 (собран 4 июля 2026). Сменился и тип сборки: в файле было protobuf.build = "full", стало protobuf.build = "minimal". Та же библиотека вшита в connector.bundle.js и pull.worker.bundle.js.

Minimal-сборка кодирует и декодирует сообщения по заранее сгенерированным классам. Самому pull этого хватает, его model.js сгенерирован pbjs -t static-module и парсер не использует. А из глобального объекта protobuf пропали парсер и reflection:

  • загрузка и разбор схем: load, loadSync, parse, tokenize, common;
  • reflection-классы: Root, Type, Field, MapField, Enum, OneOf, Namespace, ReflectionObject, Service, Method, Message;
  • генераторы и хелперы: encoder, decoder, verifier, converter, types, wrappers.

Остались Reader, Writer, BufferReader, BufferWriter, util, rpc, roots и configure.

Если ваш фронтенд подхватывал этот глобальный protobuf и грузил через него свои .proto или собирал типы через Root.fromJSON(), после обновления такие вызовы упадут, потому что этих свойств больше нет. Посмотреть, какая сборка загружена на странице, можно из консоли браузера:

        console.log(globalThis.protobuf?.build);       // 'full' до 26.100.0, 'minimal' после
console.log(typeof globalThis.protobuf?.Root); // 'undefined' на minimal

    

Если reflection вам нужен, держите свою сборку protobuf.js модулем внутри своего бандла и не кладите её в глобальную область. Pull ищет свою модель в globalThis.protobuf.roots['push-server'], и подмена глобального объекта ударит уже по нему.

Сверьте список поддерживаемых браузеров

Бандлы pull.connector и pull.worker пересобраны, и транспиляции современного синтаксиса в них больше нет. Раньше вызов логгера в dist выглядел как (_this$logger = this.logger) == null ? void 0 : _this$logger.log(...), теперь там this.logger?.log(...). Вместо x != null ? x : y теперь x ?? y, а присваивания в конструкторе после super(...args) превратились в поля класса. Движок без поддержки этого синтаксиса бандл не распарсит.

Проверяйте результат Event::add() с user_params

Единственная PHP-правка 26.100.0 сделана в Bitrix\Pull\Event (lib/event.php). Когда JSON-RPC не используется, а в параметрах есть user_params или dictionary, Event::add() уходит в приватный generateEventsForUsers(). Раньше этот вызов шёл без присваивания, а сам generateEventsForUsers() ничего не возвращал, поэтому вызывающий код не узнавал, приняты ли события в очередь. Теперь он возвращает bool, и add() отдаёт его наверх. true получится, только если был хотя бы один вызов addEvent() и все такие вызовы вернули true. При пустом списке получателей addEvent() не вызывается ни разу, и результат будет false. В режиме JSON-RPC эта ветка не используется.

Заодно приватный generateEventsForUsers() перестал шуметь на неполных параметрах. params теперь приводится к массиву, а dictionary и user_params читаются через ?? null.

        <?php declare(strict_types=1);

use Bitrix\Main\Loader;
use Bitrix\Pull\Event;

Loader::requireModule('pull');

$sent = Event::add([15, 42], [
    'module_id' => 'vendor.tasks',
    'command' => 'taskUpdated',
    'params' => ['taskId' => 7],
    // персональные параметры сливаются с общими через array_merge
    'user_params' => [
        42 => ['role' => 'auditor'],
    ],
]);

if (!$sent) {
    // с 26.100.0: какой-то addEvent() вернул false или получателей не оказалось
}

    

Новое в модели push-сервера

В pull/install/js/pull/protobuf/model.js появился тип RegisterRequest с двумя строковыми полями, verificationQuery и host, а в oneof command сообщения Request добавлено поле registration под номером 4. Коннектор и воркер его пока не используют, так что это заготовка. У всех 17 типов модели появился статический getTypeUrl(), его генерирует pbjs 7. Рядом с protobuf.js лёг минифицированный protobuf.min.js.

Мелочи и находки

  • Из pull/install/js/pull/protobuf/bootstrap.es6.js удалили console.log('xxx');.
  • Шапка model.js теперь сообщает, чем модель генерировали: pbjs -t static-module ... --no-verify --no-convert --no-delimited -p pull/dev/protobuf, protobufjs-cli 1.3.3. Там же записка для своих разработчиков: после каждой регенерации руками менять UMD-обёртку на поиск рантайма в глобальной области, чтобы модель работала без AMD/CommonJS и в SharedWorker. Самих request.proto и response.proto в диффе нет.
  • Код, который генерирует pbjs 7, строже старого. Конструкторы сообщений пропускают ключ __proto__, а encode и decode считают глубину вложенности. При превышении лимита encode бросает max depth exceeded, а decode бросает maximum nesting depth exceeded.
  • В connector/src/codec/models.js window.protobuf заменили на globalThis.protobuf. Комментарий объясняет, что модуль вшивается и в SharedWorker.
  • Сборщик выкинул из бандлов неиспользуемые константы. В CloseReasons из десяти кодов осталось четыре (CONFIG_REPLACED, SERVER_RESTARTED, STUCK, WRONG_CHANNEL_ID), из ServerMode пропал Personal. Бандл экспортирует только Connector и ConnectorEvents, так что снаружи этих констант не было видно и раньше.
  • В 26.0.0 из приватного CPullChannel::SendCommand() убрали CHTTP::PrepareData(), а строка $httpClient->disableSslVerification();//todo: remove осталась на месте.
  • Ещё в 26.0.0 по всему модулю \CHTTP::urlAddParams() заменили на (new Uri($url))->addParams(): в Config::getPublishUrl(), Config::getJsonRpcUrl(), JsonRpcTransport, ProtobufTransport и CPullChannel.
  • self::$staticCache[$lockId] в CPullChannel читается через ?? null, и первое обращение к кешу канала больше не даёт предупреждения о несуществующем ключе.
  • Ревизия API коннектора прежняя, REVISION = 19. Схема БД не менялась ни в одной из двух версий.

Что делать

Перед обновлением прогоните поиск по проекту: sendBadges( и MobileCounter::send( в PHP, protobuf.load, protobuf.parse и protobuf.Root в JS. После обновления проверьте на тестовом портале, приходит ли бейдж после сброса счётчика ленты.

Устаревшие и удалённые API в этой версии

Символ Статус Чем заменять
Bitrix\Pull\MobileCounter::send() Deprecated Bitrix\Pull\Push::add()
CPushManager::sendBadges() Удалено Bitrix\Pull\Push::add()

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

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

Подписаться

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

pull 25.400.0 Заметное

pull 25.400.0: массовое удаление каналов и эмодзи, которые ломали очередь пушей

Небольшой релиз с двумя очень прикладными вещами: bulk-удаление каналов и push-токенов пачкой и кодирование эмодзи в очереди пушей. Ломающих изменений нет — единственная правка сигнатуры совместима со старыми вызовами.

3 мин
timeman 26.350.0 Заметное Свежее

Timeman 26.350.0: план дня пишется в нужную запись, блоки БП возвращают Saved

В timeman 26.350.0 для коробочного Битрикс24 блоки «Сохранить план на день» и «Сохранить отчёт сотрудника за день» из нового конструктора бизнес-процессов научились писать в заданную запись рабочего дня, оставлять Markdown как есть и сообщать, сохранилось ли (у отчёта новые настройки в конструкторе,…

2 мин
rpa 26.300.0 Безопасность Свежее

Rpa 26.300.0: права на перемещение элементов наконец проверяются

До RPA 26.300.0 `UserPermissions::canMoveItem()` сразу отвечал `true`, и любой сотрудник, кроме экстранет-пользователей, мог перетащить любой элемент на любую стадию, а права стадии на перемещение не учитывались. Теперь права проверяются, а тем, кто может только смотреть, `rpa.item.get` и `rpa.item….

3 мин
booking 26.500.100 Заметное Свежее

Booking 26.500.100: addList отвечает ошибкой, когда не создал ни одной брони, а четыре колонки дат стали DATETIME

В коробочный Битрикс24 пришёл booking 26.500.100 с двумя правками. AJAX-экшен `booking.api_v1.Booking.addList` теперь возвращает ошибку, если не создал ни одной брони. Апдейтер переводит четыре колонки дат с `TIMESTAMP` на `DATETIME`, и в `install/migrations/tables.php` они объявлены через `datetime…

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

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

на связи

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

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

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

Войти