Связи в формулах
В формулах поле «Связь» — это 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. Группируйте через фильтры
Если нужна формула типа «сумма платежей именно этой квартиры», то на дашборде вы:
- Создаёте виджет, привязанный к датасету «Платежи аренды».
- Включаете глобальный фильтр по связи
object = <id>. - Виджет покажет агрегат по выбранной квартире.
В видже-таблице
Связь в табличном виджете рендерится как имя целевой строки (берётся первое текстовое поле родителя). Кликабельно — переходит к этой строке.
В drill-down
В drill-down можно группировать данные по связи: клик на сегмент → видны строки, у которых эта связь равна выбранному id. См. «Drill-down».
Частые ошибки
- Пишут
object.price * 12в формуле дочернего датасета. Парсер выдаст ошибку «Unexpected.». Заменить нельзя без денормализации. - Ожидают, что фильтр в формуле сработает. В формуле нельзя написать
sum(amount where category == "X"). Это делается фильтром в виджете на дашборде. - Хотят формулу-агрегат в родительском датасете. «Сумма платежей по этой квартире как поле в «Объектах»» — текущая версия так не умеет. Считайте агрегат на дашборде или денормализуйте через периодический пересчёт (вручную).