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

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

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

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

![](https://463658383-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M0DL-As7pQfMiFtgM0k%2F-MK57SY5EiuXBLHrNxIg%2F-MK591mWfx8UmJsEVlU3%2Fimage.png?alt=media\&token=99c719eb-0efa-49f7-856a-26b5a74172e9)

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

![](https://463658383-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M0DL-As7pQfMiFtgM0k%2F-MK57SY5EiuXBLHrNxIg%2F-MK59QqowTu2XB_SCzw2%2Fimage.png?alt=media\&token=0464b3ff-3e3a-41eb-bb99-8551af88e9fd)

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

![](https://463658383-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M0DL-As7pQfMiFtgM0k%2F-MK57SY5EiuXBLHrNxIg%2F-MK5AMc-OeUN9xRZV3YS%2Fimage.png?alt=media\&token=ebfaafde-61bd-4b1b-a02b-bc5a2d869a38)

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

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

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 всегда заключены в кавычки, и значения переменных не подставляются как текст, вместо этого используется их реальное значение, будь то массив, словарь, число или строка.

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

![](https://463658383-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M0DL-As7pQfMiFtgM0k%2F-MK57SY5EiuXBLHrNxIg%2F-MK5NR4fF7puoUwttRyz%2Fimage.png?alt=media\&token=3826b7a1-f654-4b4a-a4e5-3fea52c79519)

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

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

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

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

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

![](https://463658383-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M0DL-As7pQfMiFtgM0k%2F-MK57SY5EiuXBLHrNxIg%2F-MK5KF--3D-AgtD52Arz%2Fimage.png?alt=media\&token=b94f9eff-6ffe-46d5-8be9-4b2d74c12149)

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

![](https://463658383-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M0DL-As7pQfMiFtgM0k%2F-MK57SY5EiuXBLHrNxIg%2F-MK5MCx3KhXXjJu1UPki%2Fimage.png?alt=media\&token=0eec794e-d6e6-4882-b5e8-09fe54e0d9a2)

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

![](https://463658383-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M0DL-As7pQfMiFtgM0k%2F-MK57SY5EiuXBLHrNxIg%2F-MK5MmdyHPBpR86y9bMI%2Fimage.png?alt=media\&token=d7f98db9-ddb9-4c57-a7b3-775b4caef14e)

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