В начало

Отправка отчета Сводные данные в Телеграм

 

            Нужно сформировать нестандартный отчет обработкой и отправить его в группу Телеграм.

 

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

Процедура ОтправитьФайлОтчетаВТелеграм(Токен, 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=""%1.pdf""", ?(ПустаяСтрока(ИмяФайла), "document_" + Строка(Новый УникальныйИдентификатор()) + ".pdf", ИмяФайла)));

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

            //ЗаписьДанных.ЗаписатьСтроку("Content-Type: application/pdf");

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

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

   

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

    //ЗаписьДанных    = Новый ЗаписьДанных(...);

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

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

   

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

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

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

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

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

   

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

 

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

    Соединение = Новый 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.Закрыть();                  

            КонецЕсли;

           

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

 

&НаСервере

Процедура ОтчетИзОбработкиВИксельИТелеграмНаСервере()

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

            Об = Обработки.СводныеДанные.Создать();

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

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

                           

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

            ТекстСообщ = "Сводные данные";

           

            ОтправитьФайлОтчетаВТелеграм("1234567:AAAAAAAAA ", "-1234567", ДД, "Отчет.xlsx", ТекстСообщ);

           

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

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

 

&НаКлиенте

Процедура ОтчетИзОбработкиВИксельИТелеграм(Команда)

            ОтчетИзОбработкиВИксельИТелеграмНаСервере();

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

 

            Отчет формируем обработкой-отчетом, т.к. форма СКД-отчета не подходит заказчику. Используем макет, который программно заполняем и выводим на форму, а также возвращаем отчет в виде табличного документа для дальнейшего его сохранения в Иксель и отправки в группу Телеграм.

 

Рис. Макет отчета «Сводные данные»

 

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

&НаСервере

Функция СформироватьОтчетНаСервере(Знач Город)

 

            Об = РеквизитФормыВЗначение("Объект");

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

 

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

 

           

&НаКлиенте

Процедура СформироватьОтчет(Команда)

 

            Если НЕ ЗначениеЗаполнено(Объект.Город) Тогда

                        Возврат;

            КонецЕсли;   

           

            ТабДок = СформироватьОтчетНаСервере(Объект.Город);

           

            ТабДок.ОтображатьСетку = Ложь;

            ТабДок.Защита = Ложь;

            ТабДок.ТолькоПросмотр = Ложь;

            ТабДок.ОтображатьЗаголовки = Ложь;

            ТабДок.Показать();

 

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

 

            Модуль формирования отчета размещен в модуле объекта, чтобы потом его можно было вызвать в регламентном задании или общем модуле.

 

Листинг. Модуль объекта обработки-отчета

&НаСервере

Функция СформироватьОтчетВМодулеОбъекта(Знач Город) Экспорт     

           

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

            ТабДок.АвтоМасштаб                                 = Истина;

            ТабДок.ОриентацияСтраницы       = ОриентацияСтраницы.Ландшафт;

            ТабДок.ИмяПараметровПечати      = "ПАРАМЕТРЫ_ПЕЧАТИ_СводныеДанные";

            Макет = ПолучитьМакет("СводныеДанные");

                         

            Запрос = Новый Запрос();  

           

            Запрос.Текст =

            "ВЫБРАТЬ

            |           БАШНЯ_РезультатОбзвонаРоботаОли.ВремяЗвонков КАК ВремяЗвонков,

            |           БАШНЯ_РезультатОбзвонаРоботаОли.ГруппаКомпаний КАК ГруппаКомпаний,

            |           БАШНЯ_РезультатОбзвонаРоботаОли.Должность КАК Должность,

            |           БАШНЯ_РезультатОбзвонаРоботаОли.Компания КАК Компания,

            |           БАШНЯ_РезультатОбзвонаРоботаОли.Звонки КАК ЧислоЗвонков,

            |           БАШНЯ_РезультатОбзвонаРоботаОли.ЛюдиНайм КАК ЛюдиНайм,

            |           БАШНЯ_РезультатОбзвонаРоботаОли.ЛюдиСвои КАК ЛюдиСвои,

            |           БАШНЯ_РезультатОбзвонаРоботаОли.Статус КАК Статус,

            |           БАШНЯ_РезультатОбзвонаРоботаОли.ТехникаНайм КАК ТехникаНайм,

            |           БАШНЯ_РезультатОбзвонаРоботаОли.ТехникаСвоя КАК ТехникаСвоя,

            |           БАШНЯ_РезультатОбзвонаРоботаОли.ФИО КАК ФИО,

            |           БАШНЯ_РезультатОбзвонаРоботаОли.ЛюдиСвои + БАШНЯ_РезультатОбзвонаРоботаОли.ЛюдиНайм КАК ЛюдиИтого,

            |           БАШНЯ_РезультатОбзвонаРоботаОли.ТехникаСвоя + БАШНЯ_РезультатОбзвонаРоботаОли.ТехникаНайм КАК ТехникаИтого,

            |           БАШНЯ_РезультатОбзвонаРоботаОли.Телефон КАК Телефон,

            |           БАШНЯ_РезультатОбзвонаРоботаОли.ЛюдиСвои + БАШНЯ_РезультатОбзвонаРоботаОли.ЛюдиНайм КАК ЛюдиИтогоПоГоризонтали,

            |           БАШНЯ_РезультатОбзвонаРоботаОли.ТехникаСвоя + БАШНЯ_РезультатОбзвонаРоботаОли.ТехникаНайм КАК ТехникаИтогоПоГоризонтали

            |ИЗ

            |           РегистрСведений.БАШНЯ_РезультатОбзвонаРоботаОли КАК БАШНЯ_РезультатОбзвонаРоботаОли

            |ГДЕ

            |           БАШНЯ_РезультатОбзвонаРоботаОли.Регион = &Регион";

           

            Запрос.Параметры.Вставить("Регион", Город);

            Результат = Запрос.Выполнить();

            Выборка = Результат.Выбрать();

 

            //============================

            // Область "Название отчета"

            //============================                

            ОбластьНО = Макет.ПолучитьОбласть("НазваниеОтчета");

           

            Если Выборка.Следующий() Тогда

                        ОбластьНО.Параметры.ГруппаКомпаний = Выборка.ГруппаКомпаний;

                        ОбластьНО.Параметры.ВремяСозданияОтчета = Формат(ТекущаяДата(), "ДФ=чч:мм");

                        ОбластьНО.Параметры.ДатаСозданияОтчета = Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy");

            КонецЕсли;   

           

            ТабДок.Вывести(ОбластьНО);

 

           

            //=============================

            //=============================

            //Таблица по людям и технике

            //=============================

            //=============================

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

            ОбластьЗаголовокПоПерсоналу = Макет.ПолучитьОбласть("ГруппировкаПоРесурсу|ТаблицаПерсоналИТехника"); 

           

            ВыборкаГруппировкиПоЛюдямИТехнике = ПолучитьИтогиПоЛюдямИТехнике();

            Пока ВыборкаГруппировкиПоЛюдямИТехнике.Следующий() Цикл  

                        //=========================

                        //Группировка по РЕСУРСУ  

                        //=========================

                        ОбластьЗаголовокПоПерсоналу.Параметры.Ресурс = ВыборкаГруппировкиПоЛюдямИТехнике.Ресурс;

                        ОбластьЗаголовокПоПерсоналу.Параметры.Количество = ВыборкаГруппировкиПоЛюдямИТехнике.Количество;

                        Таб1.Вывести(ОбластьЗаголовокПоПерсоналу); 

                       

                        //===================================

                        //Область "ГруппировкаПоКомпании1|ТаблицаСостояниеЗвонков"

                        //===================================

                        Область12 = Макет.ПолучитьОбласть("ГруппировкаПоКомпании1|ТаблицаПерсоналИТехника");

                        Выборка12 = ПолучитьИтогиПоЛюдямИТехникеПоКомпаниям(ВыборкаГруппировкиПоЛюдямИТехнике.Ресурс);

                        Пока Выборка12.Следующий() Цикл

                                   Область12.Параметры.Компания = Выборка12.Компания;

                                   Область12.Параметры.Количество = Выборка12.Количество;

                                   Таб1.Вывести(Область12);

                        КонецЦикла;

                       

            КонецЦикла;

           

            //======================

            //======================

            //Таблица по звонкам

            //======================

            //======================

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

           

            ОбластьЗаголовокПоСостояниюЗвонков = Макет.ПолучитьОбласть("ГруппировкаПоРесурсу|ТаблицаСостояниеЗвонков");

            Выборка21 = ПолучитьИтогиПоЗвонкам();

            Если Выборка21.Следующий() Тогда

                        ОбластьЗаголовокПоСостояниюЗвонков.Параметры.Количество = Выборка21.Количество;

            КонецЕсли;   

           

            Таб2.Вывести(ОбластьЗаголовокПоСостояниюЗвонков);

           

            //===========================================================

            //Область "ГруппировкаПоКомпании1|ТаблицаСостояниеЗвонков"  

            //===========================================================

            Область22 =  Макет.ПолучитьОбласть("ГруппировкаПоКомпании1|ТаблицаСостояниеЗвонков");

            Выборка22 = ПолучитьВыборкуПоЗвонкам();

            Пока Выборка22.Следующий() Цикл

                        Область22.Параметры.Состояние = Выборка22.Состояние;

                        Область22.Параметры.Количество = Выборка22.Количество;

                        Таб2.Вывести(Область22);

            КонецЦикла;

           

            ТабДок.Вывести(Таб1.ПолучитьОбласть(1,1, Таб1.ВысотаТаблицы,Таб1.ШиринаТаблицы));

            ТабДок.Присоединить(Таб2.ПолучитьОбласть(1,1,Таб2.ВысотаТаблицы,Таб2.ШиринаТаблицы));

           

            //=========================

            // Область "Шапка"

            //==========================                     

            ОбластьШапка = Макет.ПолучитьОбласть("Шапка2");   

            ТабДок.Вывести(ОбластьШапка);

 

            Если Результат.Пустой() Тогда

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

            КонецЕсли;

           

            //=====================

            //Группировка по ГК

            //=====================

            ОблГрПоГК = Макет.ПолучитьОбласть("ГруппировкаПоГК");

    ВыборкаГК = ПолучитьИтогиПоГК();

           

            Пока ВыборкаГК.Следующий() Цикл

                        ОблГрПоГК.Параметры.ЗаголовокГруппировкиПоГК = ?(ЗначениеЗаполнено(ВыборкаГК.ГруппаКомпаний), "ИТОГО ПО" + ВыборкаГК.ГруппаКомпаний, "ИТОГО БЕЗ ГК");

                        ОблГрПоГК.Параметры.ЛюдиСвои = ВыборкаГК.ЛюдиСвои;

                        ОблГрПоГК.Параметры.ЛюдиНайм = ВыборкаГК.ЛюдиНайм;

                        ОблГрПоГК.Параметры.ЛюдиИтого = ВыборкаГК.ЛюдиИтого;

                        ОблГрПоГК.Параметры.ТехникаСвоя = ВыборкаГК.ТехникаСвоя;

                        ОблГрПоГК.Параметры.ТехникаНайм = ВыборкаГК.ТехникаНайм;

                        ОблГрПоГК.Параметры.ТехникаИтого = ВыборкаГК.ТехникаИтого;

                       

                        ТабДок.Вывести(ОблГрПоГК);

                       

                        //=========================

                        //Группировка по Компании

                        //=========================

                        ОблГрПоКомпании = Макет.ПолучитьОбласть("ГруппировкаПоКомпании");          

                ВыборкаИтоговПоКомпании = ПолучитьИтогиПоКомпании(ВыборкаГК.ГруппаКомпаний);

                       

                        Пока ВыборкаИтоговПоКомпании.Следующий() Цикл 

                                   ОблГрПоКомпании.Параметры.Компания = ВыборкаИтоговПоКомпании.Компания;

                                   ОблГрПоКомпании.Параметры.ЛюдиСвои = ВыборкаИтоговПоКомпании.ЛюдиСвои;

                                   ОблГрПоКомпании.Параметры.ЛюдиНайм = ВыборкаИтоговПоКомпании.ЛюдиНайм;

                                   ОблГрПоКомпании.Параметры.ЛюдиИтого = ВыборкаИтоговПоКомпании.ЛюдиИтого;

                                   ОблГрПоКомпании.Параметры.ТехникаСвоя = ВыборкаИтоговПоКомпании.ТехникаСвоя;

                                   ОблГрПоКомпании.Параметры.ТехникаНайм = ВыборкаИтоговПоКомпании.ТехникаНайм;

                                   ОблГрПоГК.Параметры.ТехникаИтого = ВыборкаИтоговПоКомпании.ТехникаИтого;

                                  

                                   ТабДок.Вывести(ОблГрПоКомпании);

                                  

                                   //======================

                                   //Область "Строка"

                                   //======================

                                   ОблСтр = Макет.ПолучитьОбласть("Строка");

                                   ВыборкаПоКомпании = ПолучитьВыборкуПоКомпании(ВыборкаИтоговПоКомпании.Компания);

                                  

                                   Пока ВыборкаПоКомпании.Следующий() Цикл             

                                               ОблСтр.Параметры.ФИО = ВыборкаПоКомпании.ФИО;

                                               ОблСтр.Параметры.УправляющаяОрганизация = ВыборкаПоКомпании.Компания;

                                               ОблСтр.Параметры.Должность = ВыборкаПоКомпании.Должность;

                                               ОблСтр.Параметры.ЛюдиСвои = ВыборкаПоКомпании.ЛюдиСвои;

                                               ОблСтр.Параметры.ЛюдиНайм = ВыборкаПоКомпании.ЛюдиНайм;

                                               ОблСтр.Параметры.ЛюдиИтого = ВыборкаПоКомпании.ЛюдиИтого;

                                               ОблСтр.Параметры.ТехникаСвоя = ВыборкаПоКомпании.ТехникаСвоя;

                                               ОблСтр.Параметры.ТехникаНайм = ВыборкаПоКомпании.ТехникаНайм;

                                               ОблСтр.Параметры.ТехникаИтого = ВыборкаПоКомпании.ТехникаИтого;

                                               ОблСтр.Параметры.Телефон = ФорматированиеТелефона(ВыборкаПоКомпании.Телефон);

                                               ОблСтр.Параметры.ЧислоЗвонков = ВыборкаПоКомпании.ЧислоЗвонков;

                                               ОблСтр.Параметры.ВремяЗвонков = Формат(ВыборкаПоКомпании.ВремяЗвонков, "ДФ=чч:мм");

                                               ОблСтр.Параметры.Состояние = ВыборкаПоКомпании.Состояние;

                                              

                                               ТабДок.Вывести(ОблСтр);             

                                   КонецЦикла;                                    

                        КонецЦикла;

                       

            КонецЦикла;

           

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

           

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