# Змінні

## Як використовувати змінні

Давайте розглянемо, що таке змінні та як ефективно використовувати їх під час створення чатботів у MaviBot.

{% hint style="danger" %}
**Будь ласка, зверніть увагу на такі системні обмеження для змінних і констант у межах одного проєкту:**

**Змінні шаблону:**

* **Максимальна кількість:** 100 змінних
* **Максимальна довжина назви:** 100 символів

**Константи проєкту:**

* **Максимальна кількість:** 50 констант
* **Максимальна довжина назви:** 100 символів
* **Максимальна довжина значення:** 5 000 символів
  {% endhint %}

Змінна — це іменоване місце зберігання даних, яке ідентифікується унікальною текстовою міткою.

<div data-with-frame="true"><figure><img src="/files/a3f6b269d2580d1fe08fa32d1f3185ef4031d184" alt=""><figcaption></figcaption></figure></div>

&#x20;                                          *Рис. 1: Змінна з назвою `total`, що зберігає суму платежу*.

MaviBot надає кілька типів змінних:

1. [Вбудовані змінні ](#built-in-variables)
2. [Системні змінні](#system-variables)&#x20;
3. Змінні, визначені користувачем — це ті, які ви створюєте самостійно в межах проєкту.

**Оголосити змінну** означає присвоїти значення іменованому контейнеру. Іншими словами, інструкція на кшталт ***a=0*** є оголошенням змінної ***a***. Ми щойно повідомили (оголосили) конструктору, що зберігатимемо число в змінній ***a***, і наразі це значення дорівнює ***0***.

**Присвоїти значення змінній** має те саме значення.

Вирази **"присвоїти змінній значення функції"** або **"задати змінній значення функції"** також часто використовуються. Принцип той самий: замість присвоєння конкретного значення ви присвоюєте результат функції. Наприклад: **s\_id = tg\_send\_message(platform\_id, "Hello!")** У цьому випадку результат функції буде збережено в змінній.

**Скинути змінну** означає присвоїти їй значення **0**.

[**Функції та методи**](/doc/uk/chatbot/functions/zminni.md#functions-for-working-with-variables)  — це заздалегідь визначені набори команд, які налаштовані MaviBot. Більшість функцій потребують параметрів — значень, які функція або метод може зрозуміти. Після того як бот отримує необхідні параметри, він виконує певну команду.

**`tg_send_message(platform_id, "Hello!")` —** ця функція надсилає повідомлення "Hello!" у Telegram.

<div data-with-frame="true"><figure><img src="/files/fa7055ddbdc286ad36d5e2718f0e49759c707ead" alt=""><figcaption></figcaption></figure></div>

<p align="center"><em>Рис. 2. Приклад змінної з назвою text1, присвоєної функції.</em></p>

### <mark style="color:red;">**ПРАВИЛА РОБОТИ ЗІ ЗМІННИМИ:**</mark>

1. Назва змінної може починатися лише з **літери**; вона не може починатися з цифри.

   **Age1 - ✅ правильно**  &#x20;

   1Age - ❌ <mark style="color:red;">неправильно</mark>

   **age1 -** **✅ правильно**   <mark style="color:blue;">- рекомендований варіант</mark> <br>
2. Змінна не може містити пробілів або спеціальних символів, окрім підкреслення (\_).

   **Name\_Surname - ✅ правильно** &#x20;

   Name Surname - ❌ <mark style="color:red;">неправильно</mark>

   **nameSurname** **- ✅ правильно**   <mark style="color:blue;">- рекомендований варіант</mark><br>

   Зарезервовані слова з мов програмування не можна використовувати як назви змінних, наприклад: print, true, false, count, sum тощо.<br>
3. <mark style="color:$primary;">Це</mark> <mark style="color:red;">**категорично заборонено**</mark> <mark style="color:$primary;">використовувати</mark> використовувати назви вбудованих і системних змінних для змінних, визначених користувачем. Список таких змінних ви можете знайти тут. <mark style="color:red;">**посилання**</mark>
4. <mark style="color:blue;">**Ми рекомендуємо:**</mark>
   * Використовуйте латинські (англійські) назви для змінних.
   * Використовуйте короткі, але змістовні назви змінних, наприклад: totalSum, pay\_name, <mark style="color:red;">**ns**</mark>, name\_client тощо.

### Як отримати значення змінної

Помістіть назву змінної всередину фігурних дужок **#{}**. Так ви можете звертатися до її значення в полі тексту повідомлення. Однак у полі "Калькулятор" слід звертатися до значення змінної просто за її назвою, без додаткового синтаксису.

{% hint style="danger" %}
Поле **#{}** конструкція дозволяє отримати значення змінної. Вона використовується в полі "Текст повідомлення" для вставлення значення змінної в текст.
{% endhint %}

Приклад:

<div data-with-frame="true"><figure><img src="/files/8455bddf1a1a3b9461c6fac60a2d4bac8c2c8b00" alt="" width="563"><figcaption></figcaption></figure></div>

{% hint style="success" %}
Система підтримує вкладені змінні, коли значення однієї змінної є частиною назви іншої змінної. Наприклад: **#{q#{test#{i}}}**
{% endhint %}

У полі "Калькулятор" звертайтеся до змінних за їхніми назвами без використання нотації #{}.&#x20;&#x20;Наприклад, якщо у нас є дві змінні: price (sum) і quantity (num).

`num = 10`

`sum = 1500`

<div data-with-frame="true"><figure><img src="/files/b52a9375f7e50bb5e5ece6572c4cbf091fea2461" alt=""><figcaption></figcaption></figure></div>

### Як показати загальну суму&#xD;

Введіть у калькуляторі таке:

`total_sum = sum1 * num2` **✅ правильно**

<div data-with-frame="true"><figure><img src="/files/30e81b507f8ee863f68a627b1121a18a74d0843e" alt=""><figcaption></figcaption></figure></div>

**Як&#x20;*****не*****&#x20;потрібно це робити:**

`total_sum = #{sum1} * #{num2}` - ❌ <mark style="color:red;">неправильно</mark>

### Як видалити змінну з бота

Щоб видалити (очистити) змінну, введіть одне з наведених нижче в полі "Калькулятор":\
YourVariableName =\
або\
YourVariableName = ""

Після знака рівності залиште пробіл або використайте подвійні (або одинарні) лапки.

{% hint style="warning" %} <mark style="color:red;">**Зверніть увагу!**</mark> Важливо використовувати правильний префікс, щоб позначити, до чого належить змінна.

Для змінних рівня проєкту (збережених у налаштуваннях проєкту) використовуйте префікс **project:**\
Приклад:&#x20;*project.YourVariableName =*&#x20;або&#x20;*project.YourVariableName = ""*

Для змінних рівня клієнта використовуйте префікс **client**:\
Приклад:&#x20;*client.YourVariableName =* або&#x20;*client.YourVariableName = ""*

Для змінних рівня угоди префікс не потрібен.
{% endhint %}

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

Ось список вбудованих змінних:

**#{none}** - ігнорувати повідомлення

**#{api\_key}** - API-токен, що використовується у викликах API Salebot

**#{attachment\_url}** - містить посилання на вкладення

**#{attachments}** - JSON-масив URL вкладень із повідомлення користувача

**#{avatar}** - посилання на аватар користувача (відображається в розділі "Клієнти")

**#{client\_id}** - ID клієнта в конструкторі, також використовується в API-запитах

**#{client\_type}** - тип месенджера, з якого прийшов клієнт (значення описані \[тут])

**#{current\_date}** - поточна дата у форматі dd.mm.yyyy, відповідно до часового поясу проєкту

**#{current\_time}** - поточний час у форматі hh:mm, відповідно до часового поясу проєкту

**#{custom\_answer}** - відповідь, отримана з сервера, вказаного в полі "URL відповіді сервера"

**#{message\_from\_outside}** - тип вхідного повідомлення. Можливі значення:\
\&#xNAN;*regular message = 0*\
*message sent via API = 1*\
*callback notification (жовтий фон у діалозі) = 3*\
*telephony notification (світло-блакитний фон у діалозі) = 5* \
*Ця змінна генерується з кожним вхідним повідомленням, але не відображається в картці клієнта.*\
*Ви можете використовувати її в полі "Змінна для порівняння", щоб налаштувати умови для тригерів і зв'язків блоків.*

**#{date\_of\_creation}** - дата, коли користувача було додано до бота або коли він написав йому вперше

**#{full\_name}** - повне ім'я користувача (ім'я та прізвище)

**#{group}** - бот, до якого прив'язано клієнта (відображається як "Прив'язано до бота" в картці клієнта)

**#{main\_client\_id}** - ID основного клієнта серед групи пов'язаних карток клієнтів

**#{message\_id}** - ID поточного стану діалогу з клієнтом (за замовчуванням NONE)

**#{messenger}** - назва месенджера, з якого прийшов клієнт

\#{name} - ім'я користувача

\#{next\_day} - дата завтрашнього дня у форматі dd.mm.yyyy (корисно для планування повідомлень)

**#{order\_id}** - ідентифікатор замовлення (ID клієнта та внутрішній ID замовлення, розділені дефісом)

**#{order}** - вміст замовлення, надісланого користувачем

**#{platform\_id}** - ID клієнта в месенджинговій платформі

**#{question}** - повідомлення, надіслане користувачем

**#{timestamp}** - поточна мітка часу, включно з мілісекундами

**#{time\_of\_creation}** - час, коли користувача було додано до бота або коли він написав йому вперше

**#{wa\_bot}** - номер WhatsApp, на який написав користувач (корисно для передавання в поля CRM і розподілу лідів між менеджерами)

**#{weekday}** - день тижня як число (понеділок = 1, вівторок = 2 тощо)

#### **значення client\_type**

<table><thead><tr><th width="195.3359375">Значення</th><th width="211.8125">Месенджер</th></tr></thead><tbody><tr><td>1  </td><td>для Telegram </td></tr><tr><td>2  </td><td>для Viber</td></tr><tr><td>3  </td><td>для Facebook</td></tr><tr><td>5  </td><td>для онлайн-чату</td></tr><tr><td>10</td><td>для Instagram</td></tr><tr><td>14 </td><td>e-mail </td></tr><tr><td>16</td><td>Telegram Business Account </td></tr><tr><td>21</td><td>обліковий запис Telegram</td></tr><tr><td>22</td><td>TikTok</td></tr></tbody></table>

## Системні змінні

Система автоматично генерує різні змінні часу виконання під час роботи бота. Ви можете використовувати ці змінні під час створення свого бота. Ось список тих, які можуть бути вам корисні.

{% hint style="info" %}
Додаткові системні змінні ви можете знайти в документації. Вони розташовані в розділах, що відповідають їхньому використанню.
{% endhint %}

**phone** - номер телефону

**notSubscribed** - якщо змінна дорівнює 1, клієнт відписався від повідомлень і не отримуватиме жодних повідомлень

**clientBlocked** - клієнт заблокований, і бот для нього не працює

**story\_url** - ідентифікатор Instagram-історії, на яку відповів клієнт

**viewed\_page** - сторінка, з якої користувач пише в онлайн-чаті

**wa\_bot** - номер телефону WhatsApp-бота

{% hint style="info" %}
Щоб дізнатися, які змінні можна створювати під час платежу, зверніться до інструкцій з інтеграції платіжних сервісів у розділі "[Платіжна система](/doc/uk/oplata.md)".
{% endhint %}

## Користувацькі змінні

Користувацькі змінні поділяються на:

* Змінні проєкту (також називаються спільними змінними)
* [Змінні клієнта](#custom-variables)&#x20;
* [Змінні угоди](#key-deal-variables) (також називаються звичайними змінними)
* [Константи](#how-to-set-constant-variables)&#x20;

Кожен тип змінної буде пояснено нижче.

{% hint style="info" %}
Будь ласка, уникайте використання однакових назв для різних типів змінних, щоб уникнути плутанини, коли Builder відображає або використовує не те значення, яке ви очікували.
{% endhint %}

{% hint style="info" %}
Під час присвоєння значення змінній важливо вказати її тип, використовуючи відповідний префікс:

**client.** (для змінних клієнта) і **project.** (для змінних проєкту). Для змінних угоди префікс не використовується.

Префікс опускається під час отримання значення змінної.

Приклад:&#x20;Уявімо, що ви хочете створити змінну проєкту під назвою like, щоб використовувати її як лічильник лайків від ваших клієнтів.

**project.like = 0 - оголошення, виконується один раз**

У блоці, де потрібно рахувати лайки, напишіть:&#x20;**project.like = like + 1**
{% endhint %}

{% hint style="info" %}
Порядок пріоритету змінних:&#x20;змінні угоди мають найвищий пріоритет, далі йдуть змінні клієнта, а потім змінні проєкту.
{% endhint %}

#### **ID месенджера (platform\_id)**

**ID месенджера (platform\_id)** є ідентифікатором користувача/чату/каналу в межах месенджера. Щоб його знайти, відкрийте розмову з потрібним клієнтом у розділі "Клієнти". У правій частині вікна чату перейдіть до вкладки "**Про клієнта** - **Системні змінні"** або вкладки "**Усі"** .

Поле **`platform_id`** є постійною, системно згенерованою змінною, що представляє унікальний ID користувача в месенджері.

* **Постійність:** Цей ID залишається незмінним для користувача. Навіть якщо ви видалите його запис із конструктора, його `platform_id` буде таким самим після повторної реєстрації.
* **Походження:** ID призначається платформою месенджера (наприклад, Telegram, WhatsApp), коли користувач вперше взаємодіє з ботом.

Наведений нижче приклад показує, як `platform_id` відображається в картці клієнта.

<div data-with-frame="true"><figure><img src="/files/a08ba7887e0e74b48416023f99e1f2117fdb2b85" alt="" width="563"><figcaption></figcaption></figure></div>

Змінна platform\_id існує як для звичайних користувачів, так і для спільнот, каналів і чатів.

Щоб отримати **platform\_id** (ID месенджера) Telegram-каналу, де бот є адміністратором, просто надішліть повідомлення в канал зі свого особистого акаунта. Це автоматично створить діалог між ботом і каналом.

Ви можете скопіювати значення **platform\_id** каналу в розділі "Про клієнта".

У Telegram ID месенджера для каналів завжди починається зі знака мінус (-). Під час використання функцій обов'язково вказуйте повне значення, включно зі знаком мінус.&#x20;

## Як використовувати змінні

Змінні можна використовувати в тригерах, замовленнях, відповідях користувачів, блоках та багато де ще. Розгляньмо конкретний приклад під час створення воронки для агентства нерухомості.

Тож давайте створимо блок Start:

<div data-with-frame="true"><figure><img src="/files/da45f0d7e7d5a838e5720d194ca2d6dedc5b2b2e" alt=""><figcaption></figcaption></figure></div>

**Крок 1: Створіть блок "Дякую"**

Створіть новий блок із повідомленням подяки користувачу за надану інформацію.

**Крок 2: Налаштуйте перехід**

На зв'язку, що веде до цього блоку, налаштуйте такий тригер:

1. Увімкніть перемикач **"Користувач вводить дані"** .
2. У **У полі** "Введені дані" **`name`**.

<div data-with-frame="true"><figure><img src="/files/1f230ac7c296bf40d81b5befa94a356f206205e9" alt=""><figcaption></figcaption></figure></div>

введіть назву змінної: **`Введені користувачем дані зберігаються в змінній`** Name `{}. Це значення можна повторно використовувати в будь-якому наступному блоці, викликавши змінну за допомогою синтаксису` #{Name} `наприклад:`.

<div data-with-frame="true"><figure><img src="/files/fc253f1077a015c64dc3683eaf9be8a58edc61f9" alt=""><figcaption></figcaption></figure></div>

Ласкаво просимо, #{Name}!

<div data-with-frame="true"><figure><img src="/files/70b48ee99880f3f2fca7833edfa95074f179357b" alt="" width="563"><figcaption></figcaption></figure></div>

Бот працюватиме так:&#x20;

Тепер зробімо завдання трохи складнішим.

<div data-with-frame="true"><figure><img src="/files/54994234c8f9441e75b0eb93964833d9c5fb7499" alt=""><figcaption></figcaption></figure></div>

У цьому ж блоці ми запитаємо користувача, чи цікавить його первинне (нове) чи вторинне (вторинне) житло:

<div data-with-frame="true"><figure><img src="/files/e6e478d462654bcda3841c88cf01054927b12222" alt=""><figcaption></figcaption></figure></div>

Далі створіть зв'язки від кнопок "Первинне житло" та "Вторинне житло" у блоці "Чат".

Тепер розгляньмо другий спосіб використання змінних усередині блоків.&#x20;**Виберіть правий блок і введіть у полі "Калькулятор" такий текст:**&#x63;lient\_interest = Primary housing&#x20;**. У лівому блоці введіть:**.

<div data-with-frame="true"><figure><img src="/files/8e05d522c9b14dc2b6d1a210137cff3119e7f9ab" alt=""><figcaption></figcaption></figure></div>

<div data-with-frame="true"><figure><img src="/files/8cd95e064fdb4b5b36d91a5a4cf41c1b19f33155" alt=""><figcaption></figcaption></figure></div>

{% hint style="info" %}
client\_interest = Secondary housing
{% endhint %}

Користувачу присвоюється змінна, коли він переходить до будь-якого з цих блоків. Пізніше ми можемо використати її під час створення замовлення.

<div data-with-frame="true"><figure><img src="/files/8c9ec70f5b2802f2545663911c725f24dfe3438a" alt=""><figcaption></figcaption></figure></div>

<div data-with-frame="true"><figure><img src="/files/a5e3d3bdfc6c65961d3d4a37a26232466bf08a0d" alt=""><figcaption></figcaption></figure></div>

<div data-with-frame="true"><figure><img src="/files/0b659a193089e12411c3b805bbe79af33f000c8f" alt=""><figcaption></figcaption></figure></div>

<div data-with-frame="true"><figure><img src="/files/879a03298e1693b7045fdd9fd8f78646f91415ab" alt=""><figcaption></figcaption></figure></div>

Далі ми запитаємо клієнта про його бюджет на придбання нерухомості в цих блоках і створимо ще два блоки зі стрілками, що ведуть до них, на основі тригерів відповіді клієнта. **З блоку**"Який у вас бюджет?"

1. створіть зв'язок і встановіть умову тригера, щоб сегментувати користувачів за їхніми відповідями. **У налаштуваннях зв'язку увімкніть прапорець для**.
2. "Користувач вводить дані" `Призначте назву змінної (наприклад,`budget
3. У **) для збереження відповіді клієнта.** У полі `#{question}` "Змінна"
   * **Приклад:** `використайте вбудовану змінну`

<div data-with-frame="true"><figure><img src="/files/9693d86e9d0e4efe4fb752dc36cbd133de19b12b" alt=""><figcaption></figcaption></figure></div>

{% hint style="warning" %}
\#{question} <= 1000000 **Для всіх зв'язків до блоків** "Ліди" **У налаштуваннях зв'язку увімкніть прапорець для** активуйте та визначте змінну.
{% endhint %}

Ви також можете визначити додаткову змінну безпосередньо в **Для всіх зв'язків до блоків** блоці, щоб надати більш повну інформацію про угоду.

<div data-with-frame="true"><figure><img src="/files/0e79e2470f88b8ba547f30954c44238d13cfd7b4" alt=""><figcaption></figcaption></figure></div>

Тепер змініть тип двох останніх блоків на "Ліди" і подивіться результат:

Давайте протестуємо потік у дії:

<div data-with-frame="true"><figure><img src="/files/8a265c6ed512ab6e18ca05bc43c2eb7565e0a018" alt="" width="375"><figcaption></figcaption></figure></div>

Ви можете переглянути створену угоду та збережені дані клієнта, перейшовши до **"Клієнти"** розділу й відкривши відповідну розмову. Змінні угоди будуть там видимі.

<div data-with-frame="true"><figure><img src="/files/b841a0a577e2c865c0e645ad5fae7df38781dfb0" alt=""><figcaption></figcaption></figure></div>

Тепер ви знаєте, як використовувати змінні принаймні трьома різними способами:

1. Призначати імена змінних введеним користувачем даним (наприклад, “Name”, “Budget”)
2. Призначати значення змінної під час переходу до блоку (наприклад, client\_interest = Primary housing)

## Як переглядати змінні

Щоб переглянути змінні клієнта, перейдіть до **"Клієнти"** розділу та відкрийте його картку клієнта.

<div data-with-frame="true"><figure><img src="/files/a809386cc7a6f3192ba6db537eb77a106fd6da15" alt=""><figcaption></figcaption></figure></div>

Змінні відображаються у вигляді списку в картці клієнта:

* Кожна змінна займає окремий рядок.
* Поле **назва змінної** відображається ліворуч.
* Її відповідне **value** значення

**відображається праворуч.**

Щоб змінити змінну:

* Наведіть курсор на її рядок у списку, щоб відобразити кнопку дії. Натискання на цю кнопку дозволяє:
* Редагувати назву змінної.
* Редагувати значення змінної.

<div data-with-frame="true"><figure><img src="/files/f40a30f06486351a7d12839ea202cf1af62ff93c" alt="" width="375"><figcaption></figcaption></figure></div>

<div data-with-frame="true"><figure><img src="/files/ac65a6c8c4711e888f82fda3fe28cc86b7dca237" alt="" width="375"><figcaption></figcaption></figure></div>

{% hint style="info" %}
Повністю видалити змінну.
{% endhint %}

## Системні змінні не можна редагувати!

{% hint style="info" %}
Як налаштувати змінні клієнта
{% endhint %}

Змінні клієнта не видаляються, не скидаються і не губляться під час використання блоку "Кінець збору даних" (червоний блок).&#x20;

Приклад: `client.age = 28` або `client.age = 28:`

<div data-with-frame="true"><figure><img src="/files/0941e623e79dc32143b374e1c379e608c0246c45" alt="" width="563"><figcaption></figcaption></figure></div>

Неявний спосіб — це встановити змінну в полі введення даних стрілки.

Приклад:

Давайте створимо блок, у якому ми запитаємо ім'я клієнта, а також створимо блок нижче:

<div data-with-frame="true"><figure><img src="/files/42aafbf2ac258fc9199e667f0b89853fd039f850" alt="" width="563"><figcaption></figcaption></figure></div>

Далі перейдіть до налаштувань зв'язку та увімкніть опцію "Користувач вводить дані".

<div data-with-frame="true"><figure><img src="/files/b85d1b0acab561fb8f5696ba34d730537e569873" alt="" width="563"><figcaption></figcaption></figure></div>

Використовуйте `client.` префікс під час називання вашої змінної (наприклад, `client.name`) для зберігання введених користувачем даних. Потім на цю змінну можна буде посилатися в наступних повідомленнях як `#{client.name}`.

<div data-with-frame="true"><figure><img src="/files/7365fa178b82f9c5951b4484d5581d801746971e" alt="" width="563"><figcaption></figcaption></figure></div>

{% hint style="success" %}
Змінні клієнта використовуються в конструкторі так само, як і звичайні змінні, але без **client** префікса.
{% endhint %}

## Як налаштувати змінні проєкту

{% hint style="info" %}
Глобальні змінні не видаляються, не скидаються і не губляться під час використання блоку "Ліди" (червоний блок).
{% endhint %}

Глобальні змінні доступні всім користувачам бота. Вони ідеально підходять для керування поведінкою бота або для взаємодії між різними користувачами.

**Приклад використання:**\
Один користувач може опублікувати товар у каналі маркетплейсу, встановивши змінну (наприклад, `project.latest_listing`), а всі інші користувачі можуть його побачити й відповісти.

#### **Синтаксис присвоєння**

Щоб створити або оновити глобальну змінну, використовуйте `project.` префікс у Калькуляторі:

**Приклади:**

* `project.product_shop = 28`
* `project.age = 28`

<div data-with-frame="true"><figure><img src="/files/373d1b7c967ae584929d912b392eba618b5c7b6d" alt=""><figcaption></figcaption></figure></div>

Їх можна використовувати без будь-якого префікса.

Давайте подивимося, як дані відображаються в таблиці.

<div data-with-frame="true"><figure><img src="/files/0f2b808402ebced231ddc9381c733d18e831335e" alt=""><figcaption></figcaption></figure></div>

Тепер виконайте блок "Start" у тестовому режимі.

<div data-with-frame="true"><figure><img src="/files/c19fdf013e5eb5c01936234a3c6940701c4f5191" alt="" width="375"><figcaption></figcaption></figure></div>

Ми бачимо дані, які були записані в змінну з таблиці, у повідомленні, надісланому ботом. Оскільки ми посилалися на змінну в повідомленні за допомогою `#{}` синтаксису, дані, що зберігалися в ній, відобразилися в чаті бота.

{% hint style="info" %}
Докладніше про те, як працювати з функцією get\_records\_from\_table(), пояснюється в статті "[AI assistant with MaviBot table](/doc/uk/chatbot/ai/tables.md)".
{% endhint %}

Поле `project.` префікс дозволив функції записати дані таблиці безпосередньо в глобальні змінні проєкту, доступні в **"Змінні"** розділ.

<div data-with-frame="true"><figure><img src="/files/f78ec84425304029b4646c228ca399885048b6a9" alt=""><figcaption></figcaption></figure></div>

Ви можете редагувати змінні проєкту в налаштуваннях проєкту.

### Приклад: використання змінних проєкту

Створіть систему, яка присвоює кожному новому клієнту, що заходить у бот, послідовний номер.

**Реалізація:**

1. Перейдіть до **Налаштування проєкту**.
2. Створіть нову змінну проєкту (наприклад, `project.client_counter`).

<div data-with-frame="true"><figure><img src="/files/5ba182869163b74790120462fe6cb0d00f6f1ebc" alt=""><figcaption></figcaption></figure></div>

<div data-with-frame="true"><figure><img src="/files/f67b37066ccc0e5d4556bc0ecb190bcd097340bf" alt=""><figcaption></figcaption></figure></div>

3. Встановіть її початкове значення (наприклад, `0`) що означає **"У боті немає клієнтів"**:

<div data-with-frame="true"><figure><img src="/files/6a14d7dd2c46f605559f6b3d61e3a460df9e83e9" alt="" width="563"><figcaption></figcaption></figure></div>

<div data-with-frame="true"><figure><img src="/files/174212d9d7a59351873a660276907f30d444d63c" alt=""><figcaption></figcaption></figure></div>

<div data-with-frame="true"><figure><img src="/files/557ada1c5d24bbdb3f67b10641f7b500fe49fbc6" alt="" width="563"><figcaption></figcaption></figure></div>

У стартовому блоці бота додайте логіку, яка:

1. Збільшує значення змінної проєкту на 1.
2. Присвоює нове значення змінній, специфічній для клієнта, для поточного користувача.

<div data-with-frame="true"><figure><img src="/files/ec8c9b3abf8c7e115b7675bc06bc41913fe2fb41" alt=""><figcaption></figcaption></figure></div>

{% hint style="info" %}
Не забудьте встановити обмеження, щоб лічильник не можна було збільшити для одного й того самого клієнта двічі.
{% endhint %}

<div data-with-frame="true"><figure><img src="/files/15bec52508e10336dc896f67e8e0df99b8ccbd1a" alt="" width="563"><figcaption></figcaption></figure></div>

## Як налаштувати константні змінні

Константи — це фіксовані значення, які залишаються незмінними (або змінюються дуже рідко) протягом життєвого циклу проєкту.

**Ключова відмінність від глобальних змінних:**

На відміну від глобальних змінних, константи є **специфічними для клієнта**. Якщо значення константи змінено, зміна застосовується лише до сесії цього конкретного клієнта.

**Типові варіанти використання:**

Константи ідеально підходять для зберігання статичних даних, таких як:

* Ціни на товари та знижки для клієнтів
* Токени інтеграцій та API-ключі
* Контактна інформація продавця або служби підтримки
* Будь-які інші фіксовані значення конфігурації

### Приклад: використання константних змінних

Наприклад, знижка клієнта за замовчуванням може становити 10%, але після введення промокоду змінюватися на 25%.

У "Налаштуваннях проєкту" → "Константи" введіть: Discount : 10

<div data-with-frame="true"><figure><img src="/files/70aafdcb8e3dfafbeb3e5cc12794302cf1fd9147" alt=""><figcaption></figcaption></figure></div>

Щоб ввести промокод, додайте блок "Тригер", у якому ми присвоюємо змінній **discount** значення 25.

<div data-with-frame="true"><figure><img src="/files/5021f81e02babd6b0c48c2633e24e11b5dea73e0" alt=""><figcaption></figcaption></figure></div>

Відобразіть змінну, що показує суму знижки, у зеленому блоці:

<div data-with-frame="true"><figure><img src="/files/e3747a53706328efe0b27389f9b9680e22014e50" alt=""><figcaption></figcaption></figure></div>

**Крок 1: Налаштуйте автоматичний перехід**\
Створіть зв'язок із **таймером на нуль секунд** із сірого блоку. Це гарантує, що знижка застосовується одразу, а клієнт переходить до повідомлення в стартовому блоці.

**Крок 2: Протестуйте потік**\
Тепер напишіть повідомлення боту, щоб запустити й протестувати всю послідовність.

<div data-with-frame="true"><figure><img src="/files/6614f4b684f169ea7bdcae1c3366fbd82de21a12" alt="" width="563"><figcaption></figcaption></figure></div>

Стандартна знижка без промокоду становить 10%. Однак введення дійсного промокоду змінює ситуацію.

<div data-with-frame="true"><figure><img src="/files/f7abda7f83522c8a89880c22b49f7d6728db2971" alt="" width="563"><figcaption></figcaption></figure></div>

Отже, після введення промокоду змінна "discount" для цього клієнта стала 25. <br>

Так сталося тому, що присвоєння на кшталт discount = 25 встановило значення для змінної угоди, а не змінило значення константи з тією самою назвою.

## Ключові змінні угоди

**name** - назва угоди. Термін **Введені користувачем дані зберігаються в змінній** використовується для міжнародної версії проєкту.

**description** - опис угоди. **Опис** використовується в міжнародній версії проєкту

**Призначте назву змінної (наприклад,** - сума угоди (число).

Щоб редагувати змінні за допомогою API-запиту /set\_order\_vars, ви повинні використовувати назви з т[цього посібника точно так, як вони показані](#how-to-set-client-variables), включно з регістром літер і версією проєкту.

## Обмеження

{% hint style="warning" %}
Максимальна довжина назви змінної: 500 символів

Максимальна довжина значення змінної: 100 000 символів

Максимальна кількість змінних на клієнта або угоду: 1 000 символів.
{% endhint %}

## Як правильно працювати зі змінними

### *Коли потрібно брати значення змінної в лапки?*

*Наприклад, <mark style="color:yellow;">**client\_id = 1202020202**</mark> або <mark style="color:green;">**client\_id = '1202020202'**</mark>?*

Обидва варіанти синтаксису є функціонально правильними. Використання лапок навколо значення впливає лише на його візуальне підсвічування в редакторі калькулятора.

Однак дотримання послідовних правил кодування покращує читабельність і підтримуваність:

* **Не ставте лапки** для **числових** значень (наприклад, `discount = 25`).
* **Використовуйте лапки** для **рядкових** значень (наприклад, `status = "active"`).

<div data-with-frame="true"><figure><img src="/files/c7b46ded875f2276472f41412bbb4435e390241c" alt=""><figcaption></figcaption></figure></div>

<div data-with-frame="true"><figure><img src="/files/9890b4e6f1e146227c213ef0f85969f0742def92" alt=""><figcaption></figcaption></figure></div>

<div data-with-frame="true"><figure><img src="/files/92ad314780f71f8ee2d1c09aa3700e364a96a75e" alt=""><figcaption></figcaption></figure></div>

*Який правильний синтаксис для передавання ідентифікаторів, таких як Client ID, Site ID, Block ID або Certificate ID, у функції — чи потрібно брати їх у лапки?*

<div data-with-frame="true"><figure><img src="/files/729eafe0a9ea48f5fbcf0d1796a0fa6ba8ef5760" alt="" width="563"><figcaption></figcaption></figure></div>

ID не слід брати в лапки під час передавання методу або функції:

<div data-with-frame="true"><figure><img src="/files/427e60dd8053dfa20bf5738345c1c17e3cb75dd6" alt=""><figcaption></figcaption></figure></div>

### Що слід використовувати: подвійні лапки чи одинарні лапки?

Немає різниці між використанням одинарних або подвійних лапок, але ми рекомендуємо використовувати подвійні лапки. Так, наприклад, під час вставлення змінної всередині рядка змінна буде підсвічуватися іншим кольором, що полегшує її помітити.

<div data-with-frame="true"><figure><img src="/files/7c1c9e49ab2060432241f46db3dc8889aac6c15e" alt=""><figcaption></figcaption></figure></div>

### Як мають бути розставлені пробіли?&#x20;

Чи працює так само, якщо між змінною та знаком рівності є пробіл (наприклад, *<mark style="color:blue;">ans="yes"</mark>, <mark style="color:purple;">ans = "yes"</mark>, <mark style="color:orange;">ans= "yes"</mark>, <mark style="color:red;">ans ="yes"</mark>?*

<div data-with-frame="true"><figure><img src="/files/c3668a6c91a52616dbfc30d5603139315535cf95" alt=""><figcaption></figcaption></figure></div>

Розташування пробілів не впливає на роботу методів, змінних або функцій. Однак для покращення читабельності коду рекомендується використовувати пробіли.

### Як правильно писати коментарі в калькуляторі

{% hint style="success" %}
**Докладніше про те, як писати коментарі в Калькуляторі, дивіться** [**цю статтю**](/doc/uk/chatbot/functions/kalkulyator.md)**.**
{% endhint %}

## Як порівнювати змінні

Ви можете керувати перебігом чат-бота, порівнюючи значення змінних. Це дає змогу створювати умовну логіку, наприклад перевіряти вік користувача на відповідність вимогам закону або спрямовувати взаємодію залежно від платформи месенджера користувача.

{% hint style="info" %}
Ось як розділити воронку [за різними месенджерами або за різними акаунтами одного й того самого месенджера, пояснено тут.](/doc/uk/faq/faq.md#how-can-i-split-a-funnel-by-messengers)
{% endhint %}

#### **Підтримувані оператори:**

"**+**": додавання \
"**-**"': віднімання \
"**\***" *множення* \
"**/**": *ділення*\
"**%**'"*: остача від ділення* \
"**^**" "**\*\***": піднесення до степеня \
"**та**" "**AND**" "**&&**": логічне І \
"**або**" "**OR**" "**||**": логічне АБО

Оператори порівняння:\
"**==**" — дорівнює\
"**!=**" — не дорівнює\
"**>**" — більше за\
"**<**" — менше за \
"**>=**" — більше або дорівнює\
"**<=**" — менше або дорівнює

{% hint style="warning" %}
**ВАЖЛИВО!** \
Щоб перевірити, що **вбудований тег змінної** (тег запуску бота) відсутній у картці клієнта, використовуйте такий метод порівняння:\
\
`tag == "NONE"`
{% endhint %}

Змінні слід порівнювати в умові в полі "Змінна" (і в налаштуваннях з'єднання, і в налаштуваннях блоку):

**Приклад порівняння змінної в полі "Змінна" тригерного блоку.**

<div data-with-frame="true"><figure><img src="/files/58b5dea3e83f8ab2c4b7121f31df2fd66ac55ba8" alt=""><figcaption></figcaption></figure></div>

**Приклад порівняння змінної в полі "Змінна" з'єднання блоку.**

<div data-with-frame="true"><figure><img src="/files/017d336749436adb3137827fde9ab0a430527b33" alt=""><figcaption></figcaption></figure></div>

#### **Як змінні та тригери працюють разом**

Щоб з'єднання було активовано, **мають виконуватися обидва тригери**:

1. Умова в **"Trigger"** .
2. Логіка порівняння в **) для збереження відповіді клієнта.** .

#### **Розуміння поля "Змінна"**

Якщо ви вводите лише назву змінної (наприклад, `client_type`) у **) для збереження відповіді клієнта.** полі без виразу, система перевіряє *існування* або *істинність* значення змінної. Вона не **не** порівнює його з необробленим введенням користувача.

**Приклад:**\
Наведена нижче конфігурація перевіряє, чи клієнт із WhatsApp, шляхом перевірки того, що `client_type` змінна дорівнює `6` (де `6` означає WhatsApp).

`client_type == 6`

<div data-with-frame="true"><figure><img src="/files/ca8745bced9c665760591c0f2f9da6188716e3f8" alt="" width="563"><figcaption></figcaption></figure></div>

Наведений нижче приклад працює так само:

<div data-with-frame="true"><figure><img src="/files/08c6acddbf485736190a18d4d2983701f4f6d0ca" alt="" width="563"><figcaption></figcaption></figure></div>

{% hint style="warning" %}
Зверніть увагу! \
Не можна вказувати кілька значень для порівняння змінної в полі "Тригер".

<img src="/files/c663b79c91c1bb1e6a4dc50f955c719e4644e882" alt="" data-size="original">

Це неправильно!

Якщо потрібно порівняти кілька змінних, вкажіть їхні значення в полі "Змінна".

Ці варіанти правильні.

<img src="/files/16b54c9166b3bea4c70ac07127fc7ea12c64b0e1" alt="" data-size="original">
{% endhint %}

{% hint style="info" %}
client\_type == 3 перехід, якщо значення змінної дорівнює **3**\
attachments != None перехід, якщо змінна містить будь-яке значення\
attachments == None перехід, якщо змінну не задано\
product\_quantity >= 100 перехід, якщо кількість товару більша або дорівнює **100**\
product\_quantity <= 100 перехід, якщо кількість товару менша або дорівнює **100**\
name == "John" перехід, якщо назва змінної дорівнює John

Щоб перевірити, порожня змінна чи ні, використовуйте вирази:\
\&#xNAN;**"#{value}" == ""**  \
**"#{value}" != ""** <br>

(де **value** є назвою змінної).

Результат операції порівняння повертає логічне значення: **True** або **False**.
{% endhint %}

{% hint style="warning" %}
Максимальна довжина виразу: 1000 символів
{% endhint %}

{% hint style="warning" %}
Значення за замовчуванням буде повернено як результат під час спроби порівняти значення різних типів.

"==" - False                       "<" - False\
"!=" - True                          ">=" - False \
">" - False                          "<=" - False
{% endhint %}

{% hint style="warning" %}
**ВАЖЛИВО!** \
Щоб перевірити, що **вбудований тег змінної** (тег запуску бота) відсутній у картці клієнта, використовуйте такий метод порівняння:\
\
`tag == "NONE"`
{% endhint %}

**Приклад:** бот, що перевіряє вік користувача (`age`).

* Якщо `age < 18`, він надсилає повідомлення для неповнолітніх.
* Якщо `age >= 18`, він надсилає повідомлення для дорослих.

<div data-with-frame="true"><figure><img src="/files/80a93f7cdf25ba78753235313af821277f3d617d" alt=""><figcaption></figcaption></figure></div>

<div data-with-frame="true"><figure><img src="/files/dfdcf2c6bab8dfb4eadda941543c889b48b6734c" alt=""><figcaption></figcaption></figure></div>

Зверніть увагу, що потік містить блок без тригера, від якого ведуть таймовані з'єднання.&#x20;

Цей блок навмисно створено, щоб продемонструвати, як будувати потоки, де бот реагує не на дії користувача, а на результати обчислень. На першому кроці відповідь зберігається в змінну, а потім відбувається порівняння. Затримка на стрілках встановлена на 0 для миттєвої відповіді.

Порівняння **"Вік >= 18"** також можна виразити як **"більше або дорівнює 18".**

<div data-with-frame="true"><figure><img src="/files/8b206b94829d3921a96c7e6890546041b9530380" alt=""><figcaption></figcaption></figure></div>

{% hint style="danger" %}
Зверніть увагу на помилки в тригерах:

<img src="/files/db82b028e0e5840086f2174b3abe77ab59068da8" alt="" data-size="original">

<img src="/files/ef5ae074ca012cb094d28c5ab794e125771ffaec" alt="" data-size="original">

<img src="/files/52316332282de5cd1b1c92ca4141ca2d19f8175b" alt="" data-size="original">

**Число не може одночасно бути більше за 18, менше за 18 і дорівнювати 18!**

Ці тригери не мають сенсу. Будь-яке число або менше за 18, або більше за 18, або дорівнює 18.
{% endhint %}

{% hint style="warning" %} <mark style="color:red;">**Важливо!**</mark>&#x20;

Логічні тригери зі змінними потрібно писати в <mark style="color:red;">**) для збереження відповіді клієнта.**</mark> полі, а не в полі "Тригер"!
{% endhint %}

Наприклад, на зображенні нижче блок буде активовано, якщо <mark style="color:green;">**змінна phone заповнена**</mark> (тобто не дорівнює **None**):

<div data-with-frame="true"><figure><img src="/files/4d7699a3d1ca347a027cf3aa5f1d61e0329f407f" alt="" width="563"><figcaption></figcaption></figure></div>

Наступний приклад показує, як поєднувати оператори:

<div data-with-frame="true"><figure><img src="/files/127b5dce4222537c80c74d07349a47f0f0eef9a7" alt=""><figcaption></figcaption></figure></div>

Якщо в клієнта є змінна age зі значенням від 18 до 99, блок буде активовано. Якщо змінної немає, або вік менший за 18, або більший за 99, блок не активується.

{% hint style="warning" %}
Увага!&#x20;

Якщо ви порівнюєте змінну зі значенням у лапках, переконайтеся, що між лапками та значенням немає пробілів; інакше блок може не спрацювати або поводитися некоректно!

<mark style="color:green;">**Правильно**</mark> (без пробілу <mark style="color:red;">**перед лапкою**</mark> або <mark style="color:red;">**після значення my\_new\_bot**</mark>):

<img src="/files/038fd0f3e8d173b20d72af8db160a540eeb4a45e" alt="" data-size="original">

<mark style="color:red;">**Неправильно**</mark> (з пробілом перед лапкою):

<img src="/files/03578a7961014e03e4b6001122c239652b42ca52" alt="" data-size="original">
{% endhint %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.mavibot.ai/doc/uk/chatbot/functions/zminni.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
