Как отправить сообщение в Telegram из 1С:Предприятие при использовании прокси?

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

Интеграция 1С с мессенджером Telegram — одна из наиболее востребованных задач для современного бизнеса. Это позволяет оперативно получать уведомления о критических событиях, рассылать отчеты или взаимодействовать с клиентами. Однако при реализации этой задачи разработчики часто сталкиваются с техническими трудностями, связанными с блокировками доступа, настройкой SSL-соединений и спецификой работы прокси-серверов. Разберем по шагам, как правильно настроить отправку сообщений, чтобы код работал стабильно в любой инфраструктуре.

Основные компоненты взаимодействия с Telegram API

Прежде чем приступать к написанию кода, проанализируем, какие данные нам необходимы для успешной отправки запроса. Взаимодействие происходит по протоколу HTTPS с использованием объекта HTTPСоединение. Нам понадобятся:

  1. Токен бота: Уникальный идентификатор, который выдается @BotFather при создании бота.
  2. ID чата (chat_id): Уникальный идентификатор пользователя или группы, куда будет отправлено сообщение.
  3. Сервер API: Для Telegram это всегда api.telegram.org.
  4. Параметры прокси: Если прямой доступ к серверу ограничен.

Шаг 1. Настройка прокси-сервера и поддержка SOCKS5

Одной из главных проблем является выбор протокола прокси. Многие разработчики ошибочно полагают, что 1С не поддерживает протокол SOCKS5. Начиная с версии платформы 8.3.10, такая поддержка реализована. Чтобы заставить систему работать через SOCKS5, необходимо использовать специальный префикс в адресе сервера. Рассмотрим пример настройки объекта ИнтернетПрокси.


ИнтернетПрокси = Новый ИнтернетПрокси;
// Для SOCKS5 обязательно добавляем префикс socks5:// перед адресом
АдресПроксиСервера = "socks5://" + "87.247.143.208"; 
ПортПрокси = 1080;

ИнтернетПрокси.Установить("https", АдресПроксиСервера, ПортПрокси, ЛогинПрокси, ПарольПрокси, Ложь);

Важно помнить, что если настройки прокси заданы глобально в файле inetcfg.xml на сервере 1С, они могут перекрывать настройки, заданные программно. Если код не срабатывает, проверьте конфигурационные файлы кластера.

Шаг 2. Формирование защищенного соединения

Telegram требует использования протокола TLS (HTTPS). В 1С для этого используется объект ЗащищенноеСоединениеOpenSSL. Проанализируем ситуацию: на операционных системах семейства Windows 1С обычно использует системное хранилище сертификатов. Если сертификаты в системе устарели, вы получите ошибку "Не могу установить соединение".

Рассмотрим стандартный конструктор, который подходит для большинства случаев:


ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
// В некоторых случаях на Linux требуется явно указать сертификаты удостоверяющих центров
// ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаWindows(), Новый СертификатыУдостоверяющихЦентровWindows());

Шаг 3. Правильное формирование ресурса (URL)

Частая ошибка новичков — неправильный формат строки ресурса. Telegram API ожидает путь, который начинается с префикса bot, за которым следует токен. Обратите внимание, что ресурс в методе HTTPЗапрос должен начинаться с прямого слэша /.

Выясним причину возможных ошибок: если пропустить начальный слэш или ошибиться в написании метода (например, sendMessage), сервер вернет ошибку 404 или 400. Разберем правильный шаблон:


// Правильно: /bot[TOKEN]/sendMessage
Ресурс = "/bot" + Токен + "/sendMessage";

Шаг 4. Реализация отправки сообщения (Метод POST)

Хотя 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.Ошибка", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
        Возврат Ложь;
    КонецПопытки;

КонецФункции

Шаг 5. Как получить Chat ID?

Проанализируем ситуацию: вы создали бота, но не знаете, кому отправлять сообщения. Самый простой способ получить chat_id — отправить боту любое сообщение в Telegram, а затем вызвать метод getUpdates через браузер или из 1С.

Для этого введите в браузере адрес: https://api.telegram.org/bot[ВАШ_ТОКЕН]/getUpdates. В ответе вы увидите структуру JSON, где в поле message -> chat -> id будет содержаться искомое число. Важно: если вы планируете отправлять сообщения в группу, ID чата будет отрицательным числом (например, начинаться с -100).

Особенности работы с форматированием

Чтобы ваши сообщения выглядели профессионально, используйте параметр parse_mode со значением HTML. Рассмотрим подробнее доступные теги:

При использовании HTML-разметки обязательно убедитесь, что в тексте сообщения нет "голых" символов <, > и &, иначе Telegram отклонит запрос с ошибкой 400. Их нужно заменять на соответствующие сущности (&lt;, &gt;, &amp;).

Обработка ошибок и лимитов

При массовой рассылке из 1С (например, уведомлений всем менеджерам) нужно учитывать ограничения Telegram API (Rate Limits). Бот не может отправлять более 30 сообщений в секунду. Если вы превысите этот лимит, сервер вернет код 429 (Too Many Requests). В этом случае следует проанализировать заголовок ответа Retry-After, который укажет, через сколько секунд можно повторить попытку.

Таким образом, мы рассмотрели полный цикл настройки интеграции: от решения проблем с прокси до тонкостей форматирования текста. Использование объекта HTTPСоединение вместе с правильной настройкой ИнтернетПрокси позволяет обойти большинство инфраструктурных ограничений и обеспечить надежную доставку уведомлений из вашей базы 1С.

← На главную