Вывод клавиатуры в Телеграмм-боте через 1с

1. user1272851 18.09.19 09:55 Сейчас в теме
Добрый день,форумчане!
Подскажите пожалуйста как вывести клавиатуру(inlineKeyboard или replyKeyboard) в телеграмм-боте.
Вот функция ПолучитьСписокСообщений,где используется getUpdates:

Функция ПолучитьСписокСообщений() Экспорт
    Результат = getUpdates(Константы.update_id.Получить() + 1);
    
    Если Результат.Свойство("ok") И Результат.ok = Истина Тогда
        Если Результат.Свойство("result") Тогда
            Для Каждого НС Из Результат.result Цикл
             Если НС.Свойство("message") И НС.message.Свойство("chat") Тогда
                    Если НС.message.text = "/start" Тогда
                        
                        chat = НС.message.chat;
                        id = chat.id;
                        
                        sendMessage(id, "Здравствуй, дорогой друг)",,,,,);
                        
                             КонецЕсли;
                      Константы.update_id.Установить(НС.update_id);
                КонецЕсли;
                
         КонецЦикла;
            
        КонецЕсли;
    КонецЕсли;                                                                       
    
    Возврат Результат;
КонецФункции
Показать


Вот сама функция getUpdates:
Функция getUpdates(offset = 0,limit = 0,timeout = 0) Экспорт
       method_param = Новый Массив;
       Если offset> 0 Тогда
         method_param.Добавить("offset=" + ФорматироватьСтроку(offset));  
     КонецЕсли;
     Если limit> 0 Тогда
         method_param.Добавить("limit=" + ФорматироватьСтроку(limit));  
     КонецЕсли;
     Если offset> 0 Тогда
         method_param.Добавить("timeout=" + ФорматироватьСтроку(timeout));  
     КонецЕсли;
                        
     Результат = ОтправитьHTTPЗапрос(ПолучитьAcessToken(),"getUpdates", method_param);
     Возврат ОбработатьJSON(Результат);
КонецФункции
Показать



Вот функция sendMessage:
Функция sendMessage(chat_id,text,parse_mode = Неопределено,disable_web_page_preview = Неопределено,disable_notification = Неопределено, reply_to_message_id = 0,reply_markup = Неопределено) Экспорт
    Если НЕ ЗначениеЗаполнено(chat_id) ИЛИ НЕ ЗначениеЗаполнено(text) Тогда
        Возврат Неопределено;
    КонецЕсли;
    
    method_param = Новый Массив;
    method_param.Добавить("chat_id=" + ФорматироватьСтроку(chat_id));
    method_param.Добавить("text=" + text);
    
    Если НЕ parse_mode = Неопределено Тогда
        method_param.Добавить("parse_mode" + parse_mode);
    КонецЕсли;
    Если НЕ disable_web_page_preview = Неопределено Тогда
        method_param.Добавить("disable_web_page_preview" + disable_web_page_preview);
    КонецЕсли;
    Если НЕ disable_notification = Неопределено Тогда
        method_param.Добавить("disable_notification" + disable_notification);
    КонецЕсли;                    
    Если НЕ reply_to_message_id > 0  Тогда
        method_param.Добавить("reply_to_message_id" + ФорматироватьСтроку(reply_to_message_id));
    КонецЕсли;
    Если НЕ reply_markup = Неопределено Тогда
        method_param.Добавить("reply_markup=" + reply_markup);
    КонецЕсли;
    
    Результат = ОтправитьHTTPЗапрос(ПолучитьAcessToken(),"sendMessage", method_param);
    Возврат ОбработатьJSON(Результат);
КонецФункции
Показать


Как я понял reply_markup отвечает за вывод клавиатуры,но как её вывести я так и не понял

Заранее спасибо!
Найденные решения
2. Boyborodin 18.09.19 10:22 Сейчас в теме
В reply_markup передается inline_keyboard из массива массивов объектов кнопок.
Кнопка состоит из text и одного обязательного callback_data.

Пример:

Строки = Новый Массив;
	Кнопки = Новый Массив;
	Кнопки.Добавить(Новый структура("text, callback_data", "Ответ 1", "1"));
	Кнопки.Добавить(Новый структура("text, callback_data", "Ответ 2", "2"));
	Строки.Добавить(Кнопки);

	КлавиатураВСообщении = JSON.мЗаписатьJSON(Новый Структура("inline_keyboard", Строки), Ложь);


Блок "сallback_query" говорит о нажатии на кнопку

КодНажатойКнопки = mes.callback_query.data
serpanik; wauri; user1272851; +3 Ответить
6. user1272851 19.09.19 10:31 Сейчас в теме
Спасибо большое за помощь.
Я сделал вот так:

