Вход | Регистрация

1С:Предприятие ::

Метки:

Очень навороченный отчёт

Я
   Platon
 
08.01.04 - 13:24
Озадачил начальник как всегда супер навороченным отчётом  но как всегда никогда не успеешь за полётом его гениальной мысли. пример рабочего отчёта можно скачать здесь.
Смысл доработки заключается в следующем;
Надо,  добавить ещё строки в которые добавить входящее и исходящее сальдо по этой партии посмотрите может у кого есть соображения а то уже голова у самого не работает надо чью то свежую. Или хотябы правильную мысль подкинте. Возможно ли это в принципе.
Вот код отчёта:
Процедура Сформировать()
    Перем Запрос, ТекстЗапроса, Таб;


    ТабЗнач=СоздатьОбъект("ТаблицаЗначений");
    ТабЗнач.НоваяКолонка("Цех");                                //1

    ТабЗнач.НоваяКолонка("Склад");                              //2

    ТабЗнач.НоваяКолонка("НомПервый");                          //3

    ТабЗнач.НоваяКолонка("ВидОпер");                            //4

    ТабЗнач.НоваяКолонка("ВстречСклад");                        //5

    ТабЗнач.НоваяКолонка("Док");                                //6

    ТабЗнач.НоваяКолонка("Шифр");                               //7

    ТабЗнач.НоваяКолонка("Количество","Число",20,3);            //8

    ТабЗнач.НоваяКолонка("Цена","Число",20,2);                  //9    

    ТабЗнач.НоваяКолонка("СуммаПоПриходу","Число",20,2);        //10

    ТабЗнач.НоваяКолонка("СуммаПоРасходу","Число",20,2);        //11

    ТабЗнач.НоваяКолонка("МатНоменкл");                         //12

    ТабЗнач.НоваяКолонка("Ном");                                //13

    ТабЗнач.НоваяКолонка("Дат");                                //14 

    ТабЗнач.НоваяКолонка("НачОстатокКол","Число",20,3);         //15

    ТабЗнач.НоваяКолонка("НачОстатокСумма","Число",20,2);       //16

    ТабЗнач.НоваяКолонка("КонОстатокКол","Число",20,3);         //17

    ТабЗнач.НоваяКолонка("КонОстатокСум","Число",20,2);         //18    


    ТабЗнач.УдалитьСтроки(); 
  //     ВыбСклад=ВыбСубконто2;

