imopenlines 26.900.0 Ломающее

Imopenlines 26.700.0–26.900.0: статистика V2 и новые контракты истории

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

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

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

Открытые линии пришли одной пачкой из пяти версий: 26.700.0, 26.700.100, 26.800.0, 26.850.0 и 26.900.0. Главное для разработчика — REST-методы статистики V2 и событие, которое меняет текст перед отправкой клиенту. Главное для интеграций: imopenlines.session.history.get теперь отдаёт историю страницами, а проверки прав в коннекторах, роботе и REST-настройках линий стали строже.

Новое

Забирайте статистику через REST V2

Появились методы imopenlines.v2.Session.list, Session.Stat.get, Session.Transfer.list, Session.Rating.list, Operator.list и Stat.get: диалоги, показатели сессий, переводы, оценки, загрузка операторов и сводка за период.

        BX24.callMethod('imopenlines.v2.Stat.get', {
    dateFrom: '2026-10-01',
    dateTo: '2026-10-31',
    configIdList: [1, 3],
}, (result) => console.log(result.data()));

    

У Stat.get и Session.Rating.list период обязателен и не длиннее 366 календарных дней. Списки отдают по 50 записей, максимум 200, offset у Session.list и Session.Rating.list не больше 10000. Пакетная статистика принимает до 100 ID сессий, переводы до 50, списковый фильтр до 1000 значений. sessionsByHour содержит 24 часа в часовом поясе сервера.

Методы доступны пользователю интранета, если тариф проходит Limit::canUseReport(), а у пользователя есть право ENTITY_SESSION/ACTION_VIEW. Если тариф или права на линию не дают видеть оценку руководителя и комментарий, эти поля придут null. Недоступная сессия вернёт null-метрики, пустые агрегаты — нули.

Меняйте текст перед отправкой клиенту

Событие OnBeforeImopenlineMessageDeliver срабатывает прямо перед уходом сообщения во внешний канал, когда подпись оператора и преобразования транспорта уже применены. Обработчик получает MESSAGE_ID, MESSAGE, PARAMS и OPERATION (send или update) и кладёт новый текст в MESSAGE. Пустой текст игнорируется.

        use Bitrix\Main\Event;
use Bitrix\Main\EventManager;

EventManager::getInstance()->addEventHandler(
    'imopenlines',
    'OnBeforeImopenlineMessageDeliver',
    static function (Event $event): void {
        if ($event->getParameter('OPERATION') !== 'send') {
            return;
        }

        $text = (string) $event->getParameter('MESSAGE');
        $event->setParameter('MESSAGE', $text . "\n\nОтвечаем с 9:00 до 18:00 по Москве");
    }
);

    

История, оценки и отделы

История диалога открывается в отдельном слайдере V2: сообщения и закрепы ограничены сессией, старые страницы догружаются. Из JS слайдер открывает LinesHistoryApplication.openInSlider(), а StatisticsGridApplication подключает редактирование оценок в гриде. Права на историю, включая доступ через CRM, проверяются для переданного пользователя, а пустая CRM-привязка с ID 0 доступа больше не даёт.

Оценку руководителя и комментарий теперь правят в одном окне, ячейки статистики обновляются по Pull. Клиент может изменить свою оценку в окне последнего запроса до 20 раз, IMOL_TIME_LIMIT_VOTE=0 снимает срок. Повтор той же оценки не рассылает события и уведомления, а исправление не закрывает сессию второй раз.

Chat.addMembers принимает userIds и departmentIds, Department.list отдаёт отделы. Сотрудники отдела, включая руководителя, добавляются без дублей, нужен доступ к чату и действие Extend.

CRM-триггеры и мелкие API

Триггер исходящего сообщения срабатывает, когда канал принял сообщение или оно создано в клиентском livechat, и поздняя ошибка доставки его не отменяет. Служебные, скрытые и клиентские сообщения, а также сообщения ботов и роботов его не запускают. Триггер закрытия срабатывает на переходе CLOSED=N→Y, кроме spam и force, но при параллельном закрытии единственный вызов не гарантирован. Триггер нового сообщения боту возвращает configId даже без CRM.

