Версия: 1.2
Интерактивность — обзор
Power BI позволяет создавать визуалы с помощью R и Python. Это существенно расширяет возможности, но результат обычно выводится как статическое изображение. Поэтому взаимодействовать с остальными элементами отчёта из таких визуалов сейчас нельзя.
Иногда для передачи визуала более широкому кругу пользователей нужны дополнительные зависимости. Кроме того, используемая библиотека может оказаться недоступной в службе Power BI при публикации отчёта.
Чем Deneb отличается от вариантов на R и Python
Помимо декларативного синтаксиса на основе JSON, Deneb включает библиотеки Vega и Vega-Lite. Они предназначены для веба, поэтому созданный результат в идеале должен работать во всей экосистеме Power BI независимо от устройства.
У Vega и Vega-Lite есть собственные подходы к интерактивности. Следующий естественный шаг — использовать их, чтобы наш визуал поддерживал возможности взаимодействия, привычные по другим визуалам Power BI.
Чего ожидать
Интерактивность — одна из самых сложных частей разработки пользовательского визуала. Реализовать её универсальным способом в Deneb особенно трудно, поскольку инструменты Vega предоставляют большую свободу при создании визуализаций.
При разработке интерактивных визуалов для Power BI нужно решить три основные задачи:
- Обеспечить взаимодействие визуалов Deneb с главным окном Power BI, которое обрабатывает события интерактивности от имени визуала.
- При возникновении событий сопоставлять данные и контекст строки с другими визуалами или моделью данных.
- Определить, как визуал должен себя вести и визуально реагировать на действия пользователей.
Эти особенности нужно учитывать при реализации функциональности. Тогда визуал будет выглядеть и работать привычным для Power BI образом, а пользователи получат согласованное поведение при работе с ним и другими визуалами.
Далее кратко разобраны основные вопросы. Для более глубокого понимания полезна документация Microsoft для разработчиков визуалов Power BI.
Сопоставление данных и контекста строки
Получение данных из модели
- Визуалы Power BI не могут самостоятельно читать модель данных. По ряду обоснованных причин они изолированы от основного интерфейса.
- Добавление столбцов и мер в области данных происходит в интерфейсе Power BI, а не внутри визуала.
- Power BI учитывает добавленные поля и текущий контекст фильтрации, затем выполняет DAX-запрос от имени визуала.
Например, возьмём демонстрационный набор Financial sample из Power BI Desktop, добавим столбец Country и сумму Sales в область Values визуала Deneb:

После этого Power BI сформирует следующий запрос к модели. Его можно проверить с помощью Performance Analyzer — анализатора производительности:
// DAX Query
DEFINE
VAR __DS0Core =
SUMMARIZECOLUMNS (
'financials'[Country],
"Sumv_Sales", CALCULATE ( SUM ( 'financials'[ Sales] ) )
)
VAR __DS0PrimaryWindowed =
TOPN ( 10001, __DS0Core, 'financials'[Country], 1 )
EVALUATE
__DS0PrimaryWindowed
ORDER BY 'financials'[Country]
Запрос вернёт следующий набор данных, показанный здесь в табличном визуале:

Power BI передаёт этот набор в визуал. Далее Deneb обрабатывает его, и работа продолжается обычным образом.
Передача событий обратно в Power BI
На основе этого примера рассмотрим следующие сценарии:
- Показ подсказки на основе страницы отчёта или использование современных подсказок.
- Детализация через контекстное меню — drill-through.
- Перекрёстная фильтрация других визуалов.
- Перекрёстное выделение нашего визуала из других визуалов.
Во всех случаях визуал должен сообщить Power BI, с какими данными нужно работать. Однако, как визуалы не могут произвольно читать модель, так они не могут и отправлять в неё произвольные данные.
Для таких действий Power BI предоставляет API: визуал просит основное приложение выполнить операцию от его имени. Чтобы выполнить запрос, Power BI должен определить соответствующие строки исходного набора данных.
- Если взять набор данных без изменений и создать примитив Vega или Vega-Lite, его объект
datumсохранит контекст строки и идентифицирующие сведения, нужные Power BI. - Если спецификация изменяет исходные данные — например, через преобразование Vega или Vega-Lite, — в результате этой операции связь может быть потеряна. Использовать описанную функциональность для полученного результата тогда нельзя.
Все реализуемые возможности должны учитывать эти ограничения.
Дополнительные поля datum
Если таких изменений нет, объект datum Vega или Vega-Lite содержит дополнительные поля для сопоставления. Их значения описывают строку набора данных в целом:
__identity__— исходный идентификатор и полный контекст строки.- Для разработчиков визуалов Power BI это объект
SelectionId, который можно передать в Selection Manager Power BI для делегирования действий. - Это сложный объект JavaScript, который нельзя использовать напрямую в Vega. Сложные объекты нельзя сравнивать так же, как, например, текстовые значения, поэтому не используйте его в спецификации.
- Для разработчиков визуалов Power BI это объект
__key__— обработанное представление объекта__identity__, пригодное для использования в спецификации.identityIndex— индекс соответствующей записи набора данных визуала, начиная с нуля.__selected__— состояние выбора этой строки для перекрёстной фильтрации.
Эти поля можно увидеть, например, при просмотре datum через подсказку. Использовать их вне возможностей, предоставляемых Deneb, в настоящее время не поддерживается.
Дополнительные поля перекрёстного выделения для мер
Если для визуала включено перекрёстное выделение, для каждой меры набора данных создаются следующие поля:
[measure name]__highlight— значение меры в контексте выделения. Исходное значение остаётся в обычном поле меры. Это позволяет кодировать исходное и выделенное значения отдельно.[measure_name]__highlightStatus— дополнительное состояние конкретной меры в текущем контексте строки: применено ли к ней выделение. Поле похоже на__selected__, но описывает меру, а не всю строку.[measure_name]__highlightComparator— заранее вычисленный результат сравнения выделенного и исходного значений.
Подробнее они описаны на странице «Перекрёстное выделение».
А как работают другие сценарии?
Выше не были рассмотрены ещё два случая:
- Обычные подсказки отличаются от подсказок на основе страницы отчёта и современных подсказок.
- Deneb может передать список значений и попросить Power BI показать их в стандартной подсказке.
- Этот способ также используется, если Power BI не может определить контекст строки или найти подходящую страницу подсказки.
- Подробнее см. страницу «Подсказки».
- Фильтрация через срезы работает иначе, чем перекрёстная фильтрация. Deneb не является срезом, поэтому этот сценарий здесь не рассматривается.
Визуальные эффекты и поведение
Этот раздел короче предыдущего, но его также важно учитывать.
При создании спецификации вы определяете, как Vega или Vega-Lite отображает результат интерактивных событий. Например, можно приглушать невыбранные примитивы, изменять их прозрачность или цвет либо разработать собственный эффект. Начать работу с такими подходами помогут страницы «Перекрёстная фильтрация» и «Перекрёстное выделение».