# Переменные

## Как использовать переменные

Давайте разберём, что такое переменные и как эффективно использовать их при создании чат-ботов в MaviBot.

{% hint style="danger" %}
**Обратите внимание на следующие системные ограничения для переменных и констант в одном проекте:**

**Переменные шаблона:**

* **Максимальное количество:** 100 переменных
* **Максимальная длина имени:** 100 символов

**Константы проекта:**

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

Переменная — это именованное место хранения данных, обозначенное уникальной текстовой меткой.

<div data-with-frame="true"><figure><img src="/files/e94faa1e118a5078c53cc8b2dd5d973c39fe85de" 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, "Привет!")** В этом случае результат функции будет сохранён в переменной.

**Сбросить переменную** означает присвоить ей значение **0**.

[**Функции и методы**](/doc/ru/chatbot/functions/peremennye.md#functions-for-working-with-variables)  — это заранее определённые наборы команд, которые настраиваются в MaviBot. Большинство функций требуют параметры — значения, которые функция или метод может понять. Как только бот получает необходимые параметры, он выполняет определённую команду.

**`tg_send_message(platform_id, "Привет!")` —** эта функция отправляет сообщение "Привет!" в Telegram.

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

<p align="center"><em>Рис. 2. Пример переменной text1, присвоенной функции.</em></p>

### <mark style="color:красный;">**ПРАВИЛА РАБОТЫ С ПЕРЕМЕННЫМИ:**</mark>

1. Имя переменной может начинаться только с **буквы**; оно не может начинаться с цифры.

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

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

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

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

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

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

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

### Как получить значение переменной

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

{% hint style="danger" %}
Текст **#{}** конструкция позволяет получить значение переменной. Она используется в поле "Текст сообщения", чтобы вставить значение переменной в текст.
{% endhint %}

Пример:

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

{% hint style="success" %}
Система поддерживает вложенные переменные, где значение одной переменной является частью имени другой переменной. Например: **#{q#{test#{i}}}**
{% endhint %}

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

`num = 10`

`sum = 1500`

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

### Как вывести общую сумму&#xD;

Введите в калькуляторе следующее:

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

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

**Как&#x20;*****не*****&#x20;делать:**

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

### Как удалить переменную из бота

Чтобы удалить (очистить) переменную, введите в поле "Калькулятор" одну из следующих конструкций:\
YourVariableName =\
или\
YourVariableName = ""

После знака равенства оставьте пробел или используйте двойные (или одинарные) кавычки.

{% hint style="warning" %} <mark style="color:красный;">**Обратите внимание!**</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;*обычное сообщение = 0*\
*сообщение, отправленное через API = 1*\
*callback-уведомление (жёлтый фон в диалоге) = 3*\
*телефонное уведомление (светло-голубой фон в диалоге) = 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/ru/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 %}

#### **Messenger ID (platform\_id)**

**Messenger ID (platform\_id)** — это идентификатор пользователя/чата/канала в мессенджере. Чтобы найти его, откройте диалог с нужным клиентом в разделе "Клиенты". Справа в окне чата перейдите на вкладку "**О клиенте** - **Системные переменные"** или вкладку "**Все"** .

Текст **`platform_id`** — это постоянная, сгенерированная системой переменная, представляющая уникальный ID пользователя в мессенджере.

* **Постоянство:** Этот ID остаётся неизменным для пользователя. Даже если вы удалите его запись из конструктора, его `platform_id` будет таким же при повторной регистрации.
* **Источник:** ID назначается платформой мессенджера (например, Telegram, WhatsApp), когда пользователь впервые взаимодействует с ботом.

Следующий пример показывает, как `platform_id` отображается в карточке клиента.

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

Переменная platform\_id существует как для обычных пользователей, так и для сообществ, каналов и чатов.

Чтобы получить **platform\_id** (идентификатор мессенджера) Telegram-канала, где бот является администратором, просто отправьте сообщение в канал со своего личного аккаунта. Это автоматически создаст диалог между ботом и каналом.

Вы можете скопировать **platform\_id** значение канала в разделе "О клиенте".

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

## Как использовать переменные

Переменные можно использовать в триггерах, заказах, ответах пользователя, блоках и многом другом. Давайте рассмотрим конкретный пример при создании воронки для агентства недвижимости.

