diff --git a/OPI/src/CommonModules/OPI_Telegram/Module.bsl b/OPI/src/CommonModules/OPI_Telegram/Module.bsl index 53d96a236..d78f9b9b3 100644 --- a/OPI/src/CommonModules/OPI_Telegram/Module.bsl +++ b/OPI/src/CommonModules/OPI_Telegram/Module.bsl @@ -1,26 +1,26 @@ -//MIT License +// MIT License -//Copyright (c) 2023 Anton Tsitavets +// Copyright (c) 2023 Anton Tsitavets -//Permission is hereby granted, free of charge, to any person obtaining a copy -//of this software and associated documentation files (the "Software"), to deal -//in the Software without restriction, including without limitation the rights -//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -//copies of the Software, and to permit persons to whom the Software is -//furnished to do so, subject to the following conditions: +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: -//The above copyright notice and this permission notice shall be included in all -//copies or substantial portions of the Software. +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. -//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -//OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -//SOFTWARE. +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. -//https://github.com/Bayselonarrend/OpenIntegrations +// https://github.com/Bayselonarrend/OpenIntegrations #Область ПрограммныйИнтерфейс @@ -38,7 +38,7 @@ Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/getMe"); Возврат Ответ; -Конецфункции +КонецФункции // Получить обновления. // @@ -63,11 +63,11 @@ // Возвращаемое значение: // ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера Telegram Функция УстановитьWebhook(Знач Токен, Знач URL) Экспорт - - Параметры_ = Новый Структура; - Параметры_.Вставить("url", URL); - - Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/setWebHook", Параметры_); + + Параметры_ = Новый Структура; + Параметры_.Вставить("url", URL); + + Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/setWebHook", Параметры_); Возврат Ответ; КонецФункции @@ -90,82 +90,85 @@ Функция ОбработатьДанные(Знач Запрос) Экспорт // BSLLS:DuplicateStringLiteral-off - Message = "message"; - From = "from"; - Chat = "chat"; - Id_ = "id"; - Username = "username"; - MessageId = "message_id"; - - ЧтениеJSON = Новый ЧтениеJSON; - ЧтениеJSON.УстановитьСтроку(Запрос.ПолучитьТелоКакСтроку()); - - СтруктураПараметровВходная = ПрочитатьJSON(ЧтениеJSON); - СтруктураПараметровВыходная = Новый Структура; - - Если СтруктураПараметровВходная.Свойство(Message) Тогда + Message = "message"; + From = "from"; + Chat = "chat"; + Id_ = "id"; + Username = "username"; + MessageId = "message_id"; + + ЧтениеJSON = Новый ЧтениеJSON; + ЧтениеJSON.УстановитьСтроку(Запрос.ПолучитьТелоКакСтроку()); + + СтруктураПараметровВходная = ПрочитатьJSON(ЧтениеJSON); + СтруктураПараметровВыходная = Новый Структура; + + Если СтруктураПараметровВходная.Свойство(Message) Тогда - СтруктураСообщения = СтруктураПараметровВходная[Message]; - СтруктураПользователя = СтруктураСообщения[From]; - СтруктураЧата = СтруктураСообщения[Chat]; - - СтруктураПараметровВыходная.Вставить("Вид" , "Сообщение"); - СтруктураПараметровВыходная.Вставить("Никнейм" , СтруктураПользователя[Username]); - СтруктураПараметровВыходная.Вставить("IDПользователя" , СтруктураПользователя[Id_]); - СтруктураПараметровВыходная.Вставить("IDСообщения" , СтруктураСообщения[MessageId]); - СтруктураПараметровВыходная.Вставить("IDЧата" , СтруктураЧата[Id_]); - СтруктураПараметровВыходная.Вставить("Сообщение" , СтруктураСообщения["text"]); - СтруктураПараметровВыходная.Вставить("Дата" , Дата(1970,1,1,1,0,0) + СтруктураСообщения["date"]); - СтруктураПараметровВыходная.Вставить("БотОтключен" , Ложь); - - ИначеЕсли СтруктураПараметровВходная.Свойство("my_chat_member") Тогда - - СтруктураСообщения = СтруктураПараметровВходная["my_chat_member"]; - СтруктураПользователя = СтруктураСообщения[From]; - СтруктураЧата = СтруктураСообщения[Chat]; - - СтруктураПараметровВыходная.Вставить("Вид" , "Запуск/Остановка"); - СтруктураПараметровВыходная.Вставить("Никнейм" , СтруктураПользователя[Username]); - СтруктураПараметровВыходная.Вставить("IDПользователя" , СтруктураПользователя[Id_]); - СтруктураПараметровВыходная.Вставить("IDСообщения" , ""); - СтруктураПараметровВыходная.Вставить("IDЧата" , СтруктураЧата[Id_]); - СтруктураПараметровВыходная.Вставить("Сообщение" , СтруктураСообщения["new_chat_member"]["status"]); - СтруктураПараметровВыходная.Вставить("Дата" , Дата(1970,1,1,1,0,0) + СтруктураСообщения["date"]); - СтруктураПараметровВыходная.Вставить("БотОтключен" - , ?(СтруктураСообщения["new_chat_member"]["status"] = "kicked", Истина, Ложь)); + СтруктураСообщения = СтруктураПараметровВходная[Message]; + СтруктураПользователя = СтруктураСообщения[From]; + СтруктураЧата = СтруктураСообщения[Chat]; + + СтруктураПараметровВыходная.Вставить("Вид" , "Сообщение"); + СтруктураПараметровВыходная.Вставить("Никнейм" , СтруктураПользователя[Username]); + СтруктураПараметровВыходная.Вставить("IDПользователя" , СтруктураПользователя[Id_]); + СтруктураПараметровВыходная.Вставить("IDСообщения" , СтруктураСообщения[MessageId]); + СтруктураПараметровВыходная.Вставить("IDЧата" , СтруктураЧата[Id_]); + СтруктураПараметровВыходная.Вставить("Сообщение" , СтруктураСообщения["text"]); + СтруктураПараметровВыходная.Вставить("Дата" + , Дата(1970, 1, 1, 1, 0, 0) + СтруктураСообщения["date"]); + + СтруктураПараметровВыходная.Вставить("БотОтключен" , Ложь); + + ИначеЕсли СтруктураПараметровВходная.Свойство("my_chat_member") Тогда + + СтруктураСообщения = СтруктураПараметровВходная["my_chat_member"]; + СтруктураПользователя = СтруктураСообщения[From]; + СтруктураЧата = СтруктураСообщения[Chat]; + + СтруктураПараметровВыходная.Вставить("Вид" , "Запуск/Остановка"); + СтруктураПараметровВыходная.Вставить("Никнейм" , СтруктураПользователя[Username]); + СтруктураПараметровВыходная.Вставить("IDПользователя" , СтруктураПользователя[Id_]); + СтруктураПараметровВыходная.Вставить("IDСообщения" , ""); + СтруктураПараметровВыходная.Вставить("IDЧата" , СтруктураЧата[Id_]); + СтруктураПараметровВыходная.Вставить("Сообщение" , СтруктураСообщения["new_chat_member"]["status"]); + СтруктураПараметровВыходная.Вставить("Дата" + , Дата(1970, 1, 1, 1, 0, 0) + СтруктураСообщения["date"]); + + СтруктураПараметровВыходная.Вставить("БотОтключен" + , ?(СтруктураСообщения["new_chat_member"]["status"] = "kicked", Истина, Ложь)); - ИначеЕсли СтруктураПараметровВходная.Свойство("callback_query") Тогда - - - СтруктураСообщения = СтруктураПараметровВходная["callback_query"]; - СтруктураПользователя = СтруктураСообщения[From]; + ИначеЕсли СтруктураПараметровВходная.Свойство("callback_query") Тогда + + СтруктураСообщения = СтруктураПараметровВходная["callback_query"]; + СтруктураПользователя = СтруктураСообщения[From]; - СтруктураПараметровВыходная.Вставить("Вид" , "Кнопка под сообщением"); - СтруктураПараметровВыходная.Вставить("Никнейм" , СтруктураПользователя[Username]); - СтруктураПараметровВыходная.Вставить("IDПользователя" , СтруктураПользователя[Id_]); - СтруктураПараметровВыходная.Вставить("IDСообщения" , СтруктураСообщения[Message][MessageId]); - СтруктураПараметровВыходная.Вставить("IDЧата" , СтруктураСообщения[Message][Chat][Id_]); - СтруктураПараметровВыходная.Вставить("Сообщение" , СтруктураСообщения["data"]); - СтруктураПараметровВыходная.Вставить("БотОтключен" , Ложь); - СтруктураПараметровВыходная.Вставить("Дата" - , Дата(1970,1,1,1,0,0) + СтруктураСообщения[Message]["date"]); + СтруктураПараметровВыходная.Вставить("Вид" , "Кнопка под сообщением"); + СтруктураПараметровВыходная.Вставить("Никнейм" , СтруктураПользователя[Username]); + СтруктураПараметровВыходная.Вставить("IDПользователя" , СтруктураПользователя[Id_]); + СтруктураПараметровВыходная.Вставить("IDСообщения" , СтруктураСообщения[Message][MessageId]); + СтруктураПараметровВыходная.Вставить("IDЧата" , СтруктураСообщения[Message][Chat][Id_]); + СтруктураПараметровВыходная.Вставить("Сообщение" , СтруктураСообщения["data"]); + СтруктураПараметровВыходная.Вставить("БотОтключен" , Ложь); + СтруктураПараметровВыходная.Вставить("Дата" + , Дата(1970, 1, 1, 1, 0, 0) + СтруктураСообщения[Message]["date"]); - Иначе - - СтруктураПараметровВыходная.Вставить("Вид", ""); - СтруктураПараметровВыходная.Вставить("Никнейм", ""); - СтруктураПараметровВыходная.Вставить("IDПользователя", ""); - СтруктураПараметровВыходная.Вставить("IDСообщения", ""); - СтруктураПараметровВыходная.Вставить("IDЧата", ""); - СтруктураПараметровВыходная.Вставить("Сообщение", ""); - СтруктураПараметровВыходная.Вставить("Дата", ТекущаяДатаСеанса()); - СтруктураПараметровВыходная.Вставить("БотОтключен", Ложь); - - КонецЕсли; - - Возврат СтруктураПараметровВыходная; + Иначе + + СтруктураПараметровВыходная.Вставить("Вид" , ""); + СтруктураПараметровВыходная.Вставить("Никнейм" , ""); + СтруктураПараметровВыходная.Вставить("IDПользователя" , ""); + СтруктураПараметровВыходная.Вставить("IDСообщения" , ""); + СтруктураПараметровВыходная.Вставить("IDЧата" , ""); + СтруктураПараметровВыходная.Вставить("Сообщение" , ""); + СтруктураПараметровВыходная.Вставить("Дата" , ТекущаяДатаСеанса()); + СтруктураПараметровВыходная.Вставить("БотОтключен" , Ложь); + + КонецЕсли; + + Возврат СтруктураПараметровВыходная; -// BSLLS:DuplicateStringLiteral-on +// BSLLS:DuplicateStringLiteral-on КонецФункции #КонецОбласти @@ -291,22 +294,22 @@ // IDЧата - Строка,Число - ID целевого чата // Текст - Строка - Текст // СоответствиеФайлов - Соответствие из Строка,ДвоичныеДанные - Коллекция файлов: -// * Ключ - ДвоичныеДанные,Строка - Файл +// * Ключ - ДвоичныеДанные,Строка - Файл // * Значение - Строка - Тип файла: audio, document, photo, video // Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок // // Возвращаемое значение: // Произвольный, HTTPОтвет - Ответ сервера Telegram Функция ОтправитьМедиагруппу(Знач Токен - , Знач IDЧата - , Знач Текст - , Знач СоответствиеФайлов - , Знач Клавиатура = "") Экспорт + , Знач IDЧата + , Знач Текст + , Знач СоответствиеФайлов + , Знач Клавиатура = "") Экспорт - //СоответствиеФайлов - //Ключ - Файл, Значение - Тип - //Типы: audio, document, photo, video - //Нельзя замешивать разные типы! + // СоответствиеФайлов + // Ключ - Файл, Значение - Тип + // Типы: audio, document, photo, video + // Нельзя замешивать разные типы! OPI_Инструменты.ЗаменитьСпецсимволы(Текст); @@ -320,8 +323,7 @@ Параметры_.Вставить("caption" , Текст); Параметры_.Вставить("chat_id" , IDЧата); Параметры_.Вставить("reply_markup" , Клавиатура); - - + Для Каждого ТекущийФайл Из СоответствиеФайлов Цикл Если Не ТипЗнч(ТекущийФайл.Ключ) = Тип("ДвоичныеДанные") Тогда @@ -340,7 +342,7 @@ СтруктураФайлов.Вставить(ПолноеИмяМедиа , ДД); СтруктураМедиа = Новый Структура; - СтруктураМедиа.Вставить("type", ТекущийФайл.Значение); + СтруктураМедиа.Вставить("type" , ТекущийФайл.Значение); СтруктураМедиа.Вставить("media", "attach://" + ИмяМедиа); Если Счетчик = 0 Тогда @@ -359,7 +361,6 @@ + Токен + "/sendMediaGroup", Параметры_, СтруктураФайлов, "mixed"); - Возврат Ответ; КонецФункции @@ -439,14 +440,14 @@ Ответы = OPI_Инструменты.JSONСтрокой(МассивОтветов); Параметры_ = Новый Структура; - Параметры_.Вставить("parse_mode" , "Markdown"); - Параметры_.Вставить("chat_id" , IDЧата); - Параметры_.Вставить("question" , Вопрос); - Параметры_.Вставить("options" , Ответы); - - Если Не Анонимный Тогда - Параметры_.Вставить("is_anonymous" , Ложь); - КонецЕсли; + Параметры_.Вставить("parse_mode" , "Markdown"); + Параметры_.Вставить("chat_id" , IDЧата); + Параметры_.Вставить("question" , Вопрос); + Параметры_.Вставить("options" , Ответы); + + Если Не Анонимный Тогда + Параметры_.Вставить("is_anonymous", Ложь); + КонецЕсли; Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/sendPoll", Параметры_); @@ -548,22 +549,22 @@ // Возвращаемое значение: // ДвоичныеДанные, Неопределено, Произвольный - Ответ сервера Telegram Функция СоздатьСсылкуПриглашение(Знач Токен - , Знач IDЧата - , Знач Заголовок = "" - , Знач ДатаИстечения = "" - , Знач ЛимитПользователей = 0) Экспорт + , Знач IDЧата + , Знач Заголовок = "" + , Знач ДатаИстечения = "" + , Знач ЛимитПользователей = 0) Экспорт IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); Параметры_ = Новый Структура; - Параметры_.Вставить("parse_mode" , "Markdown"); - Параметры_.Вставить("chat_id" , IDЧата); - Параметры_.Вставить("name" , Заголовок); - - Если ЗначениеЗаполнено(ДатаИстечения) Тогда - Параметры_.Вставить("expire_date" , Формат(ДатаИстечения - Дата(1970,1,1,1,0,0), "ЧГ=0")); - КонецЕсли; - + Параметры_.Вставить("parse_mode", "Markdown"); + Параметры_.Вставить("chat_id" , IDЧата); + Параметры_.Вставить("name" , Заголовок); + + Если ЗначениеЗаполнено(ДатаИстечения) Тогда + Параметры_.Вставить("expire_date", Формат(ДатаИстечения - Дата(1970, 1, 1, 1, 0, 0), "ЧГ=0")); + КонецЕсли; + Параметры_.Вставить("member_limit", ЛимитПользователей); Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/createChatInviteLink", Параметры_); @@ -613,9 +614,9 @@ IDСообщения = OPI_Инструменты.ЧислоВСтроку(IDСообщения); Параметры_ = Новый Структура; - Параметры_.Вставить("parse_mode" , "Markdown"); - Параметры_.Вставить("chat_id" , IDЧата); - Параметры_.Вставить("message_id" , IDСообщения); + Параметры_.Вставить("parse_mode" , "Markdown"); + Параметры_.Вставить("chat_id" , IDЧата); + Параметры_.Вставить("message_id" , IDСообщения); Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/unpinChatMessage", Параметры_); @@ -636,8 +637,8 @@ IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата); Параметры_ = Новый Структура; - Параметры_.Вставить("parse_mode" , "Markdown"); - Параметры_.Вставить("chat_id" , IDЧата); + Параметры_.Вставить("parse_mode", "Markdown"); + Параметры_.Вставить("chat_id" , IDЧата); Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + "/getChatMemberCount", Параметры_); @@ -658,58 +659,58 @@ // Возвращаемое значение: // Соответствие из Строка - Обработанные данные с признаком достоверности Функция ОбработатьДанныеTMA(Знач СтрокаДанных, Знач Токен) Экспорт - - СтрокаДанных = РаскодироватьСтроку(СтрокаДанных, СпособКодированияСтроки.КодировкаURL); - СтруктураДанных = OPI_Инструменты.ПараметрыЗапросаВСоответствие(СтрокаДанных); - Ключ = "WebAppData"; - Хэш = ""; - - Результат = OPI_Криптография.HMACSHA256(ПолучитьДвоичныеДанныеИзСтроки(Ключ) - , ПолучитьДвоичныеДанныеИзСтроки(Токен)); - - ТЗнач = Новый ТаблицаЗначений; - ТЗнач.Колонки.Добавить("Ключ"); - ТЗнач.Колонки.Добавить("Значение"); - - Для Каждого Данные Из СтруктураДанных Цикл - - НоваяСтрока = ТЗнач.Добавить(); - НоваяСтрока.Ключ = Данные.Ключ; - НоваяСтрока.Значение = Данные.Значение; - - КонецЦикла; - - ТЗнач.Сортировать("Ключ"); - - СоответствиеВозврата = Новый Соответствие; - DCS = ""; - - Для Каждого СтрокаТЗ Из ТЗнач Цикл - - Если СтрокаТЗ.Ключ <> "hash" Тогда - DCS = DCS + СтрокаТЗ.Ключ + "=" + СтрокаТЗ.Значение + Символы.ПС; - СоответствиеВозврата.Вставить(СтрокаТЗ.Ключ, СтрокаТЗ.Значение); - Иначе - Хэш = СтрокаТЗ.Значение; - КонецЕсли; - - КонецЦикла; - - DCS = Лев(DCS, СтрДлина(DCS) - 1); - Подпись = OPI_Криптография.HMACSHA256(Результат, ПолучитьДвоичныеДанныеИзСтроки(DCS)); - - Финал = ПолучитьHexСтрокуИзДвоичныхДанных(Подпись); - - Если Финал = вРег(Хэш) Тогда - Ответ = Истина; - Иначе - Ответ = Ложь; - КонецЕсли; - - СоответствиеВозврата.Вставить("passed", Ответ); - - Возврат СоответствиеВозврата; - + + СтрокаДанных = РаскодироватьСтроку(СтрокаДанных, СпособКодированияСтроки.КодировкаURL); + СтруктураДанных = OPI_Инструменты.ПараметрыЗапросаВСоответствие(СтрокаДанных); + Ключ = "WebAppData"; + Хэш = ""; + + Результат = OPI_Криптография.HMACSHA256(ПолучитьДвоичныеДанныеИзСтроки(Ключ) + , ПолучитьДвоичныеДанныеИзСтроки(Токен)); + + ТЗнач = Новый ТаблицаЗначений; + ТЗнач.Колонки.Добавить("Ключ"); + ТЗнач.Колонки.Добавить("Значение"); + + Для Каждого Данные Из СтруктураДанных Цикл + + НоваяСтрока = ТЗнач.Добавить(); + НоваяСтрока.Ключ = Данные.Ключ; + НоваяСтрока.Значение = Данные.Значение; + + КонецЦикла; + + ТЗнач.Сортировать("Ключ"); + + СоответствиеВозврата = Новый Соответствие; + DCS = ""; + + Для Каждого СтрокаТЗ Из ТЗнач Цикл + + Если СтрокаТЗ.Ключ <> "hash" Тогда + DCS = DCS + СтрокаТЗ.Ключ + "=" + СтрокаТЗ.Значение + Символы.ПС; + СоответствиеВозврата.Вставить(СтрокаТЗ.Ключ, СтрокаТЗ.Значение); + Иначе + Хэш = СтрокаТЗ.Значение; + КонецЕсли; + + КонецЦикла; + + DCS = Лев(DCS, СтрДлина(DCS) - 1); + Подпись = OPI_Криптография.HMACSHA256(Результат, ПолучитьДвоичныеДанныеИзСтроки(DCS)); + + Финал = ПолучитьHexСтрокуИзДвоичныхДанных(Подпись); + + Если Финал = вРег(Хэш) Тогда + Ответ = Истина; + Иначе + Ответ = Ложь; + КонецЕсли; + + СоответствиеВозврата.Вставить("passed", Ответ); + + Возврат СоответствиеВозврата; + КонецФункции #КонецОбласти @@ -726,33 +727,33 @@ // Возвращаемое значение: // Строка - JSON клавиатуры Функция СформироватьКлавиатуруПоМассивуКнопок(Знач МассивКнопок - , Знач ПодСообщением = Ложь - , Знач ОднаПодОдной = Истина) Экспорт - - Если ОднаПодОдной Тогда - - Строки = Новый Массив; - - Для Каждого Кнопка Из МассивКнопок Цикл - Кнопки = Новый Массив; - Кнопка = OPI_Инструменты.ЧислоВСтроку(Кнопка); - Кнопки.Добавить(Новый Структура("text,callback_data", Кнопка, Кнопка)); - Строки.Добавить(Кнопки); - КонецЦикла; - - Иначе - - Строки = Новый Массив; - Кнопки = Новый Массив; - - Для Каждого Кнопка Из МассивКнопок Цикл - Кнопка = OPI_Инструменты.ЧислоВСтроку(Кнопка); - Кнопки.Добавить(Новый Структура("text,callback_data", Кнопка, Кнопка)); - КонецЦикла; - - Строки.Добавить(Кнопки); - КонецЕсли; - + , Знач ПодСообщением = Ложь + , Знач ОднаПодОдной = Истина) Экспорт + + Если ОднаПодОдной Тогда + + Строки = Новый Массив; + + Для Каждого Кнопка Из МассивКнопок Цикл + Кнопки = Новый Массив; + Кнопка = OPI_Инструменты.ЧислоВСтроку(Кнопка); + Кнопки.Добавить(Новый Структура("text,callback_data", Кнопка, Кнопка)); + Строки.Добавить(Кнопки); + КонецЦикла; + + Иначе + + Строки = Новый Массив; + Кнопки = Новый Массив; + + Для Каждого Кнопка Из МассивКнопок Цикл + Кнопка = OPI_Инструменты.ЧислоВСтроку(Кнопка); + Кнопки.Добавить(Новый Структура("text,callback_data", Кнопка, Кнопка)); + КонецЦикла; + + Строки.Добавить(Кнопки); + КонецЕсли; + Если ПодСообщением Тогда СтруктураПараметра = Новый Структура("inline_keyboard,rows", Строки, 1); Иначе @@ -796,7 +797,7 @@ Если Не ТипЗнч(Файл) = Тип("ДвоичныеДанные") Тогда ТекущийФайл = Новый Файл(Файл); - Расширение = ?(Вид = "document" или Вид = "animation", ТекущийФайл.Расширение, ""); + Расширение = ?(Вид = "document" Или Вид = "animation", ТекущийФайл.Расширение, ""); Файл = Новый ДвоичныеДанные(Файл); Иначе Расширение = ""; @@ -816,8 +817,7 @@ Ответ = OPI_Инструменты.PostMultipart("api.telegram.org/bot" + Токен + Метод, Параметры_, СтруктураФайлов, "mixed"); - - + Возврат Ответ; КонецФункции