Интеграция 1С с мессенджером Telegram — популярное и удобное решение для отправки уведомлений, отчетов и оперативной информации пользователям. Однако разработчики часто сталкиваются с ситуацией, когда стабильно работающий механизм отправки сообщений внезапно дает сбой. При этом в 1С возникает ошибка: «Ошибка работы с Интернет: Не могу установить соединение», а выполнение кода зависает на несколько секунд.
В этой статье мы подробно разберем, почему возникает эта проблема, как провести диагностику сетевого окружения и какие технические решения помогут полностью восстановить работоспособность обмена данными между 1С и Telegram API.
Давайте рассмотрим типичный сценарий. В коде 1С используется классический метод отправки GET- или POST-запросов к Telegram API через объект HTTPСоединение:
ТокенБота = ПараметрыПроц.ТокенБота;
IDЧата = ПараметрыПроц.IDЧата;
Соединение = Новый HTTPСоединение("api.telegram.org",,,,,Истина);
Запрос = Новый HTTPЗапрос("bot"+ТокенБота+"/sendMessage?chat_id=-"+IDЧата+"&text=" + ПосылаемыйТекст);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
При выполнении последней строки система задумывается на несколько секунд (срабатывает внутренний таймаут ожидания ответа), после чего генерирует исключение. При этом, если программист пытается скопировать ту же самую строку запроса в адресную строку браузера на своей рабочей машине, запрос успешно отрабатывает, и сообщение уходит адресату. Из-за этого возникает ложное ощущение, что проблема кроется в самой платформе 1С. Разберем по шагам, почему так происходит.
Самая распространенная причина внезапного прекращения работы интеграции в РФ — блокировка серверов Telegram со стороны интернет-провайдеров или технических средств противодействия угрозам (ТСПУ). Если ваш провайдер заблокировал доступ к домену api.telegram.org, то прямые запросы из 1С гарантированно перестанут работать.
Почему же тогда запрос из браузера выполняется без ошибок? Как показывает практика, на рабочих компьютерах разработчиков часто установлены VPN-клиенты или специализированные расширения для браузера (например, friGate, обход блокировок Рунета и др.). Эти утилиты автоматически проксируют трафик браузера, пропуская его через незаблокированные узлы. Платформа 1С при этом продолжает отправлять запросы напрямую через основной сетевой шлюз операционной системы, натыкается на блокировку и выдает ошибку соединения.
Как проверить блокировку: отключите в браузере любые VPN-расширения и попробуйте перейти по адресу https://api.telegram.org. Если вы увидите ошибку ожидания ответа, значит, ваш провайдер ограничил доступ к сервису.
Решение проблемы: использование прокси-серверов. Платформа 1С позволяет гибко настраивать работу через прокси. Рассмотрим пример инициализации соединения с использованием прокси-сервера:
ПроксиСервер = Новый ИнтернетПрокси;
ПроксиСервер.Установить("https", "192.168.1.100", 3128, "ИмяПользователя", "ПарольПрокси");
// Либо используем системные настройки прокси, если они настроены в ОС
// ПроксиСервер = Новый ИнтернетПрокси(Истина);
Соединение = Новый HTTPСоединение("api.telegram.org",,,,,Истина, ПроксиСервер);
Обратим внимание на то, как в старом коде инициализируется защищенное соединение:
Соединение = Новый HTTPСоединение("api.telegram.org",,,,,Истина);
Использование булевого значения Истина в шестом параметре конструктора HTTPСоединение является устаревшей практикой. Современный Telegram API предъявляет жесткие требования к безопасности сетевого взаимодействия и шифрованию. Использование устаревших протоколов TLS 1.0 и TLS 1.1 полностью заблокировано со стороны Telegram. Серверы мессенджера требуют обязательного использования TLS 1.2 или TLS 1.3.
Для гарантированного прохождения процедуры TLS-handshake (рукопожатия) необходимо явно инициализировать защищенное соединение с использованием актуальных системных библиотек OpenSSL. Перепишем инициализацию соединения современным способом:
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение("api.telegram.org", 443, , , , , ЗащищенноеСоединение);
Использование явного объекта ЗащищенноеСоединениеOpenSSL заставляет платформу использовать актуальные алгоритмы криптографии, установленные в операционной системе, что решает множество проблем со сбросом соединения на этапе аутентификации узла.
Доменное имя api.telegram.org разрешается DNS-серверами как в IPv4-адреса, так и в IPv6-адреса. В современных операционных системах по умолчанию настроен приоритет протокола IPv6 над IPv4.
Если на сервере 1С или рабочем компьютере активен стек IPv6, но сам интернет-провайдер работает с ним некорректно или блокирует IPv6-трафик к Telegram, платформа 1С будет бесконечно пытаться установить соединение по адресу IPv6. Только после истечения длительного таймаута система попробует переключиться на IPv4, либо сразу вернет ошибку «Не могу установить соединение».
Решение проблемы:
8.8.8.8 или Cloudflare DNS 1.1.1.1), которые корректно отдают маршруты.При установке защищенного соединения платформа 1С проверяет валидность SSL-сертификата удаленного сервера api.telegram.org. Для этого используется локальное хранилище сертификатов. По умолчанию 1С обращается к файлу cacert.pem, расположенному в каталоге установленной платформы (обычно это папка bin).
Telegram периодически обновляет свои сертификаты безопасности, переходя на новые цепочки доверия (например, DigiCert). Если версия вашей платформы 1С устарела и давно не обновлялась, файл cacert.pem не содержит информации о новых корневых сертификатах. В результате 1С отклоняет соединение из-за невозможности подтвердить безопасность удаленного сервера.
Решение проблемы:
bin вашей платформы 1С.ЗащищенноеСоединениеOpenSSL.Очень часто отладка кода производится в файловой базе локально, где все запросы отправляются с компьютера разработчика. Но после переноса кода в клиент-серверную базу (на рабочую схему) отправка сообщений ломается.
Помните, что на сервере 1С код выполняется в контексте службы сервера (под учетной записью, чаще всего имеющей имя USR1Cv8). Эта учетная запись не имеет доступа к настройкам прокси-сервера вашего текущего пользователя Windows, у нее могут быть заблокированы порты брандмауэром сервера, а локальный антивирус на сервере может блокировать сетевую активность процесса rphost.
Решение проблемы:
rphost.exe в настройках брандмауэра Windows на сервере 1С.Если бороться со стабильностью прокси-серверов в условиях постоянных блокировок становится слишком сложно, профессиональные разработчики рекомендуют полностью отказаться от прямых запросов к домену api.telegram.org.
Вместо этого разворачивается собственный промежуточный веб-хук (мост) за пределами РФ. Сделать это можно бесплатно при помощи таких сервисов, как Cloudflare Workers или Yandex Cloud Functions. Скрипт принимает запросы от вашей 1С и просто перенаправляет их на оригинальный адрес Telegram, возвращая ответ обратно.
В коде 1С при этом меняется только адрес хоста:
// Вместо api.telegram.org указываем адрес вашего зеркала-прокси
ИмяХостаЗеркала = "my-telegram-proxy.cloudflareworkers.com";
Соединение = Новый HTTPСоединение(ИмяХостаЗеркала, 443, , , , , Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос("bot"+ТокенБота+"/sendMessage?chat_id=-"+IDЧата+"&text=" + ПосылаемыйТекст);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Этот способ позволяет навсегда забыть о проблемах локальных блокировок провайдеров, нестабильных публичных SOCKS5-прокси и ручном обновлении сертификатов на серверах компании.