--- url: /commands/actions/form.md description: >- Действие «Форма» — пошаговые вопросы участнику в Telegram и передача ответов в следующее действие через form.values. --- # Форма

Форма задает участнику вопросы по очереди — как анкета. Когда он ответит на последний вопрос, бот запустит другое действие и передаст ему все ответы. Так делают заявки в клуб, обратную связь, регистрацию на турнир.

## Как это выглядит для участника { #flow } 1. Участник вызывает команду, например `!заявка`. 2. Бот присылает первый вопрос. Поле ввода Telegram само переключается на ответ этому сообщению. 3. Участник отвечает. Если вопрос с вариантами, он просто нажимает кнопку. 4. Бот присылает следующий вопрос — и так до конца. 5. После последнего ответа бот запускает действие «после отправки». На каждом шаге есть кнопка **«Отмена»**. На ответ дается 5 минут — если участник молчит дольше, бот отменяет форму и сообщает об этом. Как тебя зовут и сколько тебе лет? ## Настройки формы { #settings } | Поле | Описание | |---|---| | **Заголовок** | Название формы, показывается в первом сообщении | | **Поля** | От 1 до 5 вопросов — см. ниже | | **Действие после отправки** | Какое действие этой команды запустить с ответами | ### Поле формы { #fields } | Настройка | Описание | |---|---| | **ID** | Имя ответа латиницей, по которому его достать в шаблоне: `form.values.tag` | | **Тип** | Текст, Число, Выбор или Да/Нет | | **Вопрос** | Что бот спросит | | **Обязательное** | Нельзя пропустить | | **Подсказка** | Шаблон, который бот покажет как подсказку к ответу — например, `{{ member.name }}` | | **Варианты** | Для типа «Выбор»: какие кнопки показать | | **Мин. и макс.** | Для типа «Число»: допустимый диапазон | | Тип | Как отвечает участник | Что придет в шаблон | |---|---|---| | Текст | Пишет ответ | Строка | | Число | Пишет число | Число. Если написал не число или вне диапазона, бот переспросит | | Выбор | Нажимает одну из кнопок-вариантов | Значение выбранного варианта | | Да/Нет | Нажимает «Да» или «Нет» | `true` или `false` | ## Ответы в следующем действии { #values } Действие «после отправки» получает ответы в `form.values`. Каждый ответ доступен по ID поля: ```template {{ form.values.tag }} {{ form.values['tag'] }} ``` Обе записи одинаковые. Вторая удобна, если ID хранится в переменной. ## Пример: заявка в клуб { #example } Команда `!заявка` с двумя действиями. **Действие 1 — «Анкета»** (по умолчанию), тип **Форма**: | ID | Тип | Вопрос | Настройки | |---|---|---|---| | `tag` | Текст | Твой тег в Brawl Stars? | обязательное | | `trophies` | Число | Сколько у тебя кубков? | от 0 до 200 000 | | `mode` | Выбор | Любимый режим? | Варианты: Захват кристаллов, Броулбол, Одиночное ШД | | `active` | Да/Нет | Готов играть в клубной лиге каждую неделю? | обязательное | Действие после отправки — «Отправить заявку». **Действие 2 — «Отправить заявку»**, тип **Отправка сообщения**, куда — **в топик «Заявки»**: ```template ## Новая заявка От: {{ member }} {{ table([ ['Тег', '#' ~ (form.values.tag | upper | replace('#', ''))], ['Кубки', form.values.trophies | number_format], ['Режим', form.values.mode], ['Клубная лига', form.values.active ? 'да' : 'нет'] ], {bordered: true, compact: true}) }} ``` ## Новая заявка От: [Анна](#) | | | |---|---| | Тег | #ABCD1234 | | Кубки | 24 510 | | Режим | Броулбол | | Клубная лига | да | ::: tip Проверка игрока по ЧС Если ваш чат привязан к клубу Astral, в то же действие можно добавить проверку по черному списку — см. пример в статье [Пространство astral](/templates/astral#examples). ::: ## Ограничения { #limits } * От 1 до 5 полей в форме. * На каждый ответ — 5 минут. * Бот принимает ответ только от того, кто начал форму, и только ответом на сообщение с вопросом. * Форма не может запустить другую форму: действие после отправки должно быть другого типа.