Формулы позволяют создавать вычисляемые свойства в [[Введение в Базы|Базах]] на основе данных из других [[Свойства|свойств]]. С их помощью можно выполнять вычисления, обрабатывать текст, работать с датами и многое другое.
## Возможности формул
Формулы помогают:
- **Вычислять значения** — складывать цены, подсчитывать итоги или выполнять математические операции.
- **Обрабатывать текст** — объединять строки, изменять регистр или извлекать подстроки.
- **Работать с датами** — вычислять разницу во времени, форматировать даты или определять сроки.
- **Применять логику** — использовать условные выражения для отображения различных значений.
- **Обрабатывать списки** — фильтровать, сортировать, преобразовывать или агрегировать данные списков.
## Создание свойства-формулы
Чтобы создать свойство-формулу:
1. В базе нажмите **Свойства** на панели инструментов.
2. Нажмите **Добавить формулу** в нижней части меню.
3. Введите название свойства-формулы.
4. Введите формулу в поле **Формула**.
5. Закройте диалоговое окно.
Редактор формул автоматически дополняет имена [[Функции|функций]] и свойств по мере ввода, а также проверяет синтаксис формулы. Зелёная галочка означает, что формула корректна.
После создания свойство-формулу можно использовать так же, как любое другое свойство в базе. Добавляйте его в [[Виды|виды]], используйте в фильтрах, сортируйте по нему и многое другое.
## Написание формулы
В редакторе формул введите выражение, используя свойства, операторы и функции.
### Ссылки на свойства
В формулах можно ссылаться на различные типы свойств:
- **Свойства заметки** — свойства из [[Свойства|начальных метаданных]] заметки.
- **Свойства файла** — встроенные свойства, такие как `file.name`, `file.size` или `file.mtime`.
- **Свойства-формулы** — другие формулы через `formula.formula_name`.
**Примеры:**
- `price * quantity` — умножение двух свойств заметки
- `file.name + " - " + description` — объединение имени файла со свойством заметки
- `formula.price_per_unit * 1.1` — использование другого свойства-формулы
### Использование операторов
**Арифметические операторы** выполняют математические операции с числами:
- `price + tax` — сложение
- `price - discount` — вычитание
- `price * quantity` — умножение
- `price / quantity` — деление
- `(part / whole) * 100` — скобки для задания порядка операций
**Операторы сравнения** сравнивают значения:
- `price > 100` — больше
- `age < 18` — меньше
- `status == "Done"` — равно
- `status != "Done"` — не равно
- `file.mtime > now() - '7d'` — сравнение дат
**Логические операторы** объединяют логические условия:
- `!completed` — отрицание
- `price > 0 && quantity > 0` — и
- `urgent || important` — или
Подробнее в разделе [[Синтаксис Баз#Операторы|Синтаксис Баз]].
### Использование функций
Функции выполняют операции над значениями. Доступные функции зависят от типа данных, с которыми вы работаете. Полный список см. в разделе [[Функции]].
**Основные категории функций:**
- **Глобальные функции** — `if()`, `now()`, `date()`, `link()`, `max()`, `min()`
- **Строковые функции** — `contains()`, `replace()`, `split()`, `lower()`, `title()`
- **Числовые функции** — `round()`, `ceil()`, `floor()`, `abs()`, `toFixed()`
- **Функции дат** — `format()`, `relative()`, `date()`, `time()`
- **Функции списков** — `filter()`, `map()`, `sort()`, `join()`, `unique()`
**Примеры:**
- `if(price, "
quot; + price.toFixed(2), "")` — условное выражение с форматированием числа.
- `file.name.lower()` — преобразование в нижний регистр.
- `tags.contains("urgent")` — проверка, содержит ли список тегов определённое значение.
- `due_date.format("YYYY-MM-DD")` — форматирование даты.
## Примеры формул
### Расчёт срока
Установка срока проекта через 2 недели после даты начала:
```js
start_date + "2w"
```
### Отображение статуса просрочки
Показать «Просрочено», если срок прошёл и статус не «Готово»:
```js
if(due_date < now() && status != "Done", "Overdue", "")
```
### Форматирование валюты
Отображение цены с 2 знаками после запятой и символом валюты:
```js
if(price, "quot; + price.toFixed(2), "")
```
### Подсчёт элементов списка
Подсчёт количества элементов в свойстве-списке:
```js
tasks.length
```
### Расчёт приоритета
Объединение нескольких факторов в оценку приоритета:
```js
(impact * urgency) / effort
```
### Объединение текстовых полей
Создание полного имени из имени и фамилии:
```js
first_name + " " + last_name
```
### Расчёт общей стоимости
Умножение ежемесячной стоимости на количество месяцев владения:
```js
monthlyUses * formula.Owned.round()
```
## Типы данных
Формулы работают с различными типами данных:
- **Строки** — текст в кавычках: `"hello"` или `'world'`
- **Числа** — числовые значения: `42`, `3.14`, `(2 + 2)`
- **Логические значения** — истина или ложь: `true`, `false`
- **Даты** — создаются с помощью `date()`, `today()` или `now()`
- **Списки** — коллекции значений: `[1, 2, 3]`
- **Объекты** — пары ключ-значение: `{"name": "value"}`
Тип результата формулы определяется используемыми данными и функциями.
## Ссылки на другие формулы
Формулы могут ссылаться на другие формулы, создавая производные вычисления. Например, если у вас есть формула `price_per_unit`:
```js
price / quantity
```
Вы можете сослаться на неё в другой формуле:
```js
formula.price_per_unit * 1.1
```
> [!warning] Избегайте циклических ссылок
> Формула не может ссылаться на саму себя напрямую или косвенно через другие формулы.