Для своих расширений из imopenlines.v2.provider.service экспортируются HistoryLoadService, DepartmentService и VoteHeadService, из imopenlines.v2.lib.utils — resolveLineId и buildSendableImageLink. На PHP Tools\Url::getSafeExternalUrl() пропускает только абсолютные HTTP(S)-ссылки без управляющих символов, пробелов и обратного слеша, getSafeHost() достаёт из ссылки host. Common::isAgreementAvailable() проверяет, есть ли активное соглашение. Config::getList() принимает ACCESS_FILTER типа ConditionTree, который соединяется с вашим фильтром через AND, и тогда допустимы только ключи select, filter, order, limit, offset.

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

Листайте историю сессии страницами

Если установленный im поддерживает пагинацию, imopenlines.session.history.get отдаёт 50 сообщений по умолчанию и не больше 200. Интеграция, которая ждала всю историю одним ответом, получит только первую страницу. Перебирайте страницы по курсору:

        // callMethod — ваша обёртка над BX24.callMethod, которая возвращает Promise с result.data()
let cursor = {};
let page;
do {
    page = await callMethod('imopenlines.session.history.get', {
        CHAT_ID: chatId, SESSION_ID: sessionId, LIMIT: 200, ...cursor,
    });
    messages.push(...Object.values(page.MESSAGE));
    cursor = { LAST_ID: page.NEXT_ID, LAST_DATE: page.NEXT_DATE };
} while (page.HAS_NEXT_PAGE);

    

Последний запрос может вернуть пустую страницу: HAS_NEXT_PAGE считается по заполненности страницы. Со старым im метод отдаёт всё сразу, как раньше.

Замените вызовы API

  • Chat::sendPullUpdateSilentMode() удалён. Тихий режим ставят Operator::setSilentMode() или SilentMode\PersonalSilentMode::set(), второй возвращает bool и сам шлёт персональный Pull после записи.
  • FinishService из imopenlines.v2.provider.service переименован в SessionFinishService без алиаса. Ошибки завершения теперь отклоняют Promise, уведомление показывает вызывающий код.
  • imopenlines.v2.QuickReply.saveFromMessage возвращает {id: …} вместо {result: true}. На PHP Operator::saveToQuickAnswers() отдаёт ID или false, в JS QuickReplyService.saveFromMessage() — ID или null. Необязательный lineId выбирает линию, без него берётся активная сессия. Старый REST-обработчик Rest::messageSaveToQuickAnswer() по-прежнему отвечает true.
  • Recent::getNonAnsweredLines() по умолчанию отдаёт не больше 100 чатов, предел меняет положительный limit.
  • $userId стал int у Queue\Event\All::returnNotAcceptedSessionsToQueue(), Queue\Event\Queue::returnNotAcceptedSessionsToQueue() и returnSessionsUsersToQueueIsStartAbsence(). Вызов со строкой из файла со strict_types=1 упадёт с TypeError.

Проверьте права в коннекторах, роботе и REST

  • В extra коннектора принимаются только PORTAL_ID, EXTRA_URL, EXTRA_TARIFF, EXTRA_USER_LEVEL, EXTRA_PORTAL_TYPE, EXTRA_REGISTER и EXTRA_DEVICE_TYPE, причём PORTAL_ID только от network. Остальные поля молча отбрасываются.
  • Робот «Сообщение в открытую линию» проверяет файлы Диска с правами редактора при сохранении и импорте и с правами автора шаблона при выполнении, удалённые файлы отклоняет. Из b_file можно прикладывать файловые поля текущего документа и файловые результаты активити. Голые ID, переменные, константы и результаты REST-активити больше не пройдут, ошибка попадёт в журнал и таймлайн CRM.
  • REST configGet требует Config::canViewLine(), configListGet всегда ограничивает список доступными линиями, даже без CHECK_PERMISSION, configAdd требует права изменения. Отказ — CONFIG_WRONG_USER_PERMISSION. imopenlines.widget.vote.send требует авторизации, чужая сессия даёт VOTE_ERROR.
  • Аватар линии или оператора очереди можно взять только из своих свежих загрузок или из уже привязанных к линии. Включить соглашение без активного соглашения нельзя, а смена соглашения снова показывает предупреждение.

