# Переменные

Переменные контакта хранят данные одного человека: город, выбранный букет, сумму заказа. Глобальные переменные общие для всего бота: адрес магазина, курс валюты, счётчик заказов. Подробнее о том, где их видно и как подставить в сообщение, — в разделе [«Данные для подстановки»](https://support.watbot.ru/chatbots/templates/data).

Что записали функции, сохраняется после того, как код завершился без ошибки. Внутри кода чтение уже видит записанное.

## getContactVariable

```js
getContactVariable(name)
```

Возвращает значение переменной контакта.

| Параметр | Тип | Что передать |
|---|---|---|
| `name` | Строка | Имя переменной, как в карточке контакта. Пробелы и русские буквы допустимы |

**Возвращает** значение строкой или `undefined`, если у контакта нет такой переменной. Для расчётов оберните значение в `Number()`.

```js
var count = Number(getContactVariable('количество_роз') || 0);

if (count >= 11) {
    setContactVariable('скидка', 10);
}
```

Если переменную записал этот же код, функция вернёт значение в том виде, в каком его записали: число останется числом.

## setContactVariable

```js
setContactVariable(name, value)
```

Записывает переменную контакта. Если переменной нет, она появится.

| Параметр | Тип | Что передать |
|---|---|---|
| `name` | Строка | Имя переменной |
| `value` | Строка, число, `true` или `false` | Значение |

**Ничего не возвращает.**

Объект, массив, `null` и `undefined` не сохраняются как есть — переменная получит пустое значение. Чтобы сохранить объект или массив, превратите его в строку, а при чтении разберите обратно:

```js
setContactVariable('корзина', JSON.stringify(['Розы', 'Тюльпаны']));

var cart = JSON.parse(getContactVariable('корзина') || '[]');
```

Логические значения лучше хранить строками, например `'да'` и `'нет'`: `true` и `false` при следующем чтении в другом блоке придут строками `'1'` и `''`.

## deleteContactVariable

```js
deleteContactVariable(name)
```

Удаляет переменную контакта.

| Параметр | Тип | Что передать |
|---|---|---|
| `name` | Строка | Имя переменной |

**Ничего не возвращает.** После удаления `getContactVariable` с этим именем вернёт `undefined`.

```js
deleteContactVariable('промокод');
```

## getGlobalVariable

```js
getGlobalVariable(name)
```

Возвращает значение глобальной переменной бота.

| Параметр | Тип | Что передать |
|---|---|---|
| `name` | Строка | Имя глобальной переменной |

**Возвращает** значение строкой или `undefined`, если такой переменной нет.

```js
var freeDelivery = Number(getGlobalVariable('бесплатная_доставка_от') || 0);
var sum = Number(getContactVariable('сумма_заказа') || 0);

if (sum >= freeDelivery) {
    sendMessage('Доставка для вас бесплатная.');
}
```

## setGlobalVariable

```js
setGlobalVariable(name, value)
```

Записывает глобальную переменную бота. Если переменной нет, она появится. Значение сразу видно всем контактам бота.

| Параметр | Тип | Что передать |
|---|---|---|
| `name` | Строка | Имя глобальной переменной |
| `value` | Любой | Значение. Сохраняется строкой: число `5` станет `'5'`, а объект — `'[object Object]'`, поэтому объекты превращайте в строку через `JSON.stringify` |

**Ничего не возвращает.**

```js
var orders = Number(getGlobalVariable('заказов_сегодня') || 0);
setGlobalVariable('заказов_сегодня', orders + 1);
```

> [!WARNING]
> Если код с такой записью выполняется у нескольких контактов одновременно, каждый прочитает одно и то же старое значение, и часть прибавлений потеряется. Для точного счёта такой счётчик не подходит.

## deleteGlobalVariable

```js
deleteGlobalVariable(name)
```

Удаляет глобальную переменную бота.

| Параметр | Тип | Что передать |
|---|---|---|
| `name` | Строка | Имя глобальной переменной |

**Ничего не возвращает.**

```js
deleteGlobalVariable('акция_дня');
```
