Многие разработчики при интеграции 1С с Telegram сталкиваются с вопросом: как сделать так, чтобы бот не просто «спамил» сообщениями, а выдавал информацию только в ответ на конкретный запрос пользователя? Давайте разберем этот процесс подробно, учитывая, что ваша база не имеет внешнего доступа и работает только внутри локальной сети.
В работе с Telegram API существуют два основных способа получения данных: Webhooks и Polling. Поскольку ваша база не опубликована наружу, использование вебхуков невозможно, так как сервер Telegram не сможет отправить уведомление на ваш сервер 1С. Поэтому наш выбор — это метод Polling (регулярный опрос).
Важно осознать: бот не является «интеллектуальным» объектом, который знает логику 1С. Это лишь интерфейс. Когда пользователь нажимает кнопку, Telegram просто фиксирует событие. Ваша задача — настроить регламентное задание в 1С, которое будет «забирать» эти события и формировать на них ответ.
Для начала работы используем метод getUpdates. Регламентное задание должно периодически обращаться к API Telegram, чтобы проверить, не появились ли новые сообщения или нажатия кнопок. Рассмотрим пример формирования запроса:
Ресурс = "bot" + Токен + "/getUpdates";
Соединение = Новый HTTPСоединение("api.telegram.org", 443, , , , , Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос(Ресурс);
Ответ = Соединение.Получить(Запрос);
Результат = Ответ.ПолучитьТелоКакСтроку();
При получении ответа вы увидите JSON-структуру, содержащую идентификатор чата (chat_id). Именно этот идентификатор позволит нам отправить ответ конкретному пользователю, который проявил активность.
Когда вы анализируете данные, пришедшие из getUpdates, вы увидите информацию о том, кто и на какую кнопку нажал. Логика 1С должна быть следующей:
getUpdates.callback_query или входящее сообщение, извлекаем chat_id отправителя.sendMessage.Для отправки ответа используйте следующий код:
ТекстДляОтправки = "Последние данные с датчика: " + ЗначениеПоказателя;
Ресурс = "bot" + Токен + "/sendMessage?chat_id=" + Формат(ИДЧата, "ЧГ=") + "&text=" + КодироватьСтроку(ТекстДляОтправки, СпособКодированияСтроки.КодировкаURL);
Запрос = Новый HTTPЗапрос(Ресурс);
Соединение.Получить(Запрос);
При использовании метода getUpdates важно помнить про параметр offset. Если его не использовать, Telegram будет возвращать одни и те же сообщения при каждом вызове регламентного задания.
Совет: Всегда сохраняйте update_id последнего обработанного события в регистр сведений или константу. При следующем обращении к getUpdates передавайте параметр ?offset=ПоследнийUpdateID + 1. Это позволит 1С забирать только новые, еще не обработанные команды.
Поскольку вы работаете через регламентное задание, время реакции бота напрямую зависит от интервала его запуска. Если вы установите интервал 10 минут, пользователь будет ждать ответ до 10 минут. Для более комфортной работы мы рекомендуем установить интервал запуска 15–30 секунд. Это создаст ощущение «почти мгновенного» отклика, не создавая при этом критической нагрузки на сервер 1С.
Важно: Не забывайте, что при нажатии кнопки в боте (Inline-кнопка), у пользователя на экране могут отображаться «часики» (состояние ожидания). Чтобы их убрать и дать пользователю понять, что 1С приняла запрос в обработку, рекомендуется использовать метод answerCallbackQuery сразу после фиксации нажатия.
Таким образом, организовав цикл опроса API внутри регламентного задания, вы успешно решите задачу предоставления данных пользователю «по запросу», сохраняя при этом безопасность вашей внутренней сети.