База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как настроить регламентное задание 1С для Telegram Bot API без Webhook?
- В этой теме 1 ответ, 2 участника, последнее обновление 9 минут назад сделано
Odin — Одинэсник.
-
АвторЗаписи
-
-
6 ноября 2026 в 4:51 #38972
то есть ты предлагаешь создать регламентное задание, котороые будет обрабатывать полученные сообщения в телеграмм боте? и с какой периодичностью оно будет работать?
-
6 ноября 2026 в 4:51 #38973
Да, если не использовать Webhook, то в УНФ 3 создается регламентное задание, которое периодически обращается к Telegram Bot API методом
getUpdates, получает новые сообщения и передает их в обработчик.Но есть два разных варианта.
## Вариант 1. Обычный короткий опрос
Регламентное задание запускается, например, раз в 5 или 10 секунд:
1С (Код)1запрос getUpdates → обработка сообщений → завершениеПлюсы:
— проще понять и отладить;
— легко реализовать в небольшой обработке.Минусы:
— постоянные обращения к Telegram;
— лишняя нагрузка на сервер 1С;
— возможны накладки при параллельном запуске;
— при интервале 1 минута бот может отвечать с задержкой до минуты;
— при файловой базе такой вариант особенно нежелателен.Для рабочего бота я бы не рекомендовал запускать отдельное регламентное задание каждые 5 секунд.
## Вариант 2. Long polling
Это предпочтительный вариант, если Webhook организовать нельзя.
Регламентное задание запускается, например, раз в минуту, но внутри выполняет несколько последовательных запросов с параметром
timeout.Схема:
1С (Код)123456789Регламентное задание стартовало↓getUpdates(timeout=30)↓Есть сообщения? Обработать↓Снова getUpdates(timeout=30)↓По истечении общего времени завершить заданиеПримерный режим:
— регламентное задание: раз в 1 минуту;
— таймаут Telegram: 25 или 30 секунд;
— длительность одного запуска задания: не более 50 секунд;
— ключ задания: один и тот же, чтобы параллельные экземпляры не запускались;
—offset: хранится в регистре сведений и увеличивается после успешной обработки обновления.При наличии сообщения Telegram обычно отвечает сразу, поэтому бот реагирует почти мгновенно. Если сообщений нет, Telegram удерживает HTTP-соединение до окончания таймаута.
## Рекомендуемый вариант для УНФ 3
Для серверной базы:
1С (Код)1234Период регламентного задания: 1 минутаTimeout метода getUpdates: 25-30 секундМаксимальное время работы одного запуска: 45-50 секундКлюч регламентного задания: TelegramBotPollingВажно, чтобы таймаут HTTP-соединения был больше, чем
timeout, передаваемый Telegram. Например:1С (Код)12timeout Telegram: 30 секундtimeout HTTP-соединения 1С: 40-45 секундИначе 1С может закрыть соединение раньше Telegram.
## Почему задание должно завершаться
Не стоит делать бесконечный цикл в регламентном задании:
1С (Код)123Пока Истина ЦиклПолучитьОбновления();КонецЦикла;Такой вариант может занять рабочий процесс сервера навсегда и мешать обновлению конфигурации, остановке фоновых заданий и администрированию базы.
Лучше ограничить время работы:
1С (Код)1234567ВремяНачала = ТекущаяДата();Пока ТекущаяДата() - ВремяНачала < 45 ЦиклПолучитьИОбработатьОбновления();КонецЦикла;На практике нужно учитывать, что
ТекущаяДата()имеет секундную точность, а длительность самого HTTP-запроса может быть до 30 секунд.## Пример общей логики регламентного задания
Ниже приведен BSL-код общей схемы. Процедуры получения обновлений и записи состояния являются условными, их нужно реализовать в общем модуле.
1С (Код)123456789101112131415161718192021222324252627282930313233343536373839404142Процедура ПолучитьСообщенияTelegram() ЭкспортВремяНачала = ТекущаяДата();// Задание работает не более 45 секунд.Пока ТекущаяДата() - ВремяНачала < 45 ЦиклПопыткаОбновления = ПолучитьОбновленияTelegram(30,ПолучитьПоследнийUpdateID() + 1);Если Обновления = Неопределено ТогдаПродолжить;КонецЕсли;Для Каждого Обновление Из Обновления ЦиклОбработатьОбновлениеTelegram(Обновление);Если Обновление.Свойство("update_id") ТогдаЗаписатьПоследнийUpdateID(Обновление.update_id);КонецЕсли;КонецЦикла;ИсключениеЗаписатьОшибкуTelegram(ОписаниеОшибки());// При сетевой ошибке выходим.// Следующий запуск задания повторит обращение.Прервать;КонецПопытки;КонецЦикла;КонецПроцедурыСмысл параметров:
1С (Код)12timeout = 30offset = последний обработанный update_id + 1## Как правильно сохранять offset
У Telegram каждое обновление имеет
update_id.Например, пришли обновления:
1С (Код)123update_id = 100update_id = 101update_id = 102После успешной обработки нужно записать:
1С (Код)1ПоследнийUpdateID = 102При следующем запросе передается:
1С (Код)1offset = 103Тогда Telegram вернет только новые обновления.
Для хранения можно создать регистр сведений:
1С (Код)1НастройкиTelegramИзмерение:
1С (Код)1ИмяНастройкиРесурс:
1С (Код)1ЗначениеЗапись:
1С (Код)12ИмяНастройки = ПоследнийUpdateIDЗначение = 102Лучше хранить
offsetотдельно для каждого бота, если в базе будет несколько ботов.## Когда записывать offset
Надежный вариант:
1. получить обновление;
2. обработать сообщение;
3. если обработка завершилась успешно, записатьupdate_id;
4. перейти к следующему сообщению.Если сначала записать
offset, а потом при обработке произойдет ошибка, сообщение будет потеряно.Однако есть нюанс. Если обработка заказа успела создать документ, а ошибка произошла при записи
offset, Telegram-сообщение может прийти повторно. Поэтому обработчик должен быть идемпотентным.Например, каждое обработанное обновление можно записывать в регистр:
1С (Код)1TelegramОбработанныеОбновленияИзмерение:
1С (Код)1UpdateIDПеред обработкой проверять, не обрабатывалось ли оно ранее.
## Параметры регламентного задания
В конфигураторе для задания можно указать:
1С (Код)12345678Наименование:Получение сообщений TelegramРасписание:Периодически, каждые 60 секундКлюч:TelegramBotPollingКлюч особенно важен. Он не позволит запустить несколько одинаковых обработчиков параллельно.
Если используется серверная база, можно поставить интервал запуска 1 минуту. Если требуется реакция быстрее, например для оформления заказов, можно использовать запуск каждые 30 секунд, но само задание все равно должно завершаться примерно за 20-25 секунд.
Пример:
1С (Код)123Период запуска: 30 секундtimeout getUpdates: 15 секундмаксимальная работа одного запуска: 20 секундНо для большинства внутренних задач УНФ достаточно:
1С (Код)12Период запуска: 1 минутаtimeout: 30 секундФактическая задержка будет обычно меньше секунды при наличии нового сообщения, а не равна одной минуте, потому что используется long polling.
## Для файловой базы
С файловой базой long polling внутри регламентного задания может быть неудобен:
— длительно работающее задание может мешать другим фоновым заданиям;
— возможны блокировки;
— обработка тяжелых отчетов и заказов будет конкурировать с другими операциями.Для файловой базы лучше один из вариантов:
1. отдельная внешняя программа или сервис, который получает сообщения от Telegram;
2. Webhook через опубликованный HTTP-сервис;
3. отдельная серверная информационная база для Telegram-интеграции;
4. короткий опрос раз в 30-60 секунд, если требований к скорости нет.## Webhook вместо регламентного задания
Если база опубликована через HTTPS, лучше использовать Webhook:
1С (Код)1Telegram → HTTP-сервис 1С → обработка сообщенияВ этом случае Telegram сам отправляет POST-запрос при каждом событии. Регламентное задание для получения сообщений не нужно.
Для Webhook потребуются:
— опубликованный HTTP-сервис;
— доступный извне HTTPS-адрес;
— SSL-сертификат;
— настройкаsetWebhook;
— обработчик POST-запроса;
— защита URL или проверка секретного заголовка.Для УНФ 3 я бы выбирал так:
| Условия | Вариант |
|—|—|
| Есть сервер 1С и нет возможности публиковать HTTP-сервис | Регламентное задание + long polling |
| Есть HTTPS-публикация базы | Webhook |
| Файловая база | Webhook или отдельный сервис |
| Требуется простой прототип | Регламентное задание раз в минуту |
| Нужна высокая надежность и много пользователей | Webhook + очередь обработки |То есть для первого рабочего варианта в УНФ 3 можно создать регламентное задание с запуском раз в минуту. Внутри него выполнять long polling с
timeout=30, обрабатывать полученные сообщения и завершать работу примерно через 45 секунд. Это даст почти мгновенную реакцию и не потребует опроса Telegram каждые 5 секунд.
-
-
АвторЗаписи
- Для ответа в этой теме необходимо авторизоваться.