1C Реквизиты табличной части - в Excel Печать
Автор: А.Волос   

Программа выводит в Excel-документ реквизиты всех табличных частей выбранного документа.

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

Excel-таблица хороша тем, что в ней возможны различные акробатические трюки в дальнейшей обработке результатов.

 

- выберите из раскрывающего списка формы имя типа документа.
- далее выберите из второго списка номер документа выбранного типа и нажмите кнопку "Выполнить" .
- программа выведет результат в Excel-таблицу, предварительно попросит указать каталог для сохранения xls-файла.

 

 


Процедура КнопкаВыполнитьНажатие(Кнопка)
        
        ТипДокумента = ЭлементыФормы.ПолеВыбора2.Значение;
        НомерДок     = ЭлементыФормы.ПолеВыбора1.Значение;
        
        Если СокрЛП(ТипДокумента) = "" Тогда
                Предупреждение("Выберите тип документа");
        ИначеЕсли  СокрЛП(НомерДок) = "" Тогда
                Предупреждение("Выберите номер документа");
        Иначе   
                
                ДокСсылка = СсылкаНаДокумент(ТипДокумента, НомерДок);
                ДокОбъект = ДокСсылка.ПолучитьОбъект();

                //создадим табличный документ
                ТипДок  = СокрЛП(ТипДокумента); //имя типа документа
                РеквизитИмя = "";
                РеквизитЗначение = "";

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

                Секция = ТабДок.ПолучитьОбласть("R1");
                Секция.Область("R1C1").Текст = ""; 
                Секция.Область("R1C2").Текст = "";
                Секция.Область("R1C3").Текст = "";
                ТабДок.Вывести(Секция,1,"Группа",Истина); //пробельная строка
                                
                Секция.Область("R1C1").Текст = "Документ:";
                Секция.Область("R1C2").Текст =  ТипДок;  //имя документа
                Секция.Область("R1C3").Текст = "";
                ТабДок.Вывести(Секция,1,"Группа",Истина);
                                
                Секция.Область("R1C1").Текст = ""; 
                Секция.Область("R1C2").Текст = "";
                Секция.Область("R1C3").Текст = "";
                ТабДок.Вывести(Секция,1,"Группа",Истина); //пробельная строка
                                
                ТабДок.НачатьАвтогруппировкуСтрок();
                
