Интеграция 1С с мессенджером Telegram — одна из наиболее востребованных задач для современного бизнеса. Это позволяет оперативно получать уведомления о критических событиях, рассылать отчеты или взаимодействовать с клиентами. Однако при реализации этой задачи разработчики часто сталкиваются с техническими трудностями, связанными с блокировками доступа, настройкой SSL-соединений и спецификой работы прокси-серверов. Разберем по шагам, как правильно настроить отправку сообщений, чтобы код работал стабильно в любой инфраструктуре.
Прежде чем приступать к написанию кода, проанализируем, какие данные нам необходимы для успешной отправки запроса. Взаимодействие происходит по протоколу HTTPS с использованием объекта HTTPСоединение. Нам понадобятся:
api.telegram.org.Одной из главных проблем является выбор протокола прокси. Многие разработчики ошибочно полагают, что 1С не поддерживает протокол SOCKS5. Начиная с версии платформы 8.3.10, такая поддержка реализована. Чтобы заставить систему работать через SOCKS5, необходимо использовать специальный префикс в адресе сервера. Рассмотрим пример настройки объекта ИнтернетПрокси.
ИнтернетПрокси = Новый ИнтернетПрокси;
// Для SOCKS5 обязательно добавляем префикс socks5:// перед адресом
АдресПроксиСервера = "socks5://" + "87.247.143.208";
ПортПрокси = 1080;
ИнтернетПрокси.Установить("https", АдресПроксиСервера, ПортПрокси, ЛогинПрокси, ПарольПрокси, Ложь);
Важно помнить, что если настройки прокси заданы глобально в файле inetcfg.xml на сервере 1С, они могут перекрывать настройки, заданные программно. Если код не срабатывает, проверьте конфигурационные файлы кластера.
Telegram требует использования протокола TLS (HTTPS). В 1С для этого используется объект ЗащищенноеСоединениеOpenSSL. Проанализируем ситуацию: на операционных системах семейства Windows 1С обычно использует системное хранилище сертификатов. Если сертификаты в системе устарели, вы получите ошибку "Не могу установить соединение".
Рассмотрим стандартный конструктор, который подходит для большинства случаев:
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
// В некоторых случаях на Linux требуется явно указать сертификаты удостоверяющих центров
// ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаWindows(), Новый СертификатыУдостоверяющихЦентровWindows());
Частая ошибка новичков — неправильный формат строки ресурса. Telegram API ожидает путь, который начинается с префикса bot, за которым следует токен. Обратите внимание, что ресурс в методе HTTPЗапрос должен начинаться с прямого слэша /.
Выясним причину возможных ошибок: если пропустить начальный слэш или ошибиться в написании метода (например, sendMessage), сервер вернет ошибку 404 или 400. Разберем правильный шаблон:
// Правильно: /bot[TOKEN]/sendMessage
Ресурс = "/bot" + Токен + "/sendMessage";
Хотя Telegram позволяет отправлять данные методом GET (передавая текст прямо в URL), мы рекомендуем использовать метод POST. Это избавляет от проблем с ограничением длины строки и необходимостью сложного кодирования спецсимволов в URL. Посмотрим на реализацию функции отправки, объединяющую все вышеперечисленное.
Функция ОтправитьСообщениеВТелеграм(Токен, ChatID, Текст) Экспорт
Сервер = "api.telegram.org";
Ресурс = "/bot" + Токен + "/sendMessage";
// Подготовка прокси (если требуется)
ИнтернетПрокси = Новый ИнтернетПрокси;
// Пример для HTTP/HTTPS прокси, для SOCKS5 добавьте префикс как в примере выше
ИнтернетПрокси.Установить("https", "ваш_прокси_адрес", 8080, "логин", "пароль");
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение(Сервер, 443, , , ИнтернетПрокси, , ЗащищенноеСоединение);
// Формируем структуру параметров
ПараметрыЗапроса = Новый Структура;
ПараметрыЗапроса.Вставить("chat_id", Формат(ChatID, "ЧГ=0")); // Убираем разделители разрядов
ПараметрыЗапроса.Вставить("text", Текст);
ПараметрыЗапроса.Вставить("parse_mode", "HTML"); // Позволяет использовать теги b, i, a
// Преобразуем структуру в JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ПараметрыЗапроса);
СтрокаJSON = ЗаписьJSON.Закрыть();
Запрос = Новый HTTPЗапрос(Ресурс);
Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Запрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8);
Попытка
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
КодСостояния = Ответ.КодСостояния;
Если КодСостояния = 200 Тогда
Возврат Истина;
Иначе
ЗаписьЖурналаРегистрации("Telegram.Ошибка", УровеньЖурналаРегистрации.Ошибка, , , Ответ.ПолучитьТелоКакСтроку());
Возврат Ложь;
КонецЕсли;
Исключение
ЗаписьЖурналаРегистрации("Telegram.Ошибка", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
КонецФункции
Проанализируем ситуацию: вы создали бота, но не знаете, кому отправлять сообщения. Самый простой способ получить chat_id — отправить боту любое сообщение в Telegram, а затем вызвать метод getUpdates через браузер или из 1С.
Для этого введите в браузере адрес: https://api.telegram.org/bot[ВАШ_ТОКЕН]/getUpdates. В ответе вы увидите структуру JSON, где в поле message -> chat -> id будет содержаться искомое число. Важно: если вы планируете отправлять сообщения в группу, ID чата будет отрицательным числом (например, начинаться с -100).
Чтобы ваши сообщения выглядели профессионально, используйте параметр parse_mode со значением HTML. Рассмотрим подробнее доступные теги:
<b>Жирный текст</b><i>Курсив</i><code>Моноширинный шрифт для кода</code><a href="http://www.example.com">Гиперссылка</a>При использовании HTML-разметки обязательно убедитесь, что в тексте сообщения нет "голых" символов <, > и &, иначе Telegram отклонит запрос с ошибкой 400. Их нужно заменять на соответствующие сущности (<, >, &).
При массовой рассылке из 1С (например, уведомлений всем менеджерам) нужно учитывать ограничения Telegram API (Rate Limits). Бот не может отправлять более 30 сообщений в секунду. Если вы превысите этот лимит, сервер вернет код 429 (Too Many Requests). В этом случае следует проанализировать заголовок ответа Retry-After, который укажет, через сколько секунд можно повторить попытку.
Таким образом, мы рассмотрели полный цикл настройки интеграции: от решения проблем с прокси до тонкостей форматирования текста. Использование объекта HTTPСоединение вместе с правильной настройкой ИнтернетПрокси позволяет обойти большинство инфраструктурных ограничений и обеспечить надежную доставку уведомлений из вашей базы 1С.