Итак, создадим стартовый блок:

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

**Шаг 1: Создайте блок "Спасибо"**

Создайте новый блок с сообщением, благодарящим пользователя за его ввод.

**Шаг 2: Настройте переход**

На соединении, ведущем к этому блоку, настройте следующий триггер:

1. Включите **переключатель "Пользователь вводит данные"** .
2. Во вкладке **в поле "Ввод данных"** введите имя переменной: **`name`**.

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

Ввод пользователя сохраняется в переменной **`Name`** . Это значение можно повторно использовать в любом последующем блоке, вызывая переменную с помощью `#{Name}` синтаксиса, например: `Добро пожаловать, #{Name}!`.

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

Бот будет работать следующим образом:

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

Теперь усложним задачу.&#x20;

В этом же блоке мы спросим пользователя, интересует ли его первичное (новое) или вторичное (вторичное) жильё:

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

Затем создайте связи от кнопок "Первичное жильё" и "Вторичное жильё" в блоке "Чат".

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

Теперь давайте посмотрим на второй способ использования переменных внутри блоков.

Выберите нужный блок и введите следующий текст в поле "Калькулятор":&#x20;**client\_interest = Первичное жильё**. В левом блоке введите:&#x20;**client\_interest = Вторичное жильё**.

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

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

{% hint style="info" %}
Переменная присваивается пользователю при переходе в любой из этих блоков. Позже мы можем использовать её при создании заказа.
{% endhint %}

Затем мы спросим клиента о его бюджете на покупку недвижимости в этих блоках и создадим ещё два блока со стрелками, ведущими к ним, на основе триггеров ответа клиента.

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

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

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

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

Из блока **"Какой у вас бюджет?"**&#x441;оздайте соединение и задайте условие триггера для сегментации пользователей по их ответу.

1. В настройках соединения включите чекбокс **"Пользователь вводит данные"**.
2. Назначьте имя переменной (например, `budget`) для хранения ответа клиента.
3. Во вкладке **в поле "Переменная"** используйте встроенную переменную `#{question}` (которая содержит последнее сообщение пользователя) для создания условия.
   * **Пример:** `#{question} <= 1000000`

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

{% hint style="warning" %}
Для всех соединений к блокам **"Лиды"** активируйте **"Пользователь вводит данные"** и определите переменную.
{% endhint %}

Вы также можете определить дополнительную переменную прямо в **"Лиды"** блоке, чтобы предоставить более полную информацию о сделке.

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

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

Давайте протестируем поток в действии:

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

Вы можете просмотреть созданную сделку и сохранённые данные клиента, перейдя в **«Клиенты»** раздел и открыв соответствующий диалог. Там будут видны переменные сделки.

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

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

1. Назначать имена переменных данным, введённым пользователем (например, "Имя", "Бюджет")
2. Присваивать значение переменной при переходе в блок (например, client\_interest = Первичное жильё)

## Как просматривать переменные

Чтобы просмотреть переменные клиента, перейдите в **«Клиенты»** раздел и откройте его карточку клиента.

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

Переменные отображаются в карточке клиента в виде списка:

* Каждая переменная занимает отдельную строку.
* Текст **имя переменной** показывается слева.
* Её соответствующее **value** отображается справа.

**Чтобы изменить переменную:**

Наведите курсор на её строку в списке, чтобы появилось кнопка действия. Нажав на неё, вы можете:

* Изменить имя переменной.
* Изменить значение переменной.
* Полностью удалить переменную.

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

<div data-with-frame="true"><figure><img src="/files/a86a62509ef87b721303d1cad2a45c5f7533aa41" 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/8affdc65c3c56931a5f322190f00632ca141b039" alt="" width="563"><figcaption></figcaption></figure></div>

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

Пример:

Создадим блок, где мы спросим имя клиента, а также создадим блок ниже:

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

Затем перейдите в настройки соединения и включите опцию "Пользователь вводит данные".

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

Используйте `client.` префикс при именовании переменной (например, `client.name`) для сохранения ввода пользователя. Затем на эту переменную можно ссылаться в последующих сообщениях как `#{client.name}`.

<div data-with-frame="true"><figure><img src="/files/81df7340bca97c193e46b7f36c7bf37fe196e3c6" 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/5ebfaa60781cac457b871a7acd780d774ac3b263" alt=""><figcaption></figcaption></figure></div>

