В начало

Результат отчета в модуле формы отчета

 

            Нужно получить результат отчета в модуле формы отчета для дальнейшей работы с ними.

Создаем внешний отчет, создаем форму отчета для размещения на ней кнопки. При создании формы отчета станут доступны виды сравнения у отборов и параметров, если будет установлен режим отображения «Быстрый доступ».

Также создаем реквизит отчета с типом «Строка» неограниченной длины, чтобы потом помещать туда массив ссылок для передачи в модуль формы.

Рис. Внешний отчет

 

            Отчет будем формировать программно, иначе не удастся получить данные отчета. Создаем набор данных типа «Объект». Добавляем необходимые поля для отчета.

Рис. Закладка «Наборы данных»

 

            Далее открываем модуль объекта отчета и редактируем обработчик «При компоновке результата». При помощи функции «ЗначениеВСтрокуВнутр()» сохраняем колонку с ссылками из таблицы значений, выгружаемой запросом. Поскольку теперь отчет выводится программно,  то нужно самим прописать условия по отборам.

 

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

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

           

            СтандартнаяОбработка = Ложь;  

                       

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

            Настройки = КомпоновщикНастроек.ПолучитьНастройки();     

           

            //Инициализация признаков использования отборов

            исГород =Ложь;

            исТелефон = Ложь; 

            исПочта = Ложь;

            исУК = Ложь;

            исДолгСУчетомОплатыТекущегоМесяцаМин = Ложь;

            исДолгСУчетомОплатыТекущегоМесяцаМакс = Ложь;

            исМесяцевДолгаОт = Ложь;

            исМесяцевДолгаДо = Ложь;

           

            Для Каждого Эл Из Настройки.Отбор.Элементы Цикл 

                        Если Эл.Использование Тогда

                                  

                                   Если Строка(Эл.ЛевоеЗначение) = "Город" И

                                                Строка(Эл.ВидСравнения) = "В списке" Тогда

                                               исГород = Истина;

                                               сзГород = Эл.ПравоеЗначение;

                                   КонецЕсли;

                                  

                                   Если Строка(Эл.ЛевоеЗначение) = "Телефон" И

                                                Строка(Эл.ВидСравнения) = "Заполнено" Тогда

                                               исТелефон = Истина;

                                   КонецЕсли;

 

                                   Если Строка(Эл.ЛевоеЗначение) = "Почта" И

                                                Строка(Эл.ВидСравнения) = "Заполнено" Тогда

                                               исПочта = Истина;

                                   КонецЕсли;

 

                                   Если Строка(Эл.ЛевоеЗначение) = "УК" И

                                                Строка(Эл.ВидСравнения) = "Равно" Тогда

                                               исУК = Истина;

                                               УК = Эл.ПравоеЗначение;

                                   КонецЕсли;

                                  

                                   Если Строка(Эл.ЛевоеЗначение) = "ДолгСУчетомОплатыТекущегоМесяца" И

                                                Строка(Эл.ВидСравнения) = "Больше или равно" Тогда

                                               исДолгСУчетомОплатыТекущегоМесяцаМин = Истина;

                                               ДолгСУчетомОплатыТекущегоМесяцаМин = Эл.ПравоеЗначение;

                                   КонецЕсли;

 

                                   Если Строка(Эл.ЛевоеЗначение) = "ДолгСУчетомОплатыТекущегоМесяца" И

                                                Строка(Эл.ВидСравнения) = "Меньше или равно" Тогда

                                               исДолгСУчетомОплатыТекущегоМесяцаМакс = Истина;

                                               ДолгСУчетомОплатыТекущегоМесяцаМакс = Эл.ПравоеЗначение;

                                   КонецЕсли;

 

                                   Если Строка(Эл.ЛевоеЗначение) = "МесяцевДолга" И

                                                Строка(Эл.ВидСравнения) = "Больше или равно" Тогда

                                               исМесяцевДолгаОт = Истина;

                                               МесяцевДолгаОт = Эл.ПравоеЗначение;

                                   КонецЕсли;

 

                                   Если Строка(Эл.ЛевоеЗначение) = "МесяцевДолга" И

                                                Строка(Эл.ВидСравнения) = "Меньше или равно" Тогда

                                               исМесяцевДолгаДо = Истина;

                                               МесяцевДолгаДо = Эл.ПравоеЗначение;

                                   КонецЕсли;

                                  

                        КонецЕсли;  

            КонецЦикла;

           

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

           

            МойЗапрос.Текст = "ВЫБРАТЬ

                              |     Партнеры.УК_ЛицевойСчетЕИРЦ КАК ЛС,

                              |     Партнеры.Ссылка КАК Ссылка,

                              |     F1_СоглашениеОРассрочкеПлатежа.Должник КАК Должник,

                              |     Партнеры.ДолгСУчетомОплатыТекущегоМесяца КАК ДолгСУчетомОплатыТекущегоМесяца,

                              |     Партнеры.F1_ТелефонСтрока КАК Телефон,

                              |     Партнеры.УК_Почта КАК Почта,

                              |     Партнеры.F1_Город КАК Город,

                              |     Партнеры.F1_УправляющаяКомпания КАК УК,

                              |     Партнеры.F1_МесяцевДолга КАК МесяцевДолга

                              |ИЗ

                              |     Справочник.Партнеры КАК Партнеры

                              |                 ЛЕВОЕ СОЕДИНЕНИЕ Документ.F1_СоглашениеОРассрочкеПлатежа КАК F1_СоглашениеОРассрочкеПлатежа

                              |                 ПО (F1_СоглашениеОРассрочкеПлатежа.Должник = Партнеры.Ссылка)

                              |ГДЕ

                              |     F1_СоглашениеОРассрочкеПлатежа.Должник ЕСТЬ NULL

                              |     И 1 = 1

                              |     И 2 = 2

                              |     И 3 = 3

                              |     И 4 = 4

                              |     И 5 = 5

                              |     И 6 = 6

                              |     И 7 = 7

                              |     И 8 = 8";     

           

            //Добавляем условия в запрос и задаем параметры

            Если исГород Тогда

                        МойЗапрос.Текст = СтрЗаменить(МойЗапрос.Текст, "1 = 1", "Партнеры.F1_Город В (&Город)");

                        МойЗапрос.УстановитьПараметр("Город", сзГород);

            КонецЕсли;

 

            Если исТелефон Тогда

                        МойЗапрос.Текст = СтрЗаменить(МойЗапрос.Текст, "2 = 2", "Партнеры.F1_ТелефонСтрока <> """"");

            КонецЕсли;

 

            Если исПочта Тогда

                        МойЗапрос.Текст = СтрЗаменить(МойЗапрос.Текст, "3 = 3", "Партнеры.УК_Почта <> """"");

            КонецЕсли;

 

            Если исУК Тогда

                        МойЗапрос.Текст = СтрЗаменить(МойЗапрос.Текст, "4 = 4", "Партнеры.F1_УправляющаяКомпания = &УК");

                        МойЗапрос.УстановитьПараметр("УК", УК);

            КонецЕсли;

 

            Если исДолгСучетомОплатыТекущегоМесяцаМин Тогда

                        МойЗапрос.Текст = СтрЗаменить(МойЗапрос.Текст, "5 = 5", "Партнеры.ДолгСУчетомОплатыТекущегоМесяца >= &ДолгСУчетомОплатыТекущегоМесяцаМин");

                        МойЗапрос.УстановитьПараметр("ДолгСучетомОплатыТекущегоМесяцаМин", ДолгСучетомОплатыТекущегоМесяцаМин);

            КонецЕсли;

 

            Если исДолгСучетомОплатыТекущегоМесяцаМакс Тогда

                        МойЗапрос.Текст = СтрЗаменить(МойЗапрос.Текст, "6 = 6", "Партнеры.ДолгСУчетомОплатыТекущегоМесяца <= &ДолгСУчетомОплатыТекущегоМесяцаМакс");

                        МойЗапрос.УстановитьПараметр("ДолгСучетомОплатыТекущегоМесяцаМакс", ДолгСучетомОплатыТекущегоМесяцаМакс);

            КонецЕсли;

 

            Если исМесяцевДолгаОт Тогда

                        МойЗапрос.Текст = СтрЗаменить(МойЗапрос.Текст, "7 = 7", "Партнеры.F1_МесяцевДолга >= &МесяцевДолгаОт");

                        МойЗапрос.УстановитьПараметр("МесяцевДолгаОт", МесяцевДолгаОт);

            КонецЕсли;

 

            Если исМесяцевДолгаДо Тогда

                        МойЗапрос.Текст = СтрЗаменить(МойЗапрос.Текст, "8 = 8", "Партнеры.F1_МесяцевДолга <= &МесяцевДолгаДо");

                        МойЗапрос.УстановитьПараметр("МесяцевДолгаДо", МесяцевДолгаДо);

            КонецЕсли;

                       

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

           

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

                        Возврат;

            КонецЕсли;    

                       

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

           

            //***************************************************************************

            ВыгрузкаДляБота = ЗначениеВСтрокуВнутр(Выгрузка.ВыгрузитьКолонку("Ссылка"));

            //***************************************************************************

                       

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

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

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

           

            ВнешнийНаборДанных = Новый Структура("НаборДанных2", Выгрузка);

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

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

           

            ДокументРезультат.Очистить();

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

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

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

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

 

            Далее переходим в модуль формы отчета, где добавляем кнопку и обработчик к ней.

Рис. Форма отчета в конфигураторе

 

            В модуле формы нужно при помощи функции «ЗначениеИзСтрокиВнутр()» преобразовать данные, которые были переданы из модуля объекта отчета. Данную функцию нужно вызывать в контексте сервера.

 

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

&НаСервере

Функция ПолучитьВыгрузкуНаСервере()

           

            Если ЗначениеЗаполнено(Отчет.ВыгрузкаДляБота) Тогда       

                        //*****************************************************

                        Возврат ЗначениеИзСтрокиВнутр(Отчет.ВыгрузкаДляБота);

                        //*****************************************************

            Иначе

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

            КонецЕсли;  

           

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

 

&НаКлиенте

Процедура СоздатьЗаданиеДляБота(Команда)

 

            МассивСсылок = ПолучитьВыгрузкуНаСервере();    

           

            Если НЕ ЗначениеЗаполнено(МассивСсылок) Тогда

                        Сообщить("Сначала нужно сформировать отчет");

                        Возврат;

            КонецЕсли;  

           

            Парам1 = Новый Структура("МассивСсылок", МассивСсылок);

           

            ОткрытьФорму("Справочник.Партнеры.Форма.ФормаВводаПараметровБота", Парам1, ЭтаФорма);

           

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

 

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