string __MonitoringMedRegion; string __MonitoringMedRegionFileName; string __MonitoringMedMO; string __MonitoringMedMO_OID; string __tablePseudo="formMed"; var MapNuRv=CreateObject("MapLong"); //виды из которых брать ФРВ var MapNuSovm=CreateObject("MapLong"); //виды с оплатой внутреннего совместительства (когда не заводят отдельные исп должности) var MapNuRest=CreateObject("MapLong"); //виды при наличии которых в отчет добавляем и нулевые строки var MapDepartmentName=CreateObject("MapString"); var MapDepartmentOID=CreateObject("MapString"); var __ClosedSources=CreateObject("MapString"); var __propArray_415=CreateObject("APropArray"); //список источников с выплатами по пп 415 var __propArray_484=CreateObject("APropArray"); //список источников с выплатами по пп 484 var __propArray_3118=CreateObject("APropArray"); //список источников с выплатами по "Дополнительные выплаты медицинским и иным работникам в соответствии с РП РФ №3118-р" var __propArray_Covid=CreateObject("APropArray"); //список источников с выплатами covid-19 bool __sortByFio=false; bool __sortBySnils=false; bool __mainDolgFirst=false; bool __takeFRMRDolgnName=false; // название должности определять через справочник ФРМР bool __useOkpdtrDolgnName=false; // название должности определять через ОКПДТР bool __frv_nrvFromMainProp=false; bool __frvBySrc=false; //учитываем источник строки при выборке ФРВ "по видам" bool __frvBySubj=false;//учитываем обьект строки при выборке ФРВ "по видам" bool __frvByDep=false; //учитываем подразделение строки при выборке ФРВ "по видам" bool __takeDepartmentNameFromSet=false;//брать наименование подразделение из сетки OID bool __takeRKFromNu=false; int __summFlag=CL_MV; //флаг выборки сумм (по месяцу начисления/месяцу принадлежности) string __prefixSnils=""; string __stagPseudo=""; string __soutPseudo=""; string __QualCatPseudo=""; string __pkgPseudo=""; string reportKeyDelim="^";//разделитель значений int __reportType; int idxReportType_MinstryHealth =1, //"Форма для заполнения" (Минздрав) idxReportType_MinstryWork =2, //"Форма для заполнения" (Минтруд) idxReportType_MinstryWork04_2020 =3, //"Форма для заполнения" (Минтруд) 04.2020 idxReportType_MinstryHealth04_2020=4, //"Форма для заполнения" (Минздрав)04.2020 idxReportType_MinstryHealth11_2020=5, //"Форма для заполнения" (Минздрав)11.2020 idxReportType_MinstryHealth01_2021=6, //"Форма для заполнения" (Минздрав)01.2021 idxReportType_MinstryHealth06_2021=7; //"Форма для заполнения" (Минздрав)06.2021 var __reportParam; int __flagPrint;//1-"Печать" Определяет номер столбца Excel bool __bUseS97OnSalaryCalc=false; //рассчитывать "Размер должностного оклада" через s97col InitMonitoringMed(reportType) { __reportType=reportType; char BufCnf[256]; GetCommonCnf("region",__tablePseudo,BufCnf,255); __MonitoringMedRegion=__MonitoringMedRegionFileName=RTrimS(BufCnf); GetCommonCnf("regionFile",__tablePseudo,BufCnf,255); if(!StringIsEmpty(BufCnf)) __MonitoringMedRegionFileName=RTrimS(BufCnf); GetCommonCnf("MO",__tablePseudo,BufCnf,255); __MonitoringMedMO=RTrimS(BufCnf); GetCommonCnf("MO_OID",__tablePseudo,BufCnf,255); __MonitoringMedMO_OID=RTrimS(BufCnf); MapNuRv.Clear(); GetCommonCnf("CllNU_Rv",__tablePseudo,BufCnf,255); var arr; int countElem =ListNUToSafeArray(BufCnf,' ',arr); for (int i=0;i=397) //01.2021 return idxReportType_MinstryHealth01_2021; if(month>=395) //11.2020 return idxReportType_MinstryHealth11_2020; } } return reportType; } //получаем данные для таблицы GetTableRow() { int reportPeriodMB = KDateFromStr(Str_Date_0).GetAbs(); int reportPeriodME = KDateFromStr(Str_Date_1).GetAbs(); __reportType=AdjustReportTypeByMonthBegin(__reportType,reportPeriodMB); try { var kcp = CreateObject("KPeriodsIterations");kcp.ClearAll(); //цикл по всем Aprop в ЛС var APropArr=CreateObject("APropArray");APropArr.GetPropListLS(); for ( int idxAprop=0; idxAprop0.001) //указаны виды для сов-ва + по видам есть суммы -> добавляем строку с "фиктивным" внутренним совместительством kcp.AddPeriod(MakeRecordKey(month,curProp,true),to_string(datatek),to_string(datatek)); } } } catch(object err) { SayError(err); //выводим сообщение о ошибке } catch(...) { SayUndefinedScriptError(); } } GetDolgnName(prop,month,btakeFRMR) { return PriorityCall("UserMonitoringGetDolgnName","SysMonitoringGetDolgnName",prop,month,btakeFRMR); } SysMonitoringGetDolgnName(prop,month,btakeFRMR) /* если есть должность ФРМР - берем ее если есть должность ОКПДТР - берем ее иначе берем то название должности что используется в организации. */ { if(prop.GetCombine()==-1) return "Должность внутреннего совместительства не определена"; var doljnElem=GetDoljnFromKCH(KDateFromInt_LastDay(month).GetStr(),prop.GetCombine()); if(doljnElem.IsEmpty()) return "Должность не определена"; //если есть должность ФРМР - берем ее if(btakeFRMR && doljnElem.GetFrmrCode()!=0) return RTrimS(doljnElem.GetFrmrName()); //если есть должность ОКПДТР - берем ее if(__useOkpdtrDolgnName && doljnElem.GetOKPDTRCode()!=0) return GetOKPDTRDoljnName(doljnElem.GetOKPDTRCode()); //берем должность из К.Ч. return RTrimS(doljnElem.GetName()); } GetDolgnDepartmentName(prop,month,params) { return PriorityCall("UserGetDolgnDepartmentName","SysGetDolgnDepartmentName",prop,month,params); } SysGetDolgnDepartmentName(prop,month,params) { //можно брать название из подразделения указанного в строке вида //todo:названия подразделений контролировать по справочнику формы- предупредить if (prop.GetCombine()==-1) return "Подразделение внутреннего совместительства не определено"; var departmentCode=DolgnDepartmentCode(prop.GetCombine(),month); if(__takeDepartmentNameFromSet && MapDepartmentName.IsExist(to_string(departmentCode))) return MapDepartmentName.GetValue(to_string(departmentCode)); return RTrimS(GetOtdName(departmentCode)); } DolgnDepartmentCode(combine,month) { var doljnElem=GetDoljnFromKCH(KDateFromInt_LastDay(month).GetStr(),combine); if(doljnElem.IsEmpty()||doljnElem.GetPodr()==0) { var CL=CreateObject("CombineList"); if(CL.GetPodr(combine)>0) return CL.GetPodr(combine); return kch_from_int("podr");//-1; todo: может все же лучше возвращать -1? } return doljnElem.GetPodr(); } GetWorkTypeName(prop,month,params) { return PriorityCall("UserGetWorkTypeName","SysGetWorkTypeName",prop,month,params); } SysGetWorkTypeName(prop,month,params) { if (IsEmployeeExtSovm(month)) return "Внешнее совместительство"; if(prop.GetCombine()==GetGeneralCombineLS()) return "Основное"; return "Внутреннее совместительство"; } IsEmployeeExtSovm(month) { var d=KDateFromInt_LastDay(month); char s[256];GetKchValue("kod_rab",s,99,d); return atoi(s)==4||atoi(s)==9; } GetDolgnStavka(prop,month) { return PriorityCall("UserMonitoringGetDolgnStavka","SysMonitoringGetDolgnStavka",prop,month); } SysMonitoringGetDolgnStavka(prop,month) { if(prop.GetCombine()==-1) return -1; return DefineKEmploy(prop.GetCombine(),KDateFromInt_LastDay(month)); } GetDolgnDepartmentOID(prop,month,params) { return PriorityCall("UserMonitoringGetDolgnDepartmentOID","SysMonitoringGetDolgnDepartmentOID",prop,month,params); } SysMonitoringGetDolgnDepartmentOID(prop,month,params) { if (prop.GetCombine()==-1) return "OID подразделения не определен"; var departmentCode=DolgnDepartmentCode(prop.GetCombine(),month); if (!MapDepartmentOID.IsExist(to_string(departmentCode))) return "OID подразделения не определен"; return MapDepartmentOID.GetValue(to_string(departmentCode)); } GetSrcType(prop) { var multiPropArray= CreateObject("MultiPropArray"); string srcList=RTrimS(GetCommonCnfStr("LIST_SRC01",__tablePseudo)); if(strlen(srcList)) { multiPropArray.LoadFromStr(srcList); if(multiPropArray.IsElemValid(prop)) return "ОМС"; } srcList=RTrimS(GetCommonCnfStr("LIST_SRC02",__tablePseudo)); if(strlen(srcList)) { multiPropArray.LoadFromStr(srcList); if(multiPropArray.IsElemValid(prop)) return "Средства бюджета на финансовое обеспечение государственного задания"; } srcList=RTrimS(GetCommonCnfStr("LIST_SRC03",__tablePseudo)); if(strlen(srcList)) { multiPropArray.LoadFromStr(srcList); if(multiPropArray.IsElemValid(prop)) return "Субсидии из средств бюджета"; } srcList=RTrimS(GetCommonCnfStr("LIST_SRC04",__tablePseudo)); if(strlen(srcList)) { multiPropArray.LoadFromStr(srcList); if(multiPropArray.IsElemValid(prop)) return "Средства от платных мед услуг"; } srcList=RTrimS(GetCommonCnfStr("LIST_SRC05",__tablePseudo)); if(strlen(srcList)) { multiPropArray.LoadFromStr(srcList); if(multiPropArray.IsElemValid(prop)) return "Иные средства от приносящих доход деятельности"; } srcList=RTrimS(GetCommonCnfStr("LIST_SRC06",__tablePseudo)); if(strlen(srcList)) { multiPropArray.LoadFromStr(srcList); if(multiPropArray.IsElemValid(prop)) return "Субсидия федерального бюджета по ПП РФ №415"; } srcList=RTrimS(GetCommonCnfStr("LIST_SRC07",__tablePseudo)); if(strlen(srcList)) { multiPropArray.LoadFromStr(srcList); if(multiPropArray.IsElemValid(prop)) return "Субсидия бюджета субъекта Российской Федерации по ПП РФ №415"; } srcList=RTrimS(GetCommonCnfStr("LIST_SRC08",__tablePseudo)); if(strlen(srcList)) { multiPropArray.LoadFromStr(srcList); if(multiPropArray.IsElemValid(prop)) return "Субсидия бюджета органа местного самоуправления по ПП РФ №415"; } srcList=RTrimS(GetCommonCnfStr("LIST_SRC09",__tablePseudo)); if(strlen(srcList)) { multiPropArray.LoadFromStr(srcList); if(multiPropArray.IsElemValid(prop)) return "Иные источники софинансирования по ПП РФ №415"; } srcList=RTrimS(GetCommonCnfStr("LIST_SRC10",__tablePseudo)); if(strlen(srcList)) { multiPropArray.LoadFromStr(srcList); if(multiPropArray.IsElemValid(prop)) return "Субсидия федерального бюджета по ПП РФ №484"; } //отпускные с ковидных выплатами srcList=RTrimS(GetCommonCnfStr("LIST_SRC26",__tablePseudo)); if(strlen(srcList)) { multiPropArray.LoadFromStr(srcList); if(multiPropArray.IsElemValid(prop)) return "Субсидия федерального бюджета по ПП РФ №415 (отпускные)"; } srcList=RTrimS(GetCommonCnfStr("LIST_SRC27",__tablePseudo)); if(strlen(srcList)) { multiPropArray.LoadFromStr(srcList); if(multiPropArray.IsElemValid(prop)) return "Субсидия бюджета субъекта Российской Федерации по ПП РФ №415 (отпускные)"; } srcList=RTrimS(GetCommonCnfStr("LIST_SRC28",__tablePseudo)); if(strlen(srcList)) { multiPropArray.LoadFromStr(srcList); if(multiPropArray.IsElemValid(prop)) return "Субсидия бюджета органа местного самоуправления по ПП РФ №415 (отпускные)"; } srcList=RTrimS(GetCommonCnfStr("LIST_SRC29",__tablePseudo)); if(strlen(srcList)) { multiPropArray.LoadFromStr(srcList); if(multiPropArray.IsElemValid(prop)) return "Иные источники софинансирования по ПП РФ №415 (отпускные)"; } srcList=RTrimS(GetCommonCnfStr("LIST_SRC30",__tablePseudo)); if(strlen(srcList)) { multiPropArray.LoadFromStr(srcList); if(multiPropArray.IsElemValid(prop)) return "Субсидия федерального бюджета по ПП РФ №484 (отпускные)"; } srcList=RTrimS(GetCommonCnfStr("LIST_SRC40",__tablePseudo)); if(strlen(srcList)) { multiPropArray.LoadFromStr(srcList); if(multiPropArray.IsElemValid(prop)) return "Дотация бюджетам субъектов Российской Федерации по РП РФ №3118-р (отпускные)"; } srcList=RTrimS(GetCommonCnfStr("LIST_SRC41",__tablePseudo)); if(strlen(srcList)) { multiPropArray.LoadFromStr(srcList); if(multiPropArray.IsElemValid(prop)) return "Дотация бюджетам субъектов Российской Федерации по РП РФ №3118-р"; } srcList=RTrimS(GetCommonCnfStr("LIST_SRC42",__tablePseudo)); if(strlen(srcList)) { multiPropArray.LoadFromStr(srcList); if(multiPropArray.IsElemValid(prop)) return "Субсидии из средств бюджета субъекта на выплаты за работу с COVID-19"; } srcList=RTrimS(GetCommonCnfStr("LIST_SRC43",__tablePseudo)); if(strlen(srcList)) { multiPropArray.LoadFromStr(srcList); if(multiPropArray.IsElemValid(prop)) return "Субсидии из средств органа местного самоуправления на выплаты за работу с COVID-19"; } srcList=RTrimS(GetCommonCnfStr("LIST_SRC44",__tablePseudo)); if(strlen(srcList)) { multiPropArray.LoadFromStr(srcList); if(multiPropArray.IsElemValid(prop)) return "Иные источники софинансирования выплат за работу с COVID-19"; } return "Источник не определен"; } GetFrvMed(prop,month,isSovmByNu) { return PriorityCall("UserGetFrvMed","SysGetFrvMed",prop,month,isSovmByNu); } SysGetFrvMed(prop,month,isSovmByNu) { //настройка брать РВ с главного, но prop не главный if(__frv_nrvFromMainProp && !prop.IsEQ(GetLsMainProp())) return 0.; double totalRv=0.; if(!isSovmByNu && MapNuRv.Size()<1)//берем ФРВ из табеля { var tmpComb=CreateObject("TmpCurCombine");tmpComb.Init(prop.GetCombine()); //устанавливаем должность текущей int tmpMrasch = mrasch; s50(month); skoljko(totalRv,data,1,countday,rsimv,calm,cht); if ( mrasch!=tmpMrasch ) s50(tmpMrasch); } else //берем РВ из видов { var propTmp = CreateObject("APropBE");propTmp.Init(CLL_TOTAL_SRC,CLL_TOTAL_SUBJECT,CLL_TOTAL_PODR,prop.GetCombine()); if(__frvBySrc) propTmp.SetSrc(prop.GetSrc()); if(__frvBySubj) propTmp.SetSubject(prop.GetSubject()); if(__frvByDep) propTmp.SetPodr(prop.GetPodr()); if(isSovmByNu) { //ФРВ берем из видов, указанных в настройках CllNU_Rv И CllNU_Sov if( MapNuRv.Size()<1 || MapNuSovm.Size()<1 ) return 0.; string nuList=GetNuListIntersect(StrFromMap(MapNuRv," "),StrFromMap(MapNuSovm," ")); var arr; int countElem =ListNUToSafeArray(nuList,' ',arr); for (int i=0;i0)//исключаем виды, указанные в MapNuSovm nuList=GetNuListExcept(nuList,StrFromMap(MapNuSovm," ")); return GetReportSummNuList(prop,month,nuList,__summFlag); } GetSummGroupFiltered(prop,month,groupNum,isSovmByNu,filterPropArray) { if( filterPropArray.FindTotal(prop)==-1) //prop не содержится в filterPropArray return 0.; return GetSummGroup(prop,month,groupNum,isSovmByNu); } DefineRkByProp(prop,month) { var date=KDateFromInt_LastDay(month); if(__takeRKFromNu) { //пытаемся найти действующую строку РК //если БЗ вида непустое - возвращаем значение БЗ char nuList[256]; GetCommonCnf("CllNU_3",__tablePseudo,nuList,255); var arr; int cntNu=ListNUToSafeArray(nuList,' ',arr); for(int i=0;i0 && MapNuRv.Size()>0) //нужно выставить флаг "суммируемое поле" для полей с ФРВ return true; return false; } GetSnilsPartSortKey() { if( !__sortByFio && !__sortBySnils ) return ""; if(__sortByFio) return GetFioFromKch(); return GetSnilsDigits(); } GetMainDolgnPartSortKey(workTypeName) { if(!__mainDolgFirst) return ""; return workTypeName=="Основное"?"1":"2"; } GetSnilsDigits() { char Buf[256];kch_from("strah_n",Buf);Buf=RTrimS(Buf); char digits[256]; // тут будет результат // Копируем в digits только цифры int digitCount=0; for (int i=0; i='0' && Buf[i]<='9') digits[digitCount++] = Buf[i]; return to_string(digits); } GetReportValue(idx) { var kcp = CreateObject("KPeriodsIterations"); return Split(kcp.GetCurCod(),reportKeyDelim)[idx]; } GetLastReportIdx() { switch(__reportType) { case idxReportType_MinstryHealth04_2020: return idx39_484; //Сумма страховых взносов с выплат стимулирующего характера, начисленных по ПП РФ 484 case idxReportType_MinstryHealth11_2020: return idx41_3118;//Дополнительные выплаты медицинским и иным работникам в соответствии с РП РФ №3118-р case idxReportType_MinstryHealth01_2021: return idxWeekTime;//Продолжительность рабочего времени в неделю ( часы ) case idxReportType_MinstryHealth06_2021: return idxVMPSumm;//96. Размер выплаты за оказание ВМП } return idxSum38; //idxReportType_MinstryWork04_2020 //Выплата стимулирующего характера за особые условия труда и } CalcFlagSumm(res) { int lastReportIdx=GetLastReportIdx(); for(int idx=idxSum1;idx<=lastReportIdx;idx++) { if(CalcFlagSumm_SkipField(idx)) continue; //нашли ненулевую сумму if(nabs(atof(Split(res,reportKeyDelim)[idx]))>0.00001) return 1; var tmp=RTrimS(Split(res,reportKeyDelim)[idx]); UpperString(tmp); if ( tmp=="ДА" ) return 1; } return 0; } CalcFlagSumm_SkipField(idx) { //поля таблицы, которые не влияют на значение flagSumm switch(idx) { case idxContracNum: case idxContracDat: case idxWeekTime: case idxSalaryValue: case idxMedStag: case idxMedSout: case idxMedQualCat: case idxMedPkg: case idxMedKu: return true; } //для отчета минздрава не учитываем столбцы РК и Северная надбавка if( __reportType>=idxReportType_MinstryHealth04_2020 && ( idx==idxRk_415 || idx==idxRk_484 || idx==idxSev_415) ) return true; //ФРВ COVID учитываем только для отчета idxReportType_MinstryHealth01_2021 и idxReportType_MinstryHealth06_2021 if( idx==idxFrv_Covid && __reportType0.00001) return 1; return 0; /* int bFindRest=0; //смотрим наличие в табеле символов "ОДТ" int combine=atoi(Split(res,reportKeyDelim)[idxSummComb]); var tmpComb=CreateObject("TmpCurCombine");tmpComb.Init(combine); //устанавливаем должность текущей int month=atoi(Split(res,reportKeyDelim)[idxMonthAbs]); int tmpMrasch = mrasch; s50(month); for ( int day=1; day <= countday; day++ ) if (calm[day-1]=='О' || calm[day-1]=='Д' || calm[day-1]=='Т' ) { bFindRest=1; break; } if ( mrasch!=tmpMrasch ) s50(tmpMrasch); return bFindRest; */ } //печатаем для Минтруда PrintMonitoringMinistryWork() { PrintMonitoringBase(idxReportType_MinstryWork); } PrintMonitoringMinistryWork04_2020() { PrintMonitoringBase(idxReportType_MinstryWork04_2020); } //печатаем для Минздрава PrintMonitoringMed() { PrintMonitoringBase(idxReportType_MinstryHealth); } //печатаем для Минздрава PrintMonitoringMed04_2020() { PrintMonitoringBase(idxReportType_MinstryHealth04_2020); } DefineXltPath(reportType) { char Dir[256]; // строка для текущей директории GetCurrentDirectory(255,Dir); // получаем текущую директорию (это корень каталога ZPL из которого запустили АМБу) // если шаблона нет, на лок.машине, и версия сетевая...то берем шаблон с // серверной машины if ( !IsLocalZPL() && IsCommonResource(NameCommonDir()) ) { //берем путь к сетевому ZPL GetCommonZPL(Dir,255); } string fileName="monitoringMed.xlt"; if( reportType==idxReportType_MinstryWork ) fileName="monitoringMinistryWork.xlt"; else if ( reportType==idxReportType_MinstryWork04_2020 ) fileName="monitoringMinistryWork_2020.xlt"; else if( reportType==idxReportType_MinstryHealth04_2020 ) fileName="monitoringMed2020.xlt"; else if( reportType==idxReportType_MinstryHealth11_2020 ) fileName="monitoringMed2020_11.xlt"; else if( reportType==idxReportType_MinstryHealth01_2021 ) fileName="monitoringMed2021_01.xlt"; else if( reportType==idxReportType_MinstryHealth06_2021 ) fileName="monitoringMed2021_06.xlt"; char NameXlt[256]; sprintf(NameXlt,"%s\\%s\\%s",Dir,NameCommonDir(),fileName); char userNameXlt[256];sprintf(userNameXlt,"%s\\%s\\user_%s",Dir,NameCommonDir(),fileName); //файл нашли-> берем пользовательский шаблон if (access(userNameXlt,0) == 0) NameXlt=userNameXlt; return NameXlt; } PrintMonitoringBase(reportType) { var CFile=CreateObject("CurPrnFile"); // объект класса для работы с текущим файлом печати CFile.SetFlagBrowse(0); CFile.SetFlag_Print(0); var CTabl=CreateObject("CurPrnTbl"); // объект класса для работы с текущей таблицей InitReportParams(CTabl,reportType); int reportMonth=atoi(__reportParam.GetValue("reportMonth")); reportType=atoi(__reportParam.GetValue("reportType")); var noPrintColumns=__reportParam.GetValue("noPrintColumns"); InitMonitoringMed(reportType); if(!CheckBeforePrint(CTabl)) return; string NameXlt=DefineXltPath(reportType); tPrepereOfficeForWork(); // определяем работать на Excel или на Calc (определяем какой из офисов (MS Office или OpenOffice) установлен и какой предпочтительнее) tOpenXlsObjects(to_string(NameXlt),""); string wshName= (reportType==idxReportType_MinstryHealth) ? "Лист1" : "Таблица 1"; tGetWshByName(OemToAnsi(wshName)); //tGetWshByIndex(1); // получаем ссылку на лист (worksheet) tWshSelect(); var CMsg = 0; // Процент выполненной работы int bTime = false; // false-показывать процент, // true-показывать оставшееся время CMsg=CreateObject("ProgressBar"); CMsg.Initial(0,100,1); CMsg.SetShowTime(static_cast_to_int(bTime)); int cntExcelColumn=CTabl.Count_Fld(); int cntExcelRow=CTabl.Count_Rcr(); var printData[cntExcelColumn][cntExcelRow]; int idxFldFlagSumm=CTabl.Find_Name_Fld("flagSumm"); int idxFldFlagRest=CTabl.Find_Name_Fld("flagRest"); //определяем в каком порядке печатать колонки ( пользователь может определить свой шаблон и внем порядок колонок может быть другим) var MapColumnOrder; int columnCount=FillColumnOrder(CTabl,reportType,MapColumnOrder); if(columnCount==-1) { tEndXlsWork(1); // делаем форму видимой return 0; } try { int rowIndex=0; //индекс строки в printData int firstExcelRow=reportType==idxReportType_MinstryWork04_2020?5:4;//начинаем печатать в 4 строку int npp=0;//порядковый номер строки // цикл по записям таблицы for (int record=0; record0; bool haveRest=idxFldFlagRest==-1||atoi(CTabl.Text(idxFldFlagRest,record))>0; if ( !haveSumm && !haveRest) continue; if( reportType==idxReportType_MinstryWork04_2020 ) npp++; //добавляем строки tInsertRows(firstExcelRow+1,1);tCopyRow(firstExcelRow+2); //пишем данные в printData PrintOneRow(CTabl,record,rowIndex++,npp,noPrintColumns,printData,MapColumnOrder); } int lastExcelRow=firstExcelRow+rowIndex-1; if(rowIndex) //если есть что печатать tSetRangeValue(firstExcelRow,1,lastExcelRow,columnCount,printData); //удаляем "пустые" строки tDeleteRows(lastExcelRow+1,3); // чтобы не было выделенной строки после всех манипуляций с копированием // выделим отдельную ячейку. tWshCellSelect(4,1); } // блок try catch(object err) { tEndXlsWork(1); // делаем форму видимой SayError(err); return 1; } catch(...) { SayUndefinedScriptError(); } if( reportType==idxReportType_MinstryHealth11_2020 ) { string filePath=MakeReportName(reportMonth); if(!StringIsEmpty(filePath) && CheckFileExistAndDelete(filePath)) tSaveXlsObjects(filePath); } tEndXlsWork(1); // делаем форму видимой return 0; } FillColumnOrder(CTabl,reportType,&MapColumnOrder) { int columnIndex=0; int maxExcelColumnNumber=0; if( reportType==idxReportType_MinstryWork04_2020 ) columnIndex++;//оставляем место под "номер п/п" var UsedExcelColumn=CreateObject("MapString");UsedExcelColumn.Clear(); MapColumnOrder=CreateObject("MapLong");MapColumnOrder.Clear(); for(int tableColumn=0;tableColumn0 && !MapColumnOrder.IsExist(tableColumn)) { //проверяем - может этот номер уже был указан для другого столбца... if(UsedExcelColumn.IsExist(excelColumnNumber)) { MsgBox(OemToAnsi("Столбец Excel с номером "+to_string(excelColumnNumber)+" зарезервирован для печати данных из столбца "+UsedExcelColumn.GetValue(excelColumnNumber)),"",MB_OK|MB_ICONWARNING); return -1; } else UsedExcelColumn.Add(excelColumnNumber,RTrimS(CTabl.Name(tableColumn))); MapColumnOrder.Add(tableColumn,excelColumnNumber-1); //минус 1 т.к. мечатаем через матрицу if(excelColumnNumber>maxExcelColumnNumber) maxExcelColumnNumber=excelColumnNumber; } } else MapColumnOrder.Add(tableColumn,columnIndex++); } return max(columnIndex,maxExcelColumnNumber); } CheckBeforePrint(tabl) { int reportMonth=atoi(__reportParam.GetValue("reportMonth")); int reportType=atoi(__reportParam.GetValue("reportType")); if(reportType==idxReportType_MinstryHealth11_2020 && reportMonth>=395) { //Источник финансирования <субсидия федерального бюджета по ПП РФ 415> исключен начиная с отчета за ноябрь 2020 года, то есть выплаты по данному источнику будут считаться ошибкой!!!. int fldSum_415=tabl.Find_Name_Fld("S36"); int fdVznosi_415=tabl.Find_Name_Fld("S37"); //Источник финансирования <субсидия федерального бюджета по ПП РФ 484> исключен в связи с прекращением действия ПП РФ №484 начиная с отчета за ноябрь 2020 года, то есть выплаты по данному источнику будут считаться ошибкой!!! int fldSum_484=tabl.Find_Name_Fld("S39"); int fdVznosi_484=tabl.Find_Name_Fld("S40"); int fldSrcName=tabl.Find_Name_Fld("SrcName"); bool bFindSummClosedSource=false; string curSrcName=""; // цикл по записям таблицы for (int record=0; record0.001) { bFindSummClosedSource=true; break; } } if( bFindSummClosedSource && MsgBox(OemToAnsi("Внимание! В таблице присутствуют суммы по источнику '" + curSrcName + "' (исключен с ноября 2020 года)\r\nПродолжить печать?"),"",MB_YESNO)!=IDYES) return false; //не печатаем } return true;//все ок } MakeReportName(absMonth) { char dir[256]; GetCurrentDirectory(255,dir); dir+="\\"+NameCommonDir()+"\\MonitoringMedReports\\"; //создаем директорию var dirInfo = CreateObject("DirectoryInfo"); dirInfo.Init(to_string(dir)); if (!dirInfo.Exists()) dirInfo.Create(); //в Panel_Path надо передать путь в дос кодировке dir=AnsiToOem(dir); if(Panel_Path("Каталог для сохранения отчета",dir,0)==ESC) return ""; var kdate=KDateFromInt(absMonth); char filePath[256]; sprintf(filePath,"%s%s_%02d_%04d.xls",OemToAnsi(RTrimS(dir)),OemToAnsi(__MonitoringMedRegionFileName),kdate.GetMonth(),kdate.GetYear()); return to_string(filePath); } CheckFileExistAndDelete(filePath) { var fileInfo = CreateObject("FileInfo"); fileInfo.Init(to_string(filePath)); var dirInfo = CreateObject("DirectoryInfo"); dirInfo.Init(fileInfo.Directory()); //создаем директорию if (!dirInfo.Exists()) { if(!dirInfo.Create()) return false; } //файл уже создан ранее.. если пользователь согласен перезаписать его - удаляем файл. if (fileInfo.Exists()) { string msg = "Внимание!\nФайл '" + AnsiToOem(filePath) + "' существует. \n\nПерезаписать?"; int res = AmbaMessageBox(msg, "Контур-Зарплата", MB_YESNOCANCEL|MB_ICONWARNING|MB_DEFBUTTON2, 0); if (res != IDYES) return false; fileInfo.Delete(); } return true; } PrintOneRow(&CTabl,record,rowIndex,npp,noPrintColumns,&printData,MapColumnOrder) { if (npp>0) printData[0][rowIndex]=npp; for(int tableColumn=0;tableColumn0 ? prop.GetCombine() : GetGeneralCombineLS(); //для сов-ва "через вид" берем должность помеченную главной var tmpComb=CreateObject("TmpCurCombine");tmpComb.Init(combine); //устанавливаем должность текущей char str[256]; GetKchValue("empcontr",str,255,KDateFromInt_LastDay(month));//берем "значение" из поля к.ч. Трудовой договор на дату=последнее число для month str = KZMainDomain().EmploymentContract(to_string(str)).Number; if(StringIsEmpty(str)) return "б/н"; return to_string(str); } //дата трудового договора GetContractDate(month,prop) { return PriorityCall("UserGetContractDate","SysGetContractDate",month,prop); } bool bTakeDateRb=false;//если в к.ч. дата договора не заполнена - брать дату приема SysGetContractDate(month,prop) { int combine=prop.GetCombine()>0 ? prop.GetCombine() : GetGeneralCombineLS(); //для сов-ва "через вид" берем должность помеченную главной var tmpComb=CreateObject("TmpCurCombine");tmpComb.Init(combine); //устанавливаем должность текущей char str[256]; GetKchValue("empcontr",str,255,KDateFromInt_LastDay(month));//берем "значение" из поля к.ч. Трудовой договор на дату=последнее число для month var datV = KZMainDomain().EmploymentContract(to_string(str)).ContractDate; var kd = CreateObject("KDate"); kd.SetVariantDate(datV); if(kd.IsValid()) return kd.GetStr(); GetKchDate("empcontr",str,255,KDateFromInt_LastDay(month));//берем "дату" из поля к.ч. Трудовой договор на дату=последнее число для month //если в к.ч. дата договора не заполнена брать дату приема?? if(bTakeDateRb && !KDateFromStr(str).IsValid()) return to_string(kch_from_safe("data_rb")); return to_string(str); } //Продолжительность рабочего времени в неделю ( часы ) GetWeekTime(month,prop) { return PriorityCall("UserGetWeekTime","SysGetWeekTime",month,prop); } SysGetWeekTime(month,prop) { int combine=prop.GetCombine()>0 ? prop.GetCombine() : GetGeneralCombineLS(); //для сов-ва "через вид" берем должность помеченную главной var tmpComb=CreateObject("TmpCurCombine");tmpComb.Init(combine); //устанавливаем должность текущей char kchvalue[256]; int numgr = atoi(GetKchValue("grafik",kchvalue,255,KDateFromInt_LastDay(month))); if ( !numgr ) numgr = 1; int parentNum = GetNumParentCalend(numgr); if ( parentNum ) numgr = parentNum; return GetCountWeekHours(numgr); } GetSalaryValue(curProp,month,isSovmByNu) { return PriorityCall("UserGetSalaryValue","SysGetSalaryValue",curProp,month,isSovmByNu); } SysGetSalaryValue(curProp,month,isSovmByNu) { if(isSovmByNu) return 0.; //"должностной оклад" определяем через ras_normzar() //по видам, входящим в "CllNU_1" //значение берем на конец месяца //пометим оклады символом 1 в столбце 'd' char dopstbuf[MAXKOD]; memcpy(dopstbuf,dopst,MAXKOD); for ( int i=0; i=0; --i ) { int ikod =arr[i]; int pos = poisk1(ikod, kodnu1, cntplus, 0); if (pos != -1) dopst[pos]='1'; } //значение берем на конец месяца var DateDop=KDateFromInt_LastDay(month); var tmpCommonSrc = CreateObject("TempCommonSrc"); tmpCommonSrc.TempCommonSrcInitial(CMN_SRC_COUNT_LS); SetCommonProp(CMN_SRC_COUNT_LS,curProp); double rez=0.; if(__bUseS97OnSalaryCalc) { double rz2; double d1=KDateFromInt_WithDay(1,month).GetDouble(); double d2=KDateFromInt_LastDay(month).GetDouble(); int tmpMrasch = mrasch; s50(month); s97col('d',d1,d2,rez,rz2,1); //умножаем ставку за день на НРВ, чтобы получить сумму оклада. rez*=GetNrvImpl(curProp.GetCombine(),month,1); if ( mrasch!=tmpMrasch ) s50(tmpMrasch); } else ras_normzar('d',"1",1,0x02|0x04,rez,DateDop); memcpy(dopst,dopstbuf,MAXKOD); return rez; } GetMedStag(curProp,month) { return PriorityCall("UserGetMedStag","SysGetMedStag",curProp,month); } int flagMedStagShowWarn=1;//показывать сообщение? SysGetMedStag(prop,month) { //для сов-ва "через вид" стаж определить не можем if( prop.GetCombine()<1) return 0.; if ( !Str_Cmp(__stagPseudo," "," ") ) // пустая настройка по стажу return 0.; else if ( kch_num_sys(__stagPseudo)<0 ) { if ( flagMedStagShowWarn ) MsgBoxCheck(OemToAnsi("Отсутствует поле КЧ "+__stagPseudo+" для подсчета стажа"),OemToAnsi("Контур-Зарплата"),MB_OK|MB_ICONWARNING,"",flagMedStagShowWarn); return 0.; } var tmpComb=CreateObject("TmpCurCombine");tmpComb.Init(prop.GetCombine()); //устанавливаем должность текущей //значение берем на конец месяца var kDate=KDateFromInt_LastDay(month); int years = 0, months = 0, days = 0; if(CalculateStagSIOZPCommon(__stagPseudo,kDate,years,months,days)== -1) return 0.; //Например: сотрудник отработал в государственных МО 10 лет и 3 месяца, тогда в поле ставим значение - 10,25, так как 3 месяца составляет 0,25 от года double stag= years+months/12.; roundd(stag, 2, stag); return stag; } int flagMedSoutShowWarn=1;//показывать сообщение? GetMedSout(curProp,month) { return PriorityCall("UserGetMedSout","SysGetMedSout",curProp,month); } SysGetMedSout(prop,month) { //для сов-ва "через вид" СОУТ определить не можем if( prop.GetCombine()<1) return ""; if ( !Str_Cmp(__soutPseudo," "," ") ) // пустая настройка по стажу return ""; else if ( kch_num_sys(__soutPseudo)<0 ) { if ( flagMedSoutShowWarn ) MsgBoxCheck(OemToAnsi("Отсутствует поле КЧ "+__soutPseudo+" для определения класса вредности"),OemToAnsi("Контур-Зарплата"),MB_OK|MB_ICONWARNING,"",flagMedSoutShowWarn); return ""; } var tmpComb=CreateObject("TmpCurCombine");tmpComb.Init(prop.GetCombine()); //устанавливаем должность текущей //значение берем на конец месяца var kDate=KDateFromInt_LastDay(month); char kchvalue[256]; GetKchValue(__soutPseudo,kchvalue,255,kDate); string Out = ""; if ( GetCommonCnfInt("TypeSout",__tablePseudo)==1 ) Out = RTrimS(kchvalue); else { int cod = atoi(kchvalue); if ( cod<100 ) return Out; // спецоценка не проводилась int klass = cod%100; if ( klass==10 ) Out = "1"; else if ( klass==20 ) Out = "2"; else if ( klass==31 ) Out = "3.1"; else if ( klass==32 ) Out = "3.2"; else if ( klass==33 ) Out = "3.3"; else if ( klass==34 ) Out = "3.4"; else if ( klass==40 ) Out = "4"; } //допустимые значения switch(Out) { case "1": case "2": case "3.1": case "3.2": case "3.3": case "3.4": case "4": return Out; } return ""; } GetMedQualCat(curProp,month) { return PriorityCall("UserGetMedQualCat","SysGetMedQualCat",curProp,month); } int flagMedQualCatShowWarn=1;//показывать сообщение? SysGetMedQualCat(prop,month) { //для сов-ва "через вид" СОУТ определить не можем if( prop.GetCombine()<1) return "Отсутствует"; if ( !Str_Cmp(__QualCatPseudo," "," ") ) // пустая настройка по стажу return "Отсутствует"; else if ( kch_num_sys(__QualCatPseudo)<0 ) { if ( flagMedQualCatShowWarn ) MsgBoxCheck(OemToAnsi("Отсутствует поле КЧ "+__QualCatPseudo+" для определения квалификационной категории"),OemToAnsi("Контур-Зарплата"),MB_OK|MB_ICONWARNING,"",flagMedQualCatShowWarn); return "Отсутствует"; } var tmpComb=CreateObject("TmpCurCombine");tmpComb.Init(prop.GetCombine()); //устанавливаем должность текущей //значение берем на конец месяца var kDate=KDateFromInt_LastDay(month); char kchvalue[256]; kchvalue=RTrimS(GetKchValue(__QualCatPseudo,kchvalue,255,kDate)); LowerString(kchvalue); string qualCat="Отсутствует"; if ( atoi(kchvalue) == 1 || kchvalue=="первая") qualCat = "Первая"; else if ( atoi(kchvalue) == 2 || kchvalue=="вторая") qualCat = "Вторая"; else if ( atoi(kchvalue) == 3 || kchvalue=="высшая") qualCat = "Высшая"; else if ( strlen(kchvalue) ) qualCat = to_string(kchvalue); //допустимые значения switch(qualCat) { case "Отсутствует": case "Вторая": case "Первая": case "Высшая": return qualCat; } return "Отсутствует"; } GetMedPkg(curProp,month) { return PriorityCall("UserGetMedPkg","SysGetMedPkg",curProp,month); } int flagMedPkgShowWarn=1;//показывать сообщение? SysGetMedPkg(prop,month) { //для сов-ва "через вид" СОУТ определить не можем if( prop.GetCombine()<1) return ""; if ( !Str_Cmp(__pkgPseudo," "," ") ) // пустая настройка по стажу return ""; else if ( kch_num_sys(__pkgPseudo)<0 ) { if ( flagMedPkgShowWarn ) MsgBoxCheck(OemToAnsi("Отсутствует поле КЧ "+__pkgPseudo+" для определения ПКГ"),OemToAnsi("Контур-Зарплата"),MB_OK|MB_ICONWARNING,"",flagMedPkgShowWarn); return ""; } var tmpComb=CreateObject("TmpCurCombine");tmpComb.Init(prop.GetCombine()); //устанавливаем должность текущей //значение берем на конец месяца var kDate=KDateFromInt_LastDay(month); char kchvalue[256]; GetKchValue(__pkgPseudo,kchvalue,255,kDate); string pkg=""; if ( atoi(kchvalue) == 1 || atoi(kchvalue) == 2 || atoi(kchvalue) == 3 || atoi(kchvalue) == 4 ) pkg = to_string(atoi(kchvalue)); return pkg; } GetMedKu(curProp,month) { return PriorityCall("UserGetMedKu","SysGetMedKu",curProp,month); } SysGetMedKu(prop,month) { //для сов-ва "через вид" КУ определить не можем if( prop.GetCombine()<1) return ""; char nuList[256]; GetCommonCnf("CllNU_40",__tablePseudo,nuList,255); var arr; int cntNu=ListNUToSafeArray(nuList,' ',arr); //цикл по видам в настройке for(int i=0;i0)//исключаем виды, указанные в MapNuSovm nuList=GetNuListExcept(nuList,StrFromMap(MapNuSovm," ")); var map=MapFromStr(nuList," "); double totalRv=0; //цикл по видам из настройки for (bool Cur=map.InitIterator();Cur;Cur=map.Next()) { int code =atoi(map.GetCurKey()); if(code<1) continue; totalRv+=CashSummProp(0,code,month,month,42,CL_SOURCE|__summFlag,prop); } roundd(totalRv, 2, totalRv); return nabs(totalRv)>0.001 ? to_string(totalRv): ""; }