Имя: Пароль:
1C
1С v8
есть тз. с колонками . вычисление по формуле . вывод в СКД.
0 zladenuw
 
30.03.13
03:00
Делаю вот так.
Возможно есть более оптимальней вариант ?

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