Анкета в Telegram-боте часто начинается с трёх вопросов, а заканчивается сложным разговором: пользователь отвлёкся, отправил файл вместо текста, решил исправить предыдущий ответ или вернулся через несколько дней. Если бот хранит только последний вопрос, он легко принимает новое сообщение за ответ не на тот шаг.
Надёжная форма строится вокруг сохранённого состояния. Система знает, какую анкету заполняет человек, какие сведения уже получены и что разрешено сделать дальше. Это относится к заявке на консультацию, записи на услугу и сбору технических данных. Ниже разобрана форма обращения без привязки к конкретному конструктору.
Опишите результат до первого вопроса
Начните с полей, необходимых сотруднику для обработки заявки. Для технического обращения это могут быть тема, версия программы, описание наблюдаемого поведения и необязательный файл. Не добавляйте телефон и адрес только потому, что подобные поля встречаются в других формах. Каждое обязательное значение должно иметь рабочее назначение.
Для каждого поля задайте допустимый тип и понятное исправление. Если требуется версия приложения, пользователь должен понимать, где её посмотреть. Если файл необязателен, нужен очевидный способ пропустить этот шаг. Ответ «неверный ввод» не помогает человеку завершить анкету, потому что не объясняет ожидаемое действие.
Отдельно решите, какие сведения можно изменить после отправки. Например, описание проблемы разрешают дополнить, а выбранное время встречи после подтверждения меняют через перенос. Такие правила относятся к вашему процессу, а не возникают автоматически от наличия кнопок в Telegram.
Что хранить в состоянии формы
Минимальная запись содержит идентификатор пользователя, идентификатор экземпляра анкеты, текущий шаг, введённые ответы, время обновления и версию сценария. Не путайте экземпляр анкеты с пользователем: один человек может отправить несколько заявок в разные дни. У каждой из них должна быть отдельная история.
Состояние сохраняют в устойчивом хранилище, если форма должна переживать перезапуск приложения. Переменная в памяти процесса годится только для сценария, где потеря заполнения действительно допустима. Если обещан возврат позже, проверьте это после реального перезапуска тестового сервера, а не только после закрытия окна Telegram.
Полезно также хранить ссылку на сообщение с актуальными кнопками и признак завершённости. Тогда система понимает, почему нажатие старой кнопки не относится к новой анкете. Срок хранения черновика определяет команда с учётом назначения формы; бесконечное хранение не является обязательным условием удобства.
Последовательность, которую понимает пользователь
В начале коротко объясните, какие сведения потребуются и что произойдёт после отправки. Затем задавайте по одному смысловому вопросу. Не обязательно по одному полю: город и часовой пояс иногда удобнее выбрать вместе, а большой технический рассказ лучше отделить от выбора категории.
На каждом шаге должны быть предусмотрены допустимые действия: ответить, вернуться, отменить, пропустить необязательное поле. Интерфейс кнопок выбирают с учётом возможностей Bot API и клиента. Не заставляйте человека запоминать скрытую команду, если действие критично для исправления ошибки.
Перед финальной отправкой покажите сводку с возможностью исправления. Это особенно полезно для времени встречи и контактных сведений. После изменения одного значения человек не должен снова вводить все остальные. Система возвращает его к проверке готовой анкеты, если другие ответы остаются допустимыми.
Условный пример: заявка на техническую помощь
Предположим, пользователь выбирает тему «ошибка запуска», указывает систему и описывает, что происходит при открытии программы. На шаге приложения файла он закрывает Telegram. Через день возвращается и пишет: «Вчера обновил программу, теперь другая ошибка». Бот не должен автоматически сохранить эту фразу как файл или молча начать новую заявку.
При наличии черновика система предлагает продолжить его, посмотреть заполненные ответы либо начать заново. После выбора продолжения пользователь может изменить описание и добавить актуальный файл. Старые сведения остаются доступными для проверки до подтверждения нового варианта. Финальное сообщение показывает, что именно будет отправлено сотруднику.
Если человек выбирает новую заявку, старый черновик получает предусмотренное состояние: отменён или заменён. Важно не оставлять две неразличимые активные анкеты. Этот пример описывает логику приложения, которую нужно реализовать; стандартный Telegram-бот не получает такую модель состояния без разработки.
Старые кнопки и параллельные устройства
Пользователь может открыть историю на другом устройстве и нажать кнопку предыдущего шага. Поэтому обработчик проверяет не только название действия, но и принадлежность к экземпляру формы и текущей версии состояния. Старое действие не должно менять уже отправленную заявку без отдельного разрешённого процесса редактирования.
Если устаревшее нажатие отклоняется, объясните причину и покажите актуальный шаг. Молчаливое игнорирование выглядит как неисправность. При возможности обновите старую клавиатуру, однако не полагайтесь исключительно на её внешний вид: решение о допустимости операции принимается сервером.
Два почти одновременных ответа также требуют правила. Например, система применяет один допустимый переход состояния, затем проверяет второй относительно уже обновлённой записи. Конкретный механизм зависит от хранилища. Важно, чтобы два сообщения не перескочили через вопрос или не отправили заявку дважды.
Проверка файлов и свободного текста
Тип вложения проверяют отдельно от подписи. Фотография экрана и документ могут приходить разными объектами; обработчик должен принимать только предусмотренные варианты и ясно объяснять остальные. Для диагностики иногда подходит оба типа, но это решение нужно заложить в сценарий заранее.
Свободный текст полезно ограничивать понятной задачей, а не только технической длиной. Предложите описать наблюдаемое поведение и ожидаемый результат. Не просите вводить ключи, пароли или полную копию конфигурации, если для первичного разбора достаточно сообщения об ошибке и версии продукта.
Если анкета направляется в CRM, проверка должна происходить до создания окончательной записи. Ошибка внешнего сервиса не должна уничтожать готовые ответы. Сохраните подтверждённую заявку локально либо примените другую согласованную схему доставки, чтобы повторная попытка не требовала нового заполнения.
Набор испытаний перед запуском
Пройдите форму обычным путём, затем повторите с возвратом, отменой и исправлением одного поля. Проверьте отправку неподходящего типа сообщения, пустого ответа, нескольких файлов и повторное нажатие финальной кнопки. Отдельно перезапустите приложение между двумя шагами и убедитесь, что поведение соответствует обещанному.
Полезен тест обновления сценария: старая анкета начата до выпуска новой версии, а продолжена после. Определите, можно ли завершить её по прежним правилам или потребуется понятный перезапуск. Не допускайте скрытого смешения полей двух разных версий, которое заметит только оператор после отправки.
Готовая форма сохраняет смысл разговора при паузах и ошибках пользователя. Она не обязана иметь много экранов или сложную графику. Достаточно, чтобы человек видел текущий шаг, мог исправить ответ и понимал, отправлена ли заявка. Это и проверяют перед расширением анкеты дополнительными вопросами.
Как сообщать о сохранённом черновике
Не обещайте сохранение всех ответов, если приложение фиксирует их только после финального подтверждения. Текст интерфейса должен соответствовать фактическому моменту записи. Если каждый шаг сохраняется отдельно, человек может получить короткое подтверждение, что вернуться к анкете позже возможно в пределах установленного срока.
При удалении устаревшего черновика не показывайте пустой следующий шаг так, будто пользователь уже начал новую форму. Объясните, что прежнее заполнение больше недоступно, и предложите начать снова. Если можно сохранить часть безопасных неизменившихся сведений, покажите их для подтверждения, а не используйте незаметно. Такой подход особенно важен для старых контактных данных и выбранного времени, которые могли измениться за время паузы.
Источники
Варианты клавиатур, команд и ввода описаны в Telegram Bot Features. Структуры сообщений и callback представлены в Telegram Bot API. Хранение черновиков и переходы анкеты являются ответственностью приложения бота.