//    ВыбМатериалы=ВыбСубконто1;

    Опер=СоздатьОбъект("Операция");
    
    
            Опер.ВыбратьОперацииСПроводками(ВыбНачПериода, ВыбКонПериода, СчетПоКоду("10"));
    Номер=0;
    Пока Опер.ПолучитьПроводку()=1 Цикл
        Состояние("Обрабатывается документ "+Опер.Документ);
        Если (Опер.Дебет.Счет.Родитель(1)=СчетПоКоду("10")) и (Опер.Дебет.Счет<>СчетПоКоду("10.07")) Тогда
            Если (ПустоеЗначение(Опер.Дебет.Субконто(1))=1) Тогда
                Предупреждение("Не указан материал ("+Опер+")!"); 
                СтатусВозврата(0);
                Возврат;
            КонецЕсли;
            Если (ПустоеЗначение(Опер.Дебет.Субконто(2))=1) Тогда
                Предупреждение("Не указан склад ("+Опер+")!"); 
                СтатусВозврата(0);
                Возврат;
            КонецЕсли;
            Если (ПустоеЗначение(ВыбСклад)=1)
            или ((ПустоеЗначение(ВыбСклад)=0) и (ВыбСклад.ЭтоГруппа()=1) и (Опер.Дебет.Субконто(2).ПринадлежитГруппе(ВыбСклад)=1))
            или ((ПустоеЗначение(ВыбСклад)=0) и (ВыбСклад.ЭтоГруппа()=0) и (Опер.Дебет.Субконто(2)=ВыбСклад)) Тогда
                Если (ПустоеЗначение(ВыбМатериалы)=1)
                или ((ПустоеЗначение(ВыбМатериалы)=0) и (ВыбМатериалы.ЭтоГруппа()=1) и (Опер.Дебет.Субконто(1).ПринадлежитГруппе(ВыбМатериалы)=1))
                или ((ПустоеЗначение(ВыбМатериалы)=0) и (ВыбМатериалы.ЭтоГруппа()=0) и (Опер.Дебет.Субконто(1)=ВыбМатериалы))  Тогда
                    
                    ТабЗнач.НоваяСтрока();
                    Номер=Номер+1;
                 
                    
                    Если ПустоеЗначение(Опер.Дебет.Субконто(2).Родитель.Родитель)=1 Тогда
                        ТабЗнач.УстановитьЗначение(Номер,1,Опер.Дебет.Субконто(2).Родитель);
                    Иначе
                        ТабЗнач.УстановитьЗначение(Номер,1,Опер.Дебет.Субконто(2).Родитель.Родитель);
                    КонецЕсли;  
                    Если (Опер.Кредит.Счет.Родитель(1)=СчетПоКоду("10"))
                    и ((Опер.Кредит.Счет<>СчетПоКоду("10.07"))) Тогда
                        ТабЗнач.УстановитьЗначение(Номер,5,СокрЛП(Опер.Кредит.Субконто(2).Код));  
                    КонецЕсли;
                    
                    ТабЗнач.УстановитьЗначение(Номер,2,Опер.Дебет.Субконто(2));
                    ТабЗнач.УстановитьЗначение(Номер,12,Опер.Дебет.Субконто(1).Код);
                    ТабЗнач.УстановитьЗначение(Номер,3,Лев(СокрЛП(Опер.Дебет.Субконто(1).Код),1));
                
                    ТабЗнач.УстановитьЗначение(Номер,4,СокрЛП(Опер.Дебет.Субконто(3).Код));
                    ТабЗнач.УстановитьЗначение(Номер,6,Опер.Документ);
                    ТабЗнач.УстановитьЗначение(Номер,13,Опер.Документ.НомерДок);
                    ТабЗнач.УстановитьЗначение(Номер,14,Опер.Документ.ДатаДок);
//            Ит=СоздатьОбъект("БухгалтерскиеИтоги");




// Если ПустоеЗначение(ВыбМатериалы)=1 Тогда

//             Ит.ИспользоватьСубконто(ВидыСубконто.Материалы);

//    ИначеЕсли ВыбМатериалы.ЭтоГруппа()=1 Тогда
//        Ит.ИспользоватьСубконто(ВидыСубконто.Материалы,ВыбМатериалы,1);

//    Иначе
//        Ит.ИспользоватьСубконто(ВидыСубконто.Материалы,ВыбМатериалы,2);

//    КонецЕсли;
//    Если ПустоеЗначение(ВыбСклад)=1 Тогда

//        Ит.ИспользоватьСубконто(ВидыСубконто.МестаХранения);
//    ИначеЕсли ВыбСклад.ЭтоГруппа()=1 Тогда

//        Ит.ИспользоватьСубконто(ВидыСубконто.МестаХранения,ВыбСклад,1);
//    Иначе

//        Ит.ИспользоватьСубконто(ВидыСубконто.МестаХранения,ВыбСклад,2);
//    КонецЕсли;

//    Ит.ВключатьСубсчета(-1);
//  Если Ит.ВыполнитьЗапрос(ВыбНачПериода, ВыбКонПериода, СчетПоКоду("10")) = 0 Тогда

//        Возврат;
//    КонецЕсли;    

//    Ит.ВыбратьСубконто(1);
//    Номер1=0;            

//         Пока Ит.ПолучитьСубконто(1)=1 Цикл
//        Ит.ВыбратьСубконто(2);

//        Пока Ит.ПолучитьСубконто(2)=1 Цикл  
//            Ит.ВыбратьСчета();

//            Пока Ит.ПолучитьСчет()=1 Цикл
//                ТабЗнач.НоваяСтрока();

//                Номер1=Номер1+1;
//                Если ПустоеЗначение(Ит.Субконто(2).Родитель.Родитель)=1 Тогда

