import "layer92.dll" UserAlgorithmCalc(&info,&r) { // инициализация локальных переменных int RetFlag = code_Break, crow = info.crow, b3 = info.b3, ikod = info.ikod, kod_alg = info.kod_alg, pos = info.pos, mkat = info.mkat, krabot = info.krabot, tip_s9600 = info.tip_s9600, flag_propusk0 = info.flag_propusk0, z1 = info.z1, z2 = info.z2; double h[4]; double kod = info.kod, n1 = info.n1, d1 = info.d1, d2 = info.d2, bz = info.bz; h[0] = info.h[0], h[1] = info.h[1], h[2] = info.h[2], h[3] = info.h[3]; int rowkod[ROWMAX],i,m,m1,b1,b2,mvrem; char t[20],str[81],str1[81]; double n2,n3,n4,n5,n6,n7,n8,n9,n10,r8,r9,k; /*-----------------------------------------------------*/ /* tip_s9600=0 - функция обработки СУММЫ по строке */ /* (s9600) - обнуляет РВ, если СУММА==0. */ /* tip_s9600=1 - не обнуляет (в спец.случаях) */ /*-----------------------------------------------------*/ /*-----------------------------------------------------*/ /* Если flag_propusk0=1, то расчет данного вида по его */ /* алгоритму производится только через режимы "Расчет */ /* произвольного вида", "Доп.расчеты" и при расчете от-*/ /* дельной строки в "Просмотре, корректировке ЛС". */ /* flag_propusk0=3, то же, что =1, только в этом случае*/ /* программа работает со строкой вида даже если у нее */ /* вышли даты действия (например, для квартал.дотаций).*/ /* В остальных режимах - если есть СУММА, то подается */ /* на корректировку, иначе - вид пропускается в расчете*/ /*-----------------------------------------------------*/ int c=-4096; switch(kod_alg) { // Сюда можно вставлять вызов собственных алгоритмов расчета. // Примеры функций с алгоритмами находятся // в файле SCRIPT\ALGSYS.S // начало описания алгоритмов пользователя // конец описания алгоритмов пользователя // Пример вызова алгоритма пользователя. //case 4: // return UserAlg4(info,r); // case 712: // return UserAlg712(info,r); case 196: case 197: return UserAlg196_197(info,r); default: RetFlag=0; break; } if ( RetFlag ) { info.crow = crow, info.b3 = b3, info.kod = kod, info.ikod = ikod, info.kod_alg = kod_alg, info.n1 = n1, info.d1 = d1, info.d2 = d2, info.pos = pos, info.mkat = mkat, info.krabot = krabot, info.tip_s9600 = tip_s9600, info.flag_propusk0 = flag_propusk0, info.z1 = z1, info.z2 = z2, info.h[0] = h[0], info.h[1] = h[1], info.h[2] = h[2], info.h[3] = h[3], info.bz = bz; if (c<=-4096) c=1; info.c = c; } return RetFlag; } UserAlg196_197(&info,&r) { r[2] = UserDefineSev_196(mrasch, info.d1, info.d2)*100.; double r9; if(info.kod_alg == 197 ) // ФЗП s1001simv("1","н",info.d1,info.d2,0,ST_RK,r9,2,0); if(info.kod_alg == 196 ) // ФМП s1001simv("2","н",info.d1,info.d2,0,ST_RK,r9,2,0); char t[20]; if((info.c=korrv(r,t,0,info.h,flagrow,jf)) != 1) return code_ReturnCode; info.n1=r9*r[2]/100.; if(FL_V_ALG && uprc != NO_SCREEN) { infolist.add_record("Сумма",r9); infolist.add_record("Северный процент",r[2]); infolist.add_record("Результат",info.n1); } return code_Break; } UserAlg4(&info,&r) { return SysAlg4(info,r); } UserDefineSev_196(month, d1, d2) { int setNumber1=80; int setNumber2=81; double proc_sev = 0; char Str_Work[11]; double p1,p2; kch_from("data_r",Str_Work); // дата рождения var DR=CreateObject("KDate"); DR.SetDate(static_cast_to_string(Str_Work)); DR.ImproveDay(); if ( kch_tip_ps("sever")!='T' ) kch_from("sever",Str_Work); else { char StrStag[81]; var D = CreateObject("KDate"); D.SetDateII(1,month); GetKchDate("sever",Str_Work,10,D); GetKchValue("sever",StrStag,50,D); var DateBeg = CreateObject("KDate"); DateBeg.SetDate(static_cast_to_string(Str_Work)); DateBeg.ImproveDay(); var DatTmp = CreateObject("KDate"); DatTmp.SetDate(static_cast_to_string(StrStag)); DatTmp.ImproveDay(); if ( !DatTmp.IsEqI(INVALID_DATE_VALUE) && DateBeg.IsEqI(INVALID_DATE_VALUE) ) DateBeg.SetDate(DatTmp.GetStr()); else if ( !DateBeg.IsEqI(INVALID_DATE_VALUE) && Str_Cmp(StrStag," "," ") ) { // Это значит что в КЧ задано: на такую то дату у человека был такой-то стаж // и нам надо считать с учетом этих данных var Param = CreateObject("ParamFuncRW"); Param.IInitial(static_cast_to_string(StrStag),",./|;()[]<>\\- лгЛГмМmMдД",3); int CountParam = Param.Count(); if ( CountParam ) { int off_year=atoi(Param.Get(0)); int off_m =0, off_d=0; if ( CountParam>1 ) off_m=atoi(Param.Get(1)); if ( CountParam>2 ) off_d=atoi(Param.Get(2)); if ( off_year>-1 && off_m>-1 && off_d>-1 ) { int CountM = off_year*12+off_m; DateBeg.SetDateII(DateBeg.GetDay(), DateBeg.GetAbs()-CountM); DateBeg.SetDateD(DateBeg.GetOffs(-off_d)); } } } stccpy(Str_Work,DateBeg.GetStr('.'),11); } var DS=CreateObject("KDate"); DS.SetDate(static_cast_to_string(Str_Work)); DS.ImproveDay(); var MRasch=CreateObject("KMonth"); MRasch.SetMonth(month); // расчетный месяц if(MRasch.GetAbs()-DR.GetAbs() <= 360 && !DR.IsEqI(INVALID_DATE_VALUE) ) procent_ot_staga(setNumber1,"sever",1,0,1,EOF,d1,d2,proc_sev); // северные до 30 лет else // обычные северные tabl=81; { procent_ot_staga(setNumber1,"sever",1,0,1,EOF,d1,d2,p1); procent_ot_staga(setNumber2,"sever",1,0,1,EOF,d1,d2,p2); if(p1 == p2) proc_sev=p1; // северные полностью else { if( (DR.GetAbs()+360 < DS.GetAbs() && !DS.IsEqI(INVALID_DATE_VALUE) ) || DR.IsEqI(INVALID_DATE_VALUE)) // северный стаж начался procent_ot_staga(setNumber2,"sever",1,0,1,EOF,d1,d2,proc_sev);// после 30 летия else { DR.SetMonthYear(DR.GetMonth(),DR.GetYear()+30); // 30 летие // Необходимо вычислить "смещение" для даты начала стажа: // 1) Кол-во месяцев до 30-летия идет "месяц за два" (но только // после первых 12 месяцев, первые 12 месяцев считаются одинаково, что // до 30 лет, что после 30 лет) var i=DR.GetAbs()-DS.GetAbs(); if(i-12 >= 0) i=(i-12)*2+12; // else i=0; // не надо ничего обнулять - берем месяцы один к одному! // 2) Кол-во месяцев после 30-летия идут один к одному i += month-DR.GetAbs(); var DS1=CreateObject("KDate"); DS1.SetDateII(DS.GetDay(),month-i); procent_ot_staga(setNumber2,"",1,0,1,EOF,DS1.GetDouble(),d2,proc_sev);// получили % с учетом 30 летия } } } double Epsilon = 0.0000001; return proc_sev / 100.; } UserAlg712(&info,&r) { struct Struct_Alg Work; var mes1=0; var mes2=0; var stolbec=ST_MPREM+1; // символы для выборки // по умолчанию - по всем ненулевым char StrSimv[51]; sprintf(StrSimv,"*"); Get_AlgWithParam(Work,info.ikod); // 31.01.1995 // Work.Count_Par - число паpаметpов для кода алгоpитма //-- параметр 1 - столбец таблицы входимости if(Work.Count_Par > 0) { var i=atoi(reinterpret_cast_to_string(Work.List_Par[0])); if( i > 0 && i <= 99 ) stolbec=i; } //-- параметр 2 - месяц начала выборки (относительно расчетного) // (по умолчанию берется за один текущий месяц) if(Work.Count_Par > 1) { var i=atoi(reinterpret_cast_to_string(Work.List_Par[1])); if( i >= (- PMES) && i <= BMES ) mes1=mes2=i; } //-- параметр 3 - месяц конца выборки (относительно расчетного) // (по умолчанию берется за один месяц, указанный параметром 2) if(Work.Count_Par > 2) { var i=atoi(reinterpret_cast_to_string(Work.List_Par[2])); if( i >= mes1 && i <= BMES ) mes2=i; } //-- параметр 4 - символы выборки if(Work.Count_Par > 3) sprintf(StrSimv,"%.50s",reinterpret_cast_to_string(Work.List_Par[3])); var n5=0.; for(var m=mes1; m<=mes2; m++) { double r9; s1001simv(StrSimv,"*",info.d1,info.d2,m,stolbec-1,r9,4,0); n5+=r9; } // Заполним таблицу уже найденными значениями if(FL_V_ALG && uprc != NO_SCREEN) { infolist.add_record("Месяц начала выборки",mes1); infolist.add_record("Месяц окончания выборки",mes2); infolist.add_record("Столбец выборки",stolbec); infolist.add_record("Символы выборки",StrSimv); infolist.add_record("Сумма выборки",n5); } // А теперь пройдемся по полю кадровой части "procPREM" // И возьмем оттуда все значения процентов, действовавшие // в рассчитываемом месяце info.n1=0.; // обнулили итоговую сумму // Дата конца действия очередного значения процента // В самом начале она равна последнему дню месяца. var DateEnd = CreateObject("KDate"); DateEnd.SetDateII(countday,mrasch); // Найдем дату начала действия очередного значения процента char StrD[21]; GetKchDate("procPREM",StrD,10,DateEnd); var Date=CreateObject("KDate"); Date.SetDate(static_cast_to_string(StrD)); // Если вдруг дата начала пустая или выходит за рамки расчетного // месяца, то установим ее равной первому числу расчетного месяца if ( Date.IsEqI(INVALID_DATE_VALUE) || Date.GetAbs()