В начало

Динамическое программное создание колонок в отчете

 

Нужно создать отчет с программным динамическим созданием колонок, нужно добавить колонки на закладке СКД «Наборы данных», далее добавить их в выбранные поля на закладке «Настройки -> Выбранные поля», а также заполнить их значения.

 

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

Функция МикрорайонИзУлицы(Знач стрУлица)

           

            Если СтрНайти(стрУлица, "Мкр ") <> 0 Тогда

                        ПозОт = СтрНайти(стрУлица, "Мкр ");

                        ПозДо = СтрНайти(стрУлица, " " , , ПозОт + 4);

                        Возврат Сред(стрУлица, ПозОт + 4, ПозДо - 5);

            Иначе    

                        Возврат "";

            КонецЕсли;   

           

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

 

Функция УдалитьСимволСКонца(Знач СтрВх, Знач стрУдаляемый)

            СтрВх = СокрЛП(СтрВх);

            Если Прав(СтрВх, 1) = стрУдаляемый Тогда

                        Возврат Сред(СтрВх, 1, СтрДлина(СтрВх)-1);

            Иначе

                        Возврат СтрВх;

            КонецЕсли;   

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

 

Функция ДатыПостановленийОВозбужденииИПизТЧ(Знач СсылкаНаБП)

           

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

                        Возврат "";

            Иначе         

                        стрДаты = "";

                       

                        Для Каждого Эл Из СсылкаНаБП.ВместоНомераИП Цикл                

                                   Если ЗначениеЗаполнено(Эл.ДатаПостановленияОВозбужденииИП) Тогда

                                               стрДаты = стрДаты + Формат(Эл.ДатаПостановленияОВозбужденииИП, "ДФ=dd.MM.yyyy") + ", ";

                                   КонецЕсли;

                        КонецЦикла;

                       

                        Возврат УдалитьСимволСКонца(стрДаты, ",");

            КонецЕсли;

           

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

 

Функция ДатыПостановленийОбОкончанииИПизТЧ(Знач СсылкаНаБП)

           

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

                        Возврат "";

            Иначе         

                        стрДаты = "";

                       

                        Для Каждого Эл Из СсылкаНаБП.ВместоНомераИП Цикл                

                                    Если ЗначениеЗаполнено(Эл.ДатаПостановленияОбОкончанииИП) Тогда

                                               стрДаты = стрДаты + Формат(Эл.ДатаПостановленияОбОкончанииИП, "ДФ=dd.MM.yyyy") + ", ";

                                   КонецЕсли;

                        КонецЦикла;

                       

                        Возврат УдалитьСимволСКонца(стрДаты, ",");

            КонецЕсли;

           

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

 

Функция НомераИПизТЧ(Знач СсылкаНаБП)

           

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

                        Возврат "";

            Иначе         

                        стрНомера = "";

                       

                        Для Каждого Эл Из СсылкаНаБП.ВместоНомераИП Цикл                

                                   Если ЗначениеЗаполнено(Эл.НомерИП) Тогда

                                               стрНомера = стрНомера + Эл.НомерИП + ", ";

                                   КонецЕсли;

                        КонецЦикла;

                       

                        Возврат УдалитьСимволСКонца(стрНомера, ",");

            КонецЕсли;

           

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

 

Функция СтатьиОкончанияФЗобИПизТЧ(Знач СсылкаНаБП)

           

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

                        Возврат "";

            Иначе         

                        стрСтатьи = "";

                       

                        Для Каждого Эл Из СсылкаНаБП.ВместоНомераИП Цикл                

                                   Если ЗначениеЗаполнено(Эл.СтатьяОкончанияФЗобИП) Тогда

                                               стрСтатьи = стрСтатьи + Эл.СтатьяОкончанияФЗобИП + ", ";

                                   КонецЕсли;

                        КонецЦикла;

                       

                        Возврат УдалитьСимволСКонца(стрСтатьи, ",");

            КонецЕсли;

           

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

 

Функция ПоследняяДатаПеречисленияИзТЧВзысканоПоИП(Знач СсылкаНаБП)

           

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

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

                        "ВЫБРАТЬ ПЕРВЫЕ 1

                        |           CRM_БизнесПроцессВзысканоПоИП.Период КАК Период

                        |ИЗ

                        |           БизнесПроцесс.CRM_БизнесПроцесс.ВзысканоПоИП КАК CRM_БизнесПроцессВзысканоПоИП

                        |ГДЕ

                        |           CRM_БизнесПроцессВзысканоПоИП.Ссылка = &СсылкаНаБП

                        |

                        |УПОРЯДОЧИТЬ ПО

                        |           Период УБЫВ";

           

            Запрос.УстановитьПараметр("СсылкаНаБП", СсылкаНаБП);

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

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

           

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

                        Возврат Выборка.Период;

            Иначе

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

            КонецЕсли;

           

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

 

