В начало

Запрос отчета из Телеграм-бота

 

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

 

Новые объекты конфигурации:

- Общий модуль «БАШНЯ_ЗапросОтчетов»

- Регламентное задание «БАШНЯ_ЗапросОтчетов»

- Непериодический независимый регистр сведений «Журнал команд бота»

 

Алгоритм:

- создаем новый бот в Телеграм;

- настраиваем бота в Телеграм (добавляем боту команды, устанавливаем конфиденциальность);

- создаем новые объекты в 1С (регистр сведений, регламентное задание, общий модуль).

 

 

chat_id, date - Число (25), Выполнено – Булево,

Команда – Строка (30),

Время – Дата и время

Рис. Регистр сведений «Журнал команд бота»

 

Листинг. Общий модуль «БАШНЯ_ЗапросОтчетов»

           

Процедура ОтправитьФайлОтчетаВТелеграм(Токен, ChatId, ДвоичныеДанные, ИмяФайла, Сообщение) 

 

    Разделитель = Строка(Новый УникальныйИдентификатор());

    Тело = Новый ПотокВПамяти();

    ЗаписьДанных    = Новый ЗаписьДанных(Тело, КодировкаТекста.UTF8, ПорядокБайтов.LittleEndian, Символы.ВК + Символы.ПС, Символы.ПС, Истина);

   

    //chat_id

    ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);

    ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""chat_id""");

    ЗаписьДанных.ЗаписатьСтроку("");

    ЗаписьДанных.ЗаписатьСтроку(ChatId);

   

    // disable_notification

    ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);

    ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""disable_notification""");

    ЗаписьДанных.ЗаписатьСтроку("");

    ЗаписьДанных.ЗаписатьСтроку("True");

       

    Если Не ПустаяСтрока(Сообщение) Тогда

        // caption

        ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);

        ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""caption""");

        ЗаписьДанных.ЗаписатьСтроку("");

        ЗаписьДанных.ЗаписатьСтроку(Сообщение);       

       

        // parse_mode

        ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);

        ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""parse_mode""");

        ЗаписьДанных.ЗаписатьСтроку("");

        ЗаписьДанных.ЗаписатьСтроку("HTML");

    КонецЕсли;

   

    //document   

    ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);

ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""document""; filename=" + ИмяФайла + "");

    ЗаписьДанных.ЗаписатьСтроку("");  

   

    //Добавим файл

    ЗаписьДанных.Записать(ДвоичныеДанные);

   

    //Завершение записи

    ЗаписьДанных.ЗаписатьСтроку("");

    ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель + "--");

    ЗаписьДанных.Закрыть();

   

    ДанныеТела = Тело.ЗакрытьИПолучитьДвоичныеДанные();  

 

    //Сформировать соединение и запрос

    Соединение = Новый HTTPСоединение("api.telegram.org",443,,,,15,Новый ЗащищенноеСоединениеOpenSSL());

    Заголовки   = Новый Соответствие;

    Заголовки.Вставить("Content-Type",      "multipart/form-data; boundary=" + Разделитель);

    Заголовки.Вставить("Accept",            "*/*");

    Заголовки.Вставить("Cache-Control",     "no-cache");

    Заголовки.Вставить("Host",              "api.telegram.org");

    Заголовки.Вставить("Accept-Encoding",   "gzip, deflate");

    Заголовки.Вставить("Content-Length",    Формат(ДанныеТела.Размер(), "ЧДЦ=0; ЧН=0; ЧГ=0"));

    Заголовки.Вставить("Connection",        "close");

    Адрес       = СтрШаблон("/bot%1/sendDocument", Токен);

    Запрос      = Новый HTTPЗапрос(Адрес, Заголовки);

    Запрос.УстановитьТелоИзДвоичныхДанных(ДанныеТела);

 

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

           

            Если Ответ.КодСостояния = 200 Тогда

                        ЧтениеJSON = Новый ЧтениеJSON();

                        ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8));

                        РезСтруктура = ПрочитатьJSON(ЧтениеJSON);

                        ЧтениеJSON.Закрыть();                  

            КонецЕсли;

           

КонецПроцедуры//ОтправитьФайлОтчетаВТелеграм

 

&НаСервере

Процедура ВывестиПодсказку(Знач вхСервер, Знач вхТокен, Знач chat_id)

           

            Ресурс = "bot" + вхТокен + "/sendMessage?chat_id=" + СтрЗаменить(Формат(chat_id, "ЧДЦ=; ЧС=; ЧРГ=."), ".", "") + "&text=Подсказка";

           

            Соединение  =  Новый HTTPСоединение(вхСервер,443,,,,,Новый ЗащищенноеСоединениеOpenSSL());

            Запрос = Новый HTTPЗапрос(Ресурс);

            Ответ = Соединение.Получить(Запрос);

           

