Перейти к содержимому

Связи в формулах

В формулах поле «Связь» — это id строки родителя, а не объект с её полями.

Что доступно в формуле

Поле-связь, как обычное поле:

  • Сравнить id с конкретным значением: object == "cuid_apartment_42".
  • Проверить, что связь не пуста: object != null.
  • Использовать в if: if(object != null, amount, 0).

Чего НЕТ

В текущей версии Invest:

  • Точечной нотации. object.purchase_price, object.addressне работают. Парсер формул не поддерживает точку (member access) — у него только идентификаторы и вызовы функций.
  • Функции «получить поле родителя по связи». Чего-то вроде lookup(object, "purchase_price") — нет.
  • Каскадных формул. Формула в дочернем датасете не может «достать» значения из родительской строки.

⚠️ Уточнить: это ограничение зафиксировано в текущем парсере (packages/formula-engine/src/parser.ts). Если в будущей версии появится синтаксис обращения через связь — этот раздел будет обновлён.

Обходные пути

1. Считайте на дашборде, а не в формуле

Большинство ситуаций «использовать поле родителя в формуле» — это в действительности агрегация на дашборде, а не формула в датасете.

Хотите видеть «доходность по каждой квартире»? Это виджет:

  • Источник: «Платежи аренды».
  • Группировка: по полю-связи object.
  • Значение: sum(amount) — суммарный доход в группе.

В таблице на дашборде вы увидите строку на каждую квартиру с агрегированными значениями.

2. Денормализуйте — продублируйте поле

Если вам действительно нужно поле родителя в каждой дочерней строке (например, чтобы потом сделать сложный if), скопируйте его как обычное поле в дочерний датасет. Минусы:

  • Дублирование данных.
  • Если поле в родителе изменилось — копию надо синхронизировать руками.

3. Группируйте через фильтры

Если нужна формула типа «сумма платежей именно этой квартиры», то на дашборде вы:

  1. Создаёте виджет, привязанный к датасету «Платежи аренды».
  2. Включаете глобальный фильтр по связи object = <id>.
  3. Виджет покажет агрегат по выбранной квартире.

В видже-таблице

Связь в табличном виджете рендерится как имя целевой строки (берётся первое текстовое поле родителя). Кликабельно — переходит к этой строке.

В drill-down

В drill-down можно группировать данные по связи: клик на сегмент → видны строки, у которых эта связь равна выбранному id. См. «Drill-down».

Частые ошибки

  • Пишут object.price * 12 в формуле дочернего датасета. Парсер выдаст ошибку «Unexpected .». Заменить нельзя без денормализации.
  • Ожидают, что фильтр в формуле сработает. В формуле нельзя написать sum(amount where category == "X"). Это делается фильтром в виджете на дашборде.
  • Хотят формулу-агрегат в родительском датасете. «Сумма платежей по этой квартире как поле в «Объектах»» — текущая версия так не умеет. Считайте агрегат на дашборде или денормализуйте через периодический пересчёт (вручную).

Что дальше