БД

В b_imopenlines_session добавлен nullable PORTAL_ID, в b_imopenlines_user_relation — SHOWN_AGREEMENT_ID (ORM-default 0, старое пустое значение отличает прежние записи). Замена пользователя сохраняет ID соглашения и пропускает некорректные записи с диагностикой imopenlines.session.replacement_user_code.

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

  • Действия CRM, история, закрепление, перехват и спам переехали в боковое меню. Завершение и спам спрашивают подтверждение только при CONFIRM_CLOSE=Y. Закрытый для оператора диалог исчезает из списка и поиска, даже если ждёт оценки.
  • Скрытые сообщения и всё, что связано с CoPilot (его сообщения, упоминания, ответы ему, индикатор набора), клиенту не уходят. AI-оператор по умолчанию выключен, новый Main\Config\Feature учитывает старую опцию Y.
  • Списки ENABLE_SYSTEM_MESSAGE и ENABLE_INCOMING_IDEMPOTENCY в imconnector включают служебные сообщения и защиту от повторных внешних ID. Network передаёт стикеры через IMOL_STICKER, другие каналы получают картинку файлом. Приветствие Network уходит, если у линии нет своего FIRST_MESSAGE, а network_welcome_allowed_list разрешает его принудительно.
  • Отчёты проверяют права и при прямом вызове API, Excel-экспорт экранирует формулы в EXTRA_URL и EXTRA_DOMAIN. Очередь статистики обходится по ID с коммитом каждые 500 строк и оставляет ошибочные записи на повтор.
  • Первое сообщение виджета с файлом больше не теряет вложение.

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

Символ Статус Чем заменять
Bitrix\ImOpenLines\Chat::sendPullUpdateSilentMode() Удалено Bitrix\ImOpenLines\Operator::setSilentMode()
imopenlines.v2.provider.service.FinishService Удалено imopenlines.v2.provider.service.SessionFinishService

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

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

Подписаться

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

timemanmobile 26.600.0 Заметное Свежее

Timemanmobile 26.550.0–26.600.0: отдельная карточка отчёта и диагностика начала дня

В timemanmobile 26.550.0 и 26.600.0 рабочий отчёт открывается в приложении отдельной карточкой, а не страницей портала. Отчёт, отправленный после полуночи, больше не считает отметки за чужой день. А если форма начала дня не показалась, теперь видно почему: причину пишет диагностический журнал.

4 мин
stafftrackmobile 26.600.0 Заметное Свежее

Stafftrackmobile 26.600.0: офисы с телефона и список присутствия команды

Мобильная часть [Stafftrack 26.600.0](/bitrix-updates/stafftrack/stafftrack-26-600-0): с телефона теперь можно создавать и редактировать офисы, искать сотрудника в списке присутствия команды и видеть, что рабочий отчёт готов к отправке. Всё это включается серверными флагами и зависит от версии прило…

4 мин
stafftrack 26.600.0 Ломающее Свежее

Stafftrack 26.600.0: управление офисами и маршруты сотрудников

В Stafftrack 26.600.0 офисы редактируются в вебе вместе с геозоной, сотрудниками и фотографиями, руководитель видит на карте сегодняшний маршрут сотрудника, а список сотрудников офиса можно запросить у руководителя. Если вы сохраняли офисы своим кодом или строили карты по отметкам, после обновления…

6 мин
rest 26.1300.0 Ломающее Свежее

Rest 26.1200.0–26.1300.0: строгие типы REST V3 и лимит времени SQL

Две версии Rest подряд закручивают гайки. В 26.1200.0 REST V3 перестал прощать `"42"` вместо `42`, а права приложений переехали из ORM-поля в отдельную таблицу. В 26.1300.0 появился лимит времени SQL для REST-вызовов, исчез старый `LoadLimiter`, а параметры встраивания ограничены 2048 байтами. Если…

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

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

на связи

пишет…

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

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

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

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

Войти