# Выражения

Внутри `{{ ... }}` можно не только вставить значение, но и посчитать, сравнить или выбрать текст по условию:

```
{{ $возраст >= 18 ? "Добро пожаловать!" : "Доступ с 18 лет" }}
Скидка 10%: {{ $цена * 0.9 }} ₽
{{ upper(first_name) ~ ", здравствуйте!" }}
```

## Из чего состоит выражение

| Что | Как писать | Пример |
|---|---|---|
| Переменная контакта | `$имя` | `$город` |
| Переменная с пробелами в имени | `var("имя")` | `var("Имя клиента")` |
| Данные контакта | имя без `$` | `first_name`, `phone` |
| Глобальная переменная | `global("имя")` | `global("Курс (USD)")` |
| Текст | в кавычках `"..."` или `'...'` | `"Добрый день"` |
| Число | цифры, дробная часть через точку | `10`, `0.9` |
| Логическое значение | `true`, `false` | |
| Пустое значение | `null` | |
| Функция | `имя(аргументы)` | `round($цена, 2)` |

Внутри кавычек ничего не заменяется: `{{ "цена $a" }}` выведет `цена $a`.

## Арифметика

| Оператор | Действие | Пример | Результат |
|---|---|---|---|
| `+` | сложение | `{{ 2 + 3 }}` | `5` |
| `-` | вычитание | `{{ 10 - 4 }}` | `6` |
| `*` | умножение | `{{ 3 * 4 }}` | `12` |
| `/` | деление | `{{ 10 / 4 }}` | `2.5` |
| `%` | остаток от деления | `{{ 10 % 3 }}` | `1` |
| `**` | степень | `{{ 2 ** 10 }}` | `1024` |

Скобки меняют порядок действий: `{{ ($цена + $доставка) * 2 }}`.

Дробные числа выводятся без лишних знаков: `{{ 0.1 + 0.2 }}` даст `0.3`. Чтобы округлить, используйте [`round`](03-functions.md#математика), для вывода с разделителями — [`number_format`](03-functions.md#текст).

## Сравнения

| Оператор | Значение |
|---|---|
| `==` | равно |
| `!=` | не равно |
| `>`, `>=` | больше, больше или равно |
| `<`, `<=` | меньше, меньше или равно |

Если с обеих сторон числа — даже записанные текстом, как значения переменных, — сравниваются числа: `"10" > 9` верно.

Результат сравнения, выведенный сам по себе, — `true` или `false`: `{{ $возраст >= 18 }}`.

## Логика

| Оператор | Значение |
|---|---|
| `and` или `&&` | и |
| `or` или `\|\|` | или |
| `not` или `!` | не |

```
{{ $возраст >= 18 and $город == "Москва" ? "Приглашаем в офис" : "Работаем онлайн" }}
```

## Условие

`условие ? если_да : если_нет` — выбирает один из двух вариантов:

```
{{ $баллы >= 100 ? "Вам доступен подарок" : "До подарка " ~ (100 - $баллы) ~ " баллов" }}
```

Короткая форма `значение ?: запасное` выведет значение, если оно не пустое, иначе запасное:

```
Здравствуйте, {{ first_name ?: "друг" }}!
```

## Запасное значение для пустых данных

`значение ?? запасное` — если значения нет совсем (у контакта не указан телефон, переменная не заполнена), подставится запасное:

```
Телефон: {{ phone ?? "не указан" }}
```

## Работа с текстом

| Оператор | Действие | Пример |
|---|---|---|
| `~` | склеить текст | `{{ first_name ~ " " ~ last_name }}` |
| `contains` | содержит | `{{ $ответ contains "да" ? "Отлично!" : "Жаль" }}` |
| `starts with` | начинается с | `{{ phone starts with "+7" ? "Россия" : "Другая страна" }}` |
| `ends with` | заканчивается на | `{{ email ends with "@gmail.com" }}` |
| `in` | есть в списке | `{{ $город in ["Москва", "Казань"] ? "Есть доставка" : "Самовывоз" }}` |
| `not in` | нет в списке | `{{ $тариф not in ["pro", "business"] }}` |

`contains`, `starts with` и `ends with` различают большие и маленькие буквы. Чтобы не различать, приведите текст к одному регистру: `{{ lower($ответ) contains "да" }}`.

## Функции внутри выражений

Функции можно вкладывать друг в друга и сочетать с операторами:

```
{{ capitalize(lower(var("Имя клиента"))) }}
{{ round(($цена + $доставка) * 0.9, 2) }}
{{ number_format(global("Курс (USD)") * $сумма, 2) }} ₽
```

Список функций — в [справочнике](https://support.watbot.ru/chatbots/templates/functions).

## Что нельзя

В выражениях нет циклов, присваиваний и обращения к внутренним данным платформы — только операторы и функции из справочника. Подробнее об ограничениях — в разделе [Ошибки и ограничения](https://support.watbot.ru/chatbots/templates/errors).
