Практика: подсказки Power BI в виде предложений с Deneb
В июне 2026 года в Power BI появились шаблоны предложений для подсказок. Они позволяют добавлять свободный текст в стандартную подсказку, обозначая места подстановки значений полей токенами в фигурных скобках, например:
Продажи {Product} = {$ Sales}
Поскольку Deneb передаёт отображение подсказок обратно Power BI, шаблоны предложений работают и с визуальными элементами Deneb. Но нужно настроить доступность полей, на которые вы хотите ссылаться. В этой статье рассмотрим механизм работы, основную возможную проблему и способы использовать в предложениях информацию из вашей спецификации.
Коротко о подсказках Deneb
В Deneb есть обработчик подсказок, написанный специально для Power BI. Он не отрисовывает подсказку Vega или Vega-Lite самостоятельно, а передаёт данные подсказки графического элемента обратно Power BI. Затем Power BI отображает её через свои API. Поддерживаются стандартные подсказки и подсказки на основе страниц отчёта.
Шаблоны предложений в стандартных подсказках не потребовали изменений с нашей стороны и работают внутри существующего механизма подсказок Power BI. Это очень удобно: если вы хотели использовать эту возможность в Deneb, можно начать в любое время. Статья поможет понять, как получить от неё максимум пользы.
Главное правило шаблонов предложений: Power BI может подставлять только те поля, которые Deneb передаёт в записи данных подсказки. Любое поле, на которое вы ссылаетесь в шаблоне, должно явно входить в подсказку, которую Deneb определяет для графического элемента под указателем.
Простой пример
Рассмотрим следующую сокращённую спецификацию Vega-Lite: столбчатая диаграмма с Product и мерой $ Sales.
{
...
"mark": {
"type": "bar",
"tooltip": true
},
"encoding": {
"y": { "field": "Product", "type": "nominal" },
"x": { "field": "$ Sales", "type": "quantitative" }
}
}
И следующий шаблон предложения, настроенный в разделе Tooltips панели свойств:
Продажи {Product} = {$ Sales}
Поскольку оба поля используются в каналах кодирования графического элемента, при задании "tooltip": true Vega-Lite автоматически включает их в создаваемый канал tooltip. Всё работает ожидаемым образом:

Проблема: поля вне datum подсказки
Допустим, в наборе данных есть мера [$ Profit], но она не назначена ни одному каналу кодирования. Изменим предложение:
Продажи {Product} = {$ Sales}; прибыль = {$ Profit}
Результат не будет соответствовать ожиданиям:

Поскольку [$ Profit] не входит в данные подсказки, которые Deneb передаёт Power BI, заполнитель остаётся в отображаемом предложении без изменений. Ошибки или предупреждения не возникает: подстановка просто не выполняется.
Решение: явно задать канал подсказки
Нужно убедиться, что [$ Profit] входит в данные подсказки, связанные с отображаемым графическим элементом.
Возможно, мы захотели бы расширить диаграмму, чтобы нагляднее сравнить прибыль и продажи. Но тогда [$ Profit] окажется у другого графического элемента, а предложение вычисляется для того элемента, на который навели указатель. У подсказок столбцов продаж всё равно останется прежний пробел. Для простоты сохраним нынешнее оформление. Самое аккуратное решение — явно задать канал кодирования подсказки и перечислить всё необходимое:
{
...
"mark": {
"type": "bar",
"tooltip": true
},
"encoding": {
...
"tooltip": [
{ "field": "Product" },
{ "field": "$ Sales" },
{ "field": "$ Profit" }
]
}
}
Теперь все значения полей находятся и подставляются правильно:

Обратите внимание:
- Значения также получают строки форматирования из модели данных согласно обычному механизму форматирования подсказок Deneb. [$ Profit] отображается с форматированием модели без дополнительных действий.
- Если у вас несколько графических элементов или слоёв, учитывайте расположение канала
tooltip:- Если он определён на верхнем уровне, его наследуют все слои. Предложение вычисляется одинаково для любого элемента под указателем; это решает и описанную выше проблему нескольких элементов.
- Если он ограничен одним слоем, поля передаются только графическими элементами этого слоя.
А как в Vega?
В Vega аналогом служит свойство tooltip в блоке encode графического элемента. Чтобы явно задать нужные поля, можно создать объект, например:
{
...
"encode": {
"enter": {
"tooltip": {
"signal": "{'Product': datum['Product'], '$ Sales': datum['$ Sales'], '$ Profit': datum['$ Profit']}"
}
}
},
...
}
Имена заполнителей шаблона предложения должны совпадать с ключами этого объекта.
Альтернатива: передать всё
Вместо перечисления полей оба языка позволяют передать все данные. В Vega для этого обычно передают запись целиком в сигнал подсказки:
"tooltip": { "signal": "datum" }
…а в Vega-Lite задают соответствующее свойство графического элемента:
"mark": {
"type": "bar",
"tooltip": { "content": "data" }
}
Оба способа делают доступным для шаблона всё содержимое записи: поля набора данных, результаты преобразований и вспомогательные поля Deneb. Перечислять поля не нужно, и любой заполнитель с именем поля записи сможет получить значение.
Это решает проблему, но имеет свою цену: подсказка, переданная в Power BI, теперь содержит каждое поле записи. Стандартная подсказка может стать перегруженной или включать поля, которые вы не собирались показывать. На практике этот способ имеет смысл прежде всего при включённом параметре Sentence format only в настройках подсказки, когда читатели видят только ваше предложение. Если стандартный список полей остаётся видимым, лучше использовать подходы выше.
Дальше: использование вычисляемых полей
Здесь начинается самое интересное. Правило простое: «всё, что есть в записи подсказки, доступно шаблону». Поэтому мы не ограничены столбцами и мерами набора данных. В предложения Power BI можно включать и поля, существующие только внутри спецификации, например:
- Результаты преобразований — поля, полученные через
calculate/formula,joinaggregate,windowи другие преобразования. - Вспомогательные поля Deneb — дополнительные поля, добавляемые Deneb к каждой записи для сопоставления данных, например
__row__и__selected__. При включённом перекрёстном выделении доступны и вспомогательные поля выделения, такие как[measure]__highlight.
Например, в Vega-Lite можно вычислить рентабельность внутри спецификации и включить её в канал подсказки:
{
"transform": [
{
"calculate": "datum['$ Profit'] / datum['$ Sales']",
"as": "Margin"
}
],
"mark": {
"type": "bar",
"tooltip": true
},
"encoding": {
...
"tooltip": [
{ "field": "Product" },
{
"field": "$ Sales",
"format": "#0.0",
"formatType": "pbiFormatAutoUnit"
},
{ "field": "Margin", "format": ".1%" }
]
}
}
Для такого шаблона предложения:
{Product}: продажи {$ Sales}, рентабельность {Margin}
…заполнитель {Margin} получает значение, хотя такого столбца нет в модели данных. Для Power BI это просто ещё одно поле переданных данных подсказки:

Вы также могли заметить, что мы заодно изменили формат [$ Sales], используя пользовательский тип форматирования pbiFormatAutoUnit и строку форматирования Power BI. Он повторяет поведение единиц отображения Auto в Power BI: большая денежная сумма отображается в удобных для предложения единицах — 0.49bn — вместо полного форматирования модели. Для текста это часто удобнее длинной последовательности цифр. Форматы, заданные в определениях полей подсказки, включая пользовательские типы, сохраняются вплоть до итогового предложения.
А что с контекстом строки?
Возможно, вы задаётесь вопросом, ограничивает ли контекст строки, обычно важнейшая часть интерактивности Deneb, наши возможности здесь. К счастью, нет. Стандартная подсказка, в которой отображается предложение, строится из простого объекта с парами «ключ — значение», передаваемого Deneb в API подсказок Power BI. Контекст строки не требуется. Механизм предложения разбирает любые полученные данные, поэтому подставляет значения даже из полностью искусственной записи, например результата преобразования aggregate, который уже не соответствует никакой строке исходного набора данных.
Контекст строки нужен только для подсказки на основе страницы отчёта у элемента под указателем. В этом случае запись действительно должна сопоставляться со строкой исходного набора данных. Преобразования, объединяющие строки или изменяющие их так, что сопоставление теряется, лишат вас этой возможности, но не самого предложения.
Если заполнители не заменяются, быстрее всего увидеть фактическое содержимое подсказки можно, временно включив передачу всех полей. Вы увидите все доступные имена именно в том виде, в котором их получает Power BI, включая вспомогательные поля Deneb. Подробнее об этом рассказывает раздел «Отладка» с помощью подсказок.
Помните: имена заполнителей должны совпадать с именами полей подсказки в точности, включая символы, пробелы и прочие знаки в названиях столбцов и мер. Если имя поля закодировано из-за ограничений Vega, в заполнителе нужно использовать его экранированное значение, а не исходное имя.
Подведём итоги
Шаблоны предложений — удобный способ добавить поясняющий текст к визуальным элементам Deneb без создания собственных текстовых элементов. Они хорошо сочетаются с существующим механизмом передачи подсказок в Power BI. Основные правила:
- Каждое поле из шаблона предложения должно входить в запись данных подсказки графического элемента:
- Явно задавайте канал
tooltipв Vega-Lite или свойствоtooltipв блоке encode Vega. - Передача всех данных через
{"content": "data"}/{"signal": "datum"}тоже работает, но сочетайте её с Sentence format only, чтобы не перегружать стандартную подсказку.
- Явно задавайте канал
- Поля, существующие только в спецификации, включая результаты преобразований и вспомогательные поля, тоже работают. За их форматирование отвечаете вы.
- Контекст строки не ограничивает предложения. Стандартная подсказка разбирает любые переданные данные, даже полностью искусственные записи. Контекст нужен только тогда, когда вы также хотите использовать подсказки на основе страниц отчёта.
- Самим предложением управляет Power BI. Это стандартное свойство контейнера, поэтому его нельзя задавать из спецификации и оно не переносится с шаблоном Deneb. Управлять можно только содержимым данных подсказки.
Если вы найдёте сценарий, в котором поведение отличается от ожидаемого, создайте сообщение об ошибке с шагами воспроизведения. Мы посмотрим, как можно улучшить работу, если это возможно.
Спасибо, как всегда, за чтение! Надеюсь, Deneb продолжает помогать вам создавать нужные визуализации.
DM-P