Как отправить сообщение и кнопки из 1С в Telegram: пошаговое руководство

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

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

Реализация простейшей отправки сообщения через GET-запрос

Для начала рассмотрим базовый механизм взаимодействия с API Telegram. Самый простой способ отправить текст — использовать HTTP-запрос методом GET. Давайте проанализируем структуру такого запроса и разберем пример кода, который позволит отправить сообщение пользователю по его уникальному идентификатору.

Прежде всего, нам понадобятся две вещи: Токен бота (получаемый у @BotFather) и ID получателя (его можно узнать через бота @myidbot). Рассмотрим пример кода:


Токен = "123456789:ABCDEF12345ghIkl-zyx57W2v1u123ew11"; // Ваш токен
ИдентификаторПолучателя = "111222333"; // ID чата или пользователя
ТекстСообщения = "Привет! Это сообщение из 1С.";

Сервер = "api.telegram.org";
Ресурс = "bot" + Токен + "/sendMessage?chat_id=" + Формат(ИдентификаторПолучателя, "ЧГ=") + "&text=" + ТекстСообщения;

Соединение = Новый HTTPСоединение(Сервер, 443, , , , 5, Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос(Ресурс);
Ответ = Соединение.Получить(Запрос);

Если Ответ.КодСостояния = 200 Тогда
    Сообщить("Сообщение успешно отправлено!");
Иначе
    Сообщить("Ошибка при отправке: " + Ответ.КодСостояния);
КонецЕсли;

В данном примере мы используем объект HTTPСоединение с портом 443 и обязательным использованием ЗащищенноеСоединениеOpenSSL, так как Telegram работает исключительно по защищенному протоколу HTTPS. Обратите внимание на параметр ЧГ= в функции Формат — он необходим, чтобы при преобразовании числового ID в строку 1С не добавила лишние пробелы (разделители групп разрядов), которые сломают URL-запрос.

Решение проблемы ошибки 400 и обработка спецсимволов

Часто разработчики сталкиваются с ошибкой 400 (Bad Request). Выясним причину: чаще всего она кроется в наличии недопустимых символов в тексте сообщения или ссылке. Пробелы, символы переноса строк (Символы.ПС), амперсанды (&) и кириллица должны быть закодированы в формат URL-компонента.

Рассмотрим, как правильно подготовить текст сообщения. Вместо ручной замены через СтрЗаменить, мы рекомендуем использовать встроенную функцию платформы, которая гарантирует корректность строки для HTTP-запроса:


// Правильное кодирование текста сообщения
ТекстСообщения = "Строка 1" + Символы.ПС + "Строка 2 с символом & и кириллицей";
ЗакодированныйТекст = КодироватьСтроку(ТекстСообщения, СпособКодированияСтроки.URLКомпонента);

Ресурс = "bot" + Токен + "/sendMessage?chat_id=" + ID_Стр + "&text=" + ЗакодированныйТекст;

Если же вы передаете внешнюю навигационную ссылку 1С, которая содержит множество служебных символов, обязательно проанализируйте ситуацию с её «обрезанием». Telegram перестает считывать ссылку, как только встречает символ, который не был экранирован. Функция КодироватьСтроку решит и эту проблему.

Улучшение читаемости кода: использование шаблонов

При формировании длинных строк запроса код становится трудночитаемым. Разберем подход, который сделает вашу разработку более «каноничной» и удобной для поддержки. Вместо конкатенации (склеивания) множества переменных, используем метод шаблонизации:


ШаблонРесурса = "bot%1/sendMessage?chat_id=%2&text=%3";
Ресурс = СтрШаблон(ШаблонРесурса, Токен, ID_Стр, ЗакодированныйТекст);

Такой подход позволяет сразу видеть структуру запроса целиком, что соответствует стандартам разработки и упрощает отладку.

Отправка сообщений с кнопками через метод POST

Когда нам нужно отправить не просто текст, а интерактивные кнопки (например, для согласования документа «Да/Нет»), метод GET становится крайне неудобным из-за ограничений на длину строки и сложности структуры JSON. Проанализируем переход на метод POST, который является рекомендуемым для работы с API Telegram.

Для создания кнопок используется параметр reply_markup. Разберем по шагам создание Inline-кнопок, которые отображаются прямо под сообщением:


// 1. Формируем структуру кнопок
КнопкаДа = Новый Структура;
КнопкаДа.Вставить("text", "Согласовать");
КнопкаДа.Вставить("callback_data", "approve_id_123");

КнопкаНет = Новый Структура;
КнопкаНет.Вставить("text", "Отклонить");
КнопкаНет.Вставить("callback_data", "reject_id_123");

МассивКнопок = Новый Массив;
МассивКнопок.Добавить(КнопкаДа);
МассивКнопок.Добавить(КнопкаНет);

СтрокаКнопок = Новый Массив;
СтрокаКнопок.Добавить(МассивКнопок);

Клавиатура = Новый Структура;
Клавиатура.Вставить("inline_keyboard", СтрокаКнопок);

// 2. Преобразуем структуру в JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Клавиатура);
ТекстКнопокJSON = ЗаписьJSON.Закрыть();

// 3. Формируем POST-запрос
ДанныеЗапроса = Новый Структура;
ДанныеЗапроса.Вставить("chat_id", ИдентификаторПолучателя);
ДанныеЗапроса.Вставить("text", "Прошу согласовать документ №123");
ДанныеЗапроса.Вставить("reply_markup", Клавиатура); // Передаем структуру напрямую

// Записываем всё тело в JSON
ЗаписьJSON_Тело = Новый ЗаписьJSON;
ЗаписьJSON_Тело.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON_Тело, ДанныеЗапроса);
ТелоЗапроса = ЗаписьJSON_Тело.Закрыть();

// 4. Отправляем
Соединение = Новый HTTPСоединение("api.telegram.org", 443, , , , 5, Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос("bot" + Токен + "/sendMessage");
Запрос.Заголовки.Вставить("Content-Type", "application/json");
Запрос.УстановитьТелоИзСтроки(ТелоЗапроса, КодировкаТекста.UTF8);

Ответ = Соединение.ОтправитьДляОбработки(Запрос);

Важный момент: использование application/json в заголовках позволяет передавать сложные объекты без необходимости вручную кодировать каждый параметр в URL. Это самый надежный способ работы с кнопками и длинными текстами.

Оформление текста: Markdown и HTML

Выясним, как сделать сообщения более привлекательными. Telegram поддерживает форматирование текста. Чтобы выделить важные моменты жирным шрифтом или курсивом, нужно указать параметр parse_mode. Рассмотрим пример для HTML-разметки:

Жирный текст: <b>Текст</b>
Курсив: <i>Текст</i>
Гиперссылка: <a href="https://mysite.ru">Название</a>

При отправке через POST просто добавьте в структуру данных поле: ДанныеЗапроса.Вставить("parse_mode", "HTML");. Это позволит «спрятать» длинные навигационные ссылки 1С под аккуратным текстом, что значительно улучшит пользовательский опыт.

Практические советы и ограничения

  1. Безопасность: Никогда не храните токен бота прямо в коде модуля. Используйте для этого константы или защищенные параметры настроек, к которым имеют доступ только администраторы.
  2. Лимиты: Помните, что Telegram ограничивает частоту рассылок. Бот может отправлять не более 30 сообщений в секунду разным пользователям и не более одного сообщения в секунду одному и тому же пользователю. При массовых уведомлениях из 1С используйте механизм очереди сообщений.
  3. Отладка: Если код возвращает ошибку, всегда анализируйте тело ответа сервера (Ответ.ПолучитьТелоКакСтроку()). Telegram возвращает подробное описание того, какой именно параметр заполнен неверно.

Таким образом, мы рассмотрели путь от простого запроса до профессиональной реализации интеграции с использованием JSON и POST-методов. Эти знания позволят вам создавать надежные и функциональные системы оповещения на базе 1С и Telegram.

← На главную