Их можно использовать без какого-либо префикса.

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

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

Теперь запустите блок "Старт" в тестовом режиме.

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

Мы видим данные, которые были записаны в переменную из таблицы, в сообщении, отправленном ботом. Поскольку мы обратились к переменной в сообщении с помощью `#{}` синтаксиса, данные, сохранённые в ней, были отображены в чате бота.

{% hint style="info" %}
Подробнее о том, как работать с функцией get\_records\_from\_table(), рассказано в статье "[ИИ-ассистент с таблицей MaviBot](/doc/ru/chatbot/ai/tables.md)".
{% endhint %}

Текст `project.` префикс позволил функции записать данные таблицы напрямую в глобальные переменные проекта, доступные в **вкладке "Переменные"** .

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

Вы можете редактировать переменные проекта в настройках проекта.

### Пример: использование переменных проекта

Создайте систему, которая присваивает каждому новому клиенту, вошедшему в бота, последовательный номер.

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

1. Перейдите в **Настройки проекта**.
2. Создайте новую переменную проекта (например, `project.client_counter`).

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

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

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

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

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

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

В стартовом блоке бота добавьте логику, которая:

1. Увеличивает значение переменной проекта на 1.
2. Присваивает новое значение клиентской переменной для текущего пользователя.

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

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

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

## Как задавать переменные-константы

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

**Ключевое отличие от глобальных переменных:**

В отличие от глобальных переменных, константы **зависят от клиента**. Если значение константы изменяется, изменение применяется только к сессии этого конкретного клиента.

**Типичные варианты использования:**

Константы идеально подходят для хранения статических данных, таких как:

* Цены на товары и скидки для клиентов
* Токены интеграций и API-ключи
* Контактная информация продавца или службы поддержки
* Любые другие фиксированные значения конфигурации

### Пример: использование переменных-констант

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

В "Настройки проекта" → "Константы" введите: Discount : 10

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

Чтобы ввести промокод, добавьте блок "Триггер", где мы присваиваем переменной **discount** значение 25.

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

Отобразите переменную, показывающую размер скидки, в зелёном блоке:

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

**Шаг 1: Настройте автоматический переход**\
Создайте соединение с **нулевой задержкой** из серого блока. Это обеспечивает немедленное применение скидки и переход клиента к сообщению в стартовом блоке.

**Шаг 2: Проверьте поток**\
Теперь отправьте сообщение боту, чтобы запустить и протестировать всю последовательность.

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

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

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

Таким образом, после ввода промокода переменная "discount" для этого клиента стала равна 25. <br>

Это произошло потому, что присваивание вроде discount = 25 установило значение для переменной сделки, а не изменило значение константы с тем же именем.

## Ключевые переменные сделки

**name** - название сделки. Термин **Name** используется для международной версии проекта.

**description** - описание tdeal. **Описание** используется в международной версии проекта

**budget** - сумма сделки (число).

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

## Максимальная длина имени переменной: 500 символов

{% hint style="warning" %}
Максимальная длина значения переменной: 100 000 символов

Максимальное количество переменных на клиента или сделку: 1 000 символов.

Как правильно работать с переменными
{% endhint %}

## Когда нужно заключать значение переменной в кавычки?

### *Например,*

*client\_id = 1202020202 <mark style="color:жёлтый;">**client\_id = '1202020202'**</mark> или <mark style="color:зелёный;">**Оба варианта синтаксиса функционально корректны. Использование кавычек вокруг значения влияет только на его визуальную подсветку в редакторе калькулятора.**</mark>?*

Однако соблюдение единых правил оформления кода повышает читаемость и удобство сопровождения:

Не используйте кавычки

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

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

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

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

*Каков правильный синтаксис передачи идентификаторов, таких как Client ID, Site ID, Block ID или Certificate ID, функциям — нужно ли заключать их в кавычки?*

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

ID не должен заключаться в кавычки при передаче методу или функции:

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

### Что следует использовать: двойные или одинарные кавычки?

Между использованием одинарных и двойных кавычек нет разницы, но мы рекомендуем использовать двойные кавычки. Так, например, при вставке переменной внутрь строки переменная будет выделяться другим цветом, и её будет легче заметить.

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

