//================================= // Печать БЛ в Excel //================================= PrintFormBL(DATBEG,SERBL,NUMBL,TIPRASSR,DATBRRULE) { var CurFile=CreateObject("CurPrnFile"); CurFile.SetFlagBrowse(0); var CTabl=CreateObject("CurPrnTbl"); int cntRcr=CTabl.Count_Rcr(); // полное число записей // заводим переменную, которая будет показывать процент выполнения (ProgressBar) var CMsg = CreateObject("ProgressBar"); CMsg.Initial(0,100,1); CMsg.SetShowTime(0); // печать всей первой таблицы или только итоговой строки int PrintAllTabl= GetCommonCnfInt("TYP_PR_BL","блист"); char Buf[1024], BufStr[1024]; GetCurrentDirectory(255,Buf); string WorkDir = Buf; // убираем мусор DeleteFiles(WorkDir,"formbl*.tmp"); try { tPrepereOfficeForWork(); // определяем работать на Excel или на Calc (определяем какой из офисов (MS Office или OpenOffice) установлен и какой предпочтительнее) NewWb_BL(); // открыли новый воркбук char FIO[256]; FIO = GetFioFromKch(); PrintCommINF(DATBEG,SERBL,NUMBL,FIO); UnloadScriptModule("forms\\blreestr_2"); LoadScriptModule("forms\\blreestr_2"); // Массив для сохранения строк печати string BufPrint[20]; for(int i=0; i<20; ++i) BufPrint[i] = ""; int ChStr = 0; int year,month,day; int TypeBl = atoi(GetInfoBL(DATBEG,"ВИДБЛ")); // Заголовок для "Назначение пособия" CreateZglNazPos(DATBEG,FIO,DATBRRULE,TypeBl,year,month,day,BufPrint,ChStr); BufStr = ""; for(int i=0; i=0 && atof(CTabl.Text(FldDbl,cntRcr-1))<0. ) CTabl.SText(FldDbl,cntRcr-1," "); int Row = 18; if ( atoi(TIPRASSR)!=3 ) { Row += 2; PrintAllTabl = 1; } else tDeleteRows(Row,2); Row += 2; var MonthBeg = CreateObject("KDate"); var MonthEnd = CreateObject("KDate"); MonthBeg.SetDate("01."+CTabl.Text(0,0)); int EndRcr=CTabl.Count_Rcr()-2; if ( EndRcr<0 ) EndRcr=0; MonthEnd.SetDate("01."+CTabl.Text(0,EndRcr)); MonthEnd.SetDateII(MonthEnd.CountDay(),MonthEnd.GetAbs()); int FirstYear = MonthBeg.GetYear(); int LastYear = MonthEnd.GetYear(); double eps = 0.001; //================================= // Печать сумм с др. места работы //================================= var AllSprOtherWork = CreateObject("KOtherEnterprisesCollectionReferences"); AllSprOtherWork.LoadFromLS(); int PrZgl = 0; //Печать Заголовка if ( AllSprOtherWork.Size() ) { for ( int i=FirstYear; i<=LastYear; ++i ) { // "Сводная" информация с других мест работы для 1-ого года var InfOtherWork = AllSprOtherWork.CollectInfoBLByYear(static_cast_to_int(i)); double SummaOW = InfOtherWork.Summa(); //сумма дополнительно учитываемая при расчете среднего int ExcDays = InfOtherWork.ExcludeDays(); //количество исключаемых дней для этого года // Если есть суммы с др мест работы if ( nabs(SummaOW)>eps ) { if ( !PrZgl ) { if ( TypeBl==1 ) tDeleteRows(Row+2,3); else tDeleteRows(Row-1,3); PrZgl = 1; } tInsertRows(Row+1,1); tCopyRows(Row+1,1); tWriteStringToCell("A"+to_string(Row),toXls(i)); tWriteStringToCell("P"+to_string(Row),toXls(SummaOW)); if ( TypeBl==1 ) { tWriteStringToCell("AY"+to_string(Row),toXls(ExcDays)); tWriteStringToCell("CH"+to_string(Row),toXls("Предыдущий страхователь")); } else tWriteStringToCell("BP"+to_string(Row),toXls("Предыдущий страхователь")); Row++; } } if ( PrZgl ) tDeleteRows(Row,2); } if ( !PrZgl ) tDeleteRows(Row-2,8); else Row += 3; //================================= // Печать расчет среднего заработка //================================= // Печатать форму развернутую по месяцам if ( !PrintAllTabl ) tDeleteRows(Row-2,6); else { Row++; int cntFld = CTabl.Count_Fld(); // число столбцов if( cntFld>6 ) cntFld = 6; // Заполняем названия столбцов for ( int Idx = 0; Idx1; char BufPeriod[81]; if ( bYear ) sprintf(BufPeriod, " %s - 31.12.%04d и",MonthBeg.GetStr(), MonthBeg.GetYear()); else sprintf(BufPeriod, "c %02d %-8.8s %4d года", MonthBeg.GetDay(), NameMB, MonthBeg.GetYear()); tWriteStringToCell("A"+to_string(Row),toXls(BufPeriod)); tWriteStringToCell("BK"+to_string(Row),toXls(SumFirst)); if ( TypeBl==1 ) { tWriteStringToCell("AA"+to_string(Row),toXls(RvFirst)); tWriteStringToCell("AS"+to_string(Row),toXls(RvMinusFirst)); } else tWriteStringToCell("AF"+to_string(Row),toXls(RvFirst)); Row++; if ( bYear ) sprintf(BufPeriod, " 01.01.%04d - %s ", MonthEnd.GetYear(),MonthEnd.GetStr()); else sprintf(BufPeriod, "по %02d %-8.8s %4d года",MonthEnd.GetDay(),NameME,MonthEnd.GetYear()); tWriteStringToCell("A"+to_string(Row),toXls(BufPeriod)); tWriteStringToCell("BK"+to_string(Row),toXls(SumLast)); if ( TypeBl==1 ) { tWriteStringToCell("AA"+to_string(Row),toXls(RvLast)); tWriteStringToCell("AS"+to_string(Row),toXls(RvMinusLast)); } else tWriteStringToCell("AF"+to_string(Row),toXls(RvLast)); Row++; int Accuracy = 3; if ( IsCommonCnfExist("ACC_SR","блист") ) { char Tmp[256]; Accuracy = atoi(GetCommonDateCnf("ACC_SR","блист",DATBEG,Tmp,255)); if ( Accuracy>5 || Accuracy<0 ) Accuracy=3; } sprintf(Buf," %12.*f",Accuracy,SumSredn); tWriteStringToCell("BK"+to_string(Row),toXls(SumFirst+SumLast)); tWriteStringToCell("CP"+to_string(Row),toXls(Buf)); if ( TypeBl==1 ) { tWriteStringToCell("AA"+to_string(Row),toXls(RvFirst+RvLast)); tWriteStringToCell("AS"+to_string(Row),toXls(RvMinusFirst+RvMinusLast)); } else tWriteStringToCell("AF"+to_string(Row),toXls(RvFirst+RvLast)); } UnloadScriptModule("forms\\blreestr_2"); // Не закрываем воркбук, будем еще печатать вторую часть БЛ //EndWb_BL(); // закончили все дела с предыдущим воркбуком //tEndXlsWork(1); // делаем форму видимой } catch(...) { tEndXlsWork(1); // делаем форму видимой SayUndefinedScriptError(); } return 0; } // Функция получает заголовок для "Назначение пособия" CreateZglNazPos(DATBEG,FIO,DATBRRULE,TypeBl,&year,&month,&day, &BufPrint,&ChStr) { char Buf[1024]; string DatPredBL = DATBEG; string DatEndStag = DATBEG; while ( Str_Cmp(DatPredBL," "," ./" ) ) { DatEndStag = DatPredBL; DatPredBL = GetInfoBL(DatEndStag,"ПРЕДБЛ"); } double Proc = CalcStrahStagBL(DatEndStag,year,month,day); double Procent; if ( !year && !month && Proc==0. ) { Procent = (GetCommonCnfInt("PROC_STAVK","блист")) ? 60. : 100.; } else { if ( Proc!=0. ) Procent = Proc; else { if ( year>=8 ) Procent=100.; else if ( year>=5 ) Procent=80.; else Procent=60.; } } //var rez = GetStrYMD(year,month,day); GetFIOPadegFSAS(FIO,3,FIO,40); sprintf(Buf,"%s назначено пособие",FIO); int TypeBl = atoi(GetInfoBL(DATBEG,"ВИДБЛ")); if ( TypeBl==1 ) Buf += " по беременности и родам"; else Buf += " по временной нетрудоспособности"; BufPrint[ChStr++] = Buf; // Пособие 1 строка sprintf(Buf,"%3d",static_cast_to_int(Procent)); string proc = Buf; if (TypeBl==1 || TypeBl==2) proc="100"; var DatBBl = CreateObject("KDate"); var DatEBl = CreateObject("KDate"); DatBBl.SetDate(static_cast_to_string(DATBEG)); DatEBl.SetDate(static_cast_to_string(GetInfoBL(DATBEG,"ДАТАК"))); long CalDn = DatEBl.Diff(DatBBl)+1; sprintf(Buf,"%3ld",CalDn); string strdn = Buf; sprintf(Buf,"в размере %3.3s%% за %3.3s календарных %s",proc,strdn,GetStrYMD(0,0,CalDn)[2]); if ( TypeBl==4 ) Buf = GetProcOplForBlUh(DatBBl); BufPrint[ChStr++] = Buf; // Пособие 2 строка var Dat = CreateObject("KDate"); if ( TypeBl==4 ) { Buf ="по уходу в течение календарного года"; int YearBeg = DatBBl.GetYear(); int cntYear = DatEBl.GetYear()-YearBeg+1; int TotalCountDay = 0; int TotalCountPaydRv = 0; char DateBegCalc[21],DateEndCalc[21]; if ( cntYear>1 ) BufPrint[ChStr++] = Buf; // Пособие 3 строка for ( int i = 0; i1 ) sprintf(Buf,"%4d: %3d календарных %s (из них оплачено %3d %s)",YearBeg+i,YearCountDay, GetStrYMD(0,0,YearCountDay)[2],PaydRv,GetStrYMD(0,0,PaydRv)[2]); else { sprintf(Buf,"%s %3d календарных %s (оплачено %3d %s)",Buf,YearCountDay, GetStrYMD(0,0,YearCountDay)[2],PaydRv,GetStrYMD(0,0,PaydRv)[2]); } BufPrint[ChStr++] = Buf; // Пособие 3 строка } } if ( Str_Cmp(DATBRRULE," ","./ ") ) { Dat.SetDate(static_cast_to_string(DATBRRULE)); sprintf(Buf,"Пособие снижено с %s г.",Dat.GetStr()); BufPrint[ChStr++] = Buf; // Пособие 4 строка } return ""; } //=========================================== // Печать 2-ой части БЛ "Причитается пособие" //=========================================== PrintFormBL2(DATBEG,FLSEV,FLDOP,FLDOP1,IdxTabl,Mes,God) { var CurFile=CreateObject("CurPrnFile"); CurFile.SetFlagBrowse(0); var CTabl = CreateObject("CurPrnTbl"); int cntRcr=CTabl.Count_Rcr(); // полное число записей // заводим переменную, которая будет показывать процент выполнения (ProgressBar) var CMsg = CreateObject("ProgressBar"); CMsg.Initial(0,100,1); CMsg.SetShowTime(0); UnloadScriptModule("forms\\blreestr_2"); UnloadScriptModule("forms\\blreestr_1"); LoadScriptModule("forms\\blreestr_2"); LoadScriptModule("forms\\blreestr_1"); // определяем необходимые нам номера полей if ( !FillNumFldBL2(CTabl) ) return 0; try { int Row = 22; Row = SearchFirstRow(Row)+1; // Поиск первой строки для печати второй таблицы if ( Row ) { int Tip = 0; // Не печатаем таблицу с учетом столбца "Доплата сверх нормы" char Buf[1024]; double eps = 0.001; double SumDop2 = atof(CTabl.Get_Bottom_Text(fld[idxSUMM_BLDSR])); if ( nabs(SumDop2)>eps ) // Печатать таблицу с учетом столбца "Доплата сверх нормы" { tDeleteRows(Row,6); Tip = 1; Row += 3; } else { tDeleteRows(Row+6,7); cntIdxFld--; Row += 2; } // Заполняем названия последних столбцов (меняются в зависимости от БЛ) for ( int Idx = idxSUMM_BLDOP; Idxeps ) */ PrintItSum(SUM_R,Row); // else tDeleteRows(Row,2); // За счет средств Фонда социального страхования Российской Федерации: /* if ( nabs(SUM_SS)>eps ) */ PrintItSum(SUM_SS,Row); //else tDeleteRows(Row,2); // Доплата сверх нормы за счет средств работодателя: if ( nabs(SUM_DOPL)>eps ) PrintItSum(SUM_DOPL,Row); else tDeleteRows(Row,2); // Всего: // Если сумма равна нулю или северный вариант, то надо еще // рассмотреть предыдущий столбец double SUM_BLD = atof(CTabl.Get_Bottom_Text(fld[idxSUMM_BLDOP])); double SUM_BL1 = atof(CTabl.Get_Bottom_Text(fld[idxSUMM_BL])); SUM_BL = SUM_BLD; bool FD = FLSEV && FLDOP; if ( IdxTabl==2 ) FD = FLSEV && FLDOP1; if ( nabs(SUM_BLD)eps ) PrintItSum(SUM_BL,Row); else tDeleteRows(Row,2); FreeSpaceString(Mes,3,""); sprintf(Buf,"Сумма пособия включена в платежную ведомость за %s %d г.",Mes,atoi(God)); tWriteStringToCell("A"+to_string(Row),toXls(Buf)); tVerticalAlignment("A18:DU"+to_string(Row+50),1); tVerticalAlignment("A18:DU"+to_string(Row+50),3); EndWb_BL(); // закончили все дела с предыдущим воркбуком tEndXlsWork(1); // делаем форму видимой } } catch(...) { tEndXlsWork(1); // делаем форму видимой SayUndefinedScriptError(); } UnloadScriptModule("forms\\blreestr_2"); UnloadScriptModule("forms\\blreestr_1"); return 0; } PrintItSum(SUM,&Row) { char Buf[1024], Str[1024]; sprintf(Buf,"%.2f",SUM); tWriteStringToCell("BR"+to_string(Row++),toXls(Buf)); R_MAKE_SCRIPT(Buf,Str,255,0); //пропись рублей и копеек tWriteStringToCell("A"+to_string(Row++),toXls(Str)); return ""; } PrintCommINF(DATBEG,SERBL,NUMBL,FIO) // Печать общей информации { char Str[1024],Buf[1024]; var Date = CreateObject("KDate"); Date.SetDate(static_cast_to_string(DATBEG)); // Серия БЛ tWriteStringToCell("AY5",toXls(SERBL)); // Номер БЛ tWriteStringToCell("BS5",toXls(NUMBL)); string NameP=GetEnterpriseVar("ИМЯП",Buf,255); string GlBuh=GetEnterpriseVar("ГЛБУХ",Buf,255); // Название организации tWriteStringToCell("Q6",toXls(NameP)); // Гл.бухгалтер tWriteStringToCell("BL70",toXls(GlBuh)); // Текущая дата var date=KDateFromStr(to_string(datatek)); var dateAsString=date.NameMonth(2); //"февраля 2018" tWriteStringToCell("CV70",OemToAnsi(GetElementFromString(0,dateAsString," "))); //название месяца sprintf(Str,"%02d",date.GetDay()); tWriteStringToCell("CP70",to_string(Str)); //день sprintf(Str,"%02d",date.GetYear()%100); tWriteStringToCell("DO70",to_string(Str));//год // ФИО tWriteStringToCell("Q8",toXls(FIO)); // ТН GetKchValue("tn",Str,6,Date); tWriteStringToCell("CQ8",toXls(Str)); // ИНН GetKchValue("inn_fl",Str,14,Date); tWriteStringToCell("CQ9",toXls(Str)); // СНИЛС GetKchValue("strah_n",Str,14,Date); tWriteStringToCell("CQ10",toXls(Str)); // Подразделение GetKchValue("podr",Str,6,Date); char NamePodp[256]; NamePodp = GetOtdName(atol(Str)); FreeSpaceString(NamePodp,3,""); FreeSpaceString(Str,3,""); tWriteStringToCell("Q9",toXls(Str+" "+NamePodp)); // Должность char Dolgn[256]; GetKchDoljn(Dolgn, 256, Date, GetGeneralCombineLS()); FreeSpaceString(Dolgn,3,""); tWriteStringToCell("Q10",toXls(Dolgn)); return ""; } EndWb_BL() { tGetWshByIndex(1); tWshSelect(); tWshCellSelect(1,1); // ищем подходящее имя для файла, если же остался "мусор" то подбираем имя (FileName) // перебирая номера (cWbTmp) char Buf[256]; GetCurrentDirectory(255,Buf); string WorkDir = Buf; string tmpnm=""; for( ; 1; ++cWbTmp) { sprintf(Buf,"\\formbl%d.tmp", cWbTmp); tmpnm = WorkDir + Buf; if ( access(tmpnm,0) ) break; } cWbTmp++; tSaveXlsObjects(tmpnm); } NewWb_BL() { string NameXlt = to_string(GetPathXLT("TABLREF","formbl.xlt")); // путь к шаблону tCreateXlsObjects(NameXlt,"Расчет пособия по временной нетрудоспобности"); //tMakeXlsVisible(); // для отладки cWsh = 1; // сбрасываем счетчик листов tGetWshByIndex(cWsh); // получаем ссылку на лист (worksheet) tWshSelect(); return ""; } SearchFirstRow(Row) { int EndRow = 100; char Str[255]; for ( int i=Row; i