Интеграция 1С с мессенджером Telegram открывает огромные возможности для бизнеса: от оперативного согласования документов до получения складских остатков в режиме реального времени. Одной из ключевых задач при создании удобного интерфейса бота является добавление кнопок. В Telegram существует два основных типа кнопок: Inline-кнопки (привязанные к конкретному сообщению) и Reply-кнопки (заменяющие стандартную клавиатуру пользователя).
В этой статье мы подробно разберем, как реализовать оба варианта на стороне 1С, проанализируем структуру JSON-запросов и рассмотрим механизмы взаимодействия с HTTP-сервисами Telegram.
Прежде чем переходить к коду, определимся с терминологией:
callback_data, которая отправляется боту при нажатии. Это удобно для действий с конкретным объектом (например, кнопки "Одобрить" или "Отклонить" под заявкой).Рассмотрим пример формирования инлайн-кнопок. Для этого нам потребуется создать структуру, которую мы затем преобразуем в JSON. Посмотрим на фрагмент кода, где формируется массив строк, в каждой из которых находятся кнопки:
// Функция для формирования структуры инлайн-кнопок
Функция ВернутьСтруктуруСогласования()
Строки = Новый Массив; // Основной массив строк клавиатуры
Кнопки = Новый Массив; // Массив кнопок для конкретной строки
// Допустим, у нас есть массив имен кнопок
МассивКнопок = Новый Массив;
МассивКнопок.Добавить("Согласовать");
МассивКнопок.Добавить("Отклонить");
Для каждого ИмяКнопки Из МассивКнопок Цикл
// Каждая кнопка — это Структура с полями text и callback_data
ДанныеКнопки = Новый Структура("text, callback_data", ИмяКнопки, ИмяКнопки + "_ID_123");
Кнопки.Добавить(ДанныеКнопки);
КонецЦикла;
// Добавляем строку кнопок в общий массив клавиатуры
Строки.Добавить(Кнопки);
// Оборачиваем в структуру inline_keyboard и сериализуем в JSON
КлавиатураСтруктура = Новый Структура("inline_keyboard", Строки);
Возврат ЗаписатьJS(КлавиатураСтруктура);
КонецФункции
Важно помнить, что callback_data имеет ограничение по длине (до 64 байт). Если вам нужно передать сложную команду, лучше использовать краткие идентификаторы, которые 1С сможет распознать при получении ответа.
Если ваша задача — создать постоянное меню, как просил автор темы, необходимо использовать объект keyboard. В отличие от инлайн-кнопок, нажатие на такую кнопку просто отправляет текстовое сообщение от имени пользователя.
Проанализируем пример отправки сообщения с постоянной клавиатурой:
Процедура ОтправитьМенюПользователю(ЧатID, Токен)
ТекстСообщения = "Выберите действие из меню:";
// Формируем JSON клавиатуры вручную или через структуру
// В данном примере показан формат JSON для клавиатуры из 2 строк
ТекстКнопок = "
|{
| ""keyboard"": [
| [""📦 Мои заказы""],
| [""💰 Баланс"", ""📞 Контакты""]
| ],
| ""resize_keyboard"": true,
| ""one_time_keyboard"": false
|}";
// Настройка соединения
АдресAPI = "api.telegram.org";
Ресурс = "bot" + Токен + "/sendMessage";
// Добавляем параметры в URL (Chat_ID, Text и Reply_Markup)
ПараметрыЗапроса = "?chat_id=" + ЧатID
+ "&text=" + ТекстСообщения
+ "&reply_markup=" + ТекстКнопок;
HTTPСоединение = Новый HTTPСоединение(АдресAPI, 443, , , , , Новый ЗащищенноеСоединениеOpenSSL());
HTTPЗапрос = Новый HTTPЗапрос(Ресурс + ПараметрыЗапроса);
Попытка
Ответ = HTTPСоединение.Получить(HTTPЗапрос);
// Проанализируем результат
Если Ответ.КодСостояния <> 200 Тогда
Сообщить("Ошибка API: " + Ответ.ПолучитьТелоКакСтроку());
КонецЕсли;
Исключение
Сообщить("Ошибка связи: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
В этом коде мы использовали два важных параметра:
resize_keyboard: если установлено true, кнопки будут компактными. Без этого параметра они займут очень много места на экране смартфона.one_time_keyboard: если установлено true, клавиатура скроется после первого же нажатия.При работе с Telegram API из 1С часто возникают ошибки, связанные с кодировкой и спецсимволами. Выясним причину: при передаче текста через URL-параметры (метод GET), символы пробела, кириллица и знаки препинания должны быть экранированы. Рассмотрим более правильный подход с использованием метода POST и передачей данных в теле запроса.
Это позволит избежать проблем с длиной URL и кодировкой текста:
Процедура ОтправитьСообщениеPOST(Токен, ЧатID, Текст, КлавиатураJSON)
Соединение = Новый HTTPСоединение("api.telegram.org", 443, , , , , Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос("/bot" + Токен + "/sendMessage");
// Формируем тело запроса как структуру
ТелоЗапроса = Новый Структура;
ТелоЗапроса.Вставить("chat_id", ЧатID);
ТелоЗапроса.Вставить("text", Текст);
ТелоЗапроса.Вставить("reply_markup", ДесериализоватьJSON(КлавиатураJSON)); // Преобразуем строку обратно в объект для общей сериализации
ТелоЗапроса.Вставить("parse_mode", "HTML");
// Сериализуем всё тело в JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ТелоЗапроса);
СтрокаJSON = ЗаписьJSON.Закрыть();
Запрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8);
Запрос.Заголовки.Вставить("Content-Type", "application/json");
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
КонецПроцедуры
Когда пользователь нажимает кнопку, бот получает обновление. Разберем, как 1С должна обрабатывать эти данные. Рассмотрим два сценария:
message), где в поле text будет написано название кнопки (например, "Мои заказы"). Вы обрабатываете это как обычную текстовую команду.callback_query. В нем будет содержаться поле data, в котором передано значение из callback_data.Важный совет: Если вы используете Inline-кнопки, после получения callback_query обязательно вызывайте метод answerCallbackQuery. Если этого не сделать, на смартфоне пользователя еще несколько секунд будет "крутиться" индикатор ожидания.
В коде, представленном в начале темы, используется метод getUpdates (Polling). Это означает, что 1С должна постоянно "опрашивать" сервер Telegram. Это создает лишнюю нагрузку и задержки в реакции бота.
Мы рекомендуем использовать Webhook. Для этого:
POST.setWebhook.Теперь Telegram будет сам мгновенно присылать данные в 1С при каждом действии пользователя, что сделает работу бота максимально быстрой.
При разработке не забывайте о следующих правилах:
chat_id — это большое число. В 1С при выводе его в строку обязательно используйте Формат(Идентификатор, "ЧГ=0"), чтобы исключить появление пробелов-разделителей (например, "882 646 417"), которые сломают URL запроса.Используя приведенные примеры и рекомендации, вы сможете создать полноценный интерфейс для своего Telegram-бота на базе 1С, обеспечив удобное взаимодействие сотрудников или клиентов с вашей информационной системой.