### Как следует расставлять пробелы?&#x20;

Одинаково ли это работает, если между переменной и знаком равенства есть пробел (например, *<mark style="color:синий;">ans="yes"</mark>, <mark style="color:фиолетовый;">ans = "yes"</mark>, <mark style="color:оранжевый;">ans= "yes"</mark>, <mark style="color:красный;">ans ="yes"</mark>?*

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

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

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

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

## Как сравнивать переменные

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

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

#### **Поддерживаемые операторы:**

"**+**": сложение \
"**-**"': вычитание \
"**\***" *умножение* \
"**/**": *деление*\
"**%**'"*: остаток от деления* \
"**^**" "**\*\***": возведение в степень \
"**и**" "**И**" "**&&**": логическое И \
"**или**" "**ИЛИ**" "**||**": логическое ИЛИ

Операторы сравнения:\
"**==**" — равно\
"**!=**" — не равно\
"**>**" — больше чем\
"**<**" — меньше чем \
"**>=**" — больше или равно\
"**<=**" — меньше или равно

{% hint style="warning" %}
**ВАЖНО!** \
Чтобы проверить, что **встроенный тег переменной** (тег запуска бота) отсутствует в карточке клиента, используйте следующий способ сравнения:\
\
`tag == "NONE"`
{% endhint %}

Переменные следует сравнивать в условии в поле "Переменная" (как в настройках соединения, так и в настройках блока):

**Пример сравнения переменной в поле "Переменная" блока-триггера.**

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

**Пример сравнения переменной в поле "Переменная" соединения блока.**

<div data-with-frame="true"><figure><img src="/files/25757de43299942f66ec3a451b30e99ffabf9fd7" 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/e192f9d51b47e3e3c074533ed94623c48941741b" alt="" width="563"><figcaption></figcaption></figure></div>

Приведённый ниже пример работает точно так же:

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

{% hint style="warning" %}
Обратите внимание! \
Нельзя указывать несколько значений для сравнения переменной в поле "Триггер".

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

Это неправильно!

Если вам нужно сравнить несколько переменных, укажите их значения в поле "Переменная".

Эти варианты правильные.

<img src="/files/7735486833fbbeaf701513e36a2cbde55acd4603" 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 < 18`), отправляет сообщение для несовершеннолетних.
* Если `age >= 18`), отправляет сообщение для совершеннолетних.

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

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

Обратите внимание, что сценарий включает блок без триггера, от которого идут соединения с задержкой.&#x20;

Этот блок специально создан, чтобы показать, как строить сценарии, в которых бот реагирует не на действия пользователя, а на результаты вычислений. На первом шаге ответ сохраняется в переменную, а затем происходит сравнение. Задержка на стрелках установлена в 0 для мгновенного ответа.

Сравнение **"Возраст >= 18"** также можно выразить как **"больше или равно 18."**

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

{% hint style="danger" %}
Обратите внимание на ошибки в триггерах:

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

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

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

**Число не может одновременно быть больше, меньше и равно 18!**

Эти триггеры бессмысленны. Любое число либо меньше 18, либо больше 18, либо равно 18.
{% endhint %}

{% hint style="warning" %} <mark style="color:красный;">**Важно!**</mark>&#x20;

Логические триггеры с переменными должны быть написаны в <mark style="color:красный;">**в поле "Переменная"**</mark> поле, а не в поле "Триггер"!
{% endhint %}

Например, на изображении ниже блок сработает, если <mark style="color:зелёный;">**переменная phone заполнена**</mark> (то есть не равна **None**):

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

Следующий пример показывает, как комбинировать операторы:

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

Если у клиента есть переменная возраста со значением от 18 до 99, блок сработает. Если переменная отсутствует, либо возраст меньше 18 или больше 99, блок не активируется.

{% hint style="warning" %}
Примечание!&#x20;

Если вы сравниваете переменную со значением в кавычках, убедитесь, что между кавычками и значением нет пробелов; иначе блок может не сработать или вести себя некорректно!

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

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

<mark style="color:красный;">**Неправильно**</mark> (с пробелом перед кавычкой):

<img src="/files/46933b21e655353c04160ad01e29ada8689edfb9" 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/ru/chatbot/functions/peremennye.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.
