В начало

Отправка отчета в Телеграм

 

            Нужно отправить отчет в Телеграм.

 

            План действий такой:

1) Создаем необходимые объекты конфигурации: отчет «ОтчетПоЗаявкам» и внешнюю обработку для отладки.

2) Программно вызываем «Отчет по заявкам» и помещаем в табличный документ.

3) Сохраняем табличный документ в каталог временных файлов.

4) Отправляем отчет с комментариями в Телеграм.

5) Удаляем файл отчета из каталога временных файлов.

 

Листинг. Модуль формы внешней обработки

&НаСервере

Процедура ОтправитьФайл(Токен, 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Запрос(Адрес, Заголовки);

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

 

    // POST

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

 

    // Разбор ответа

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

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

        ВызватьИсключение СтрШаблон("Ошибка отправки вложения в телеграм.

            |Код состояния: %1

            |Тело: %2"

            , Ответ.КодСостояния

            , ОтветСтрокой

        );

    КонецЕсли;

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

 

&НаСервере

Функция СоздатьОтчетИПоместитьВТабДок()

            ТабДок = Новый ТабличныйДокумент();

           

            СКД=Отчеты.ОтчетПоЗаявкам.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

            Настройки=СКД.НастройкиПоУмолчанию;

           

            Параметр1 = Настройки.ПараметрыДанных.Элементы.Найти("НачалоДня");

            Параметр1.Значение = НачалоДня(ТекущаяДата());

            Параметр1.Использование = Истина;

 

            Параметр2 = Настройки.ПараметрыДанных.Элементы.Найти("КонецДня");

            Параметр2.Значение = КонецДня(ТекущаяДата());

            Параметр2.Использование = Истина;

           

            Расшифровка = Новый ДанныеРасшифровкиКомпоновкиДанных;

            КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;   

           

            //Передаем в макет компоновки схему, настройки и данные расшифровки

            МакетКомпоновки = КомпоновщикМакета.Выполнить(СКД, Настройки, Расшифровка);   

            ВнешниеПараметры = Новый Структура;   

           

            //Выполним компоновку с помощью процессора компоновки

            ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;

            ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ВнешниеПараметры, Расшифровка);   

           

            //Выводим результат в табличный документ

            ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;

            ПроцессорВывода.УстановитьДокумент(ТабДок);   

            ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных, Истина);            

                                                                                  

            Возврат ТабДок;

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

 

&НаКлиенте

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

           

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

            ТабДок = СоздатьОтчетИПоместитьВТабДок();

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

                           

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

            ТекстСообщ = "Отчет по заявкам";

            ОтправитьФайл("1234567:abcdef", "-1234567", ДД, ИмяФайла, ТекстСообщ);

           

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

           

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