Функция ПолучитьСписокСообщений() Экспорт
	Результат = getUpdates(Константы.update_id.Получить() + 1);
	
	Если Результат.Свойство("ok") И Результат.ok = Истина Тогда
		Если Результат.Свойство("result") Тогда
			Для Каждого НС Из Результат.result Цикл
				Если НС.Свойство("message") И НС.message.Свойство("chat") Тогда
					Если НС.message.text = "/start" Тогда
						chat = НС.message.chat;
						id = chat.id;
						Строки = Новый Массив;
						Кнопки = Новый Массив;
						Кнопки.Добавить(Новый Структура("text,callback_data","Показать прайс","prays"));
						Кнопки.Добавить(Новый Структура("text,callback_data","Сделать заказ","zakaz"));
						Строки.Добавить(Кнопки);
						КлавиатураВСообщении = СформироватьJSON(Новый Структура("inline_keyboard",Строки),Ложь);
						sendMessage(id, "Здравствуй, дорогой друг)",,,,,КлавиатураВСообщении);
						ИначеЕсли НС.message.text = "/report" Тогда
							 chat = НС.message.chat;
							 id = chat.id;
						     Строки = Новый Массив;
							 Кнопки = Новый Массив;
							 Кнопки.Добавить(Новый Структура("text,callback_data","Показать прайс","prays"));
							 Кнопки.Добавить(Новый Структура("text,callback_data","Сделать заказ","zakaz"));
							 Кнопки.Добавить(Новый Структура("text,callback_data","Показать долг","dolg"));

							 Строки.Добавить(Кнопки);
							 КлавВСообщ = СформироватьJSON(Новый Структура("keyboard,resize_keyboard=Истина",Строки),Ложь);
							 sendMessage(id,"Выберите действие",,,,,КлавВСообщ);
						 КонецЕсли;
					Константы.update_id.Установить(НС.update_id);
				КонецЕсли;
				
			КонецЦикла;
			
		КонецЕсли;
	КонецЕсли;                                                                       //показать прайс показать долг сделать заказ
	
	Возврат Результат;
КонецФункции
Показать


И получилось вывести inline и reply клавиатуры.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Boyborodin 18.09.19 10:22 Сейчас в теме
В reply_markup передается inline_keyboard из массива массивов объектов кнопок.
Кнопка состоит из text и одного обязательного callback_data.

Пример:

Строки = Новый Массив;
	Кнопки = Новый Массив;
	Кнопки.Добавить(Новый структура("text, callback_data", "Ответ 1", "1"));
	Кнопки.Добавить(Новый структура("text, callback_data", "Ответ 2", "2"));
	Строки.Добавить(Кнопки);

	КлавиатураВСообщении = JSON.мЗаписатьJSON(Новый Структура("inline_keyboard", Строки), Ложь);


Блок "сallback_query" говорит о нажатии на кнопку

КодНажатойКнопки = mes.callback_query.data
serpanik; wauri; user1272851; +3 Ответить
3. user1272851 19.09.19 07:21 Сейчас в теме
(2) А можете подробно объяснить про блок "callback_query"?
5. Boyborodin 19.09.19 07:43 Сейчас в теме
(3) На самом деле тут вопрос не 1С-ный. По работе с телеграмм ботом есть много информации на других ресурсах.

CallbackQuery

Этот объект представляет входящий запрос обратной связи от инлайн-кнопки с заданным callback_data.
Если кнопка, создавшая этот запрос, была привязана к сообщению, то в запросе будет присутствовать поле message.
Если кнопка была показана в сообщении, отправленном при помощи встроенного режима, в запросе будет присутствовать поле inline_message_id.

Поле Тип Описание
id String Уникальный идентификатор запроса
from User Отправитель
message Message Опционально. Сообщение, к которому была привязана вызвавшая запрос кнопка. Обратите внимание: если сообщение слишком старое, содержание сообщения и дата отправки будут недоступны.
inline_message_id String Опционально. Идентификатор сообщения, отправленного через вашего бота во встроенном режиме
data String Данные, связанные с кнопкой. Обратите внимание, что клиенты могут добавлять свои данные в это поле.
user1272851; +1 Ответить
4. user1272851 19.09.19 07:34 Сейчас в теме
И ещё один вопрос.Принцип работы с "reply_keyboard" такой же?Или там есть свои заморочки?
6. user1272851 19.09.19 10:31 Сейчас в теме
Спасибо большое за помощь.
Я сделал вот так:

Функция ПолучитьСписокСообщений() Экспорт
	Результат = getUpdates(Константы.update_id.Получить() + 1);
	
	Если Результат.Свойство("ok") И Результат.ok = Истина Тогда
		Если Результат.Свойство("result") Тогда
			Для Каждого НС Из Результат.result Цикл
				Если НС.Свойство("message") И НС.message.Свойство("chat") Тогда
					Если НС.message.text = "/start" Тогда
						chat = НС.message.chat;
						id = chat.id;
						Строки = Новый Массив;
						Кнопки = Новый Массив;
						Кнопки.Добавить(Новый Структура("text,callback_data","Показать прайс","prays"));
						Кнопки.Добавить(Новый Структура("text,callback_data","Сделать заказ","zakaz"));
						Строки.Добавить(Кнопки);
						КлавиатураВСообщении = СформироватьJSON(Новый Структура("inline_keyboard",Строки),Ложь);
						sendMessage(id, "Здравствуй, дорогой друг)",,,,,КлавиатураВСообщении);
						ИначеЕсли НС.message.text = "/report" Тогда
							 chat = НС.message.chat;
							 id = chat.id;
						     Строки = Новый Массив;
							 Кнопки = Новый Массив;
							 Кнопки.Добавить(Новый Структура("text,callback_data","Показать прайс","prays"));
							 Кнопки.Добавить(Новый Структура("text,callback_data","Сделать заказ","zakaz"));
							 Кнопки.Добавить(Новый Структура("text,callback_data","Показать долг","dolg"));

							 Строки.Добавить(Кнопки);
							 КлавВСообщ = СформироватьJSON(Новый Структура("keyboard,resize_keyboard=Истина",Строки),Ложь);
							 sendMessage(id,"Выберите действие",,,,,КлавВСообщ);
						 КонецЕсли;
					Константы.update_id.Установить(НС.update_id);
				КонецЕсли;
				
			КонецЦикла;
			
		КонецЕсли;
	КонецЕсли;                                                                       //показать прайс показать долг сделать заказ
	
	Возврат Результат;
КонецФункции
Показать


И получилось вывести inline и reply клавиатуры.
7. user1272851 19.09.19 10:33 Сейчас в теме
Остался последний вопрос.
Что нужно сделать,чтобы клавиатура выводилась вертикально?
8. user1272851 19.09.19 12:51 Сейчас в теме
Разобрался.Надо было каждую кнопку записать в отдельный массив
14. KOTzilla 22 15.08.23 12:59 Сейчас в теме
(8)
				
МассивКнопок = ПолучитьПереченьКнопокДляTelegramm(); 
				
Строки = Новый Массив;
Для Каждого НаименованиеКнопки из МассивКнопок Цикл				 
    Кнопки = Новый Массив; 
    Кнопки.Добавить(Новый Структура("text, callback_data", НаименованиеКнопки, НаименованиеКнопки));	
    Строки.Добавить(Кнопки); 
    клСтруктура = Новый Структура("inline_keyboard",Строки);   				
КонецЦикла;
	
Показать
9. 028 10.06.20 14:15 Сейчас в теме
что сделать чтобы после нажатия кнопка удалилась?
10. Vovus 4 29.07.21 09:30 Сейчас в теме
СформироватьJSON(Новый Где можно подсмотреть?
11. user704573_pff12780 14.09.21 14:53 Сейчас в теме
(10) я так делаю:
				Строки = Новый Массив;
				Кнопки = Новый Массив;
				Кнопки.Добавить(Новый Структура("text, callback_data", "кнопка 1", "кнопка1"));
				Кнопки.Добавить(Новый Структура("text, callback_data", "кнопка 2", "кнопка2"));
				Строки.Добавить(Кнопки);    
				клСтруктура = Новый Структура("inline_keyboard",Строки);

				ЗаписьJSON = Новый ЗаписьJSON;
				ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет);
				ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);
				ЗаписатьJSON(ЗаписьJSON,клСтруктура);
				Клавиатура = ЗаписьJSON.Закрыть();
				ТекстДляОтправки = "&reply_markup=" + СокрЛП(Клавиатура);
Показать
12. КсенияИ 26.04.22 13:02 Сейчас в теме
Добрый день. Не нашла ветку, поэтому задам вопрос здесь.
Подскажите, пожалуйста, можно ли в Телеграм создавать опросники через 1С, чтобы затем по аналогии с кнопками inline можно было отловить ответ?
13. UNIT68RUS 07.06.22 08:49 Сейчас в теме
Коллеги, Вопрос такого плана Пытаюсь программно создать кнопки клавиатуры:

клСтруктура = Новый Структура;
Строки = Новый Массив;


Кнопки = Новый Массив;
Для Каждого СтрТЗ Из Параметр Цикл
Кнопки.Добавить(Новый Структура("text, callback_data", СтрТЗ.Наименование, Команда + " " + СтрТЗ.Наименование));
КонецЦикла;

Строки.Добавить(Кнопки);

клСтруктура.Вставить("inline_keyboard", Строки);
клСтруктура.Вставить("resize_keyboard", Истина);

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

Не хочет создавать, Заполняю руками создается. Уже всю голову сломал, и помещал создание массива и добавление строк в цикл, и что только не делал. По типам на выходе тоже самое что если и руками задать, И оборачивал в строку, и выносил переменные в отдельные. Самое интересное если создание массива кнопки поместить в запрос то он отрабатывает только для последнего из цикла, это понятно почему. Но почему не отрабатывает так как вам написал не могу понять. Помогите.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот