# Встроенные переменные

Часть данных код получает без вызова функций — в готовых переменных JavaScript. Набор зависит от блока, в котором выполняется код.

## Данные контакта

Во всех блоках, кроме «Входящего Webhook», данные контакта, для которого выполняется код, доступны сразу. Во «Входящем Webhook» они появляются после того, как код найдёт контакта [функцией выбора контакта](https://support.watbot.ru/api/javascript/contact).

| Переменная | Что в ней |
|---|---|
| `id` | ID контакта на платформе |
| `bot_id` | ID бота |
| `name` | Имя контакта целиком |
| `first_name` | Первое слово имени |
| `last_name` | Второе слово имени |
| `phone` | Телефон |
| `email` | Почта |
| `address` | Адрес |
| `username` | Имя пользователя в мессенджере: `@flower_lover` в Telegram и MAX, `id123456` во ВКонтакте |
| `telegram_id` | ID человека в Telegram |
| `max_id` | ID человека в MAX |
| `created_at` | Когда контакт появился у бота, в виде `2026-01-31 12:00:00` (UTC) |

Значения — строки, в том числе `id` и `bot_id`. Во «Входящем Webhook» `id` и `bot_id` приходят числами, поэтому для сравнения приводите их к одному виду: `Number(id) === 12345`.

Если у контакта чего-то нет — например, телефона, — переменной не будет совсем, и обращение к ней остановит код с ошибкой `ReferenceError`. Проверяйте такие переменные через `typeof`:

```js
if (typeof phone !== 'undefined') {
    setContactVariable('телефон_для_курьера', phone);
} else {
    sendMessage('Оставьте, пожалуйста, телефон для курьера.');
}
```

Во «Входящем Webhook» после выбора контакта есть ещё несколько переменных — тоже только если у контакта есть значение:

| Переменная | Что в ней |
|---|---|
| `start_message` | Первое сообщение, которое контакт отправил боту |
| `amocrm_lead_id`, `amocrm_contact_id` | ID сделки и контакта в amoCRM |
| `bitrix_lead_id`, `bitrix_deal_id`, `bitrix_contact_id` | ID лида, сделки и контакта в Битрикс24 |

Переменные контакта и глобальные переменные бота готовыми переменными не приходят — их читают функциями [`getContactVariable` и `getGlobalVariable`](10-variables.md).

## Ответ сервера

В коде блока [«HTTP-запрос»](https://support.watbot.ru/chatbots/blocks/developer/http) ответ сервера лежит в объекте `response`:

| Поле | Что в нём |
|---|---|
| `response.status` | Код ответа, число: `200`, `404` и так далее |
| `response.body` | Тело ответа строкой, как оно пришло |
| `response.data` | Тело ответа, разобранное как JSON. Если ответ не в формате JSON, здесь пустой объект `{}` |

Код запускается, только когда сервер ответил. Если ответа нет — сервер не ответил за время из поля «Timeout» или соединение не установилось, — блок уходит по выходу «Нет ответа от сервера», и код не выполняется. Ответ с кодом ошибки, например `500`, — обычный ответ: код выполнится, проверьте `response.status` сами.

Код выполняется после остальных настроек блока: переменные из «Записать ответ json в переменные» к этому времени уже записаны.

```js
if (response.status !== 200) {
    sendMessage('Сервис доставки сейчас недоступен, попробуйте позже.');
    disableContinue();
} else if (response.data.slots && response.data.slots.length > 0) {
    setContactVariable('ближайшая_доставка', response.data.slots[0].time);
} else {
    sendMessage('На сегодня свободных окон доставки нет.');
}
```

## Входящий запрос

В коде блока [«Входящий Webhook»](https://support.watbot.ru/chatbots/blocks/developer/incoming-webhook) пришедший запрос лежит в объекте `request`:

| Поле | Что в нём |
|---|---|
| `request.query` | Параметры из строки запроса. Значения — строки |
| `request.headers` | Заголовки запроса. Имена — строчными буквами: `request.headers['content-type']` |
| `request.body` | Тело запроса строкой, как оно пришло |
| `request.data` | Все параметры запроса вместе: из строки запроса, из формы и из тела в формате JSON. Числа и логические значения из JSON остаются числами и `true`/`false` |

Если в запросе нет параметров, `request.query` — пустой объект. Обращайтесь к вложенным полям с проверкой, чтобы код не остановился на `undefined`:

```js
var order = request.data.order;

if (order && order.contact_id && setContactById(order.contact_id)) {
    setContactVariable('номер_заказа', String(order.id));
    sendMessage('Заказ №' + order.id + ' собран и передан курьеру.');
}
```

Если отправитель подписывает запросы, подпись можно проверить функцией [`hash_hmac`](30-crypto.md#hashhmac) — по `request.body` и заголовку с подписью.

## Строки таблицы

В коде блока [«Чтение записей из Google Таблицы»](https://support.watbot.ru/chatbots/blocks/lists/google-sheet-reader) найденные строки лежат в `sheet.data` — массиве строк, где каждая строка — массив ячеек.

- В `sheet.data` только строки, которые прошли фильтры блока, и не больше, чем указано в «Количество записей в сообщении».
- Ячейки — строки. Первая ячейка массива — столбец `A`.
- Блок загружает столбцы до самого правого из тех, что упомянуты в его настройках. Чтобы коду достались и другие столбцы, вызовите в начале кода `setColumnRange("A:F")` с нужным диапазоном — блок прочитает этот вызов до запроса к таблице. Пустые ячейки в конце строки Google не присылает, поэтому длина строк может различаться.
- Если строк не нашлось, код не выполняется: блок уходит по выходу «Записи не найдены».

```js
setColumnRange("A:C");

var rows = sheet.data;
var total = 0;

for (var i = 0; i < rows.length; i++) {
    total += Number(rows[i][2] || 0);
}

setContactVariable('сумма_заказа', total);
```

Здесь в столбце `C` — цена букета, и код складывает цены всех найденных строк.
