BI-коннектор 26.1300.0–26.1600.0: защита ключей, REST для конструктора и контроль публичных ссылок
Обновление безопасности
Закрыта уязвимость или ослабленная проверка прав. Ставить в первую очередь.
Разбор объединяет biconnector 26.1300.0, 26.1400.0, 26.1400.100, 26.1500.0 и 26.1600.0, а также superset 26.600.0. Версия 26.1300.0 вошла в снимок 26.1400.0: изменения этого снимка ниже отмечены как 26.1400.0. Обновление закрывает доступ к BI-ключам через REST без права управления и добавляет REST v3 для отчётов, графиков и наборов. Перед установкой проверьте интеграции ключей, периоды отчётов и обработку публичных ссылок.
Новое
Конструктор получил REST и MCP
В 26.1500.0 появились biconnector.builder.dashboard.list, .get, .filter.values и .parameters.search. В 26.1600.0 семейство biconnector.builder.* дополнено созданием, изменением, копированием и удалением отчётов, работой с графиками, наборами и системными таблицами. Метод catalog.get отдаёт опубликованные методы и их коды отказов. Всё семейство закрыто флагом Public\Features\BuilderRest.
С 26.1400.0 AI-клиент с поддержкой MCP подключается к инструментам отчётов, графиков, наборов и таблиц через scope mcp.bi. Нужны модуль aiassistant и флаг mcp_bi_connection.
Отдельный REST-метод biconnector.sqllab.execute появился в 26.1400.0: read-only SQL к BI-базе, до 10 000 строк, по умолчанию 1000. Нужны main не ниже 26.700.0, флаг Public\Features\SqlLabRest и право доступа к BI. Запрос выполняется под сервисным токеном Superset: пользовательские роли и RLS самого Superset к нему не применяются. Учитывайте это при выдаче доступа.
Ограничьте таблицы и публичные ссылки
В 26.1400.0 появилась отдельная ось прав на просмотр, изменение и экспорт групп таблиц. Она требует тарифа с правами BI и флага Configuration\Feature\TablePermissionsFlag, выключенного по умолчанию. REST biconnector.dataset.add/update принимает tableGroupIds; при включённой оси пустой список даёт VALIDATION_TABLE_GROUP_REQUIRED. Хотфикс 26.1400.100 исправляет ответ сервису Superset: выключенная ось возвращает axis_enabled: false даже без логина, вместо BAD_REQUEST. В 26.1600.0 раздел системных таблиц тоже начал скрывать недоступные таблицы, появился редактор групп.
В 26.1600.0 флаг Public\Features\PublicLinksControl открывает реестр публичных ссылок, их отключение и запрет новых ссылок на выбранный отчёт. Право — BIC_SHARE_CONTROL. Автосохранение настроек ссылки не включает её обратно после отключения администратором. Ещё с 26.1400.0 деактивация сотрудника отключает его ссылки фоновой задачей, а ошибка отзыва ссылок блокирует перевод отчёта в черновик.
Свой REST-источник считает агрегаты
С 26.1400.0 коннектор принимает urlCapabilities и urlAggregatedData. Первый адрес описывает поддержанные агрегаты и условия, второй получает JSON с table, filter, aggregation и mapFields. Функция работает при включённых агрегации в источнике и опции rest_aggregation_pushdown.
В 26.1500.0 диагностика biconnector.source.add/update получила причины SOURCE_CONNECTION_*: таймаут, недоступный адрес, HTTP-ошибка или ошибка протокола. Её включает Public\Features\RestSourceDiagnostics; в 26.1600.0 диагностика дошла до предпросмотра набора.
Сводки и поля для отчётов
AI-сводка в чат появилась в 26.1400.0, а в 26.1500.0 получателями стали отделы и добавился ручной выбор периода. Действия БП доступны при bizproc:bitrix_ai_bi_dashboard_available=Y. Разбор графика через BitrixGPT из 26.1500.0 требует облачного портала, облачного Superset и выключенного по умолчанию ChartAnalysisFlag.
В 26.1500.0 набор crm_product получил раздел каталога и закупочную цену с валютой. В 26.1600.0 у товарных позиций сделок и лидов появились SUM_NETTO, SUM_EXCLUSIVE, SUM_TOTAL и CURRENCY_ID с округлением по валюте родителя.
Что сломается
REST больше не выдаёт значение BI-ключа
С 26.1400.0 biconnector.key.* и key.connection.list требуют biconnector_key_manage, иначе возвращают ACCESS_DENIED. key.add игнорирует USER_ID и переданный ACCESS_KEY: сервер генерирует ключ для вызывающего. key.list больше не возвращает ACCESS_KEY. key.update проверяет подключение и отвечает WRONG_CONNECTION, если его нет. Проверьте приложения, которые задавали ключ сами или читали его через list.
Для уже выданных ключей есть CLI-команды biconnector:key:audit и biconnector:key:revoke --apply: они находят и отключают ключи авторов без права управления.
Пересмотрите период отчёта и выгрузку задач
В 26.1400.0 убран собственный период отчёта: действует глобальный. Исключение — значение по умолчанию, заданное автором в фильтре времени Superset. Скользящие last_* больше не принимаются; миграция заменяет, например, last_30 на current_month. Это календарный месяц с начала месяца, поэтому числа могут измениться.
С 26.1500.0 DataLens получает даты задач без времени: task.DATE_START, DEADLINE, START_DATE_PLAN, END_DATE_PLAN, task_elapsed_time.DATE_START и task_efficiency.DATETIME_REPAIR. В task.DEPENDS_ON остаётся наименьший ID зависимости. Power BI сохраняет прежний формат.
Обработайте квоты и новое состояние ссылки
С 26.1600.0 BI Builder ограничивает чтение 60/120/180 вызовами за минуту для пользователя/приложения или вебхука/портала, запись — 20/40/60. Параллельных чтений разрешено 3/6/9, записей — 2/4/6. При RateLimit учитывайте retryAfter.
deleteOwnShareAction() теперь отключает ссылку. Отключённые и просроченные ссылки старше 30 дней удаляет агент. В своих шаблонах проверяйте SHARE_DATA['isActive']: непустой SHARE_DATA больше не означает действующую ссылку.
Проверьте PHP-расширения и БП
В 26.1400.0 PermissionDictionary::getPermissionCodes() заменён на getDashboardPermissionCodes() и getTablePermissionCodes(). У DateTime удалён hasDefaultFilter(), новые проверки — isResolvedByDashboard(array) и hasConfiguredDefault(array); getDateStart()/getDateEnd() возвращают Date. Убраны классы настройки периода, перечисленные в реестре удалений.
Свои реализации IntegratorInterface обновите по сигнатурам 26.1400.0 и 26.1500.0: добавлены clearPermissionCache(), getPhysicalDatasetList() и параметры SQL, загрузки и фильтров отчёта. В 26.1600.0 BiSqlHelperInterface требует getRoundExpression(string $expression, string $scaleExpression): string. Наследникам NameFieldAssembler нужны новый аргумент MarketAccessManager и замена удалённых canEditTitle()/getEditButton(); ConfigureDigestAction с 26.1500.0 требует DigestSetupAvailabilityService.
Активити BIConnectorDashboardResultActivity с 26.1400.0 требует BI_DIGEST_RUN_ID и включённые BI-инструменты, а BI_DASHBOARD_RESULT_FILE больше не заполняет. В superset 26.600.0 ExecuteSqlCommand требует аргументы $limit и $user; в результате вместо limitingFactor приходит truncated, ошибки имеют коды SQLLAB_*. Read-only-проверка SQL стала строже: отклоняет незакрытые и неоднозначные кавычки, а также конструкции (SELECT …) INTO, которые раньше проходили.
Deprecated
С 26.1400.0 заменяйте PermissionDictionary::clearDashboardGroupPermissions() на clearGroupPermissions(): сброс охватывает обе оси прав.
Устаревшие и удалённые API в этой версии
| Символ | Статус | Чем заменять |
|---|---|---|
Bitrix\BIConnector\Access\Permission\PermissionDictionary::clearDashboardGroupPermissions()
|
Deprecated |
Bitrix\BIConnector\Access\Permission\PermissionDictionary::clearGroupPermissions()
|
Bitrix\BIConnector\Access\Permission\PermissionDictionary::getPermissionCodes()
|
Удалено |
Bitrix\BIConnector\Access\Permission\PermissionDictionary::getDashboardPermissionCodes()
|
Bitrix\BIConnector\Integration\Superset\Model\Dashboard::getNativeFilterFields()
|
Удалено | — |
Bitrix\BIConnector\Superset\Dashboard\EmbeddedFilter\DateTime::hasDefaultFilter()
|
Удалено |
Bitrix\BIConnector\Superset\Dashboard\EmbeddedFilter\DateTime::isResolvedByDashboard()
|
Bitrix\BIConnector\Superset\Grid\Row\Assembler\Field\Dashboard\FilterPeriodFieldAssembler
|
Удалено | — |
Bitrix\BIConnector\Superset\UI\Period\DefaultPeriodLabelBuilder
|
Удалено | — |
Bitrix\BIConnector\Superset\UI\SettingsPanel\Field\DashboardPeriodFilterField
|
Удалено | — |
Bitrix\BIConnector\Superset\Grid\Row\Assembler\Field\Dashboard\NameFieldAssembler::canEditTitle()
|
Удалено | — |
Bitrix\BIConnector\Superset\Grid\Row\Assembler\Field\Dashboard\NameFieldAssembler::getEditButton()
|
Удалено | — |