Функция МаксимальноеЧислоОтветчиков(Знач ДатаСудебногоПроцессаНачало, Знач ДатаСудебногоПроцессаКонец, Знач Истец, Знач Город)

           

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

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

            "ВЫБРАТЬ ПЕРВЫЕ 1

            |           КОЛИЧЕСТВО(CRM_БизнесПроцессОтветчики.Ссылка) КАК Количество,

            |           CRM_БизнесПроцессОтветчики.Ссылка КАК Ссылка

            |ИЗ

            |           БизнесПроцесс.CRM_БизнесПроцесс.Ответчики КАК CRM_БизнесПроцессОтветчики

            |ГДЕ

            |           CRM_БизнесПроцессОтветчики.Ссылка.Дата >= &ДатаСудебногоПроцессаНачало

            |           И CRM_БизнесПроцессОтветчики.Ссылка.Дата <= &ДатаСудебногоПроцессаКонец

            |           И 1 = 1

            |           И 2 = 2

            |

            |СГРУППИРОВАТЬ ПО

            |           CRM_БизнесПроцессОтветчики.Ссылка

            |

            |УПОРЯДОЧИТЬ ПО

            |           Количество УБЫВ";     

           

           

            Запрос.УстановитьПараметр("ДатаСудебногоПроцессаНачало", ДатаСудебногоПроцессаНачало);   

            Запрос.УстановитьПараметр("ДатаСудебногоПроцессаКонец", ДатаСудебногоПроцессаКонец);

           

            Если ЗначениеЗаполнено(Город) Тогда

                        Запрос.Текст = СтрЗаменить(Запрос.Текст, "1 = 1", "CRM_БизнесПроцессОтветчики.Ссылка.Партнер.F1_Город В(&Город)");

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

            КонецЕсли;

           

            Если ЗначениеЗаполнено(Истец) Тогда

                        Запрос.Текст = СтрЗаменить(Запрос.Текст, "2 = 2", "CRM_БизнесПроцессОтветчики.Ссылка.Истец = &Истец");

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

            КонецЕсли;

           

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

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

           

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

                        Возврат Выборка.Количество;

            Иначе

                        Возврат 0;

            КонецЕсли;

           

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

 

