string __MonitoringMedRegion; 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 __propArray_415=CreateObject("APropArray"); //список источников с выплатами по пп 415 var __propArray_484=CreateObject("APropArray"); //список источников с выплатами по пп 484 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 reportKeyDelim="^";//разделитель значений int __reportType; int idxReportType_MinstryHealth =1, //"Форма для заполнения" (Минздрав) idxReportType_MinstryWork =2, //"Форма для заполнения" (Минтруд) idxReportType_MinstryWork04_2020 =3, //"Форма для заполнения" (Минтруд) 04.2020 idxReportType_MinstryHealth04_2020=4; //"Форма для заполнения" (Минздрав)04.2020 InitMonitoringMed(reportType) { __reportType=reportType; char BufCnf[256]; GetCommonCnf("region",__tablePseudo,BufCnf,255); __MonitoringMedRegion=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;i0.001) //указаны виды для сов-ва + по видам есть суммы -> добавляем строку с "фиктивным" внутренним совместительством kcp.AddPeriod(MakeRecordKey(month,curProp,true),to_string(datatek),to_string(datatek)); } } } catch(object err) { SayError(err); //выводим сообщение о ошибке } catch(...) { SayUndefinedScriptError(); } } GetDolgnName(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) { if(prop.GetCombine()==-1) return -1; return DefineKEmploy(prop.GetCombine(),KDateFromInt_LastDay(month)); } GetDolgnDepartmentOID(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"; } 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]; } CalcFlagSumm(res) { for(int idx=idxSum1;idx<=idxLastSumm;idx++) { //для отчета минздрава не учитываем столбцы РК и Северная надбавка if( __reportType==idxReportType_MinstryHealth04_2020 && ( idx==idxRk_415 || idx==idxRk_484 || idx==idxSev_415) ) continue; //нашли ненулевую сумму if(nabs(atof(Split(res,reportKeyDelim)[idx]))>0.00001) return 1; } return 0; } CalcFlagRest(month,curProp) { if (nabs(GetReportSummNuList(curProp,month,StrFromMap(MapNuRest," "),CL_M))>0.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); } PrintMonitoringBase(reportType) { InitMonitoringMed(reportType); var CFile=CreateObject("CurPrnFile"); // объект класса для работы с текущим файлом печати CFile.SetFlagBrowse(0); CFile.SetFlag_Print(0); char Dir[128]; // строка для текущей директории GetCurrentDirectory(128,Dir); // получаем текущую директорию (это корень каталога ZPL из которого запустили АМБу) 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"; string nm="\\"+NameCommonDir()+fileName; char NameXlt[256]; NameXlt = Dir+nm; // если шаблона нет, на лок.машине, и версия сетевая...то берем шаблон с // серверной машины if ( !IsLocalZPL() && IsCommonResource(NameCommonDir()) ) { //берем путь к сетевому ZPL GetCommonZPL(NameXlt,255); NameXlt = NameXlt+nm; } 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 CTabl=CreateObject("CurPrnTbl"); // объект класса для работы с текущей таблицей var CMsg = 0; // Процент выполненной работы int bTime = false; // false-показывать процент, // true-показывать оставшееся время CMsg=CreateObject("ProgressBar"); CMsg.Initial(0,100,1); CMsg.SetShowTime(static_cast_to_int(bTime)); int idxFldFlagSumm=CTabl.Find_Name_Fld("flagSumm"); int idxFldFlagRest=CTabl.Find_Name_Fld("flagRest"); try { //int excelRow=4;//начинаем печатать в 4 строку int excelRow=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++; PrintOneRow(CTabl,record,excelRow++,npp); } //удаляем 3 строки из шаблона tDeleteRows(excelRow,3); // чтобы не было выделенной строки после всех манипуляций с копированием // выделим отдельную ячейку. tWshCellSelect(4,1); } // блок try catch(object err) { tEndXlsWork(1); // делаем форму видимой SayError(err); return 1; } catch(...) { SayUndefinedScriptError(); } tEndXlsWork(1); // делаем форму видимой return 0; } /*PrintOneRow(&CTabl,record,excelRow) { tInsertRows(excelRow+1,1);tCopyRow(excelRow+2); int excelColumn=1; for(int column=0;column0) tWriteStringToCell2(excelRow,1,npp); int excelColumn=npp>0?2:1; //если нпп ненулевой -в первой колонке выводим нпп for(int column=0;column