//              Создадим таблицу значений и заполним ее
                ТЗДанных = Новый ТаблицаЗначений;
                ТЗДанных.Колонки.Добавить("Документ",   Новый ОписаниеТипов("Строка"));
                ТЗДанных.Колонки.Добавить("ТабЧасть",   Новый ОписаниеТипов("Строка"));
                ТЗДанных.Колонки.Добавить("Реквизит",   Новый ОписаниеТипов("Строка"));
                ТЗДанных.Колонки.Добавить("ЗначениеРеквизита",  Новый ОписаниеТипов("Строка"));
                
                СтрокаВсехРеквизитов = 
                "
                |Метаданные.Документы."+ТипДок+".ТабличныеЧасти.*.Реквизиты.*
                |";
        
                МассивСтрокМногострочнойСтроки = ПолучитьМассивСтрокМногострочнойСтроки(СтрокаВсехРеквизитов);
                
                мМассивСтрок = РазвернутьМассивСтрокОбходаМетаданных(МассивСтрокМногострочнойСтроки, "*", "Имя");
                
                Для Каждого эл Из мМассивСтрок Цикл
                        МасСтрок = РазложитьСтрокуВМассив(эл, ".");
                        НоваяСтрока = ТЗДанных.Добавить();
                        НоваяСтрока.Документ = СокрЛП(МасСтрок[2]);
                        НоваяСтрока.ТабЧасть = СокрЛП(МасСтрок[4]);
                        НоваяСтрока.Реквизит = СокрЛП(МасСтрок[6]);
                        НоваяСтрока.ЗначениеРеквизита = "Знач. Реквизита";
                        
                КонецЦикла;             

                //Инициируем табличное поле данными из таблицы значений
                //ТабличноеПоле1 = ТЗДанных;

                КолонкиТЗ = ТЗДанных.Колонки;
                
                МассивРеквиз          = Новый Массив;
                МассивТабЧастей       = Новый Массив;

                МассивРеквиз.Добавить(ТЗДанных.ВыгрузитьКолонку(КолонкиТЗ[2] ));
                МассивТабЧастей.Добавить(ТЗДанных.ВыгрузитьКолонку(КолонкиТЗ[1] ));

                МасТемп               = новый Массив();
                ТабЧастьИмя               = "";
                колич = МассивРеквиз[0].Количество();
                
                //Просканируем массив таб частей 
                индМассивТабЧастей = 0;
                Для Каждого элем Из МассивТабЧастей Цикл
                        Для Каждого элл Из элем Цикл
                                
                                Если индМассивТабЧастей = 0 Тогда
                                        //Сообщить("Инициируем ТабЧастьИмя");
                                        ТабЧастьИмя = элл;
                                КонецЕсли;      
                                
                                Если ТабЧастьИмя <> элл ИЛИ индМассивТабЧастей > колич-2 Тогда    //если строки не равны или это последний элемент массива
                                        
                                        Если индМассивТабЧастей > колич-2 Тогда
                                                МасТемп.Добавить(МассивРеквиз[0][индМассивТабЧастей]);
                                        КонецЕсли;      
                                        
                                        Сообщить("ТабЧастьИмя: "+ТабЧастьИмя);
                                                                                
                                        Секция.Область("R1C1").Текст = "";
                                        Секция.Область("R1C2").Текст = "";
                                        Секция.Область("R1C3").Текст = "";
                                        ТабДок.Вывести(Секция,2,"Группа 1",Истина); //пробельная строка

                                         
                                        Секция.Область("R1C1").Текст = "Табличная часть: ";
                                        Секция.Область("R1C2").Текст = ТабЧастьИмя; // имя текущей ТабЧасти 
                                        Секция.Область("R1C3").Текст = ""; 
                                        ТабДок.Вывести(Секция,2,"Группа 1",Истина);

                                        // Получим необходимые данные для проведения и проверки заполнения данных по табличной части "Товары".
                                        СтруктураПолей = Новый Структура();
                                        
                                        Для Каждого Элемент из МасТемп Цикл 
                                                СтруктураПолей.Вставить(Элемент, Элемент);
                                        КонецЦикла; 
                                        
                                        //СканПростойСтруктуры(СтруктураПолей);
                                        
                                        Запрос = Новый Запрос;
                                        Запрос.УстановитьПараметр("ДокументСсылка", ДокСсылка);
                                        
                                        Запрос.Текст = мСформироватьЗапросПоТабличнойЧасти2(ДокОбъект, ТабЧастьИмя, СтруктураПолей);

                                        ТаблицаЗнач = Запрос.Выполнить().Выгрузить(); //Пока еще у нас нет переменной Таблица значений

                                        ПоказатьТаблицу(ТаблицаЗнач);


                                        Количество = ТаблицаЗнач.Колонки.Количество();
        
                                        Для каждого Строка из ТаблицаЗнач Цикл
                                               Для Индекс = 0 По Количество-1 Цикл 
          
                                                   РеквизитИмя = СокрЛП(ТаблицаЗнач.Колонки[Индекс].Имя);
                                                   РеквизитЗначение = Строка[СокрЛП(ТаблицаЗнач.Колонки[Индекс].Имя)];
                                                   Секция.Область("R1C1").Текст = ""; 
                                                   Секция.Область("R1C2").Текст = РеквизитИмя; //имя реквизита
                                                   Секция.Область("R1C3").Текст = РеквизитЗначение; //значение реквизита
                                                   ТабДок.Вывести(Секция,3,"Группа 2",Истина);
                                               КонецЦикла;                     

                                               Секция.Область("R1C1").Текст = ""; 
                                               Секция.Область("R1C2").Текст = ""; //
                                               Секция.Область("R1C3").Текст = ""; //
                                               ТабДок.Вывести(Секция,3,"Группа 2",Истина);
                                        КонецЦикла;

                                        ТаблицаЗнач.Очистить();
        
                                        Секция.Область("R1C1").Текст = "";
                                        Секция.Область("R1C2").Текст = "";
                                        Секция.Область("R1C3").Текст = "";
                                        ТабДок.Вывести(Секция,2,"Группа 1",Истина); //пробельная строка

                                        МасТемп.Очистить();
                                        ТабЧастьИмя = элл;
                                        
                                        Если индМассивТабЧастей > колич-2 Тогда
                                                break;  
                                        КонецЕсли;      

                                        
                                КонецЕсли;
                                
                                МасТемп.Добавить(МассивРеквиз[0][индМассивТабЧастей]);
                                
                                индМассивТабЧастей = индМассивТабЧастей+1;
                        КонецЦикла;
                КонецЦикла;
                                

                ТабДок.ЗакончитьАвтогруппировкуСтрок();
                //ТабДок.ИтогиСнизу = Истина;
                ТабДок.ОтображатьСетку = Истина;
                ТабДок.Защита = Ложь;
                ТабДок.ТолькоПросмотр = Истина;
                ТабДок.Показать();

                ИмяФайла = ТипДок + НомерДок;
				
                СохраненитьТабличныйДокументВExcel(ИмяФайла, Ложь, ТабДок);

        КонецЕсли;            
        
КонецПроцедуры 

 

Скачать внешнюю обработку: Реквизиты табличной части - в Excel

 

Обновлено 24.09.2014 11:10