Функция ДанныеОтветчикаИзТаблицыОтветчики(Знач СсылкаНаБП, Знач НомерОтветчика) 

           

            ДО = Новый Структура;     

           

            ДО.Вставить("ФИО", СсылкаНаБП.Ответчики[НомерОтветчика - 1].Ответчик.ФИО);       

            ДО.Вставить("ДатаРождения", СсылкаНаБП.Ответчики[НомерОтветчика - 1].Ответчик.ДатаРождения);          

            ДО.Вставить("ИНН", СсылкаНаБП.Ответчики[НомерОтветчика - 1].Ответчик.ИНН);        

           

            Возврат ДО;

           

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

 

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

 

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

           

            ДатаСудебногоПроцессаНачало = Дата(1,1,1);

            ДатаСудебногоПроцессаКонец = Дата(1,1,1);

            Город = Справочники.F1_Города.ПустаяСсылка();

            Истец = Справочники.УК_ПоставщикиУслуг.ПустаяСсылка();

                                  

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

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

           

            ПараметрКомпоновкиДанныхСудебногоПроцессаНачало = Новый ПараметрКомпоновкиДанных("ДатаСудебногоПроцессаНачало");

            ПараметрКомпоновкиДанныхСудебногоПроцессаКонец = Новый ПараметрКомпоновкиДанных("ДатаСудебногоПроцессаКонец");

            ПараметрГород = Новый ПараметрКомпоновкиДанных("Город");

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

           

            Для Каждого СтрЭлемент из КомпоновщикНастроек.ПользовательскиеНастройки.Элементы Цикл 

                       

                        //Параметры

                        Если СтрЭлемент.Использование = Истина И

                                    Тип(СтрЭлемент) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных")  Тогда

                                   Если СтрЭлемент.Параметр = ПараметрКомпоновкиДанныхСудебногоПроцессаНачало Тогда

                                               ДатаСудебногоПроцессаНачало = СтрЭлемент.Значение.Дата;           

                                              

                                   ИначеЕсли СтрЭлемент.Параметр = ПараметрКомпоновкиДанныхСудебногоПроцессаКонец Тогда

                                               ДатаСудебногоПроцессаКонец = СтрЭлемент.Значение.Дата;

                                              

                                   ИначеЕсли СтрЭлемент.Параметр = ПараметрГород Тогда

                                               Город = СтрЭлемент.Значение;                                        

 

                                   ИначеЕсли СтрЭлемент.Параметр = ПараметрИстец Тогда

                                               Истец = СтрЭлемент.Значение;                                                                                       

                                   КонецЕсли;                                                             

                        КонецЕсли;      

                       

                        //Отборы

                        Если  СтрЭлемент.Использование = Истина И   

                                     Тип(СтрЭлемент) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда    

                                     ыыы=1;

                        КонецЕсли;              

            КонецЦикла;  

           

           

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

           

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

                              |     CRM_БизнесПроцесс.Ссылка КАК СсылкаНаБП,

                              |     CRM_БизнесПроцесс.Номер КАК НомерБП,

                              |     CRM_БизнесПроцесс.Партнер.УК_ЛицевойСчетРЦ КАК НомерЛС,

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

                              |     CRM_БизнесПроцесс.Партнер.УК_ФизЛицо.ФИО КАК ФИОСобственникаНанимателя,

                              |     CRM_БизнесПроцесс.Партнер.УК_ФизЛицо.ДатаРождения КАК ФизЛицоДатаРождения,

                              |     CRM_БизнесПроцесс.Партнер.УК_ФизЛицо.ИНН КАК ФизЛицоИНН,

                              |     CRM_БизнесПроцесс.Партнер.F1_Город КАК Город,

                              |     CRM_БизнесПроцесс.Партнер.F1_Улица КАК Улица,

                              |     CRM_БизнесПроцесс.Партнер.F1_Дом.НомерДома КАК Дом,

                              |     CRM_БизнесПроцесс.Партнер.УК_Помещение.НомерПомещенияРЦ КАК Квартира,

                              |     CRM_БизнесПроцесс.НачалоПЗ КАК НачалоПЗ,

                              |     CRM_БизнесПроцесс.КонецПЗ КАК КонецПЗ,

                              |     CRM_БизнесПроцесс.СуммаИска КАК СуммаИска,

                              |     CRM_БизнесПроцесс.СуммаПошлины КАК СуммаПошлины,

                              |     CRM_БизнесПроцесс.ДатаПодачиВСудСП КАК ДатаПодачиСП,

                              |     CRM_БизнесПроцесс.СудебныйУчасток.Наименование КАК НаименованиеСудебногоУчастка,

                              |     CRM_БизнесПроцесс.ДатаВынесенияСП КАК ДатаВынесенияСП,

                              |     CRM_БизнесПроцесс.НомерДелаСП КАК НомерСП,

                              |     CRM_БизнесПроцесс.ДатаОтменыСП КАК ДатаОтменыСП,

                              |     CRM_БизнесПроцесс.ДатаПодачиВСудИЗ КАК ДатаПодачиИЗвСуд,

                              |     CRM_БизнесПроцесс.НомерДелаИска КАК НомерДелаИска,

                              |     CRM_БизнесПроцесс.СуммаПоРешению КАК СуммаПоРешению,

                              |     CRM_БизнесПроцесс.СуммаПениПоРешению КАК СуммаПениПоРешению,

                              |     CRM_БизнесПроцесс.ДатаПодачиИДвСберБанк КАК ДатаПодачиИДвСберБанк,

                              |     CRM_БизнесПроцесс.ДатаНаправленияИДвФССП КАК ДатаНаправленияИДвФССП,

                              |     CRM_БизнесПроцесс.Партнер.F1_УправляющаяКомпания КАК УК,

                              |     CRM_БизнесПроцесс.Истец КАК Истец

                              |ИЗ

                              |     БизнесПроцесс.CRM_БизнесПроцесс КАК CRM_БизнесПроцесс

                              |ГДЕ

                              |     CRM_БизнесПроцесс.Дата >= &ДатаСудебногоПроцессаНачало

                              |     И CRM_БизнесПроцесс.Дата <= &ДатаСудебногоПроцессаКонец

                              |     И 1 = 1

                              |     И 2 = 2";     

           

           

            МойЗапрос.УстановитьПараметр("ДатаСудебногоПроцессаНачало", ДатаСудебногоПроцессаНачало);   

            МойЗапрос.УстановитьПараметр("ДатаСудебногоПроцессаКонец", ДатаСудебногоПроцессаКонец); 

           

            Если ЗначениеЗаполнено(Город) Тогда

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

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

            КонецЕсли;

           

            Если ЗначениеЗаполнено(Истец) Тогда

                        МойЗапрос.Текст = СтрЗаменить(МойЗапрос.Текст, "2 = 2", "CRM_БизнесПроцесс.Истец = &Истец");

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

            КонецЕсли;

           

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

           

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

                        Возврат;

            КонецЕсли;    

                       

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

           

            //Дополнительные колонки

            Выгрузка.Колонки.Добавить("Микрорайон");

            Выгрузка.Колонки.Добавить("ДатаВозбужденияИП");

            Выгрузка.Колонки.Добавить("НомерИП");         

            Выгрузка.Колонки.Добавить("ДатаОкончанияИП");

            Выгрузка.Колонки.Добавить("СтатьяОкончанияФЗобИП");

            Выгрузка.Колонки.Добавить("ДатаПеречисленияСредствВАдресУК");

           

            ЧислоОтветчиков = МаксимальноеЧислоОтветчиков(ДатаСудебногоПроцессаНачало, ДатаСудебногоПроцессаКонец, Истец, Город);

           

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

            //Добавляем поля Ответчиков в набор данных

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

            Для Инд = 1 по ЧислоОтветчиков Цикл

                        Поле1 = СхемаКомпоновкиДанных.НаборыДанных.НаборДанных1.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));

        Поле1.Заголовок = "ФиоОтветчика" + Инд;

        Поле1.ПутьКДанным = "ФиоОтветчика" + Инд;

        Поле1.Поле = "ФиоОтветчика" + Инд;

                        //Поле.ТипЗначения    = Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(15, 2));

                       

                        Поле2 = СхемаКомпоновкиДанных.НаборыДанных.НаборДанных1.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));

        Поле2.Заголовок = "ДатаРожденияОтветчика" + Инд;

        Поле2.ПутьКДанным = "ДатаРожденияОтветчика" + Инд;

        Поле2.Поле = "ДатаРожденияОтветчика" + Инд;

 

                        Поле3 = СхемаКомпоновкиДанных.НаборыДанных.НаборДанных1.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));

        Поле3.Заголовок = "ИННОтветчика" + Инд;

        Поле3.ПутьКДанным = "ИННОтветчика" + Инд;

        Поле3.Поле = "ИННОтветчика" + Инд;

                       

            КонецЦикла;

           

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

            //Добавляем поля в выбранные поля 

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

            Для Инд = 1 по ЧислоОтветчиков Цикл    

                        ВыбрПоле1 = Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));

        ВыбрПоле1.Заголовок = "ФиоОтветчика" + Инд;

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

        ВыбрПоле1.Поле = Новый ПолеКомпоновкиДанных("ФиоОтветчика" + Инд);

                       

                        ВыбрПоле2 = Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));

        ВыбрПоле2.Заголовок = "ДатаРожденияОтветчика" + Инд;

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

        ВыбрПоле2.Поле = Новый ПолеКомпоновкиДанных("ДатаРожденияОтветчика" + Инд);

 

                        ВыбрПоле3 = Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));

        ВыбрПоле3.Заголовок = "ИННОтветчика" + Инд;

        ВыбрПоле3.Использование = Истина;

        ВыбрПоле3.Поле = Новый ПолеКомпоновкиДанных("ИННОтветчика" + Инд);

                       

            КонецЦикла;

                       

            //Добавляем колонки в ТЗ           

            Для Инд = 1 По ЧислоОтветчиков Цикл

                        Выгрузка.Колонки.Добавить("ФиоОтветчика" + Инд);

                        Выгрузка.Колонки.Добавить("ДатаРожденияОтветчика" + Инд);

                        Выгрузка.Колонки.Добавить("ИннОтветчика" + Инд);

            КонецЦикла;                                      

           

           

            //Добавляем данные

            Для Каждого Эл Из Выгрузка Цикл

                        Эл.Микрорайон = МикрорайонИзУлицы(Эл.Улица.Наименование);

                        Эл.ДатаВозбужденияИП = ДатыПостановленийОВозбужденииИПизТЧ(Эл.СсылкаНаБП);

                        Эл.НомерИП = НомераИПизТЧ(Эл.СсылкаНаБП);                   

                        Эл.ДатаОкончанияИП = ДатыПостановленийОбОкончанииИПизТЧ(Эл.СсылкаНаБП);

                        Эл.СтатьяОкончанияФЗобИП = СтатьиОкончанияФЗобИПизТЧ(Эл.СсылкаНаБП);

                        Эл.ДатаПеречисленияСредствВАдресУК = ПоследняяДатаПеречисленияИзТЧВзысканоПоИП(Эл.СсылкаНаБП);

                       

                        Если ЗначениеЗаполнено(Эл.СсылкаНаБП.Ответчики) Тогда

                                   Для Инд = 1 По Эл.СсылкаНаБП.Ответчики.Количество() Цикл

                                                                                             

                                               ДО = ДанныеОтветчикаИзТаблицыОтветчики(Эл.СсылкаНаБП, Инд);

                                               Эл["ФиоОтветчика" + Инд] = ДО.Фио;

                                               Эл["ДатаРожденияОтветчика" + Инд] = Формат(ДО.ДатаРождения, "ДФ=dd.MM.yyyy");

                                               Эл["ИННОтветчика" + Инд] = ДО.ИНН;

                                   КонецЦикла;

                        КонецЕсли;   

                       

            КонецЦикла;

           

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

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

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

           

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

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

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

           

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

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

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

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

           

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