# Переменные

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

Рассмотрим, что такое переменные и как их использовать при создании чат-ботов на конструкторе Salebot.

{% hint style="danger" %}
Обращаем внимание!

Необходимо учитывать лимиты по переменным и константам в проекте:

1. Максимальное количество шаблонных переменных — 100;
2. Название шаблонной переменной не может превышать 100 символов;
3. Максимальное количество констант проекта — 50;&#x20;
4. Название константы не может превышать 100 символов;
5. Значение константы не может превышать 5000 символов.
   {% endhint %}

**Переменная** - это хранилище данных. Переменной присваивается некое текстовое имя:

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

<p align="center"><em>Рис. 1. Пример переменной</em> <br><em>под названием payment_sum, в которой лежит</em> <br><em>сумма для платежа</em></p>

В Salebot существуют несколько типов переменных:

1. [Встроенные переменные](#vstroennye-peremennye);
2. [Служебные переменные](#sluzhebnye-peremennye);
3. Пользовательские переменные — это те, которые Вы сами задаете в проекте.&#x20;

**Объявить переменную** - значит присвоить некое значение поименованному хранилищу: то есть запись вида ***a=0*** и есть то самое объявление переменной ***a***. Мы только что сказали (объявили) конструктору, что в переменной ***a*** мы будем хранить число, пока это значение ***0***.  **Присвоить переменной значение** имеет такой же смысл .&#x20;

Также используют выражение **Присвоить переменной значение функции, Приравнять переменную к функции.**  Принцип тот же, после знака равно ставим не конкретное значение, а функцию. Например, s\_id = vk\_send\_message(platform\_id, "Привет").  В этом случае в переменную запишется результат выполнения функции.

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

[**Функции и методы**](/chatbots/peremennye-i-funkcii/kalkulyator.md) — это определенный набор команд, который заранее установлен Сейлботом. Для большинства функций указываются параметры — значения, которые понимает функция или метод. Как только бот получит значения для функции/метода, далее выполняется определенная команда.

`vk_send_message(platform_id, "Привет")` — это функция, которая отправляет сообщение вконтакте "Привет".&#x20;

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

<p align="center"><em>Рис. 2. Пример переменной</em> <br><em>под названием s_id с приравненной функцией</em></p>

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

1. Переменная может начинаться **только с буквы**, с цифры нельзя

   **Возраст1 - ✅ правильно**  &#x20;

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

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

   **Имя\_Фамилия - ✅ правильно** &#x20;

   Имя Фамилия - ❌ <mark style="color:red;">неправильно</mark>

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

   В имени переменной нельзя использовать зарезервированные слова языков программирования, например: print, true, false и т.д.<br>
3. <mark style="color:red;">**КАТЕГОРИЧЕСКИ НЕЛЬЗЯ**</mark> использовать для имен пользовательских переменных имена встроенных и служебных переменных. С перечнем таких переменных Вы познакомитесь [здесь](#vstroennye-peremennye)<br>
4. <mark style="color:blue;">**Рекомендуем:**</mark>&#x20;
   * используйте латинские наименования для переменных
   * используйте короткие, но смысловые названия переменных, например: totalSum, pay\_name, fio, name\_client и т.д.

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

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

{% hint style="danger" %}
Конструкция #{} позволяет получить значение переменной. Используется эта конструкция в поле Текст сообщения для вставки значения переменной в текст.

Пример:

![](/files/vX8tQwKi3sBbYK7L6rSe)
{% endhint %}

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

В поле "Калькулятор" к переменной обращаемся по имени, без использования конструкции #{}.

Например, у нас есть две переменные: цена (sum) и количество (num).&#x20;

`num = 10`

`sum = 1500`

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

Как вывести итоговую сумму?

Прописываем в калькуляторе:

`total_sum = sum * num` **✅ правильно**&#x20;

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

**Как нельзя:**

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

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

Для удаления переменной (очищения) в поле Калькулятор введите одно из двух:\
Название\_вашей\_переменной = \
Название\_вашей\_переменной = ""

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

{% hint style="warning" %} <mark style="color:red;">**Обратите внимание!**</mark> Важно указывать приставку для места определения принадлежности переменной.<br>

Для переменных проекта (тогда переменная будет записана в настройки проекта) - это **project**: \
project.Название\_вашей\_переменной =  \
или project.Название\_вашей\_переменной = ""<br>

Для переменных клиента **client**:\
client.Название\_вашей\_переменной =  \
или client.Название\_вашей\_переменной = ""

Для переменных сделки приставка не указывается.
{% endhint %}

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

Список встроенных переменных:&#x20;

**#{none}** - проигнорировать сообщение\
\&#xNAN;**#{api\_key}** - токен API. Он передается в вызовах API Salebot\
\&#xNAN;**#{attachment\_url}** - в этой переменной содержится ссылка на вложение\
\&#xNAN;**#{attachments}** - url вложений к сообщению пользователя в формате JSON массива\
\&#xNAN;**#{avatar}** - ссылка на аватар пользователя (которая отображается в разделе Клиенты)\
\&#xNAN;**#{client\_id}** - id клиента в конструкторе. Он передается в вызовы API.  \
\&#xNAN;**#{client\_type}** - тип мессенджера, откуда пришел клиент. Значения описаны [тут](#znacheniya-client_type)\
\&#xNAN;**#{current\_date}** - текущая дата в формате dd.mm.yyyy по часовому поясу проекта\
\&#xNAN;**#{current\_time}** - время проекта в формате hh:mm по часовому поясу проекта\
\&#xNAN;**#{custom\_answer}** - ответ, полученный с сервера, указанного в поле 'URL для ответа с сервера'\
\&#xNAN;**#{message\_from\_outside}** - тип входящего сообщения, может быть: \
\&#xNAN;*Обычное сообщение = 0* \
*Сообщение отправленное через API = 1* \
*Сообщение из CRM (Амо, Битрикс) = 2* \
*Уведомление Callback (желтоватый фон в диалоге) = 3* \
*Уведомление телефонии(светло синий фон в диалоге) = 5*\
Переменная появляется при каждом входящем сообщении, в карте клиента НЕ отображается. Можно использовать в поле переменная для сравнения для настройки срабатывания блоков с условием и стрелок.\
\&#xNAN;**#{date\_of\_creation}** - дата, когда человек был добавлен в бота или написал ему первый раз\
\&#xNAN;**#{full\_name}** - имя и фамилия собеседника\
\&#xNAN;**#{group}** - бот, к которому привязан клиент (В карточке клиента называется "Привязан к боту")\
\&#xNAN;**#{main\_client\_id}** - ID основного клиента, идентификатор основного клиента среди связанных между собой карточек клиентов\
\&#xNAN;**#{message\_id}** - текущее состояние диалога с клиентом. Идентификатор состояния. По умолчанию NONE.\
\&#xNAN;**#{messenger}** - название мессенджера, откуда пришел клиент\
\&#xNAN;**#{name}** - имя собеседника\
\&#xNAN;**#{next\_day}** - завтрашняя дата в формате dd.mm.yyyy. Удобно для отправки сообщения завтра.\
\&#xNAN;**#{order\_id}** - идентификатор заявки(идентификатор клиента и внутренний идентификатор заявки через дефис)\
\&#xNAN;**#{order}** - содержимое заявки, созданной пользователем\
\&#xNAN;**#{platform\_id}** - id клиента в мессенджере\
\&#xNAN;**#{question}** - сообщение пользователя\
\&#xNAN;**#{timestamp}** - текущий timestamp c учетом милисекунд\
\&#xNAN;**#{time\_of\_creation} -** время, когда человек был добавлен в бота или написал ему первый раз\
\&#xNAN;**#{wa\_bot}** - номер Whatsapp, на который написал пользователь (удобно передавать его в поля СРМ, чтобы распределять заявки между менеджерами)\
\&#xNAN;**#{weekday}** - день недели в виде числа, понедельник - 1, вторник -2, и тд

#### **Значения client\_type**

<table><thead><tr><th width="195.3359375">Значение</th><th width="211.8125">Мессенджер</th></tr></thead><tbody><tr><td>0 </td><td>для Вконтакте </td></tr><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>6 </td><td>whatsapp</td></tr><tr><td>7 </td><td>авито </td></tr><tr><td>8 </td><td>одноклассники</td></tr><tr><td>10</td><td>в Instagram*  </td></tr><tr><td>12 </td><td>Юла </td></tr><tr><td>13</td><td>Телефония</td></tr><tr><td>14 </td><td>e-mail </td></tr><tr><td>16</td><td>Telegram Business Account </td></tr><tr><td>19 </td><td>для Циан</td></tr><tr><td>20 </td><td>Max</td></tr><tr><td>21</td><td>Telegram account</td></tr><tr><td>22</td><td>TikTok</td></tr><tr><td>23</td><td>Discord</td></tr></tbody></table>

{% hint style="danger" %}
\*Принадлежит компании Meta, запрещенной в России и признанной экстремисткой.
{% endhint %}

## Служебные переменные

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

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

avito\_profile - ссылка на профиль покупателя в Avito\
avito\_order\_id - идентификатор объявления\
avito\_order\_url - ссылка на объявление в Avito

phone - номер телефона

notSubscribed - если переменная равна 1, то клиент отписался от сообщений и ни одно сообщение ему не будет отправлено\
clientBlocked - клиент заблокирован и бот для него не работает\
story\_url - идентификатор сторис, на который ответил клиент в Instagram\
ok\_user\_id - идентификатор пользователи в Одноклассниках\
viewed\_page - страница, с которой человек пишет в онлайн-чат\
wa\_bot - номер телефона Whatsapp-бота

{% hint style="info" %}
Какие переменные могут быть созданы при оплате, читайте в инструкциях по подключению платежных сервисов в разделе "[Эквайринг](/integration/payments.md)".
{% endhint %}

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

Пользовательские переменные делятся на\
\- [переменные проекта или общие переменные](#kak-zadat-obshie-peremennye)\
\- [переменные клиента или клиентские переменные](#kak-zadat-peremennye-klienta)\
\- [переменные сделки или обычные переменные](#kak-zadat-peremennuyu-sdelki)\
-[ константы](#kak-zadat-konstantnye-peremennye)

Каждый из видов переменных мы рассмотрим ниже.

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

{% hint style="info" %}
При присвоении значения переменной важно указать её вид, используя соответствующие префиксы клиент. (client.)  или проект. (project.), для переменных сделки префикс не используется.

При получении значения переменной такой префикс опускается.

Пример:&#x20;

Допустим, мы хотим задать общую переменную лайк, которую будем использовать как счетчик лайков наших клиентов.

проект.лайк = 0 - объявление, выполняется единожды

в блоке, где необходимо проводить подсчет лайков, пишем:

проект.лайк = лайк + 1
{% endhint %}

{% hint style="info" %}
Приоритет срабатывания у переменных: переменные сделки (самый высокий), переменные клиента, переменные проекта
{% endhint %}

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

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

&#x20;ID в мессенджере (переменная platform\_id) является служебной (встроенной) переменной и постоянна. Даже если вы удалите пользователя из конструктора, то при новой регистрации в боте ID  в мессенджере будет тот же. Этот ID пользователь получает при регистрации в самом мессенджере. \
Как выглядит platform\_id (ID  в мессенджере) в карточке клиента:

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

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

Чтобы получить platform\_id (ID канала в мессенджере) для канала Телеграм, в котором бот является администратором, достаточно написать в канал сообщение (со своего личного аккаунта напишите сообщение в канал).&#x20;

Будет автоматически создан диалог бота с каналом. И в разделе **О клиенте** можно скопировать значение platform\_id канала. В Телеграм для каналов значение ID в мессенджере идёт со знаком минус. В функциях используем всё значение вместе с минусом. &#x20;

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

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

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

Итак, создадим блок "Стартовое условие", в котором спросим, как зовут пользователя:

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

Дальше создаем еще один блок, где благодарим пользователя за предоставленную информацию. В условии перехода в этот блок включим переключатель "Пользователь вводит данные" и в поле "Вводимые данные" напишем "Имя":

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

&#x20;В нашем случае "Имя" - это как раз и есть переменная, в которую бот запишет имя пользователя. Здесь может быть любое слово как на русском так и на английском языках, в том числе и цифры.&#x20;

После этого мы можем использовать введенные данные с помощью переменной "имя". В следующем блоке обращаемся к клиенту по имени, используя переменную, не забыв при этом добавить решетку и фигурные скобки:

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

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

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

Теперь давайте усложним задачу. В этом же блоке спросим пользователя, его интересует первичное жилье или вторичное:

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

&#x20;Затем добавим два блока, где в стрелках в условиях укажем текст кнопок:

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

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

Теперь рассмотрим второй вариант использования переменных: в блоках. Для этого выделим правый блок, в поле "Калькулятор" введем следующий текст: "Клиента\_интересует = Первичное жилье". В левом блоке соответственно "Клиента\_интересует = Вторичное жилье":

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

Для чего это сделано: при переходе в любой из блоков пользователю присваивается переменная, которую мы сможем использовать при создании заявки.&#x20;

Дальше в блоках спросим бюджет клиента для покупки недвижимости, а также создадим еще два блока, к которым будут протянуты стрелки с условием перехода в зависимости от ответа клиента:

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

А из блоков "Какой у вас бюджет" создадим условие с проверкой введенных данных через встроенную переменную #{question} (в данном случае эта переменная является введенным ответом пользователя).

Выражение "question <= 1000000" в поле "Переменная для сравнения" как раз помогает проверить ответ клиента, распределить его в зависимости от бюджета и переместить по воронке в нужный блок. При этом также нужно активировать чекбокс "Пользователь вводит данные" и назначить переменную, в которую запишется ответ клиента.

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

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

Теперь проверим схему в действии:

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

При переходе в раздел "Клиенты" в диалоге с клиентом вы увидите созданную сделку с переменными сделки, которые хранят данные клиента:

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

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

1. Присваивать введенным пользователем данным названия переменных ("Имя", "Бюджет")
2. Присваивать название переменной при переходе в блок (Клиента интересует = Первичное жилье)
3. Сравнивать переменные с ответом пользователя (question >= 1000001)

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

Переменные можно просмотреть в карточке клиента в разделе Клиенты&#x20;

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

Каждая переменная указывается с новой строки, слева имя переменной, справа - значение. При наведении указателя мыши на переменную появляется кнопка ![](/files/ZKE60ZhNxZTvuVESi49s), при нажатии на которую можно отредактировать как имя переменной, так и ее значение или удалить переменную:

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

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

{% hint style="info" %}
Отредактировать системные переменные нельзя!
{% endhint %}

## Как задать переменные клиента

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

Задать переменную клиента можно двумя способами - явно и неявно.

Явный способ объявления переменной - это прописать ее в Калькуляторе одного из  блоков воронки.&#x20;

Например, `клиент.возраст = 28` или `client.возраст = 28:`

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

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

Пример:

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

<div><figure><img src="/files/FSYlvYAIuTLLG9ZO3Lfl" alt="" width="563"><figcaption></figcaption></figure> <figure><img src="/files/SZurvvezsclZXFx185NB" alt="" width="563"><figcaption></figcaption></figure></div>

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

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

В поле прописываем приставку client. и название переменной (в примере client.name): таким образом, когда клиент напишет свое имя, бот запишет имя в клиентскую переменную name.

Далее переменную можно вывести в следующем сообщении:

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

{% hint style="success" %}
Переменные клиента используются идентично обычным в конструкторе уже без приставки client.
{% endhint %}

## Как задать общие переменные

{% hint style="info" %}
Общие переменные не удаляются, не обнуляются и не пропадают при использовании блока "Закрыть сделку" (красный блок).
{% endhint %}

Общие переменные доступны всем пользователям бота. С их помощью можно управлять ботом или обеспечить взаимодействие клиентов между собой. Например, один клиент размещает объявление, все его видят и кто-то на него откликается.&#x20;

Записать переменную можно используя приставку проект., например: `проект.количество_обращений = 28` или `project.возраст = 28`

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

&#x20;Использовать их можно без префикса.

{% hint style="info" %}
Подробнее о работе с функцией get\_records\_from\_table() рассказали в статье "[AI-ассистент с Salebot-таблицами](/chatbots/ai_assistant/sheets.md)".
{% endhint %}

Отредактировать общие переменные можно в настройках проекта:

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

### Пример использования общих переменных

Для примера сделаем систему присвоение номера по порядку каждому входящему в бот клиенту.&#x20;

Перейдем в настройки проекта и создадим новую переменную:

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

Откроется окно, где нужно добавить переменную со значением 0, что означает "Нет клиентов в боте":

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

Далее в стартовом блоке бота будем увеличивать значение переменной на 1 и отписывать полученное значение в клиентскую переменную нашего клиента.

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

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

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

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

Константные переменные или просто константы — это постоянные переменные, значения которых редко меняются в проекте (или не меняются вовсе). В отличие от общих переменных, доступ к ним имеет только один текущий клиент и в случае перезаписи переменной изменения применятся только для него. В константные переменные можно записывать стоимость товаров, скидку для покупателя, токены доступа к интеграциям, контактные данные продавца и т.д.&#x20;

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

В качестве примера представим, что скидка для нового клиента по умолчанию 10%, но если ввести промокод - становится 25%.

В "Настройках проекта" -> "Константы" запишем Скидка : 10

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

Для ввода промокода добавим блок “Не состояние с условием”, где присвоим переменной "Скидка" значение 25.

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

А в зеленом блоке выведем переменную с размером скидки:

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

И проведем стрелку с таймером в ноль секунд из серого блока, чтобы скидка была применена и клиенту пришло сообщение из стартового блока.

Теперь напишем боту:

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

Без промокода наша скидка равна 10%. Но если мы напишем промокод, то ситуация изменится:

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

Таким образом, переменная "скидка" после ввода промокода для данного клиента стала равна 25.&#x20;

Так произошло, потому что запись вида скидка = 25 задала значение для переменной сделки, а не изменила значение одноименной константы.&#x20;

## Основные переменные сделки

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

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

**budget** - Стоимость сделки (число).

Для редактирования переменных с помощью api-запроса  /set\_order\_vars необходимо использовать наименования из [данной инструкции](#polzovatelskie-peremennye) с учетом регистра и версии проекта.

## Функции для работы с переменными

{% embed url="<https://docs.salebot.pro/peremennye-1/kalkulyator/dlya-raboty-s-peremennymi>" %}

## Лимиты

{% 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>?*

Верны оба способа. Постановка кавычек в значение переменной влияет только на подсветку кода в калькуляторе. Но хорошей практикой будет для числовых значений не использовать кавычки, а для строковых (то есть для текста) использовать, поскольку это также упрощает чтение кода.

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

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

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

*Если передавать ID клиента, ID сайта, ID блока в конструкторе, ID сертификата и другие ID в функциях и методах, нужно ли их закрывать в кавычки?*

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

При передаче ID в методе или функции, его не нужно оборачивать в кавычки:

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

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

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

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

<mark style="color:$warning;">**ВАЖНО!**</mark>&#x20;

Не ставьте пробелы после кавычки!

<mark style="color:$success;">**ПРАВИЛЬНО:**</mark>

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

<mark style="color:red;">**ЭТО НЕВЕРНО!**</mark>

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

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

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

{% hint style="success" %}
В калькуляторе можно проставлять комментарии, чтобы понимать, для чего объявлены те или иные функции, методы и переменные.

Комментарии не влияют на работу переменных, функций и методов в калькуляторе и нужны для вашего удобства.
{% endhint %}

Для комментирования текста используйте **/\* текст комментария \*/**.  Данное сочетание /\* \*/  (теги) позволяют делать в калькуляторе как однострочные, так и многострочные комментарии:

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

Не забывайте, что комментарий нужно обязательно закрыть тегом <mark style="color:red;">**\*/**</mark> на конце, <mark style="color:red;">**иначе комментарий продолжится с новой строки:**</mark>

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

{% hint style="danger" %}
Важно!

Не располагайте комментарии друг за другом, между ними должна быть обязательно хотя бы пустая строка
{% endhint %}

Не забывайте ставить закрывающий тег для комментария, даже если комментарий является последней строкой в поле "Калькулятор":

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

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

Переменные можно сравнивать по значениям для отработки схемы чат-бота. Например, проверить, является ли ваш пользователь совершеннолетним, а также на случай, чтобы разделить схему бота по мессенджерам.&#x20;

{% hint style="info" %}
Как разделить воронку по[ разным мессенджера](/chasto-zadavaemye-voprosy/faq.md#kak-razdelit-voronku-po-messendzheram)м или по [разным аккаунтам одного мессенджера](/chasto-zadavaemye-voprosy/faq.md#kak-razdelit-voronku-po-raznym-loginam) рассказали в FAQ.
{% endhint %}

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

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

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

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

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

<div><figure><img src="/files/ZhHD8ePstTVLf8b1c8ij" alt=""><figcaption></figcaption></figure> <figure><img src="/files/L87mjTNpOrqplkLJ6F4t" alt=""><figcaption></figcaption></figure></div>

Переменная для сравнения работает совместно с условием. То есть должно выполниться как условие в поле "Условие", так и сравнение в поле "Переменная для сравнения".

Если в поле переменная для сравнения указать просто имя переменной, без выражения, то условие будет сравниваться с ней, а не с тем, что ввел пользователь. Например, на рисунке ниже проверяется что клиент из Wahtsapp (переменная client\_type в Whatsapp равна 6):

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

Пример ниже работает идентично:

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

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

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

Это ошибка!

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

{% hint style="info" %}
client\_type == 3 переход, если значение переменной равно 3\
attachments != None переход, если значение переменной заполнено любым содержимым\
attachments == None переход, если значение переменной не задано\
количество\_товара >= 100 переход, если количество товара больше или равно 100\
количество\_товара <= 100 переход, если количество товара меньше или равно 100\
имя == "Вася" переход, если значение переменной имя равно Вася

Чтобы проверить пустая переменная или нет, используйте выражение: \
\&#xNAN;**"#{value}" == ""**  \
**"#{value}" != ""** \
Где value - имя переменной.

В результате выполнения операции сравнения будет возвращен результат - логическое значение True или False
{% endhint %}

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

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

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

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

**Пример:**

Бот спрашивает возраст, если он меньше 18 лет, бот отвечает, что человек несовершеннолетний, если больше, то совершеннолетний.

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

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

Сравнение "Age >= 18" может выглядеть также следующим образом: как больше 18 или равно 18%

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

{% hint style="danger" %}
Обращаем внимание на ошибки в условиях:&#x20;

Так делать нельзя!

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

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

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

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

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

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

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

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

Следующий пример: как сочетать операторы:

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

То есть, если у клиента есть переменная age, где указан его возраст от 18 до 99, то блок отработается. Если переменной нет или возраст меньше 18 и больше 99, то блок не будет срабатывать.&#x20;

{% 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/L5zVBGnFLivuKCuLjBqh" alt="" data-size="original">

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

<img src="/files/eceGI0JEyAzUSmWucRfF" 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.salebot.pro/chatbots/peremennye-i-funkcii/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.
