Как реализовать ответ бота Telegram по нажатию кнопки в 1С без публикации базы?

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием IT и автоматизация бизнеса
← На главную

Многие разработчики при интеграции 1С с Telegram сталкиваются с вопросом: как сделать так, чтобы бот не просто «спамил» сообщениями, а выдавал информацию только в ответ на конкретный запрос пользователя? Давайте разберем этот процесс подробно, учитывая, что ваша база не имеет внешнего доступа и работает только внутри локальной сети.

Понимание архитектуры взаимодействия

В работе с Telegram API существуют два основных способа получения данных: Webhooks и Polling. Поскольку ваша база не опубликована наружу, использование вебхуков невозможно, так как сервер Telegram не сможет отправить уведомление на ваш сервер 1С. Поэтому наш выбор — это метод Polling (регулярный опрос).

Важно осознать: бот не является «интеллектуальным» объектом, который знает логику 1С. Это лишь интерфейс. Когда пользователь нажимает кнопку, Telegram просто фиксирует событие. Ваша задача — настроить регламентное задание в 1С, которое будет «забирать» эти события и формировать на них ответ.

Шаг 1: Получение сообщений от бота

Для начала работы используем метод getUpdates. Регламентное задание должно периодически обращаться к API Telegram, чтобы проверить, не появились ли новые сообщения или нажатия кнопок. Рассмотрим пример формирования запроса:


Ресурс = "bot" + Токен + "/getUpdates";
Соединение = Новый HTTPСоединение("api.telegram.org", 443, , , , , Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос(Ресурс);
Ответ = Соединение.Получить(Запрос);
Результат = Ответ.ПолучитьТелоКакСтроку();

При получении ответа вы увидите JSON-структуру, содержащую идентификатор чата (chat_id). Именно этот идентификатор позволит нам отправить ответ конкретному пользователю, который проявил активность.

Шаг 2: Обработка нажатий и логика «Запрос-Ответ»

Когда вы анализируете данные, пришедшие из getUpdates, вы увидите информацию о том, кто и на какую кнопку нажал. Логика 1С должна быть следующей:

  1. Опрашиваем API методом getUpdates.
  2. Парсим полученный JSON.
  3. Если найдено событие callback_query или входящее сообщение, извлекаем chat_id отправителя.
  4. Выполняем поиск нужных данных по оборудованию в базе 1С.
  5. Отправляем результат пользователю методом sendMessage.

Для отправки ответа используйте следующий код:


ТекстДляОтправки = "Последние данные с датчика: " + ЗначениеПоказателя;
Ресурс = "bot" + Токен + "/sendMessage?chat_id=" + Формат(ИДЧата, "ЧГ=") + "&text=" + КодироватьСтроку(ТекстДляОтправки, СпособКодированияСтроки.КодировкаURL);
Запрос = Новый HTTPЗапрос(Ресурс);
Соединение.Получить(Запрос);

Шаг 3: Как избежать дублирования событий

При использовании метода getUpdates важно помнить про параметр offset. Если его не использовать, Telegram будет возвращать одни и те же сообщения при каждом вызове регламентного задания.

Совет: Всегда сохраняйте update_id последнего обработанного события в регистр сведений или константу. При следующем обращении к getUpdates передавайте параметр ?offset=ПоследнийUpdateID + 1. Это позволит 1С забирать только новые, еще не обработанные команды.

Оптимизация работы

Поскольку вы работаете через регламентное задание, время реакции бота напрямую зависит от интервала его запуска. Если вы установите интервал 10 минут, пользователь будет ждать ответ до 10 минут. Для более комфортной работы мы рекомендуем установить интервал запуска 15–30 секунд. Это создаст ощущение «почти мгновенного» отклика, не создавая при этом критической нагрузки на сервер 1С.

Важно: Не забывайте, что при нажатии кнопки в боте (Inline-кнопка), у пользователя на экране могут отображаться «часики» (состояние ожидания). Чтобы их убрать и дать пользователю понять, что 1С приняла запрос в обработку, рекомендуется использовать метод answerCallbackQuery сразу после фиксации нажатия.

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

← На главную