# Отличия шага Установить переменную и SmartQuery

Исторически сложилось так, что в SmartBot есть 2 разных способа для вычисления значений выражений с переменными: шаг **"Установить переменные"** и **SmartQuery** (SQ, шаг Выполнить SmartQuery).

## Про шаг "Установить переменную"

Изначально был только шаг "Установить переменные". Его основная задача — сохранять текст в переменную. Так, например, с его помощью можно сохранить ответ пользователя из переменной **%сообщение%** в какую-то локальную переменную.&#x20;

![](/files/-MK591mWfx8UmJsEVlU3)

Также можно использовать этот шаг для сохранения меток пользователей, например:

![](/files/-MK59QqowTu2XB_SCzw2)

Ещё этот шаг позволяет производить несложные арифметические вычисления с переменными. Например, если вам нужно считать, сколько раз бот выполнил определённый шаг для каждого пользователя, это можно сделать так:

![](/files/-MK5AMc-OeUN9xRZV3YS)

Подробное описание возможностей этого шага можно посмотреть тут: [Операции с переменными](/sozdanie-scenariev/peremennye/operacii-s-peremennymi.md).

Алгоритм работы этого шага можно описать следующим образом:

1. Подставляем значения переменных (в виде текста) в правую часть выражения
2. Результирующую строку пытаемся выполнить как арифметическое выражение
3. Если выражение удалось вычислить, то подставляем вместо него,полученный результат
4. Иначе оставляем всё как было - текстом, полученным в п.1

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

Рассмотрим на примере. Пусть у нас есть 2 переменные: **%a%** и **%b%**. Допустим, их значения вводит пользователь.

| %a% | %b% | Выражение | Результат |
| --- | --- | --------- | --------- |
| 10  | 10  | %a% + %b% | 20        |
| 10  | 10ш | %a% + %b% | 10 + 10ш  |

Видно, что во втором случае выражение не удалось вычислить (из-за "ш"), и оно осталось не вычисленным, хоть переменные и были подставлены. Другим негативным примером может быть кейс, когда пользователь в переменную занесёт что-то, что может быть проинтерпретировано как арифметическое выражение. Возможно вы не хотите его вычислять, просто хотите сохранить как есть. Но сделать этого не можете, потому что SmartBot всегда пытается вычислить выражение в правой части шага Установить переменную.

| %сообщение% | Выражение   | Результат |
| ----------- | ----------- | --------- |
| 20 \* 2     | %сообщение% | 40        |

Кроме того, так как этот шаг всегда подставляет переменные в виде текста, вы не можете работать с массивами и словарями в этом шаге без SQ.

## Про шаг "Выполнить SmartQuery"

SmartQuery — это встроенный в SmartBot скриптовый язык программирования со строгой динамической типизацией. Во многом он похож на Python.

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

Приведём несколько примеров:

![](/files/-MK5NR4fF7puoUwttRyz)

Значением переменной **%var1%** будет строка **2 \* 2**, **%var2%** — число **4**, **%var3%** — строка из переменной **%сообщение%**. При этом даже если в **%сообщение%** будет записано арифм. выражение оно не будет вычислено, потому что строка есть строка, строка — это не выражение.

С помощью SQ можно сделать всё, что можно сделать с помощью "Установить переменную" и гораздо больше, но синтаксис сложнее.

Подробнее про SQ можно почитать тут: [Введение](/smartquery/vvedenie.md).\
Документация: [Справочник функций](/smartquery/spravochnik-funkcii.md).

## Список отличий

* Выражения на SQ можно использовать везде, не только в шаге "Выполнить SmartQuery" и в сложных условиях, но и в тексте сообщений, рассылок и т.п.\
  Для этого выражение нужно обернуть в **двойные фигурные скобки**. Это говорит смартботу, что вместо выражения нужно подставить его текстовое представление результата его вычисления в текст сообщения.\
  Таким образом всё, что находится внутри {{ }} — это выражение на языке SQ, и оно будет вычислено, а всё что снаружи — это просто текст.\
  Обратите внимание, что в шаге "Выполнить SmartQuery" и в сложных условиях фигурные скобки ставить не нужно: там всё поле ввода — это одно выражение на SQ, а не текст.

![](/files/-MK5KF--3D-AgtD52Arz)

* В шаге **"Установить переменную"** можно использовать такие переменные как **%ранд(a, b)%** и **%дата+N%**. В целом, не очень корректно их называть переменными, но так сложилось исторически. В **SQ** они недоступны, потому что противоречат синтаксису этого языка программирования. Вместо них в SQ есть функция **rand(a, b)**. Кроме того, она также позволяет получить случайное значение из массива. Альтернативы для второй переменной в SQ на данный момент нет.
* В шаге Установить переменную тоже можно использовать SQ -- в фигурных скобках, также как и везде, где можно использовать обычные переменные. Но скорее всего, удобней будет всё же воспользоваться шагом "Выполнить SmartQuery".
* Так как в "Установить переменную" подстановка переменных идёт перед вычислением выражения, то для того, чтобы склеить 2 строки вместе вам просто нужно написать их подряд. Тут нет никакого спец. синтаксиса. Смартбот не сможет вычислить это выражение как арифметическое, и просто ограничится подстановкой значений переменных в текст.

![](/files/-MK5MCx3KhXXjJu1UPki)

* В SQ того же результата будет добиться гораздо сложнее

![](/files/-MK5MmdyHPBpR86y9bMI)

* Работать с словарями и массивами можно только в SQ.
* Функции из раздела [Операции с переменными](/sozdanie-scenariev/peremennye/operacii-s-peremennymi.md) доступны только в шаге Установить переменную. Функции SQ описаны тут: [Справочник функций](/smartquery/spravochnik-funkcii.md).


---

# 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.smartbot-vk.ru/sozdanie-scenariev/peremennye/otlichiya-shaga-ustanovit-peremennuyu-i-smartquery.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.
