import "XMachine.dll" // Справка 417 (рефакторинг от 2014.11.30) f417(rasRV,StTV,FList) { var array_param[5]; array_param[0]=4; //количество параметров array_param[1]=rasRV; array_param[2]=StTV; array_param[3]=FList; array_param[4]=RazrList; f417_new(array_param); return 0; } f417_new(array_param) //========================================= // Основная процедура //========================================= { var CFile=CreateObject("CurPrnFile"); // объект класса для работы с текущим файлом печати CFile.SetFlagBrowse(0); // запрещаем просмотр CFile.SetFlag_Print(0); var CTabl=CreateObject("CurPrnTbl"); // объект класса для работы с текущей таблицей if ( !FillNumFld(CTabl) ) return 1; //определяем необходимые нам номера полей int cr=CTabl.Count_Rcr(); // число рабочих записей в таблице if ( !cr || (cr==1 && CTabl.Check_Empty_Rcr(0) ) )return 1; if(initVarForPrint(array_param,CTabl)!=0) return -1; char NumberD[10]; if ( ESC == Panel_Zapros("",""," Номер первого документа",NumberD,7 )) return; NomDoc = atoi(NumberD); if ( NomDoc <= 0 ) NomDoc = 1; OpenOffice(); if ( RazrListOtp ) tPageBreaks(17); // Разбивку страницы добавляем if ( FirstList ) tPageBreaks(24); // Разбивку страницы добавляем if ( RazrList ) tPageBreaks(39); // Разбивку страницы добавляем try { var CMsg = 0; // Процент выполненной работы int bTime = false; // false-показывать процент, // true-показывать оставшееся время CMsg=CreateObject("ProgressBar"); CMsg.Initial(0,100,1); CMsg.SetShowTime(static_cast_to_int(bTime)); bool flagPrintTablOne=false ; int tn,oldtn,oldcomb,curComb; tn=oldtn=curComb=oldcomb=-1; var lsInfo[cntTabl]; /* lsInfo[idxInfoStavka] - ставка lsInfo[idxInfoOtpusk] - отпуск lsInfo[idxInfoUderg] - Виды и суммы постоянных удержаний lsInfo[idxInfoNU]) - данные по НУ */ var MapSortedRecords=FillMap(CTabl); // цикл по записям таблицы bool lsReadSuccessfully=false; int ii=0; for (bool Cur=MapSortedRecords.InitIterator();Cur;Cur=MapSortedRecords.Next()) { int zap=atoi(MapSortedRecords.GetCurValue()); // progress bar - чтобы видеть процент выполненной работы до того как появится результат if ( CMsg.Msg_Proc(" Подождите немного. Идет подготовка к печати. ",100.*ii++/cr)==ESC ) { tEndXlsWork(1); return 0; } tn = atoi(CTabl.Text(Fld[idxTN],zap)); if ( printCombSeparately ) curComb = atoi(CTabl.Text(Fld[idxCmbInt],zap)); //нужно добавить новый лист: // выводим данные по текущему ЛС (табельный==oldtn) // читаем ЛС если сменился ТН // добавляем новый лист // получаем данные из видов НУ if (NeedAddNewWsh(tn,oldtn,curComb,oldcomb)) { if( oldtn!=-1 && lsReadSuccessfully ) //если oldtn не задан - нечего печатать ( обрабатывается первая запись таблицы ) { PrintInfoLs(lsInfo,oldcomb); tWshCellSelect(1,1); } if( tn!=oldtn ) //табельный номер сменился - надо прочитать ЛС { lsReadSuccessfully=TryReadLs(tn); cntWshForLs=0; MapExistSubjNU.Clear(); } flagPrintTablOne=false; currentTn=oldtn=tn; oldcomb=curComb; if ( lsReadSuccessfully ) { KodStroki=2; AddNewWsh(CTabl,zap); LsInfoInit(lsInfo); FillInfoLs(lsInfo,curComb); //бежим по строкам ЛС и заполняем информацию для отпуска,алиментов, "переводов" } } if ( lsReadSuccessfully ) { //1)Выводим общую информацию (таблица со столбцами "дата рождения","Квалификация,категория","Образование",...) PrintTablOne(CTabl,zap,tn,flagPrintTablOne,curComb); // Собираем значения для ставки, вывод в конце (т.к. по разным источникам, совместительствам) AddInfoStavka(CTabl,zap,lsInfo[idxInfoStavka]); //TODO: значение ставки выводится неверно если печатаем "общую справку"(без разбивки по должностям) - строки в таблице схлапываются некорректно по столбцу "Ставка" //накапливаем информацию по начислениям/удержаниями (вывод в Excel в конце) AddInfoNU(CTabl,zap,lsInfo[idxInfoNU]); } } if ( lsReadSuccessfully ) { //выводим данные по последнему "сотруднику/должности": PrintInfoLs(lsInfo,curComb); tWshCellSelect(1,1); } } // блок try //что Excel не остовался в памяти catch(object err) { tEndXlsWork(1); SayError(err); return 1; } catch(...) { SayUndefinedScriptError(); tEndXlsWork(1); return 1; } if ( n_wsh>1 ) { tGetWshByIndex(n_wsh); // получаем ссылку на лист (worksheet) tWshHide(); // делаем лист невидимым } tGetWshByIndex(1); tWshSelect(); tEndXlsWork(1); return 0; } int cntWshForLs=0; initVarForPrint(array_param,&CTabl) { perBeg = atoi(CTabl.Text(Fld[idxABMES],0)), //период запроса perEnd = atoi(CTabl.Text(Fld[idxAEMES],0)); //проверка: perBeg и perEnd принадлежат одному календарному году if( KDateFromInt(perBeg).GetYear()!=KDateFromInt(perEnd).GetYear() ) { AmbaMessageBox("Месяц начала и месяц окончания должны принадлежать одному календарному году","Неверно указан период!",0,0); return -1; } int count = atoi(array_param[0]); rasRV = atoi(array_param[1]); // расчет РВ NumStTV = atoi(array_param[2]); // номер столбца ТВ FirstList = atoi(array_param[3]); // разрыв после шапки RazrList = atoi(array_param[4]); // разрыв между табл.по суммам if ( count>=9 ) { PrRV = atoi(array_param[5]); PrPRIKAZ = atoi(array_param[6]); PrVOtp = atoi(array_param[7]); FlDatPr= atoi(array_param[8]); FlPrOtp= atoi(array_param[9]); } SimDR="З"; if ( count>=10 ) { CountPr = atoi(array_param[10]); CommPr = atoi(array_param[11]); SimDR = static_cast_to_string(array_param[12]); } if ( count>=13 ) LimitFirstDate = atoi(array_param[13]); NumStTV = NumStTV-1; //определяем источник для сформированной таблицы (в дальнейшем будет использоваться для фильтра строк в ЛС) { src_tabl=""; char SrcF[200];SrcF = ""; R_TEXT_FLD("SRC",SrcF,10,0); // Источник //кусок кода выше не работает( вместо источника возвращает №.п.п) если в справочнике только один источник - "подстрахуемся" var listTabl=CreateObject("CurPrnTbl"); listTabl.Initial(CTabl.GetAdrListTabl()); int idxFIst=listTabl.Find_Name_Fld("SRC"); //в списке сформированных таблиц столбец "источник" не нашли -> считаем что таблица сформирована по всем источникам if (idxFIst==-1) SrcF=""; FreeSpaceString(SrcF,3,""); src_tabl=SrcF; /*так делать нельзя т.к. лс еще не прочитан if (SrcF!="") { double vnKod = atof(CTabl.Text(Fld[idxKODt],0)); double iKod = Extern_To_InternE(vnKod); src_tabl = to_string(IntSrcToExt(GetSrcOfCod(iKod))); }*/ } // Определяем как печатать совместительства (все вместе, отдельно) printCombSeparately = atoi(CTabl.Get_Bottom_Text(Fld[idxFlComb])); startRow[idxInfoStavka]=9; startRow[idxInfoRecruit]=15; startRow[idxInfoOtpusk]=startRow[idxInfoUderg]=22; startRow[idxInfoNU]=29; for(int i=0;i 3. Карточка-справка (ф.417) ) GetListOtpuskCode(); return 0; } reInitVarForPrintFromNastr() { if ( IsCommonCnfExist("COL_TVH","417") ) //столбец ТВХ { char Buf[256]; GetCommonCnf("COL_TVH","417",Buf,80); FreeSpaceString(Buf,3,""); if (atoi(Buf)>0) NumStTV=atoi(Buf)-1; } for (int i=0;i0) NumSetki[i] = atoi(s); } } if ( IsCommonCnfExist("limFirstD","417") ) //Ограничить первую дату началом периода { char Buf[256]; GetCommonCnf("limFirstD","417",Buf,80); LimitFirstDate=atoi(Buf); } // if ( IsCommonCnfExist("CTVH_Excl","417") ) { char StrCol[256]; ColTVHExcludeNU = -1; ColTVHExcludeNU = GetCnfCol(GetCommonCnf("CTVH_Excl","417", StrCol, 255), ColTVHExcludeNU); } if ( IsCommonCnfExist("bSumNach","417") ) //флаг выборки сумм { char Buf[256]; GetCommonCnf("bSumNach","417",Buf,80); bSumNach=atoi(Buf); } if ( IsCommonCnfExist("rasRv ","417") ) //Режим расчета рабочего времени { char Buf[256]; GetCommonCnf("rasRv ","417",Buf,80); rasRV =atoi(Buf); } if ( IsCommonCnfExist("PrintRvVid ","417") ) //Печатать РВ для видов НУ { char Buf[256]; GetCommonCnf("PrintRvVid ","417",Buf,80); PrRV = atoi(Buf); } if ( IsCommonCnfExist("fPageBreak ","417") ) //Печатать на отдельном листе таблицу НУ { char Buf[256]; GetCommonCnf("fPageBreak ","417",Buf,80); FirstList = atoi(Buf) & 0x01; RazrList = atoi(Buf) & 0x02; RazrListOtp= atoi(Buf) & 0x04; } if ( IsCommonCnfExist("PrVOtp ","417") ) //печать виды отпусков { char Buf[256]; GetCommonCnf("PrVOtp ","417",Buf,80); PrVOtp = atoi(Buf) ; } if ( IsCommonCnfExist("PrintPr ","417") ) //Печатать № и дату приказа { char Buf[256]; GetCommonCnf("PrintPr ","417",Buf,80); PrPRIKAZ = atoi(Buf) >0; FlDatPr = atoi(Buf) & 0x02; CountPr = atoi(Buf) & 0x04; CommPr = atoi(Buf) & 0x08; } if ( IsCommonCnfExist("HowPrOtp","417") ) //Как определять № приказа для отпусков { char Buf[256]; GetCommonCnf("HowPrOtp","417",Buf,80); FlPrOtp = (atoi(Buf) & 0x01)!=0; howPrintOtpusk = (atoi(Buf) & 0x02)!=0; howPrintOtpuskAttest = (atoi(Buf) & 0x04)!=0; } if ( IsCommonCnfExist("HowPrRecr","417") ) //Как определять № приказа для таблицы "Отметки о приеме на работу и переводах" { char Buf[256]; GetCommonCnf("HowPrRecr","417",Buf,80); howPrintRecruit = atoi(Buf); } if ( IsCommonCnfExist("SimDR","417") ) //Символы доп.реквизитов с № приказа { char Buf[256]; GetCommonCnf("SimDR","417",Buf,80);FreeSpaceString(Buf,3,""); SimDR=Buf; } if ( IsCommonCnfExist("CllNU_Main","417") ) //виды, по которым БЗ берем с основного источника { char Buf[256]; GetCommonCnf("CllNU_Main","417",Buf,80); var ArrNU; int CountNU =ListNUToSafeArray(Buf,' ',ArrNU); for (int i=0;i 16 ) { code=atoi(Lst.Get(10)); if ( code && !ListOtpuskCode.IsExist(code) ) ListOtpuskCode.Add(code ,"Основной"); code=atoi(Lst.Get(11)); if ( code && !ListOtpuskCode.IsExist(code) ) ListOtpuskCode.Add(code ,"Учеб.отпуск"); code=atoi(Lst.Get(12)); if ( code && !ListOtpuskCode.IsExist(code) ) ListOtpuskCode.Add(code ,"Компенсация"); if ( clm > 17 ) { code=atoi(Lst.Get(17)); if ( code && !ListOtpuskCode.IsExist(code) ) ListOtpuskCode.Add(code ,"Дополнительный"); } if ( clm > 18 ) { code=atoi(Lst.Get(18)); if ( code && !ListOtpuskCode.IsExist(code) ) ListOtpuskCode.Add(code ,"Комп. > 28"); } } else { if ( clm > 8 ) { code=atoi(Lst.Get(8)); if ( code && !ListOtpuskCode.IsExist(code) ) ListOtpuskCode.Add(code ,"Основной"); } if ( clm > 9 ) { code=atoi(Lst.Get(9)); if ( code && !ListOtpuskCode.IsExist(code) ) ListOtpuskCode.Add(code ,"Учеб.отпуск"); } if ( clm > 10 ) { code=atoi(Lst.Get(10)); if ( code && !ListOtpuskCode.IsExist(code) ) ListOtpuskCode.Add(code ,"Компенсация"); } if ( clm > 15 ) { code=atoi(Lst.Get(15)); if ( code && !ListOtpuskCode.IsExist(code) ) ListOtpuskCode.Add(code ,"Дополнительный"); } } } } OpenOffice() { char Dir[128]; // строка для текущей директории GetCurrentDirectory(128,Dir); // получаем текущую директорию (это корень каталога ZPL из которого запустили АМБу) string nm="417_2015.xlt"; // имя Excel'евского файла var WorkDir = Dir + "\\"+NameCommonDir()+"\\"; string fullFileName = GetPathXLT(NameCommonDir(),nm); tPrepereOfficeForWork(); // определяем работать на Excel или на Calc (определяем какой из офисов (MS Office или OpenOffice) установлен и какой предпочтительнее) //tCreateXlsObjects(WorkDir+nm,"Карточка-справка(форма 417)"); // создание основных объектов tCreateXlsObjects(fullFileName,"Карточка-справка(форма 417)"); // создание основных объектов tGetWshByIndex(1); // получаем ссылку на лист (worksheet) tWshSelect(); //tMakeXlsVisible(); // делаем форму видимой } TryReadLs(tn) { // чтение ЛС if ( 1 != LSRead(tn, 10000) ) { AmbaMessageBox("Невозможно прочитать ЛС!","Ошибка!",0,0); return 0; } return 1; } LsInfoInit(&lsInfo) { for(int i=0;i min_dateForRecruitCurComb.GetDouble() ) min_dateForRecruitCurComb=KDateFromD(d_rb); //рассматриваем только строки с суммами ПОСЛЕ даты приема bool isLSAttest=kch_from_int("attest"); for (int row=0; row добавляем в "отметки о приеме на работу и переводах" строку с пометкой "Уволен" if ( d_uv >= min_dateForRecruitCurComb.GetDouble() && d_uv <= dPerEnd.GetDouble() ) lsInfo[idxInfoRecruit].Add(d_uv,"Уволен"); } //получаем данные об отпусках из Доп.структуры if( ( !isLSAttest && howPrintOtpusk) || ( isLSAttest && howPrintOtpuskAttest) ) AddInfOtpuskFromDopInfo(lsInfo[idxInfoOtpusk],curComb); tmp_comb=0; } GetExtSrc(iKod) { char src[2]; src[1]=0; src[0]=GetSrcOfCod(iKod); src[0]=IntSrcToExt(src[0]); return to_string(src); } int currentTn=0; AddInfOtpusk(&MapOtpuskInfo,row) { double iKod = GetCode(row); // внутренний код строки (точный) if ( !ListOtpuskCode.IsExist(atoi(iKod)) ) return; //строка не является видом отпуска - выходим var db_row=CreateObject("KDate"); db_row.SetDateD(GetBegDate(row)); // дата начала строки var de_row=CreateObject("KDate"); de_row.SetDateD(GetEndDate(row)); // дата конца строки if ( zaprosPeriod.IsPeriodFree(db_row.GetStr(),de_row.GetStr()) ) return; //если период действия строки не пересекается с периодом "запроса" - выходим double rv=GetRvRowForPeriod(iKod,db_row.GetAbs(),de_row.GetAbs()); //TODO возможно не стоит отфильтровывать строки отпуска без РВ ( надо завести настройку) if (rv<0.00001) return; //РВ по строке отпуска нулевое - выходим string dPrikaz=""; //дата приказа string nPrikaz=""; //номер приказа string period =""; //период за который предоставлен отпуск string vidOtpusk=""; if ( PrPRIKAZ ) //пытаемся достать данные о приказе из доп.реквизитов. GetPrikazFromDopRkv(iKod,dPrikaz,nPrikaz,period,vidOtpusk); if( !strlen(vidOtpusk) ) //в доп.реквизите вид отпуска не указан - берем из настроек по фондам... vidOtpusk=ListOtpuskCode.GetValue(atoi(iKod)); char key[256],value[256]; //ключ : "начало отпуска"_"окончание отпуска"_"номер приказа" //значение: "дата приказа"_"номер приказа"_"за период"_"период отпуска"_"количество дней"_"вид отпуска" sprintf(key,"%.2f_%.2f_%s",db_row.GetDouble(),de_row.GetDouble(),nPrikaz); if(!MapOtpuskInfo.IsExist(to_string(key))) { //для компенсации обычно указывается дробное число дней if ( vidOtpusk=="Компенсация" ) sprintf(value,"%s_%s_%s_%s- %s_%.2f_%s",dPrikaz,nPrikaz,period,db_row.GetStr(),de_row.GetStr(),rv ,vidOtpusk); else sprintf(value,"%s_%s_%s_%s- %s_%d_%s" ,dPrikaz,nPrikaz,period,db_row.GetStr(),de_row.GetStr(),atoi(rv),vidOtpusk); MapOtpuskInfo.Add(to_string(key),to_string(value)); } } GetPrikazFromDopRkv(iKod,&dPrikaz,&nPrikaz,&period,&vidOtpusk) { dPrikaz=nPrikaz=period=""; string prikaz=""; char sim_row=Sim_For_Intern_Cod(atoi(iKod),20-1); //символ из столбца с доп реквизитами char str_comm[256],str_ls[256]; int flagOtpusk=ListOtpuskCode.IsExist(atoi(iKod)); if ( sim_row=='В' && (!flagOtpusk || FlPrOtp==0) ) //по структуре "Оклада"(в ТВХ символ -"В", псевдоним реквизита-"p") { Rkv_from(iKod,"p", str_comm,str_ls); FreeSpaceString(str_ls,3,""); prikaz=str_ls; } else //по структуре "Надбавки" (в ТВХ символ -"З", псевдоним реквизита-"pr") { for ( int i=0 ; i1 || TablOtpuskInfo.Check_Empty_Rcr(0)==0 ) { //определяем номера столбцов в структуре: int fldComb =TablOtpuskInfo.Find_Name_Fld("Comb"), fldOtpuk_db =TablOtpuskInfo.Find_Name_Fld("db"), fldOtpuk_de =TablOtpuskInfo.Find_Name_Fld("de"), fldKodDolgn =TablOtpuskInfo.Find_Name_Fld("vkodDolgn"), fldDPrikaz =TablOtpuskInfo.Find_Name_Fld("dPrikaz"), fldNPrikaz =TablOtpuskInfo.Find_Name_Fld("nPrikaz"), fldPeriod_db=TablOtpuskInfo.Find_Name_Fld("nPeriod"), fldPeriod_de=TablOtpuskInfo.Find_Name_Fld("ePeriod"), fldVidOtpusk=TablOtpuskInfo.Find_Name_Fld("vidOtpusk"); for ( int rcr=0; rcr< TablOtpuskInfo.Count_Rcr(); rcr++ ) { int comb= (fldComb==-1)?0:atoi(TablOtpuskInfo.Text(fldComb,rcr)); if( comb && printCombSeparately && comb!=curComb) //печатаем раздельно и код должности в таблице не совпадает с кодом должности, которую печатаем continue; var dbOtpusk=KDateFromStr(TablOtpuskInfo.Text(fldOtpuk_db,rcr)); //начало отпуска var deOtpusk=KDateFromStr(TablOtpuskInfo.Text(fldOtpuk_de,rcr)); //окончание отпуска {//фильтр на отпуска недействующие в периоде запроса и на отпуска с "кривыми" датами начала/окончания if ( !dbOtpusk.IsValid() || !deOtpusk.IsValid() || dbOtpusk.GetDouble()>dPerEnd.GetDouble() || deOtpusk.GetDouble()1 || tableRecruitInfo.Check_Empty_Rcr(0)==0 ) { //определяем номера столбцов в структуре: int fldComb =tableRecruitInfo.Find_Name_Fld("Comb"), fldDPrikaz =tableRecruitInfo.Find_Name_Fld("dPrikaz"), fldNPrikaz =tableRecruitInfo.Find_Name_Fld("nPrikaz"), fldCaption =tableRecruitInfo.Find_Name_Fld("Caption"); for ( int rcr=0; rcr< tableRecruitInfo.Count_Rcr(); rcr++ ) { int comb= (fldComb==-1)?0:atoi(tableRecruitInfo.Text(fldComb,rcr)); if( comb && printCombSeparately && comb!=curComb) //печатаем раздельно и код должности в таблице не совпадает с кодом должности, которую печатаем continue; {//фильтр на приказы недействующие в периоде запроса } var dPrikaz=KDateFromStr(tableRecruitInfo.Text(fldDPrikaz,rcr)); //дата приказа string nPrikaz=tableRecruitInfo.Text(fldNPrikaz,rcr); //номер приказа string caption=tableRecruitInfo.Text(fldCaption,rcr); //пока не используется string d=to_string(dPrikaz.GetDouble()); if(!MapPrikaz.IsExist(d)) MapPrikaz.Add(d,nPrikaz); else //приказ для этой даты уже есть { if (CountPr) //выводим ВСЕ приказы для этой даты { string oldValue=MapPrikaz.GetValue(d); MapPrikaz.Add(d,oldValue+", "+nPrikaz); } } } } } AddInfoRecruit(&MapDateListNu,row) { double iKod = GetCode(row); // внутренний код строки (точный) char sim=Sim_For_Intern_Cod(atoi(iKod),NumStTV); double bDat=GetBegDate(row); double eDat=GetEndDate(row); if ( sim=='0' || //вид не помечен символом !IsCodeNach(atoi(iKod)) || //вид не является начислением !eDat || //пересчетная строка bDat>dPerEnd.GetDouble() || eDat нужно смотреть не только на БЗ вида... { double bz=GetBase(row); if ( nabs(bz)<0.00001 ) bz=DefineRk(bDat.GetDouble(),0)*100.; double result[1][2]; result[0][0]=bz; result[0][1]=bDat.GetDouble(); ListBZ=result; return 1; } var eDat =KDateFromD(GetEndDate(row)); var EndStr=KDateFromD(GetEndDate(row)); char str[256]; str[0]=sim; str[1]=0; double bz=0., rz=0.; int MesOtn = 0; if (EndStr.GT(dPerEnd)) // в том случае если дата конца строки MesOtn = dPerEnd.GetRel(); // больше чем дата конца периода берем месяц конца периода else // в том случае если дата конца строки MesOtn = EndStr.GetRel(); // не больше даты конца периода берем месяц конца строки if ( sim=='1' ) //берем из БЗ return GetListBZ(iKod,bDat.GetDouble(),eDat.GetDouble(),GetBase(row),ListBZ); else if (sim=='С') //С - русская { int NumSet = NumSetki[9-1];//минус 1 т.к. нумерация сеток с нуля if ( NumSet>0 ) { int extCode=Intern_To_Extern(iKod);//внешний код вида char script[256]; Value_For_Table_CodS(NumSet,GetCurEnterprise(),extCode,data,script);FreeSpaceString(script,3,""); if (strlen(script)) //нашли для вида скрипт в сетке { /*if (IsSubStrPresent(script,"InternCode")) //нужно в скрипт пользователя подставить точный внутренний код script=ReplaceN(to_string(script),"InternCode" ,to_string(iKod));*/ if (TryGetBz(script,iKod,rz)) //пытаемся выполнить скрипт { double result[1][2]; result[0][0]=rz; result[0][1]=bDat.GetDouble(); ListBZ=result; return 1; } } } } else if (atoi(str)>1) { //определяем порядковый номер сетки int numFromTvh = atoi(str); if ( numFromTvh>9 ) numFromTvh = 2; //если номер в ТВХ больше 9 ( как такое возможно!!!?), то берем значение из "первой" сетки int NumSet = NumSetki[numFromTvh-2]; //минус два,т.к. минимальное значение numFromTvh равно 2, а индекс для сетки(для этого символа) равен нулю if ( NumSet>0 ) { //считаем значения по сетки по стажу procent_ot_staga(NumSet,"datavys",1,MesOtn,1,row,bDat.GetDouble(),eDat.GetDouble(),rz); double result[1][2]; result[0][0]=rz; result[0][1]=bDat.GetDouble(); ListBZ=result; return 1; } } return 0; } TryGetBz(script,iKod,&rz) { bool runtimeError=false; rz=0.; try { var xm = CreateObject("XMachine"); rz=atof(xm.Evaluate(to_string(script),"InternCode",iKod)); } catch(interface IErrorInfo err) { string s;string ss; err.GetDescription(s); // описание ошибки, err.GetSource(ss);// место ошибки в коде MsgBox(s,ss,MB_ICONERROR); runtimeError=true; } catch(object err) { SayError(err); runtimeError=true; } catch(...) { SayUndefinedScriptError(); runtimeError=true; } return !runtimeError; } GetSumPer(iKod,mb,me) { double summ=0.; //for (int mes=dPerBeg.GetAbs(); mes<=dPerEnd.GetAbs(); mes++) for (int mes=mb; mes<=me; mes++) { if (atoi(bSumNach)==1) summ+=CollectSumm(iKod,0,mes,CL_MV | CL_EXACT); else summ+=CollectSumm(iKod,mes,0,CL_M | CL_EXACT); } return summ; } AddInfUderg(&MapUdergInfo,row) { double iKod = GetCode(row); // внутренний код строки (точный) char sim=Sim_For_Intern_Cod(atoi(iKod),NumStTV); double bDat=GetBegDate(row); double eDat=GetEndDate(row); if ( sim=='0' || //вид не помечен символом IsCodeNach(atoi(iKod)) || //вид является начислением !eDat || //пересчетная строка bDat>dPerEnd.GetDouble() || eDat12) { tTextWrap("AC4",1); tTextWrap("X15",1); } // ФИО str=CTabl.Text(Fld[idxFIO],zap); FreeSpaceString(str,3,""); OemToChar(str,str); tWriteStringToCell("Y5",str); //день рождение str=CTabl.Text(Fld[idxDR],zap); FreeSpaceString(str,3,""); OemToChar(str,str); tWriteStringToCell("A9",str); //категория str=CTabl.Text(Fld[idxKat],zap); FreeSpaceString(str,3,""); OemToChar(str,str); tWriteStringToCell("O9",str); //стаж str=CTabl.Text(Fld[idxStag],zap); FreeSpaceString(str,3,""); OemToChar(str,str); tWriteStringToCell("BO9",str); if (GetCommonCnfInt("stag","417")!=-1) { //0-по полю "страховой стаж",1- по "дате приема на работу", +2 значение стажа вычислять на конец периода int howPrintStag= GetCommonCnfInt("stag","417"); bool calcByDateRb=howPrintStag & 0x01; //по "дате приема на работу" bool calcOnEndPeriod=howPrintStag & 0x02; //значение стажа вычислять на конец периода var dPer=(calcOnEndPeriod) ? dPerEnd : dPerBeg; //инициализируем TmpCurCombine "текущим" совместительством var tmp_comb = CreateObject("TmpCurCombine"); if ( printCombSeparately ) tmp_comb.Init(curComb); else tmp_comb.Init(GetGeneralCombineLS()); char Func[1024],Buf[256]; //сотрудник может работать не сначала года - в этом случае вместо стажа выводим "дату" var date=CreateObject("KDate");date.SetDateD(GetDateFromFuncRWScript((howPrintStag==0)?"data_st":"data_rb")); if ( date.GT(dPer) ) Buf=date.GetStr(); else //вычисляем стаж { sprintf(Func,"СТАЖ2(%s,%s)",(howPrintStag==0)?"data_st":"data_rb",dPer.GetStr()); FreeSpaceString(Func,2,""); CallFuncReceive(Func,Buf,255,2); } tWriteStringToCell("BO9",OemToAnsi(Buf)); } //звание str=CTabl.Text(Fld[idxZvan],zap); FreeSpaceString(str,3,""); OemToChar(str,str); tWriteStringToCell("AY9",str); //образование str=CTabl.Text(Fld[idxObraz],zap); FreeSpaceString(str,3,""); OemToChar(str,str); tWriteStringToCell("AL9",str); //дата выхода на пенсию str=CTabl.Text(Fld[idxDPens],zap); FreeSpaceString(str,3,""); OemToChar(str,str); tWriteStringToCell("EF9",str); //дети str=CTabl.Text(Fld[idxDeti],zap); FreeSpaceString(str,3,""); OemToChar(str,str); tWriteStringToCell("CS9",str); //дети(иждивенцы) str=CTabl.Text(Fld[idxDeti_i],zap); var div = CreateObject("ParamFuncRW"); div.IInitial1(static_cast_to_string(str),";",100); int divcount = div.Count(); int icount = 0; var di = CreateObject("ParamFuncRW"); for ( int i = 0; i < divcount; i++ ) { di.IInitial1(div.Get(i),",",10); icount += atoi(di.Get(0)); } tWriteStringToCell("DC9",static_cast_to_string(icount)); //инвалид char InvStr[100]; sprintf(InvStr,"%-80.80s",CTabl.Text(Fld[idxInv],zap)); int InvGr = GetGroupInv(InvStr); tWriteStringToCell("DO9",InvGr); //Дата выхода на пенсию var pensDate=KDateFromStr(kch_from_safe("datepens")); if(pensDate.IsValid()) tWriteStringToCell("EF9",pensDate.GetStr()); //должность str=CTabl.Text(Fld[idxDol],zap); FreeSpaceString(str,3,""); OemToChar(str,str); tWriteStringToCell("AY15",str); flagPrintTablOne=true; } GetHeightOfRow(str,heightOneRow,maxCountSimInRow,strDelim) { var RazbW = CreateObject("ParamFuncRW");RazbW.IInitialW(to_string(str),maxCountSimInRow,255,strDelim); return heightOneRow*RazbW.Count(); } // Расчет нормативного заработка GetRasNormzar(DateFirst,SledDate,src_sim,comb,&rez) { //int codSrc=(!strlen(src_sim))?0:ExtSrcToInt(src_sim); int codSrc=(src_tabl=="")?CLL_TOTAL_SRC:ExtSrcToInt(GetCharFromStr(src_tabl,0)); rez=0.; var DateDop=CreateObject("KDate"); DateDop.SetDateD(DateFirst); int mes=DateDop.GetAbs(); int tmpmrasch = mrasch; DateDop.SetDateD(SledDate); var Prop=CreateObject("APropBE"); Prop.Init(codSrc,0,0,comb); var ts3 = CreateObject("TempCommonSrc"); ts3.TempCommonSrcInitial(CMN_SRC_COUNT_LS); SetCommonProp(CMN_SRC_COUNT_LS,Prop); if( tmpmrasch!=mes) s50all(mes); ras_normzar( NumStTV,"*",1,4,rez,DateDop); if( tmpmrasch!=mes) s50all(tmpmrasch); } //////////////////////////////////////////////// GetKchDatBegForDolg(ps,str,idx) //TODO: таблицу ФОТ заполнять с учетом возможной смены должности и подразделения // ************************************************************* // *** Функция дает значение из КЧ, взяв из строки str c датами // ** начала действия значений idx-ую по счету дату начала // ( Для должности, т.к. в версии 4.3 функция GetKchValue для // должности выдает код должности, а не наименование ) // ************************************************************* { var Par = CreateObject("ParamFuncRW"); Par.IInitial(static_cast_to_string(str),",",1000); var Dat = CreateObject("KDate"); Dat.SetDate(static_cast_to_string(Par.Get(idx))); char Buf[512], Dt[256], Arg[256]; sprintf(Dt,"%02d.%02d.%4d",Dat.GetDay(),Dat.GetMonth(),Dat.GetYear()); sprintf(Arg,"dolgnost,%-10.10s,0",Dt); return R_Face(Arg,Buf,120,0); } //////////////////////////////////////////////// // Запрос совмещения при формровании таблицы //////////////////////////////////////////////// bool fl_zapr = false; int rez_zapr = false; ZaprosComb() { var CombL = CreateObject("CombineList"); if ( !fl_zapr && CombL.Size()>1 ) { if ( PanelZap(rez_zapr)==ESC ) { fl_zapr = true; return 0; } fl_zapr = true; } return rez_zapr; } PanelZap(&rez) { rez = 0; var Map = CreateObject("MapString"); Map.Add("1" ,"по каждому отдельно"); Map.Add("2" ,"по всем, общим списком"); string Title = "Совместительства"; var MapRez = CreateObject("MapString"); if ( PanelValueFromMap(Map,MapRez,1,Title) == ESC ) return ESC; if ( !MapRez.InitIterator() ) return 0; rez = atoi(MapRez.GetCurKey()); if ( rez==2 ) rez = 0; return 0; } NeedAddNewWsh(tn,oldtn,comb,oldcomb) { if ( (tn!=oldtn) || (printCombSeparately && comb!=oldcomb ) ) return 1; return 0; } AddNewWsh(&CTabl,zap) { cntWshForLs++; CopyWsh(CTabl,zap); PrintHead(); PrintFooter(); } CopyWsh(&CTabl,zap) { // название листа = фамилия + tn var Par = CreateObject("ParamFuncRW"); Par.IInitial(static_cast_to_string(CTabl.Text(Fld[idxFIO],zap))," ",2); string s_tn = static_cast_to_string(CTabl.Text(Fld[idxTN],zap)); FreeSpaceString(s_tn,3,""); // копируем шаблон, название листа = фамилия + tn if ( !printCombSeparately ) tCopyWshByIndex(n_wsh,Par.Get(0)+" "+s_tn); else { //название листа = фамилия_cntWshForLs(код совместительства) +тн string s_comb = static_cast_to_string(CTabl.Text(Fld[idxCmbCod],zap)); FreeSpaceString(s_comb,3,""); char tmp[256]; sprintf(tmp,"%s_%d(%s) %s",Par.Get(0),cntWshForLs,s_comb,s_tn); tCopyWshByIndex(n_wsh,to_string(tmp)); } tGetWshByIndex(n_wsh); n_wsh++; // увеличиваем счетчик листов tWshSelect(); } PrintHead() { char s[256]; sprintf(s,"КАРТОЧКА-СПРАВКА № %d",NomDoc); tWriteStringToCell("BN1",OemToAnsi(s)); NomDoc++; sprintf(s,"за %d год",KDateFromInt(perEnd).GetYear()); tWriteStringToCell("BU2",OemToAnsi(s)); int len=256; char Org[len]; GetEnterpriseVar("ИМЯП", Org,len-1); // Наименование предприятия или отделения иностранной организации FreeSpaceString(Org,3,""); OemToChar(Org,Org); tWriteStringToCell("N3",Org); char Okp[len]; // код общероссийского классификатора прелприятий и организаций GetEnterpriseVar("ОКПО", Okp,len-1); FreeSpaceString(Okp,3,""); UpperString(Okp); OemToChar(Okp,Okp); tWriteStringToCell("ES4",Okp); // tWriteStringToCell("ES3",Okp); // дата tWriteStringToCell("ES3",static_cast_to_string(datatek)); } PrintFooter() { int len=256; //Должность исполнителя char tmp[len]; GetEnterpriseVar("ДОЛЖОТВНАЛ", tmp,len-1); FreeSpaceString(tmp,3,""); OemToChar(tmp,tmp); char Buf[81];Buf=GetCommonCnfS("DolgnIsp","417"); if ( strlen(Buf)>0 ) OemToChar(Buf,tmp); tWriteStringToCell("N54",tmp); //Расшифровка исполнителя GetEnterpriseVar("ОТВНАЛ", tmp,len-1); FreeSpaceString(tmp,3,""); OemToChar(tmp,tmp); Buf=GetCommonCnfS("Rasshifr","417"); if ( strlen(Buf)>0 ) OemToChar(Buf,tmp); tWriteStringToCell("BI54",tmp); //Должность ответственного исполнителя tmp = ""; Buf=GetCommonCnfS("DolgnOtv","417"); if ( strlen(Buf)>0 ) OemToChar(Buf,tmp); tWriteStringToCell("CX54",tmp); //Расшифровка ответственного исполнителя tmp = ""; Buf=GetCommonCnfS("RasshOtv","417"); if ( strlen(Buf)>0 ) OemToChar(Buf,tmp); tWriteStringToCell("EQ54",tmp); //дата формирования var DataStr=CreateObject("KDate"); DataStr.SetDate(static_cast_to_string(datatek)); tWriteStringToCell("C56",DataStr.GetDay()); // tWriteStringToCell("DF54",DataStr.GetDay()); tWriteStringToCell("CZ56",DataStr.GetDay()); R_DATA_PROPIS(datatek,tmp,20,0); FreeSpaceString(tmp,2," "); OemToChar(tmp,tmp); var PartData = CreateObject("ParamFuncRW"); PartData.IInitial1(static_cast_to_string(tmp)," ",3); if (PartData.Count()>1) tWriteStringToCell("J56",PartData.Get(1)); // tWriteStringToCell("DM54",PartData.Get(1)); tWriteStringToCell("DG56",PartData.Get(1)); tWriteStringToCell("AH56",SubStr(DataStr.GetYear(),2,2)); // tWriteStringToCell("EK54",SubStr(DataStr.GetYear(),2,2)); tWriteStringToCell("EE56",SubStr(DataStr.GetYear(),2,2)); } AddInfoStavka(&CTabl,zap,&MapStavka) { string str=CTabl.Text(Fld[idxStav],zap); string s_comb =CTabl.Text(Fld[idxCmbCod],zap);FreeSpaceString(s_comb,3,""); if ( !MapStavka.IsExist(s_comb) ) MapStavka.Add(s_comb,str); } AddInfoNU(CTabl,zap,&dataNU) { int extCode=atoi(CTabl.Text(Fld[idxKOD],zap)); if ( ColTVHExcludeNU!=-1 && Sim_For_Extern_Cod(extCode,ColTVHExcludeNU)!='0' ) return; int flagN = atoi(CTabl.Text(Fld[idxNU],zap));//признак Н или У if (flagN>1 || flagN<0) return; double sum[12],rv[12]; for(int i=0;i<12;i++) {sum[i]=0.;rv[i]=0.;} //пользователь может указать месяц начала != январь -> вычислим смещение относительно января int offset=dPerBeg.GetMonth()-1; int fld=Fld[idxSumM1]; //!!!делаем предположение что столбцы с Суммами и РВ идут подряд (друг за другом) for (int m=perBeg; m<=perEnd; m++) //цикл по периоду { double sumMes=atof(CTabl.Text(fld,zap)); sum[m-perBeg+offset]=sumMes; if ( PrRV ) // РВ печатаем { double rvMes=atof(CTabl.Text(fld+1,zap)); rv[m-perBeg+offset]=rvMes; } fld+=2; } //определяем название для вида char mnim=Sim_For_Extern_Cod(extCode,1003-1); char nameVid[256]; sprintf(nameVid,"%03d%s%s",extCode,(mnim=='0')?" ":" * ",GetShortNameNU(Extern_To_Intern(extCode))); //название вида (для мнимых видов добавляем символ *) char key[256];//ключ == "количество эл. в МАР"_"название вида"_"признак мнимого вида" sprintf(key,"%07d_%s_%d",dataNU[!flagN].Size(),to_string(nameVid),(mnim=='0')?0:1); var value[2];value[0]=sum;value[1]=rv; //данные: два массива (с суммами и РВ) за 12 месяцев dataNU[!flagN].Add(to_string(key),value); CalcDaysWorked(dataNU[2]);//определяем сколько "Отработано дней" } //TODO:отработано дней надо выводить с учетом текущей должности , если printCombSeparately==1 CalcDaysWorked(&DaysWorked) { int tmpmrasch = mrasch; for(int m=perBeg; m<=perEnd; m++) //цикл по периоду { s50all(m); if ( rasRV==0 )//рабочие время по табелю { DaysWorked[m-perBeg] = dney_v_tab("r",calm,1,countday); } else //рабочие время через виды { var ts = CreateObject("TempCommonSrc"); ts.TempCommonSrcInitial(CMN_SRC_COUNT_LS); //сохраняем значение текущего источника (при выходе восстановится) unsigned char charSrc = (src_tabl=="")?CLL_TOTAL_SRC:ExtSrcToInt(GetCharFromStr(src_tabl,0)); var Src=CreateObject("APropBE");Src.SetSrc(charSrc); //заменяем источник SetCommonProp(CMN_SRC_COUNT_LS,Src); //устанавливаем текущий источник double n6=0.; s98(m-mrasch,n6); n6*=norm(1);round(n6); DaysWorked[m-perBeg] = n6; // - отработанных дней ts=0; } } if ( tmpmrasch!=mrasch ) s50all(tmpmrasch); } PrintInfoLs(&lsInfo,comb) { PrintStavka(lsInfo[idxInfoStavka]); PrintInfRecruit(lsInfo[idxInfoRecruit],comb); PrintInfOtpuskAliment(lsInfo); PrintInfoNU(lsInfo[idxInfoNU]); } // Печать ставки PrintStavka(&MapStavka) { char str[256]; double stavka = 0.; for (bool Cur=MapStavka.InitIterator(); Cur; Cur=MapStavka.Next() ) stavka += atof(MapStavka.GetCurValue()); sprintf(str,"%.2f",stavka); tWriteStringToCell("CA9",str); MapStavka.Clear(); return 0; } PrintInfRecruit(&MapDateListNu,comb) { var MapPrikaz=CreateObject("MapString");MapPrikaz.Clear();//список вида: "дата начала" - "номер приказа" if(howPrintRecruit) FillMapPrikaz(MapPrikaz,comb); DopProcessingMap(MapDateListNu,MapPrikaz); char cell[256]; //определим для каждого вида номер колонки Excel var MapCodCol=FillMapCodCol(MapDateListNu); //список вида "порядок расчета"_"вн.код вида" - "индекс колонки Excel (для массива ColNu[] ) int row=GetRow(idxInfoRecruit)-1; //определяем сколько строк нужно добавить в Excel int rowNeedAdd=MapDateListNu.Size(); for(int r=1;rmaxHeight_row ) maxHeight_row=currenHeight; tWriteStringToCell2(row,15, OemToAnsi(nPrikaz)); //номер приказа } { //должность на дату приказа char Dolgn[256]; if (!printCombSeparately) GetKchDoljn(Dolgn, 256, curDate, GetGeneralCombineLS()); else GetKchDoljn(Dolgn, 256, curDate, comb); Dolgn=Trim(Dolgn); // уберем лишние пробелы int currenHeight=GetHeightOfRow(to_string(Dolgn),height_row,13," ,;'\""); if( currenHeight>maxHeight_row ) maxHeight_row=currenHeight; sprintf(cell,"AY%d",row); tWriteStringToCell(cell, OemToAnsi(Dolgn)); } var MapNu=MapDateListNu.GetCurValue(); if ( !IsObject(MapNu) ) //случай когда вместо МЭПа с видами передали строку "Уволен" tWriteStringToCell2(row,15, OemToAnsi("Уволен")); else { for (bool Cur=MapNu.InitIterator();Cur;Cur=MapNu.Next()) //цикл по видам { string curKey =MapNu.GetCurKey(); string curValue =MapNu.GetCurValue(); if ( !MapCodCol.IsExist(curKey) ) continue; int idxcol=atoi(MapCodCol.GetValue(curKey)); int cod=atoi(GetElementFromString(1,curKey,"_")); string nameNu=GetShortNameNU(cod)+" "+GetEdBz(atoi(cod)); sprintf(cell,"%s%d",ColNu[idxcol],rowNuHead); tWriteStringToCell(cell, OemToAnsi(nameNu)); //выводим название вида double bz=atof(GetElementFromString(0,curValue,"_")); sprintf(cell,"%s%d",ColNu[idxcol],row); tWriteStringToCell(cell, OemToAnsi(bz)); //выводим БЗ } {// Заработная плата double rez = 0.; if(!printCombSeparately) GetRasNormzar(curDate.GetDouble(),nextDate.GetDouble(),src_tabl,0,rez); else GetRasNormzar(curDate.GetDouble(),nextDate.GetDouble(),src_tabl,comb,rez); sprintf(cell,"BO%d",row); tWriteStringToCell(cell,rez); } } tRowHeight(row,maxHeight_row); row++; } } DopProcessingMap(&MapDateListNu,&MapPrikaz) { var tmpMap=CreateObject("Map"); tmpMap.Clear(); bool firstDate=true; //цикл по датам в порядке возрастания дат for (bool Cur=MapDateListNu.InitIterator();Cur;) { var curDate=KDateFromD(atof(MapDateListNu.GetCurKey())); var MapNu=MapDateListNu.GetCurValue(); if ( !IsObject(MapNu) ) //случай когда вместо МЭПа с видами передали строку "Уволен" { //сохраняем получившийся список видов MapNuNew в tmpMap tmpMap.Add(to_string(curDate.GetDouble()),"Уволен"); break; //после даты увольнения ничего не печатаем... } var MapNuNew=CreateObject("MapString");MapNuNew.Clear(); //список вида: "порядок расчета"_"вн код вида(int)" - BZ ( если встретили несколько видов с одинаковым кодом -> значение БЗ суммируем) for (bool Cur=MapNu.InitIterator();Cur;Cur=MapNu.Next()) //цикл по видам для даты curDate (заполняем MapNuNew данными из MapNu) { string curKey =MapNu.GetCurKey(); string curValue =MapNu.GetCurValue(); int cod=atoi(GetElementFromString(1,curKey,"_")); int PRash=atoi(GetElementFromString(0,curKey,"_")); char key[256]; sprintf(key,"%04d_%03d",PRash, cod); double bz=atof(GetElementFromString(0,curValue,"_")); if (!MapNuNew.IsExist(to_string(key))) MapNuNew.Add(to_string(key),to_string(bz)); else { double curBz=atof(MapNuNew.GetValue(to_string(key))); MapNuNew.Add(to_string(key),to_string(curBz+bz)); } if(howPrintRecruit) continue; //добавляем информацию о приказе из доп.ркв строки double iKod=atof(GetElementFromString(1,curKey,"_")); string dPrikaz=""; //дата приказа string nPrikaz=""; //номер приказа string period =""; //период за который предоставлен отпуск string vidOtpusk=""; if ( PrPRIKAZ ) //пытаемся достать данные о приказе из доп.реквизитов. GetPrikazFromDopRkv(iKod,dPrikaz,nPrikaz,period,vidOtpusk); if ( strlen(nPrikaz)==0 ) continue; if ( !MapPrikaz.IsExist(to_string(curDate.GetDouble())) ) { MapPrikaz.Add(to_string(curDate.GetDouble()),nPrikaz); } else //приказ для этой даты уже есть { if (CountPr) //выводим ВСЕ приказы для этой даты { string oldValue=MapPrikaz.GetValue(to_string(curDate.GetDouble())); MapPrikaz.Add(to_string(curDate.GetDouble()),oldValue+", "+nPrikaz); } } } if (!firstDate) //как минимум вторая итерация по MapDateListNu -> //->перебираем "предыдущие даты" и проверяем какие виды для этих дат действуют на дату curDate( если дата окончания вида> curDate , то добавляем этот вид в MapNuNew) { try //TODO: убрать после починки .Prev() { for (bool Cur=MapDateListNu.Prev();Cur;Cur=MapDateListNu.Prev()) //цикл по датам в порядке убывания дат { var curDate2=KDateFromD(atof(MapDateListNu.GetCurKey())); var MapNu=MapDateListNu.GetCurValue(); for (bool Cur=MapNu.InitIterator();Cur;Cur=MapNu.Next()) //цикл по видам для даты curDate (заполняем MapNuNew данными из MapNu) { string curKey =MapNu.GetCurKey(); string curValue =MapNu.GetCurValue(); var dataE=KDateFromD(atof(GetElementFromString(1,curValue,"_"))); if ( dataE.GetDouble()0.00001) MapDateListNu.Next(); } else firstDate=false; //сохраняем получившийся список видов MapNuNew в tmpMap tmpMap.Add(to_string(curDate.GetDouble()),MapNuNew); Cur=MapDateListNu.Next(); //переходим к следующей дате } //заменяем список MapDateListNu=tmpMap; } FillMapCodCol(&MapRecruit) { /*int startCol=79, col=79, offset=13;*/ var mapCodCol=CreateObject("MapString"); mapCodCol.Clear(); var mapTemp =CreateObject("MapString"); mapTemp.Clear(); for (bool Cur=MapRecruit.InitIterator();Cur;Cur=MapRecruit.Next()) //цикл по датам { var Map=MapRecruit.GetCurValue(); if ( IsObject(Map) ) for (bool Cur=Map.InitIterator();Cur;Cur=Map.Next()) //цикл по видам { string curKey=Map.GetCurKey(); if ( !mapTemp.IsExist(curKey) ) mapTemp.Add(curKey,""); } } int idxCol=0, cntSumShablon=8, cntColIStlb=11, idxFirstRow=13, idxFirstCol=160, cntInsertCol=0; // "пронумеруем" колонки for (bool Cur=mapTemp.InitIterator();Cur;Cur=mapTemp.Next()) //цикл по видам { mapCodCol.Add(mapTemp.GetCurKey(),to_string(idxCol++)); if(idxCol>cntSumShablon) { if(idxCol>=maxColSum) break; cntInsertCol++; tCopyRange(idxFirstRow,idxFirstCol,idxFirstRow+2,idxFirstCol+10,idxFirstRow,idxFirstCol+cntColIStlb*cntInsertCol); tWriteStringToCell2(idxFirstRow+1,idxFirstCol+cntColIStlb*cntInsertCol,13+ cntInsertCol); } } return mapCodCol; } PrintInfOtpuskAliment(&lsInfo) { int row=GetRow(idxInfoOtpusk)-1; //определяем сколько строк нужно добавить в Excel int rowNeedAdd=lsInfo[idxInfoOtpusk].Size(); if (lsInfo[idxInfoUderg].Size()>rowNeedAdd) rowNeedAdd=lsInfo[idxInfoUderg].Size(); for(int r=1;rheight_row ) height_row=currenHeight; } if ( PrVOtp==1 || PrVOtp==2 ) //печатаем "вид" отпуска вместо "периода" за который предоставлен отпуск { period=vidOtpuska; int currenHeight=GetHeightOfRow(period,12,12," ,;'\""); if( currenHeight>height_row ) height_row=currenHeight; } char cell[256], str[256]; if (PrPRIKAZ) // 1 - печать № приказов и даты приказов, 0 - нет { sprintf(cell,"A%d",row); tWriteStringToCell(cell, OemToAnsi(dPrikaz)); //дата приказа sprintf(cell,"O%d",row); tWriteStringToCell(cell, OemToAnsi(nPrikaz)); //номер приказа sprintf(cell,"X%d",row); tWriteStringToCell(cell, OemToAnsi(period )); //за период } sprintf(cell,"AL%d",row); tWriteStringToCell(cell, OemToAnsi(periodO)); //начало и конец отпуска sprintf(cell,"AY%d",row); tWriteStringToCell(cell, OemToAnsi(rv )); //количество дней tRowHeight(row,height_row); row++; } MapOtpuskInfo.Clear(); } ////////////////////////////////// PrintInfoAliment(&MapUdergInfo) { int row=GetRow(idxInfoUderg); //номер первой строки в Excel с информацией об алиментах //цикл по массиву с данными for (bool Cur=MapUdergInfo.InitIterator();Cur;Cur=MapUdergInfo.Next()) { string key =MapUdergInfo.GetCurKey(); string value=MapUdergInfo.GetCurValue(); var List = CreateObject("ParamFuncRW"); List.IInitial1(value,"_",100); char cell[256]; sprintf(cell,"BZ%d",row); if(List.Count()>0) tWriteStringToCell(cell, OemToAnsi(List.Get(0))); //дата и номер sprintf(cell,"CW%d",row); if(List.Count()>1) tWriteStringToCell(cell, OemToAnsi(List.Get(1))); //вид удержания sprintf(cell,"DJ%d",row); if(List.Count()>2) tWriteStringToCell(cell, OemToAnsi(List.Get(2))); //дата первого удержания sprintf(cell,"DR%d",row); if(List.Count()>3) tWriteStringToCell(cell, OemToAnsi(List.Get(3))); //дата последнего удержания sprintf(cell,"ED%d",row); if(List.Count()>4) tWriteStringToCell(cell, OemToAnsi(List.Get(4))); //размер удержания sprintf(cell,"EL%d",row); if(List.Count()>5) tWriteStringToCell(cell, OemToAnsi(List.Get(5))); //в пользу кого sprintf(cell,"EZ%d",row); if(List.Count()>6) tWriteStringToCell(cell, OemToAnsi(List.Get(6))); //адрес ( расчетный счет ) row++; } MapUdergInfo.Clear(); } int KodStroki=2; //значение в колонке "Код стро-ки" (после "Наименование показателя") PrintInfoNU(&dataNU) { int row=GetRow(idxInfoNU); //номер первой строки в Excel с информацией об начислениях int cntRowHead=6, cntRowFooter=4; int first_rowTablNu=row-cntRowHead; double sumVed[12];for(int m=0;m<12;m++) sumVed[m]=0.; //Сумма к выдаче bool printSomeThing=false; //признак того что "что-то" напечатали в таблице за полугодие //выводим информацию по начислениям за первое полугодие if ( PrintSummNUForPeriod(dataNU,row,0,6,sumVed,0) ) printSomeThing=true; row+=3; //выводим информацию по удержаниям за первое полугодие if ( PrintSummNUForPeriod(dataNU,row,0,6,sumVed,1) ) printSomeThing=true; if ( !printSomeThing ) //если ничего не напечатали - удалим "пустую" таблицу за первое полугодие { int cntDeletedRow=row+cntRowFooter-first_rowTablNu; tDeleteRows(first_rowTablNu,cntDeletedRow); // удаляем таблицу за второе полугодие row-=cntDeletedRow; } printSomeThing=false; row+=10; first_rowTablNu=row-cntRowHead; //выводим информацию по начислениям за второе полугодие if ( PrintSummNUForPeriod(dataNU,row,6,12,sumVed,0) ) printSomeThing=true; row+=3; //выводим информацию по удержаниям за второе полугодие if ( PrintSummNUForPeriod(dataNU,row,6,12,sumVed,1) ) printSomeThing=true; if ( !printSomeThing) //если ничего не напечатали - удалим "пустую" таблицу за второе полугодие { int cntDeletedRow=row+cntRowFooter-first_rowTablNu; tDeleteRows(first_rowTablNu,cntDeletedRow); // удаляем таблицу за второе полугодие } dataNU[0].Clear(); dataNU[1].Clear(); } //what 0- печатаем начисления, 1-печатаем удержания PrintSummNUForPeriod(&dataNU,&row,m1,m2,&sumVed,what) { bool bPrintSumm=false; if (m20.00001) bPrintSumm=true; if ( PrRV && what==0 && nabs(rv[m])>0.00001) //печатаем РВ { if (MapPrintRvMainProp.IsExist(Extern_To_Intern(extCode))) //переопределим значение РВ ( возьмем РВ из ЛС по основному источнику/сов-ву/обьекту) { var tmpKdate=CreateObject("KDate");tmpKdate.SetDateIII(1,m+1,dPerBeg.GetYear()); rv[m]=GetRvFromMainProp(extCode,tmpKdate.GetAbs()); } tWriteStringToCell2(row,idxFirstCol-8+idxCol*cntStlbInCol, rv[m]); bPrintSumm=true; } int flagMnim=atoi(GetElementFromString(2,Map.GetCurKey(),"_")); if(flagMnim==0 && extCode!=101 && extCode!=300) //в итоге не учитываем виды остаток/долг, а также мнимые виды { itogo[m]+=sum[m]; } else if (extCode==101) sumVed[m]+=sum[m]; //добавляем остаток к "сумма к выдаче" else if (extCode==300) sumVed[m]-=sum[m]; //вычитаем долг из "сумма к выдаче" } } //печатаем итог по месяцу for(int m=m1;m добавить новую не надо if (CTablDop.Count_Rcr() == 1 && CTablDop.Check_Empty_Rcr(0) == -1 ); else //Не удалось добавить строку if( CTablDop.Add_Rcr(zap++, 1) == -1) return false; CTablDop.SText(FldDb,zap,db); CTablDop.SText(FldDe,zap,de); CTablDop.SText(FldDPrikaz,zap,dPrikaz); CTablDop.SText(FldNPrikaz,zap,nPrikaz); CTablDop.SText(FldBPeriod,zap,bPeriod); CTablDop.SText(FldEPeriod,zap,ePeriod); CTablDop.SText(FldVOtpusk,zap,vOtpusk); return true; } //Настройка -> 5. Настройки таблиц и форм печати -> >> Справки по ЛС -> 3. Карточка-справка (ф.417) int PrPRIKAZ=1; // 1 - печать № приказов и даты приказов, 0 - нет int FlDatPr=1; // 1 - обрезается дата приказа (из доп.рекв.) для ФОТ, 0 - нет //Настройки для таблицы ФОТ: int NumStTV = 0; // номер столбца Таблицы Входимости для заполнения таблицы ФОТ //символы в ТВХ: // '0' - вид не попадает в таблицу ФОТ; // '1' - попадает в таблицу ФОТ; // '2-9' - виды для которых БЗ определяется из сетки по стажу (Номера сеток задаются в настройке через запятую. Можно использовать первые 8 номеров.) // 'С' - (русская) трактуется как "Скрипт". "БЗ вида" определяется по сетке с порядковым номером 9. В этой сетке для каждого вида указывается скриптовая функция для вычисления БЗ. // За основу можно взять сетку "Сетка КОД-ЗНАЧЕНИЕ - пример 1". В режиме crtl+A+A, стоя на столбце с суммой, нажимаем Alt+F6. // Тип данных ставим "C"(латинская),Размерность - "255", Точность - пробел, Ширина - "30". Теперь вместо суммы можно написать скрипт. // Пример скрипта: 'char rez[256],tmp[256];Rkv_from(InternCode,"проц",tmp,rez);return rez;' // вместо строки "InternCode" подставится точный внутренний код вида // Данный скрипт определяет для текущей строки значение доп.реквизита из поля "проц" int cntSetki=9; //первые 8 номеров сеток служат для определения БЗ из сетки по стажу //сетка с порядковым номером 9 служит для определения БЗ через скриптовую функцию int NumSetki[cntSetki]; //массив хранит номера сеток int LimitFirstDate = 1; //Ограничить первую дату началом периода: 0-не ограничивать(мин.дата=="P2MES"), 1-ограничить первым число var min_dateForRecruitCurComb;//минимальное значение даты для текущей должности( для фильтра видов в таблице ФОТ) int howPrintRecruit=0; //где брать информацию о номере приказа: 0 - "по старому" ( из доп. реквизита видов), 1 - из доп.структуры 97 //Настройки для таблицы ОТПУСКА: int howPrintOtpusk=0; //где брать информацию об отпуске для НЕ аттестованных: 0 - "по старому" ( из видов), 1 - из доп.структуры 89 int howPrintOtpuskAttest=0;//где брать информацию об отпуске для аттестованных: 0 - "по старому" ( из видов), 1 - из доп.структуры 89 int FlPrOtp=1; //( Используется если PrPRIKAZ==1 ) //Дата и номер приказа по отпуску вводится через дополнительный реквизит // 1 - по структуре "Надбавки" (в ТВХ символ -"З", псевдоним реквизита-"pr") // 0 - по структуре "Оклада"(в ТВХ символ -"В", псевдоним реквизита-"p") int CountPr=0; // 1 - на одну дату, может быть несколько приказов // 0 - выводить только 1 номер приказа для 1 даты int CommPr=0; // 1 - выводить комментарий к номеру приказа (вид ФОТ) // 0 - не выводить int PrVOtp=0; // 0 - не печатать виды отпуска // 1 - печать виды отпусков (вместо графы за период) // 2 - печать виды отпусков для Челяб.(вместо графы за период), // 3 - печать виды отпусков (вместе с кол-вом дней); //Настройки для таблицы НУ: int ColTVHExcludeNU=-1; // Столбец ТВХ с исключаемыми видами Н-У int bSumNach = 0; //Режим выборки сумм: 0-по месяцу принадлежности; 1-по месяцу начисления int rasRV =0; //Как определять отработанные дни: 0-по табелю, 1-через виды(2 столбец спец.ТВХ) int PrRV = 0; //Печатать РВ для видов НУ: 1 - печатать, 0 - нет // Настройка для того чтобы таблица с суммами по месяцам начиналась со второй страницы int FirstList = 0;// 0 - нет разрывов листа , 1 - таблица с суммами по месяцам начинается со второго листа // Настройка для того чтобы таблица с суммами по месяцам разделялась по страницам int RazrList = 0;// 0 - нет разрывов листа , 1 - разрыв между 1 и 2 частью таблицы с суммами по месяцам int RazrListOtp=0; //разрыв листа перед информацией по отпускам // Совмещения (значение определяется через запрос при формировании таблицы) int printCombSeparately = 0; // 0 - печать все совместительства вместе, 1 - по каждому отдельно // Объект для ФОТ, как берем объект для видов, по которым БЗ берется из 1 объекта int WhatSubj = 0;// 0 - по любому первому объекту, 1 - по основному char SimDR[256]; //символы доп.реквизитов для ТВХ char src_tabl[256]; //источник, по которому сформирована таблица int n_wsh = 1; //номер текущей страницы Excel int idxInfoStavka =0, //таблица "кадровые данные" сотрудника (дата рождения, квалификация и т.д.) idxInfoRecruit=1, //таблица "Отметки о приеме на работу и переводах" (Виды и суммы постоянных начислений заработной платы, надбавок, доплат и т.д.) idxInfoOtpusk =2, //таблица "Сведения об использовании отпусков" idxInfoUderg =3, //таблица "Виды и суммы постоянных удержаний" idxInfoNU =4, //таблица "Начисления и удержания" cntTabl =5, cntInsertRow[cntTabl], startRow[cntTabl]; int perBeg,perEnd; //период запроса (абсолютные месяца) var dPerBeg=CreateObject("KDate"), dPerEnd=CreateObject("KDate"); var zaprosPeriod=CreateObject("KDatePeriods"); // максимальное число листов в книге (для печати в Excel) (+1 это шаблон) int cListInBook = 200+1; int NomDoc = 0; // номер документа int HeightRowPodr=0; var MapPrintMainSrcNU=CreateObject("MapLong"); //ключ - код вида, значение - индекс var MapPrintRvMainProp=CreateObject("MapLong"); //ключ - код вида, значение - индекс Список видов, по которым РВ берем только с "основного" источника/обьекта/сов-ва int howSortWsh=0; //0- по ТН, 1- по ФИО var MapPrintSubjNU=CreateObject("MapLong"); //ключ - код вида, значение - индекс var MapExistSubjNU=CreateObject("MapLong"); //ключ - код вида, значение - индекс FillMap(&CTabl) { var MapRecords=CreateObject("MapString");MapRecords.Clear(); for (int zap=0; zap