КонецПроцедуры

 

&НаСервере

Процедура ВывестиОтчетЖурналОтключений(Знач вхТокен, Знач chat_id)

           

            ИмяФайла = ПолучитьИмяВременногоФайла("xlsx");

 

 

            Об = Обработки.ЖурналОтключений.Создать();

            ТабДок = Об.кмдСформироватьВМодулеОбъекта();      

            ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);

                           

            ДД  = Новый ДвоичныеДанные(ИмяФайла);

            ТекстСообщ = "Журнал отлючений";

           

            ОтправитьФайлОтчетаВТелеграм(вхТокен, СтрЗаменить(Формат(chat_id, "ЧДЦ=; ЧС=; ЧРГ=."), ".", ""), ДД, "Журнал отключений.xlsx", ТекстСообщ);

 

            УдалитьФайлы(ИмяФайла);

           

КонецПроцедуры//ВывестиОтчетЖурналОтключений

 

 

Функция ВыполнитьКомандуБотаПоИмени(Знач вхСервер, Знач вхТокен, Знач ЗаписьРегистра)

           

            Если ЗаписьРегистра.Команда = "/report" Тогда

                        ВывестиОтчетЖурналОтключений(вхТокен, ЗаписьРегистра.chat_id);

                       

            ИначеЕсли ЗаписьРегистра.Команда = "/help" Тогда       

                        ВывестиПодсказку(вхСервер, вхТокен, ЗаписьРегистра.chat_id);

            КонецЕсли;   

           

           

            Возврат Истина;

           

КонецФункции

 

Функция ПолучитьМассивСообщений2(Знач вхСервер, Знач вхТокен)

   

            Ресурс = "bot" + вхТокен + "/getUpdates";

            Соединение  =  Новый HTTPСоединение(вхСервер,443,,,,,Новый ЗащищенноеСоединениеOpenSSL());

            Запрос = Новый HTTPЗапрос(Ресурс);

            Ответ = Соединение.Получить(Запрос); 

           

                        Если Ответ.КодСостояния = 200 Тогда

                       

                                   ЧтениеJSON = Новый ЧтениеJSON();

                                    ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8));

                                   Ответ2 = ПрочитатьJSON(ЧтениеJSON);

                                   ЧтениеJSON.Закрыть(); 

                                  

                                   Возврат Ответ2.Result;

                        Иначе

                                   Возврат Неопределено;

                        КонецЕсли;

           

            КонецФункции

           

Процедура ПроверкаСообщенийДляРеглЗадания() Экспорт

 

            Сервер = "api.telegram.org";  

            Токен = "12345678912:AAEwfm1M2GHif-3pw0vgbgHfrXDXmfIkOiM";

 

            мСообщений = ПолучитьМассивСообщений2(Сервер, Токен);

           

            Для Каждого Эл Из мСообщений Цикл

                       

                        Если ЗначениеЗаполнено(Эл.message.chat.id) И

                                   ЗначениеЗаполнено(Эл.message.date) Тогда

                                  

                                  

                                   НЗ = РегистрыСведений.БАШНЯ_ЖурналКомандБота.СоздатьНаборЗаписей();

                                   НЗ.Отбор.chat_id.Установить(Эл.message.chat.id);

                                   НЗ.Отбор.date.Установить(Эл.message.date);

                                   НЗ.Прочитать();

                                  

                                   Если НЗ.Количество() > 0 Тогда

                                              

                                               Для Каждого Зап Из НЗ Цикл

                                                           Если НЕ Зап.Выполнено Тогда

                                                                       ВыполнитьКомандуБотаПоИмени(Сервер, Токен, Зап);

                                                                      

                                                           КонецЕсли;

                                               КонецЦикла;

                                              

                                               НЗ.Записать();

                                              

                                   Иначе

                                               МЗ = РегистрыСведений.БАШНЯ_ЖурналКомандБота.СоздатьМенеджерЗаписи();

                                               МЗ.chat_id = Эл.message.chat.id;

                                               МЗ.date = Эл.message.date;

                                               МЗ.Время = Дата(1970, 1, 1) + 3600 * 3 + Эл.message.date;

                                               МЗ.Команда = Эл.message.text;

                                               МЗ.Выполнено = ВыполнитьКомандуБотаПоИмени(Сервер, Токен, МЗ);

                                               МЗ.Записать();

                                              

                                   КонецЕсли;

                        КонецЕсли;

            КонецЦикла;

           

КонецПроцедуры