Как добавить кнопки в телеграм бот с помощью 1с?

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

Интеграция 1С с мессенджером Telegram открывает огромные возможности для бизнеса: от оперативного согласования документов до получения складских остатков в режиме реального времени. Одной из ключевых задач при создании удобного интерфейса бота является добавление кнопок. В Telegram существует два основных типа кнопок: Inline-кнопки (привязанные к конкретному сообщению) и Reply-кнопки (заменяющие стандартную клавиатуру пользователя).

В этой статье мы подробно разберем, как реализовать оба варианта на стороне 1С, проанализируем структуру JSON-запросов и рассмотрим механизмы взаимодействия с HTTP-сервисами Telegram.

Разница между типами кнопок

Прежде чем переходить к коду, определимся с терминологией:

  1. Inline Keyboard (Инлайн-клавиатура) — кнопки появляются непосредственно под текстом сообщения. Каждая кнопка содержит callback_data, которая отправляется боту при нажатии. Это удобно для действий с конкретным объектом (например, кнопки "Одобрить" или "Отклонить" под заявкой).
  2. Reply Keyboard (Обычная клавиатура) — кнопки располагаются внизу экрана вместо текстового поля ввода. Они "прилипают" к интерфейсу и удобны для навигации по основному меню бота.

Реализация Inline-кнопок в 1С

Рассмотрим пример формирования инлайн-кнопок. Для этого нам потребуется создать структуру, которую мы затем преобразуем в JSON. Посмотрим на фрагмент кода, где формируется массив строк, в каждой из которых находятся кнопки:


// Функция для формирования структуры инлайн-кнопок
Функция ВернутьСтруктуруСогласования() 
    Строки = Новый Массив; // Основной массив строк клавиатуры
    Кнопки = Новый Массив; // Массив кнопок для конкретной строки
    
    // Допустим, у нас есть массив имен кнопок
    МассивКнопок = Новый Массив;
    МассивКнопок.Добавить("Согласовать");
    МассивКнопок.Добавить("Отклонить");
    
    Для каждого ИмяКнопки Из МассивКнопок Цикл
        // Каждая кнопка — это Структура с полями text и callback_data
        ДанныеКнопки = Новый Структура("text, callback_data", ИмяКнопки, ИмяКнопки + "_ID_123");
        Кнопки.Добавить(ДанныеКнопки);
    КонецЦикла;
    
    // Добавляем строку кнопок в общий массив клавиатуры
    Строки.Добавить(Кнопки);
    
    // Оборачиваем в структуру inline_keyboard и сериализуем в JSON
    КлавиатураСтруктура = Новый Структура("inline_keyboard", Строки);
    Возврат ЗаписатьJS(КлавиатураСтруктура);
КонецФункции 

Важно помнить, что callback_data имеет ограничение по длине (до 64 байт). Если вам нужно передать сложную команду, лучше использовать краткие идентификаторы, которые 1С сможет распознать при получении ответа.

Реализация Reply-кнопок (Меню)

Если ваша задача — создать постоянное меню, как просил автор темы, необходимо использовать объект 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: " + Ответ.ПолучитьТелоКакСтроку());
        КонецЕсли;
    Исключение
        Сообщить("Ошибка связи: " + ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

В этом коде мы использовали два важных параметра:

Технические нюансы работы с JSON и HTTP

При работе с 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С должна обрабатывать эти данные. Рассмотрим два сценария:

  1. Нажата Reply-кнопка: В 1С придет обычное сообщение (объект message), где в поле text будет написано название кнопки (например, "Мои заказы"). Вы обрабатываете это как обычную текстовую команду.
  2. Нажата Inline-кнопка: В 1С придет объект callback_query. В нем будет содержаться поле data, в котором передано значение из callback_data.

Важный совет: Если вы используете Inline-кнопки, после получения callback_query обязательно вызывайте метод answerCallbackQuery. Если этого не сделать, на смартфоне пользователя еще несколько секунд будет "крутиться" индикатор ожидания.

Оптимизация получения данных: Webhook против Polling

В коде, представленном в начале темы, используется метод getUpdates (Polling). Это означает, что 1С должна постоянно "опрашивать" сервер Telegram. Это создает лишнюю нагрузку и задержки в реакции бота.

Мы рекомендуем использовать Webhook. Для этого:

Теперь Telegram будет сам мгновенно присылать данные в 1С при каждом действии пользователя, что сделает работу бота максимально быстрой.

Безопасность и лимиты

При разработке не забывайте о следующих правилах:

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

← На главную