# Вбудовані змінні

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

## Дані контакту

В усіх блоках, крім «Вхідного Webhook», дані контакту, для якого виконується код, доступні одразу. У «Вхідному Webhook» вони з'являються після того, як код знайде контакт [функцією вибору контакту](https://support.watbot.org/uk/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.org/uk/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.org/uk/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.org/uk/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` — ціна букета, і код складає ціни всіх знайдених рядків.
