В начало

Отчеты на разных листах Иксель

 

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

Функция ОтчетАнализЕДСМО_вТабДок)

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

           

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

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

           

            //Параметры отчета

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

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

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

 

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

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

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

           

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

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

           

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

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

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

           

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

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

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

           

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

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

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

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

                                                                      

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

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

 

Функция ОтчетПоЗаявкам_вТабДок()

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

           

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

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

           

            //Параметры отчета

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

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

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

 

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

            Параметр2.Значение = КонецДня(НачалоДня(ТекущаяДата())-1);//Конец предыдущего дня

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

           

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

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

           

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

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

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

           

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

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

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

           

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

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

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

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

                                                                      

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

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

 

Процедура СохранитьМногостраничныйФайл(ИмяФайла, СоответствиеЛистов) Экспорт

 

    Х = ПолучитьCOMОбъект("", "Excel.Application");

    Х.SheetsInNewWorkbook = 1; // в новой книге создавать только 1 лист

    Книга = Х.Workbooks.Add();

 

    Первый = Истина; // у нас уже есть один лист, надо использовать его

    ПрошлыйЛист = Неопределено;

 

    Для Каждого мЛист Из СоответствиеЛистов Цикл

 

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

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

        ТабДок = мЛист.Значение;

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

 

        Х.CutCopyMode = False; // Сбрасываем старое копирование

 

        // Копируем первый (единственный) лист временного файла

        мКнига = Х.Workbooks.Open(ИмяВременногоФайла);

        мКнига.Worksheets(1).Cells.Select();

        Х.Selection.Copy();

 

        Если Первый Тогда // Используем созданный автоматически

            НовыйЛист = Книга.Worksheets(1);

            Первый = Ложь;

        Иначе // добавляем новый

            НовыйЛист = Книга.Worksheets.Add(, ПрошлыйЛист); // Добавляем новый лист после прошлого

        КонецЕсли;

 

        НовыйЛист.Name = мЛист.Ключ; // Задаём имя

        НовыйЛист.Paste(); // Вставляем содержимое

 

        // Сбрасываем выделение с добавленного листа

        НовыйЛист.Activate();

        Х.Range("A1").Select();

 

        ПрошлыйЛист = НовыйЛист;

 

    КонецЦикла;

 

    Х.DisplayAlerts = False; // Отключаем вывод предупреждений типа "Заменить файл?"

    Книга.Worksheets(1).Activate(); // Активируем 1 лист из списка

    Книга.SaveAs(ИмяФайла);

 

    Х.Quit();

 

    Х = Неопределено;

 

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

 

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

            КонецЕсли;

           

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

 

 

&НаСервере

Процедура ОтладкаНаСервере()

           

            ТабДок1 = ОтчетАнализЕДСМО_вТабДок();

            ТабДок2 = ОтчетПоЗаявкам_вТабДок();

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

           

            Листы = Новый Соответствие();

            Листы.Вставить("Лист1", ТабДок2);//Обратный порядок

            Листы.Вставить("Лист2", ТабДок1);

           

            СохранитьМногостраничныйФайл(ВремФайл, Листы);

           

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

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

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

           

            УдалитьФайлы(ВремФайл);

           

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

 

////////////////////////////////////////        

&НаКлиенте

Процедура Отладка(Команда)

            ОтладкаНаСервере();

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