//                    ТабЗнач.УстановитьЗначение(Номер,1,Ит.Субконто(2).Родитель);
//            Иначе

//                ТабЗнач.УстановитьЗначение(Номер,1,Ит.Субконто(2).Родитель.Родитель);
//                КонецЕсли;

                      
                
               //ТабЗнач.УстановитьЗначение(Номер,3,Лев(СокрЛП(Ит.Субконто(1).Код),3));

//                ТабЗнач.УстановитьЗначение(Номер,15,Ит.СНД("К")-Ит.СНК("К"));
//                ТабЗнач.УстановитьЗначение(Номер,16,Ит.СНД("С")-Ит.СНК("С"));

            
//                ТабЗнач.УстановитьЗначение(Номер,17,Ит.СКД("К")-Ит.СКК("К"));

//                ТабЗнач.УстановитьЗначение(Номер,18,Ит.СКД("С")-Ит.СКК("С")); 
//                      КонецЦикла;

//        КонецЦикла;
//    КонецЦикла;    

                    Если Опер.Документ.Вид()="Операция" Тогда
                        Если (Опер.Кредит.Счет.Родитель(1)=СчетПоКоду("20"))
                        или (Опер.Кредит.Счет.Родитель(1)=СчетПоКоду("23")) Тогда
                            ТабЗнач.УстановитьЗначение(Номер,7,Опер.Кредит.Субконто(2).Код);
                        ИначеЕсли (Опер.Кредит.Счет.Родитель(1)=СчетПоКоду("25"))
                        или (Опер.Кредит.Счет.Родитель(1)=СчетПоКоду("29"))    Тогда
                            ТабЗнач.УстановитьЗначение(Номер,7,Опер.Кредит.Субконто(1).Код);
                        КонецЕсли;
                    ИначеЕсли (Опер.Документ.Вид()="ПоступлениеМатериалов")   Тогда
                        ТабЗнач.УстановитьЗначение(Номер,7,Опер.Документ.ШифрДляПроводки);
                    ИначеЕсли (Опер.Документ.Вид()="ТребованиеНакладная") Тогда 
                        Если ПустоеЗначение(Опер.Документ.Шифр1)=1 Тогда
                            ТабЗнач.УстановитьЗначение(Номер,7,Опер.Документ.Шифр); 
                        Иначе
                            ТабЗнач.УстановитьЗначение(Номер,7,Опер.Документ.Шифр1); 
                        КонецЕсли;
                    ИначеЕсли (Опер.Документ.Вид()="Справка") Тогда 
                        Если ПустоеЗначение(Опер.Документ.ШифрДляПроводки)=1 Тогда
                            ТабЗнач.УстановитьЗначение(Номер,7,Опер.Документ.Шифр); 
                        Иначе
                            ТабЗнач.УстановитьЗначение(Номер,7,Опер.Документ.ШифрДляПроводки); 
                        КонецЕсли;
                    КонецЕсли;
                    ТабЗнач.УстановитьЗначение(Номер,8,Опер.Количество); 
                    Если Опер.Количество=0 Тогда
                        ТабЗнач.УстановитьЗначение(Номер,9,Опер.Сумма); 
                    Иначе
                        ТабЗнач.УстановитьЗначение(Номер,9,Опер.Сумма/Опер.Количество); 
                    КонецЕсли;
                    ТабЗнач.УстановитьЗначение(Номер,10,Опер.Сумма); 
                КонецЕсли;
            КонецЕсли;
        КонецЕсли;
        
        Если (Опер.Кредит.Счет.Родитель(1)=СчетПоКоду("10"))
        и (Опер.Кредит.Счет<>СчетПоКоду("10.07")) Тогда
            Если (ПустоеЗначение(Опер.Кредит.Субконто(1))=1) Тогда
                Предупреждение("Не указан материал ("+Опер+")!"); 
                СтатусВозврата(0);
                Возврат;
            КонецЕсли;
            Если (ПустоеЗначение(Опер.Кредит.Субконто(2))=1) Тогда
                Предупреждение("Не указан склад ("+Опер+")!"); 
                СтатусВозврата(0);
                Возврат;
            КонецЕсли;
            Если (ПустоеЗначение(ВыбСклад)=1)
            или ((ПустоеЗначение(ВыбСклад)=0) и (ВыбСклад.ЭтоГруппа()=1) и (Опер.Кредит.Субконто(2).ПринадлежитГруппе(ВыбСклад)=1))
            или ((ПустоеЗначение(ВыбСклад)=0) и (ВыбСклад.ЭтоГруппа()=0) и (Опер.Кредит.Субконто(2)=ВыбСклад)) Тогда
                Если (ПустоеЗначение(ВыбМатериалы)=1)
                или ((ПустоеЗначение(ВыбМатериалы)=0) и (ВыбМатериалы.ЭтоГруппа()=1) и (Опер.Кредит.Субконто(1).ПринадлежитГруппе(ВыбМатериалы)=1))
                или ((ПустоеЗначение(ВыбМатериалы)=0) и (ВыбМатериалы.ЭтоГруппа()=0) и (Опер.Кредит.Субконто(1)=ВыбМатериалы)) Тогда
                    ТабЗнач.НоваяСтрока();
                    Номер=Номер+1;
                    Если ПустоеЗначение(Опер.Кредит.Субконто(2).Родитель.Родитель)=1 Тогда
                        ТабЗнач.УстановитьЗначение(Номер,1,Опер.Кредит.Субконто(2).Родитель);
                    Иначе
                        ТабЗнач.УстановитьЗначение(Номер,1,Опер.Кредит.Субконто(2).Родитель.Родитель);
                    КонецЕсли;  
                    ТабЗнач.УстановитьЗначение(Номер,2,Опер.Кредит.Субконто(2));
                    ТабЗнач.УстановитьЗначение(Номер,12,Опер.Кредит.Субконто(1).Код);
                    ТабЗнач.УстановитьЗначение(Номер,3,Лев(СокрЛП(Опер.Кредит.Субконто(1).Код),1));
                    ТабЗнач.УстановитьЗначение(Номер,4,СокрЛП(Опер.Кредит.Субконто(3).Код));  
                    Если (Опер.Дебет.Счет.Родитель(1)=СчетПоКоду("10"))
                    и ((Опер.Дебет.Счет<>СчетПоКоду("10.07"))) Тогда
                        ТабЗнач.УстановитьЗначение(Номер,5,СокрЛП(Опер.Дебет.Субконто(2).Код));  
                    КонецЕсли;
                    ТабЗнач.УстановитьЗначение(Номер,6,Опер.Документ);
                    ТабЗнач.УстановитьЗначение(Номер,13,Опер.Документ.НомерДок);
                    ТабЗнач.УстановитьЗначение(Номер,14,Опер.Документ.ДатаДок);
                    Если Опер.Документ.Вид()="Операция" Тогда
                        Если (Опер.Дебет.Счет.Родитель(1)=СчетПоКоду("20"))
                        или (Опер.Дебет.Счет.Родитель(1)=СчетПоКоду("23")) Тогда
                            ТабЗнач.УстановитьЗначение(Номер,7,Опер.Дебет.Субконто(2).Код);
                        ИначеЕсли (Опер.Дебет.Счет.Родитель(1)=СчетПоКоду("25"))
                        или (Опер.Дебет.Счет.Родитель(1)=СчетПоКоду("29"))    Тогда
                            ТабЗнач.УстановитьЗначение(Номер,7,Опер.Дебет.Субконто(1).Код);
                        КонецЕсли;
                    ИначеЕсли (Опер.Документ.Вид()="ПоступлениеМатериалов")   Тогда
                        ТабЗнач.УстановитьЗначение(Номер,7,Опер.Документ.ШифрДляПроводки);
                    ИначеЕсли (Опер.Документ.Вид()="ТребованиеНакладная") Тогда 
                        Если ПустоеЗначение(Опер.Документ.Шифр1)=1 Тогда
                            ТабЗнач.УстановитьЗначение(Номер,7,Опер.Документ.Шифр); 
                        Иначе
                            ТабЗнач.УстановитьЗначение(Номер,7,Опер.Документ.Шифр1); 
                        КонецЕсли;
                    ИначеЕсли (Опер.Документ.Вид()="Справка") Тогда 
                        Если ПустоеЗначение(Опер.Документ.ШифрДляПроводки)=1 Тогда
                            ТабЗнач.УстановитьЗначение(Номер,7,Опер.Документ.Шифр); 
                        Иначе
                            ТабЗнач.УстановитьЗначение(Номер,7,Опер.Документ.ШифрДляПроводки); 
                        КонецЕсли;
                    КонецЕсли;
                    ТабЗнач.УстановитьЗначение(Номер,8,Опер.Количество); 
                    Если Опер.Количество=0 Тогда
                        ТабЗнач.УстановитьЗначение(Номер,9,Опер.Сумма); 
                    Иначе
                        ТабЗнач.УстановитьЗначение(Номер,9,Опер.Сумма/Опер.Количество); 
                    КонецЕсли;
                    ТабЗнач.УстановитьЗначение(Номер,11,Опер.Сумма); 
                КонецЕсли;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    
    Таб=СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Таблица");
    Таб.ВывестиСекцию("Заголовок"); 
    Таб.ВывестиСекцию("Дата");
    Таб.ВывестиСекцию("Шапка");
    
    Состояние("Заполнение выходной таблицы...");
    Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
    ТабЗнач.Сортировать("+1,+2,+3,+12,+14");
    Количество1=0;
    Приход1=0;//цех

    Расход1=0;
    Количество2=0;
    Приход2=0;//склад

    Расход2=0;
    Количество3=0;
    Приход3=0;//материал (1)

    Расход3=0;
    
    НачОстатокКолИтог3=0;
    НачОстатокСуммаИтог3=0;
    КонОстатокКолИтог3=0;
    КонОстатокСуммаИтог3=0;  
    
    ТабЗнач.ВыбратьСтроки();
    Для прм=1 по ТабЗнач.КоличествоСтрок() Цикл  
        Количество1=Количество1+ТабЗнач.ПолучитьЗначение(прм,8);
        Приход1=Приход1+ТабЗнач.ПолучитьЗначение(прм,10);//цех

        Расход1=Расход1+ТабЗнач.ПолучитьЗначение(прм,11); 
        НачОстатокКолИтог1=НачОстатокКолИтог1+ТабЗнач.ПолучитьЗначение(прм,15);
        НачОстатокСуммаИтог1=НачОстатокСуммаИтог1+ТабЗнач.ПолучитьЗначение(прм,16);//группа

            
        КонОстатокКолИтог1=КонОстатокКолИтог1+ТабЗнач.ПолучитьЗначение(прм,17);
        КонОстатокСуммаИтог1=КонОстатокСуммаИтог1+ТабЗнач.ПолучитьЗначение(прм,18);
        Количество2=Количество2+ТабЗнач.ПолучитьЗначение(прм,8);
        Приход2=Приход2+ТабЗнач.ПолучитьЗначение(прм,10);//склад

        Расход2=Расход2+ТабЗнач.ПолучитьЗначение(прм,11);
        НачОстатокКолИтог2=НачОстатокКолИтог2+ТабЗнач.ПолучитьЗначение(прм,15);
        НачОстатокСуммаИтог2=НачОстатокСуммаИтог2+ТабЗнач.ПолучитьЗначение(прм,16);//группа

            
        КонОстатокКолИтог2=КонОстатокКолИтог2+ТабЗнач.ПолучитьЗначение(прм,17);
        КонОстатокСуммаИтог2=КонОстатокСуммаИтог2+ТабЗнач.ПолучитьЗначение(прм,18);
        Количество3=Количество3+ТабЗнач.ПолучитьЗначение(прм,8);
        Приход3=Приход3+ТабЗнач.ПолучитьЗначение(прм,10);//м-л

        Расход3=Расход3+ТабЗнач.ПолучитьЗначение(прм,11);
        
        НачОстатокКолИтог3=НачОстатокКолИтог3+ТабЗнач.ПолучитьЗначение(прм,15);
        НачОстатокСуммаИтог3=НачОстатокСуммаИтог3+ТабЗнач.ПолучитьЗначение(прм,16);//группа

            
        КонОстатокКолИтог3=КонОстатокКолИтог3+ТабЗнач.ПолучитьЗначение(прм,17);
        КонОстатокСуммаИтог3=КонОстатокСуммаИтог3+ТабЗнач.ПолучитьЗначение(прм,18);
        Таб.ВывестиСекцию("ВхСальдо");
        Таб.ВывестиСекцию("Итог1");
        Таб.ВывестиСекцию("ИсхСальдо");
        Если ТабЗнач.КоличествоСтрок()=прм Тогда
            Таб.ВывестиСекцию("Итого1");
        
            
            Таб.ВывестиСекцию("Склад");
            Таб.ВывестиСекцию("Цех"); 
        ИначеЕсли (ТабЗнач.ПолучитьЗначение(прм,1)<>ТабЗнач.ПолучитьЗначение(прм+1,1)) Тогда
            Таб.ВывестиСекцию("Итого1");
        
            Таб.ВывестиСекцию("Склад");
            Таб.ВывестиСекцию("Цех"); 
            Количество1=0;
            Приход1=0;//цех

            Расход1=0;
            Количество2=0;
            Приход2=0;//склад

            Расход2=0;
            Количество3=0;
            Приход3=0;//материал (1)

            Расход3=0;
    НачОстатокКолИтог1=0;
    НачОстатокСуммаИтог1=0;
    КонОстатокКолИтог1=0;
    КонОстатокСуммаИтог1=0;
      НачОстатокКолИтог2=0;
    НачОстатокСуммаИтог2=0;
    КонОстатокКолИтог2=0;
    КонОстатокСуммаИтог2=0;
    НачОстатокКолИтог3=0;
    НачОстатокСуммаИтог3=0;
    КонОстатокКолИтог3=0;
    КонОстатокСуммаИтог3=0;
        ИначеЕсли (ТабЗнач.ПолучитьЗначение(прм,2)<>ТабЗнач.ПолучитьЗначение(прм+1,2)) Тогда
            Таб.ВывестиСекцию("Итого1");
    
            Таб.ВывестиСекцию("Склад");
            Количество2=0;
            Приход2=0;//склад

            Расход2=0;
            Количество3=0;
            Приход3=0;//материал (1)

            Расход3=0;
    НачОстатокКолИтог2=0;
    НачОстатокСуммаИтог2=0;
    КонОстатокКолИтог2=0;
    КонОстатокСуммаИтог2=0;
    НачОстатокКолИтог3=0;
    НачОстатокСуммаИтог3=0;
    КонОстатокКолИтог3=0;
    КонОстатокСуммаИтог3=0;
        ИначеЕсли (ТабЗнач.ПолучитьЗначение(прм,3)<>ТабЗнач.ПолучитьЗначение(прм+1,3)) Тогда
            Таб.ВывестиСекцию("Итого1");
    
            Количество3=0;
            Приход3=0;//материал (1)

            Расход3=0;
            
    НачОстатокКолИтог3=0;
    НачОстатокСуммаИтог3=0;
    КонОстатокКолИтог3=0;
    КонОстатокСуммаИтог3=0;

        КонецЕсли;
    КонецЦикла;
   // ТабЗнач.Свернуть("15,16","15,16");

    Таб.ВывестиСекцию("Всего"); 
    Таб.ТолькоПросмотр(1);      
    Таб.ПараметрыСтраницы(2,,,7,3,7,3,0,5,1);
    Таб.Показать("Оборотка", "");
КонецПроцедуры 
//**************************

Процедура ПриОткрытии()     
//    ВыбНачПериода=НачМесяца(РабочаяДата());

//    ВыбКонПериода=КонМесяца(РабочаяДата());
    ВыбНачПериода = НачалоПериодаБИ();
    ВыбКонПериода = КонецПериодаБИ();
КонецПроцедуры

Могу ещё сам файл скинуть.
 
 


Список тем форума
Рекламное место пустует   Рекламное место пустует
Независимо от того, куда вы едете — это в гору и против ветра!
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Ветка сдана в архив. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует