Реализация современного протокола взаимодействия с мессенджерами в среде 1С 7.7 является нетривиальной задачей. Основная сложность заключается в том, что платформа 7.7 была разработана задолго до появления вебхуков и асинхронных HTTP-запросов. Рассмотрим подробно, как можно заставить старую добрую «семерку» мгновенно реагировать на сообщения из Telegram, не перегружая систему постоянными запросами.
Стандартный путь получения данных из Telegram — это использование Webhook. Когда пользователь пишет боту, сервер Telegram отправляет POST-запрос на ваш URL. Задача состоит в том, чтобы этот запрос превратился во Внешнее событие внутри 1С. Мы проанализируем несколько стратегий: от простого опроса базы данных до использования специализированных внешних компонент (ВК), работающих с интерфейсом IAsyncEvent.
Если ваша инфраструктура уже включает UNIX-сервер, который принимает хуки и записывает их в MySQL, самым надежным (хотя и не самым быстрым) способом будет периодический опрос этой таблицы. Чтобы не вычитывать всю таблицу целиком, мы можем использовать эффективную проверку изменений.
Разберем алгоритм действий:
INSERT в таблицу MySQL.CHECKSUM TABLE.Пример реализации логики проверки на стороне 1С:
Процедура ПроверитьНовыеСообщения()
// Подключаемся к MySQL через ADODB.Connection
Запрос = "CHECKSUM TABLE telegram_hooks";
// Если результат чексуммы изменился по сравнению с прошлым разом
Если ТекущаяЧексумма <> ПредыдущаяЧексумма Тогда
// Читаем только новые строки и обрабатываем их
ПредыдущаяЧексумма = ТекущаяЧексумма;
ОбработатьНовыеЗаписи();
КонецЕсли;
КонецПроцедуры
Этот метод прост, но имеет задержку, равную интервалу вызова ОбработкаОжидания.
Чтобы 1С реагировала мгновенно, нам нужно запустить внутри нее мини-веб-сервер. Существует специализированная компонента HttpSrv7. Она позволяет 1С слушать определенный TCP-порт. Как только на этот порт приходит HTTP-запрос (например, перенаправленный с вашего основного сервера), компонента генерирует штатное ВнешнееСобытие.
Рассмотрим, как это выглядит в коде Global.ert:
Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
Если Источник = "HttpServer" Тогда
// В переменной Данные содержится тело POST-запроса от Telegram
ТекстСообщения = ИзвлечьТекстИзJSON(Данные);
Сообщить("Получено сообщение: " + ТекстСообщения);
// Здесь мы можем сразу создать документ или ответить пользователю
КонецЕсли;
КонецПроцедуры
Преимущество: мгновенная реакция. Сложность: требуется проброс портов и настройка SSL-терминирования (так как Telegram работает только по HTTPS, а компонента обычно принимает «чистый» HTTP).
Проанализируем ситуацию, когда мы не хотим использовать сетевые компоненты внутри 1С. Мы можем использовать популярную библиотеку FormEx, которая умеет отслеживать изменения в файловой системе без таймеров, используя системные прерывания Windows.
Алгоритм работы:
Это «чистое» решение, которое не нагружает процессор постоянными циклами опроса и работает крайне стабильно в многопользовательской среде.
Выясним причину, почему прямой опрос API Telegram из 1С 7.7 часто завершается ошибкой. Это связано с устаревшими протоколами безопасности TLS в Windows XP/2003, где часто крутится «семерка». Оптимальным решением будет создание небольшого приложения-посредника.
Посредник может:
python-telegram-bot или Telegram.Bot для .NET).Подведем итоги нашего анализа. Выбор метода зависит от ваших технических условий:
CHECKSUM TABLE. Это надежно и не требует регистрации сложных ВК.Важно помнить, что при использовании ОбработкаВнешнегоСобытия код внутри нее должен исполняться максимально быстро. Если планируется сложная обработка (например, проведение документов), лучше поместить входящие данные в очередь и обрабатывать их отдельным процессом, чтобы не блокировать интерфейс пользователя.