// Сведения о заработной плате и условиях осуществления деятельности работников государственных (муниципальных) учреждений ЕФС-1. Раздел 1.3 //------------------------------------------------------------------------------------------------------------------------- FillEfs1UzizpItem(part, periods, Prop, cntUzizpOfCombine) // Заполнение информации по одной строке в таблице ЕФС-1 1.3 { bool onlyFirstRow = (zpgosSingleUzizpPerCombine & 0x01)!=0; bool onlyLastRow = !onlyFirstRow && (zpgosSingleUzizpPerCombine & 0x02)!=0; int cntPer = periods.Count(); // проверяем можно ли учитывать очередной период if ( onlyFirstRow && cntUzizpOfCombine ) return; if ( onlyLastRow && cntUzizpOfCombine!=cntPer-1 ) return; var DBeg = onlyLastRow ? periods.GetDateBeg() : periods.GetCurBeg(); var DEnd = onlyFirstRow ? periods.GetDateEnd() : periods.GetCurEnd(); string BegWorkDat = DBeg.GetStr(); string EndWorkDat = DEnd.GetStr(); int combine = Prop.GetCombine(); var Uzizp = part.NewUzizpItem(); // УЗиЗП - Блок сведений об условиях занятости и заработной плате (одна строка в таблице отчета) // Сведения о договоре // Вид договора (графа 10) Uzizp.Contract.Kind = GetZpGosContractKind(Uzizp,Prop,DBeg,DEnd,periods); // Срок договора (графа 11) (1 - бессрочный, 2 - срочный) Uzizp.Contract.Time = GetZpGosContractTime(Uzizp,Prop,DBeg,DEnd,periods); // Договорников в отчет не включаем (пункт 6.9 Порядка заполнения Подраздела 1.3 Подраздела 1). При этом "основные" работники могут получать выплаты по договорам ГПХ if ( Uzizp.Contract.Kind == 4 ) return 0; // Дата начала (графа 2) Uzizp.Period.DateBeg = DBeg.GetVariantDate(); // Дата окончания (графа 3) Uzizp.Period.DateEnd = DEnd.GetVariantDate(); // Блок сведений о звании (степени), если ничего не заполнено - будет НетЗваний (графа 7) // Эти данные не "порождают" новых строк при изменении. Мы их берем просто по факту на дату конца периода строки Uzizp.Rank.AcademRank = GetZpGosAcademRank(Uzizp,Prop,DBeg,DEnd,periods); // ученое звание Uzizp.Rank.AcademDegree = GetZpGosAcademDegree(Uzizp,Prop,DBeg,DEnd,periods); // ученая степень Uzizp.Rank.HonorRank = GetZpGosHonorRank(Uzizp,Prop,DBeg,DEnd,periods); // почетное звание // Сведения о структурном подразделении int departmentCode = atoi(periods.GetCurCod(draftUzizpPodr)); // Наименование структурного подразделения и OID (графа 4) Uzizp.Podr.Name = OemToAnsi(GetZpGosDepartmentName(departmentCode,DEnd)); if ( part.IsMedOrg ) Uzizp.Podr.Oid = GetZpGosDepartmentOID(departmentCode,DEnd); // Заполняется только медицинскими организациями OID подразделения // Код наименования должности (графа 5) Uzizp.PositionCode = periods.GetCurCod(draftUzizpKND); // Код категории персонала (графа 6) string value = periods.GetCurCod(draftUzizpKKP); Uzizp.Kkp = value==""?zpgosDefaultKKP:value; // СоУЗ - Сведения о специальных (отраслевых) условиях занятости (графы 8 и 9) // Коды СоУЗ в программе задается сразу составным "код значение" if ( !part.isMedOrg ) // СоУЗ пока не нужен никому кроме медиков ZeroSouz(Uzizp); else { AddSouzValuesFromString(Uzizp,periods.GetCurCod(draftUzizpSOUZ)); if ( Uzizp.SouzItems.Count < 1 ) ZeroSouz(Uzizp); } // Блок сведений о квалификации // Профессиональная квалификационная группа (графа 12) value = periods.GetCurCod(draftUzizpPKG); Uzizp.Qualification.Code = value==""?zpgosDefaultPKG:value; // Квалификационный уровень (графа 13) int level = atoi(periods.GetCurCod(draftUzizpKU)); if ( level == atoi(zpgosUnknownKU) || level<0 ) level = atoi(zpgosDefaultKU); Uzizp.Qualification.Level = level; // Класс(подкласс) условий труда (графа 14) value = periods.GetCurCod(draftUzizpSOUT); Uzizp.Qualification.Harmfulness = value==""?zpgosDefaultSout:value; // Квалификационная категория по итогам аттестации (графа 15) Uzizp.Qualification.Attestation = atoi(periods.GetCurCod(draftUzizpQualCat)); // ставка (число занятых единиц по должности) (графа 16) // Ставка может выбираться двумя способами - порождая новые строки в случае изменения // или вычисляясь на дату окончания периода заполняемой строки bool needCalcStaffUnit = periods.GetCurCod(draftUzizpKEmpl)==zpgosRecalcStaffUnit; double k = atof(periods.GetCurCod(draftUzizpKEmpl)); if ( needCalcStaffUnit ) // особый случай zpgosRecalcStaffUnit="-1" k = RefineZpGosStaffUnit(GetKoefEmployment(DEnd,combine,0x01)); Uzizp.Qualification.StaffUnit = k; // Система оплаты (графа 17) Uzizp.Qualification.PaymentSystem = GetZpGosPaymentSystem(Uzizp,Prop,DBeg,DEnd,periods); // Размер фиксированной части в соответствии с трудовым договором (графа 18) double tarif = AddTarifFixedValuesFromString(Uzizp,Prop,DBeg,DEnd,periods); // Надо ли "обнулять" время (например если в декрете или еще по каким условиям) int isZeroNrv = IsZpGosZeroNrv(combine,DBeg,DEnd); // В отпуске по беременности и родам, по уходу за ребенком или в отпуске на время учебы double originalStvk = k; double restStvk = originalStvk; bool isBaseRow = true; // признак первой строки при разбиении по ставке while ( 1 ) { double k = restStvk; if ( zpgosSplitBigStaffUnit ) { if ( k>1.00001 ) k = 1.; Uzizp.Qualification.StaffUnit = k; } bool bSplittedRow = k1) if ( (zpgosApplyKoefNRV & 0x04)!=0 && k>1.0 ) Uzizp.Qualification.StaffUnit = 1.0; if ( onlyFirstRow || onlyLastRow || !cntUzizpOfCombine ) // пока не умеем бить суммы все ставим на одну строку в периоде по данный исп.должности { // Сведения о количестве специальных часов работы (графа 21 и графа 22) // Спец.часы бьем по ставке, если это отдельно указали в настройке. В противном случае включаем для базовой строки if ( (zpgosSplitBigStaffUnit & 0x02)!=0 || isBaseRow ) GetZpGosSpecialHours(Uzizp,Prop,DBeg,DEnd,periods,originalStvk); else SetEmptySpecialHours(Uzizp); // Сведения о заработной плате (графа 23, графа 24) double itogSumm = GetZpGosSvedZp(Uzizp,Prop,DBeg,DEnd,periods,tarif,originalStvk); // Итого - Общая сумма всех выплат (графа 25) Uzizp.Qualification.ItogSumm = itogSumm; } else { // "нулевка" по спец.часам SetEmptySpecialHours(Uzizp); // "нулевка" по основным видам выплат SetEmptySvedZp(Uzizp); Uzizp.Qualification.ItogSumm = 0.0; } string uzizpId = GetZpGosUzizpId(Uzizp); if ( !VarHasValue(ZpGosUnicUzizp) || !ZpGosUnicUzizp.IsExist(uzizpId) ) { part.UzizpItems.Add(Uzizp); if ( VarHasValue(ZpGosUnicUzizp) ) ZpGosUnicUzizp.Add(uzizpId,Uzizp); } else // объединение новой строки с существующей MergeUzizp(ZpGosUnicUzizp.GetValue(uzizpId),Uzizp); restStvk -= k; if ( zpgosSplitBigStaffUnit && restStvk>0.00001 ) { var nUzizp = Uzizp.Clone(); nUzizp.Qualification.SvedZpItems.Clear(); nUzizp.Qualification.SpecialHoursItems.Clear(); Uzizp = nUzizp; isBaseRow = false; // это уже последующие строки continue; } break; } return; } //------------------------------------------------------------------------------------------------------------------------- Efs1FillDraftUzizpPeriods(Efs1DateBeg,Efs1DateEnd) // Сбор информации об изменении ключевых показателей, которые приводят к появлению новой строке в таблице ЕФС-1 1.3 { // В draft закладываем слоями ключевые поля которые определяют одну будущую запись Uzizp // Самые базовые элементы - исполняемые должности, они определяют наполнение "Id исп.должности - KDatePeriods" // (потому что по разным исполняемым должностям возможны пересекающиеся периоды дат, в рамках одной исполняемой должности таких пересечений не будет) // Для каждой исполняемой должности заполняем "слоями" KDatePeriods: // draftUzizpComb = 0 слой - сама исп.должность (основа): // период действия исполняемой должности (даты приема-увольнения) // draftUzizpDoljn = 1 слой - должность (id должности): // В данном случае речь о должности из справочника должностей (штатного расписания). // Она задает большое количество информации для следующих уровней (подразделение, СОУЗ, ПКГ и КУ, ККП и т.д.) // draftUzizpPodr = 2 слой - подразделение: // Базовая информация берется по должности (по 1 и 0 слоям) // Но может быть переопределена через отдельное поле КЧ // Для отчета по подразделению нужны будут название и OID а в слое храним "код подразделения" по которому определяем и то и другое // draftUzizpKND = 3 слой - код наименования должности: // Базовое значение берется по должности из справочника должностей // draftUzizpKKP = 4 слой - код категории персонала (ККП): // Базовое значение берется по должности из справочника должностей // draftUzizpSOUZ = 5 слой - СОУЗ: // Базовое значение берется по должности из справочника должностей // draftUzizpPKG = 6 слой - ПКГ // draftUzizpKU = 7 слой - квалификационный уровень КУ // draftUzizpSOUT = 8 слой - класс условий труда // draftUzizpQualCat = 9 слой - квалификационная категория // draftUzizpKEmpl = 10 слой - число штатных единий (коэфф.занятости) // draftUzizpFixZP = 11 слой - фиксированный размер оплаты труда // int howCombine = zpgosHowCombine; bool excludeSlaveComb = (howCombine&0x01)!=0; int howPWork = GetCommonCnfInt("howPWork",psZpgosCnfTable); var strnuPWork = GetCommonCnfStr("LST_NU_TRF",psZpgosCnfTable); char buf[512]; var draftUzizpItems = CreateObject("Map"); var ZpGosCombList = CreateObject("CombineList"); var it = ZpGosCombList.CreateIterator(); for ( it.SetBegin(); !it.IsEnd(); it.Next() ) // цикл по совместительствам ( it.CurKey() - внутр.код совместительства ) { int combine = it.CurKey(); combine = SysFillSlaveCombines(combine,howCombine); // формируется, если надо, список совмещений SIOZPMapCombines = SysMapSlaveCombines; // todo можно избавится рефакторингом if ( !combine ) continue; // тут по настройке будут отсекаться "совмещения" // Выставляем фильтры на combine var tmpcomb = CreateObject("TmpCurCombine"); tmpcomb.Init(combine); // Возможно нам действительно понадобятся циклы на базе Prop а не combine? var Prop = GetCommonProp(CMN_SRC_REFS); Prop.SetCombine(combine); SetCommonProp(CMN_SRC_REFS,Prop); var tp = CreateObject("TempCommonSrc"); tp.InitialProp(CMN_SRC_COUNT_LS,Prop); // выборка по видам и т.п // Дополнительная проверка надо ли пропускать исп.должность if ( ZpGosSkipCombine(Prop,Efs1DateBeg,Efs1DateEnd) ) continue; // Определяем период работы по данной исп.должности int intiFlagWorkPeriods = excludeSlaveComb?0x00:0x80; var workperiods = SysBaseFillWorkPeriods(combine,Efs1DateBeg,Efs1DateEnd,howPWork,strnuPWork,intiFlagWorkPeriods); workperiods.Crop(Efs1DateBeg.GetStr(),Efs1DateEnd.GetStr()); var combinePeriods = CreateObject("KDatePeriods"); // закладываем слой периодов работы по исп.должности combinePeriods.AddFreePeriods(workperiods,to_string(combine),draftUzizpComb); // Достаем должности из поля кадровой части + все что можно по ним из справочника должностей (Важно!!! Предполагается что должности ведутся по справочнику) AddDraftUzizpInfoByDoljn(combinePeriods,Prop,Efs1DateBeg,Efs1DateEnd); // Дополняем первичную информацию полученную по должности (ну или то, чего в должности нет) // Подразделения // В поставочном варианте они будут взяты либо из отдельного поля КЧ (если там не ноль), либо как подразделение исп.должности (или всего ЛС). var per = GetZpGosDepartmentCodePeriods(Prop,Efs1DateBeg,Efs1DateEnd,combinePeriods); if ( VarHasValue(per) ) combinePeriods.UpdateLevelCodPeriods(draftUzizpPodr,per); // код наименования должности per = GetZpGosPositionCodePeriods(Prop,Efs1DateBeg,Efs1DateEnd,combinePeriods); if ( VarHasValue(per) ) combinePeriods.UpdateLevelCodPeriods(draftUzizpKND,per); // код категории персонала per = GetZpGosKkpPeriods(Prop,Efs1DateBeg,Efs1DateEnd,combinePeriods); if ( VarHasValue(per) ) combinePeriods.UpdateLevelCodPeriods(draftUzizpKKP,per,"",zpgosDefaultKKP+","); // СОУЗ per = GetZpGosSouzPeriods(Prop,Efs1DateBeg,Efs1DateEnd,combinePeriods); if ( VarHasValue(per) ) combinePeriods.UpdateLevelCodPeriods(draftUzizpSOUZ,per,"","#emptystring#"); // ПКГ per = GetZpGosPkgPeriods(Prop,Efs1DateBeg,Efs1DateEnd,combinePeriods); if ( VarHasValue(per) ) { combinePeriods.UpdateLevelCodPeriods(draftUzizpPKG,per,"",zpgosDefaultPKG+","); // в ПКГ могли сразу задать и КУ for ( per.SetBegin(); !per.End(); per.Next() ) { var db = per.GetCurBeg(); var de = per.GetCurEnd(); int ku = atoi(per.GetCurCod(draftUzizpKU)); if ( ku >=0 ) combinePeriods.UpdateLevelCod(draftUzizpKU,db.GetStr(),de.GetStr(),to_string(ku),zpgosDefaultKU+","); } } // КУ if ( (zpgosHowPkgKu & 0x02)==0 ) // если у нас не вариант с комплексным определением "ПКГ.КУ", то ищем еще отдельно КУ { per = GetZpGosKUPeriods(Prop,Efs1DateBeg,Efs1DateEnd,combinePeriods); if ( VarHasValue(per) ) combinePeriods.UpdateLevelCodPeriods(draftUzizpKU,per,"",zpgosDefaultKU+","); } // СОУТ per = GetZpGosSoutPeriods(Prop,Efs1DateBeg,Efs1DateEnd,combinePeriods); if ( VarHasValue(per) ) combinePeriods.UpdateLevelCodPeriods(draftUzizpSOUT,per,"",zpgosDefaultSout+","); // квалификационная категория per = GetZpGosQualCatPeriods(Prop,Efs1DateBeg,Efs1DateEnd,combinePeriods); if ( VarHasValue(per) ) combinePeriods.UpdateLevelCodPeriods(draftUzizpQualCat,per,"",zpgosDefaultQualCat+","); // ставка per = GetZpGosStaffUnitPeriods(Prop,Efs1DateBeg,Efs1DateEnd,combinePeriods); if ( VarHasValue(per) ) combinePeriods.UpdateLevelCodPeriods(draftUzizpKEmpl,per); // фиксированный размер зарплаты per = GetZpGosFixPeriods(Prop,Efs1DateBeg,Efs1DateEnd,combinePeriods); if ( VarHasValue(per) ) combinePeriods.UpdateLevelCodPeriods(draftUzizpFixZP,per); draftUzizpItems.Add(combine,combinePeriods); } return draftUzizpItems; } AddDraftUzizpInfoByDoljn(combinePeriods,Prop,DBeg,DEnd) // Достаем все что можно по должности из справочника должностей (код наименования должности, ККП, СОУЗ, ПКГ) { var dljnPeriods; KchToPeriods("dolgnost",DBeg.GetStr(),DEnd.GetStr(),0,dljnPeriods); // Идем по всем периодам относящимся к данной исп.должности for ( dljnPeriods.SetBegin(); !dljnPeriods.End(); dljnPeriods.Next() ) { var db = dljnPeriods.GetCurBeg(); var de = dljnPeriods.GetCurEnd(); int doljnId = atoi(dljnPeriods.GetCurCod()); combinePeriods.UpdateLevelCod(draftUzizpDoljn, db.GetStr(), de.GetStr(), to_string(doljnId)); var doljnElem = GetDoljnFromSpravByID(doljnId); if ( !doljnElem.IsEmpty() ) { // подразделение из справочника должностей if ( doljnElem.GetPodr() != 0 ) combinePeriods.UpdateLevelCod(draftUzizpPodr, db.GetStr(), de.GetStr(), to_string(doljnElem.GetPodr())); // код наименования должности из справочника должностей string value = TrimN(OemToAnsi(doljnElem.GetAdditionalValue("efs1code"))); if ( value != "" ) combinePeriods.UpdateLevelCod(draftUzizpKND, db.GetStr(), de.GetStr(), value); // код категории персонала из справочника должностей value = TrimN(OemToAnsi(doljnElem.GetAdditionalValue("efs1kkp"))); if ( value != "" ) combinePeriods.UpdateLevelCod(draftUzizpKKP, db.GetStr(), de.GetStr(), value); // специальные отраслевые условия труда из справочника должностей value = TrimN(OemToAnsi(doljnElem.GetAdditionalValue("efs1souz"))); if ( value != "" ) combinePeriods.UpdateLevelCod(draftUzizpSOUZ, db.GetStr(), de.GetStr(), value); // профессиональная квалификационная группа из справочника должностей value = TrimN(OemToAnsi(doljnElem.GetAdditionalValue("efs1pkg"))); if ( value != "" ) combinePeriods.UpdateLevelCod(draftUzizpPKG, db.GetStr(), de.GetStr(), value); else if ( (zpgosHowPkgKu & 0x01)!=0 ) // использовать старый ПКГ { int oldPkg = doljnElem.GetPKGCode(); if ( oldPkg ) { int ku = atoi(zpgosUnknownKU); value = ZpGosPkgConverter(to_string(oldPkg),Prop, db, de, ku); if ( value != "" ) { combinePeriods.UpdateLevelCod(draftUzizpPKG, db.GetStr(), de.GetStr(), OemToAnsi(value)); if ( ku!=atoi(zpgosUnknownKU) ) combinePeriods.UpdateLevelCod(draftUzizpKU, db.GetStr(), de.GetStr(), ku, zpgosDefaultKU+","); } } } // квалификационный уровень value = TrimN(OemToAnsi(doljnElem.GetAdditionalValue("efs1ku"))); if ( value != "" ) combinePeriods.UpdateLevelCod(draftUzizpKU, db.GetStr(), de.GetStr(), value,zpgosDefaultKU+","); } } } // Точка входа в заполнение перс.даты для отчета ЕФС-1 1.3 Efs1FillPersonZpGosPart(&persData, corrType, idOrg) { var modules = GetArray("forms\\siozp_common","forms\\siorun"); ReLoadSMs(modules); // Вообще отчет ежемесячный, поэтому в данном случае "перестраховка" (вдруг сделают за больший период?). int begMonth = KDateFromStr(Str_Date_0).GetAbs(); int endMonth = KDateFromStr(Str_Date_1).GetAbs(); var Efs1DateBeg = KDateFromInt_WithDay(1,begMonth); var Efs1DateEnd = KDateFromInt_LastDay(endMonth); // Инициализация общих справочников InitZpGos(idOrg,Efs1DateEnd); // Драфт заполняем за весь период сразу var draftUzizpItems = Efs1FillDraftUzizpPeriods(Efs1DateBeg,Efs1DateEnd); int howCombine = zpgosHowCombine; // Сейчас ЕФС-1, 1.3 делается помесячно и тут пошло усложнение и вроде как не надо... но вдруг перейдем на периоды больше месяца for ( int ames = begMonth; ames <= endMonth; ames++ ) { var firstdayM = KDateFromInt_WithDay(1,ames); var lastdayM = KDateFromInt_LastDay(ames); var part = persData.NewZpGosPart(); ZpGosUnicUzizp = zpgosHowMergeTheSameRow?CreateObject("Map"):GetNothing(); // список id uzizp - uzizp для того чтобы объединять одинаковые в рамках месяца // Блок сведений об отчитывающейся организации part.Enterprise.Kto = TrimN(GetEnterpriseRefValue(idOrg, AnsiToOem("КТО_ГОС"))); // Организация\КодКТО (код типа организации) part.Enterprise.Tosp = TrimN(GetEnterpriseRefValue(idOrg, AnsiToOem("ТОСП"))); // Организация\ТОСП (Территориальное обособленное структурное подразделение) Код подразделения part.Enterprise.Oid = TrimN(GetEnterpriseRefValue(idOrg, AnsiToOem("ОИД_МЕД"))); // Организация\OID (Идентификатор для мед.организаций) part.isMedOrg = strlen(part.Enterprise.Oid) > 0; for ( draftUzizpItems.InitIterator(); !draftUzizpItems.IsEnd(); draftUzizpItems.Next() ) { int combine = draftUzizpItems.GetCurKey(); combine = SysFillSlaveCombines(combine,howCombine); // формируется, если надо, список совмещений (нам понадобится когда суммы будем собирать) SIOZPMapCombines = SysMapSlaveCombines; // todo можно избавится рефакторингом if ( !combine ) continue; // такого быть не должно, т.к. мы такие должности ранее не включили в draftUzizpItems // Выставляем фильтры на combine var tmpcomb = CreateObject("TmpCurCombine"); tmpcomb.Init(combine); // Возможно нам действительно понадобятся циклы на базе Prop а не combine? var Prop = GetCommonProp(CMN_SRC_REFS); Prop.SetCombine(combine); SetCommonProp(CMN_SRC_REFS,Prop); var tp = CreateObject("TempCommonSrc"); tp.InitialProp(CMN_SRC_COUNT_LS,Prop); // выборка по видам и т.п unsigned cntUzizpOfCombine=0; var periods = CreateObject("KDatePeriods"); periods.CopyFrom(draftUzizpItems.GetCurValue()); periods.Crop(firstdayM.GetStr(),lastdayM.GetStr()); // оставляем только те периоды, которые относятся к рассматриваемому месяцу int saveSingleUzizpPerCombine = zpgosSingleUzizpPerCombine; // Если не сказано "игнорировать" разрывы и разрывы есть, то выводим все строки по исп.должности if ( (zpgosSingleUzizpPerCombine & 0x04)==0 && periods.FindFreePeriods(periods.GetDateBeg().GetStr(),periods.GetDateEnd().GetStr()).Count() ) zpgosSingleUzizpPerCombine = 0; // Идем по всем периодам относящимся к данной исп.должности for ( periods.SetBegin(); !periods.End(); periods.Next() ) { var db = periods.GetCurBeg(); var de = periods.GetCurEnd(); FillEfs1UzizpItem(part, periods, Prop, cntUzizpOfCombine++); } zpgosSingleUzizpPerCombine = saveSingleUzizpPerCombine; } if ( part.UzizpItems.Count > 0 ) { // if ( part.UzizpItems.Count > 1 ) // todo Может быть это вообще пока закомментировать/убрать и в редактор выводить всё что получилось? // CorrectUzizpItems(part); // Из коллекции нужно убрать записи с одинаковыми идентификаторами трудового договора persData.ZpGosParts.Add(part); // Если нет блоков УЗиЗП (обязательный), то не добавляем СЗПГос (необязательный) } } UnLoadSMs(modules); return; } //------------------------------------------------------------------------------------------------------------------------- CorrectUzizpItems(&part) { var Map = CreateObject("MapString"); Map.Clear(); int idx = 0; for (;;) // бесконечный цикл { var UzizpItem = part.UzizpItems.Get(idx); string idContract = GetZpGosUzizpId(UzizpItem); if ( Map.Size() > 0 ) { for ( bool Cur = Map.InitIterator(); Cur; Cur = Map.Next() ) { if ( idContract == Map.GetCurKey() ) { // todo: Выполняем какие-то преобразования. Возможно к суммам в part,UzizpItems.Get(atoi(Map.GetCurValue())) нужно будет добавить суммы из part.UzizpItems.Get(idx) part.UzizpItems.RemoveAt(idx); idx--; } } } Map.Add(idContract,to_string(idx++)); if ( idx >= part.UzizpItems.Count ) break; } return; } //------------------------------------------------------------------------------------------------------------------------- // Идентификатор трудового договора для ЗЛ // // Uzizp.Period.DateBeg Период работы в отчетном месяце Дата начала периода // Uzizp.Period.DateEnd Период работы в отчетном месяце Дата окончания периода // Uzizp.Podr.Name СтруктурноеПодразделение Наименование // Uzizp.Podr.Oid СтруктурноеПодразделение OID // Uzizp.PositionCode ЕФС:КодДолжности // Uzizp.SouzItems элементы Код и Значение блока СоУЗ // Uzizp.Contract.Kind элементы Вид и Срок блока Договор // Uzizp.Contract.Time // Uzizp.Qualification.Code ЕФС:КодКУ блок Квалификация // Uzizp.Qualification.Level Уровень // Uzizp.Qualification.StaffUnit ШтатЕд // Uzizp.Qualification.FixedItems РазмерФЧ GetZpGosUzizpId(Uzizp) { return PriorityCall("UserGetZpGosUzizpId","SysGetZpGosUzizpId",Uzizp); } SysGetZpGosUzizpId(Uzizp) // todo Вычисление этого идентификатора нужно и в шарпе (например, при валидачии редактируемых данных). Скорее всего его нужно сделать в шарпе (чтобы бы единый вариант). // Идентификатор трудового договора для ЗЛ (для одного Item) (для отдельного элемента блока УЗиЗП) { string contractId = ""; string separator = "~"; if ( (zpgosHowMakeIdUzizp & 0x01)==0 ) { var db = CreateObject("KDate"); var de = CreateObject("KDate"); db.SetVariantDate(Uzizp.Period.DateBeg); de.SetVariantDate(Uzizp.Period.DateEnd); contractId += db.GetStr(); contractId += separator + de.GetStr(); } contractId += separator + Uzizp.Podr.Name; contractId += separator + to_string(Uzizp.Podr.Oid); contractId += separator + Uzizp.PositionCode; for ( int i = 0; i < Uzizp.SouzItems.Count; i++ ) { var souzItem = Uzizp.SouzItems.Get(i); contractId += separator + souzItem.Code; contractId += separator + to_string(souzItem.Value); } contractId += separator + to_string(Uzizp.Contract.Kind); contractId += separator + to_string(Uzizp.Contract.Time); contractId += separator + Uzizp.Qualification.Code; contractId += separator + to_string(Uzizp.Qualification.Level); if ( (zpgosHowMakeIdUzizp & 0x02)==0 ) contractId += separator + to_string(Uzizp.Qualification.StaffUnit); for ( int i = 0; i < Uzizp.Qualification.FixedItems.Count; i++ ) contractId += separator + to_string(Uzizp.Qualification.FixedItems.Get(i).Value); return contractId; } //------------------------------------------------------------------------------------------------------------------------- // Заполняем списки соответствия "код подразделение - наименование" и "код подразделения - OID" InitDepartmentSettings(idOrg,date) { // Читаем настройки для подразделений int len = 1024; char dir[len]; char str[len]; ZpGosMapDepartmentName.Clear(); ZpGosMapDepartmentOID.Clear(); int setNumber = GetCommonCnfInt("podrOidSet", psZpgosCnfTable); // Название подразделений берем из сетки, если выставлена настройка + указан номер сетки zpgosTakeDepartmentNameFromSet = GetCommonCnfInt("howGetPodr", psZpgosCnfTable) != 0 && setNumber; if ( !setNumber ) return; // Сетку берем на заданную дату string FileSetka = GetNameFileRefTime(setNumber, idOrg, date.GetStr()); var CTabl = CreateObject("CurPrnTbl"); CTabl.InitialNameFile(FileSetka); int cr = CTabl.Count_Rcr(); // число рабочих записей в таблице int idxFldDepartmentCode = CTabl.Find_Name_Fld("FCpodr"); int idxFldDepartmentName = CTabl.Find_Name_Fld("podrName"); // в сетке здесь, скорее всего, стандартные названия подразделений (так работают функции контроля/корректировки в этой сетке) int idxFldDepartmentNameEfs1 = CTabl.Find_Name_Fld("NameEfs1"); // тут возможно указано альтернативное название. int idxFldDepartmentOID = CTabl.Find_Name_Fld("podrOID"); // цикл по записям таблицы for ( int zap = 0; zap < cr; zap++ ) { int departmentCode = atoi(CTabl.Text(idxFldDepartmentCode,zap)); if ( !departmentCode ) continue; // пропускаем пустые строки string departmentName = idxFldDepartmentNameEfs1!=-1?TrimN(CTabl.Text(idxFldDepartmentNameEfs1,zap)):""; if ( departmentName=="" ) { departmentName = TrimN(CTabl.Text(idxFldDepartmentName,zap)); if ( departmentName=="" ) departmentName = TrimN(GetOtdName(departmentCode)); } string departmentOID = TrimN(CTabl.Text(idxFldDepartmentOID,zap)); if ( !ZpGosMapDepartmentName.IsExist(to_string(departmentCode)) ) { ZpGosMapDepartmentName.Add(to_string(departmentCode),departmentName); ZpGosMapDepartmentOID.Add(to_string(departmentCode),departmentOID); } } // если в мэпку ничего не набрали, то значит не надо названия по сетке брать if ( !ZpGosMapDepartmentName.Size() ) zpgosTakeDepartmentNameFromSet = 0; return; } //------------------------------------------------------------------------------------------------------------------------- InitZpGos(idOrg,date) { psSiozpCnfTable = psZpgosCnfTable; // у нас подгружен модуль "siorun" и там свои настройки, поэтому нужно "переключить" их на таблицу настроек ЗПГос // На всякий случай сделал контроль не просто инициализированности, а с учетом даты (на тот случай если вдруг модуль останется загруженным по каким-либо причинам). if ( VarHasValue(isInitialisationDoneDate) && isInitialisationDoneDate.IsEq(date) ) return; isInitialisationDoneDate = date; // Загрузка таблиц соотвествия "подразделение - OID" и "подразделение - название подразделения" InitDepartmentSettings(idOrg,date); // Инициализация таблиц соответствия "код - набор видов Н-У" // Для видов выплаты ZpGosMapSvedZp = ReadSetka2ToMapListNU(idOrg,date,663,"Id","ListNU"," ",psZpgosCnfTable,"setPayCode",0x03); ZpGosListAllNUInOsnVypl = ""; if ( VarHasValue(ZpGosMapSvedZp) && ZpGosMapSvedZp.Size() > 0 ) { int idx = 0; for ( bool Cur = ZpGosMapSvedZp.InitIterator(); Cur; Cur = ZpGosMapSvedZp.Next() ) { if ( idx++ ) ZpGosListAllNUInOsnVypl += " "; ZpGosListAllNUInOsnVypl += ZpGosMapSvedZp.GetCurValue(); } } // для определения системы оплаты труда ZpGosMapPaymentSystem = ReadSetka2ToMapListNU(idOrg,date,664,"Id","ListNU"," ",psZpgosCnfTable,"setPaySyst",0x03); // для выборки информации о специальном рабочем времени ZpGosMapSpecialHours = ReadSetka2ToMapListNU(idOrg,date,665,"Id","ListNU"," ",psZpgosCnfTable,"setSpHours",0x03); // Для конвертации "старых" ПКГ ZpGosMapPKG = ReadSetka2ToMap(idOrg,date,-1,"Kod","kod_efs1","",psZpgosCnfTable,"set_pkg"); if ( !VarHasValue(ZpGosMapPKG) || !ZpGosMapPKG.Size() ) { ZpGosMapPKG = ReadTableToMap("T_GUIDE\\p_k_g.tab","Kod","kod_efs1",""); ZpGosMapKU = ReadTableToMap("T_GUIDE\\p_k_g.tab","Kod","ku_efs1",""); } else ZpGosMapKU = ReadSetka2ToMap(idOrg,date,-1,"Kod","ku_efs1","",psZpgosCnfTable,"set_pkg"); // инициализация таблицы соответствия "код - набор СОУЗ" ZpGosMapSouz = ReadSetka2ToMap(idOrg,date,667,"Id","Value",",",psZpgosCnfTable,"setSouz"); // инициализация сетки для перекодировки кода категории персонала ZpGosMapKKP = ReadSetka1ToMap(idOrg,-1,"",date.GetStr(),"",psZpgosCnfTable,"setKKP"); return; } //------------------------------------------------------------------------------------------------------------------------- GetZpGosDepartmentCodePeriods(Prop,DBeg,DEnd,combinePeriods) // Должна вернуть KDatePeriods с периодами действия разных подразделений по указанному Prop { return PriorityCall("UserGetZpGosDepartmentCodePeriods","SysGetZpGosDepartmentCodePeriods",Prop,DBeg,DEnd,combinePeriods); } SysGetZpGosDepartmentCodePeriods(Prop,DBeg,DEnd,combinePeriods) { int combine = Prop.GetCombine(); int podrCombine = kch_from_int("podr"); var ZpGosCombList = CreateObject("CombineList"); if( ZpGosCombList.GetPodr(combine) > 0 ) podrCombine = ZpGosCombList.GetPodr(combine); // в периоды подразделений складываем то, что выбрали из справочника должностей, заменяя 0 на podrCombine var podrPeriods = CreateObject("KDatePeriods"); for ( combinePeriods.SetBegin(); !combinePeriods.End(); combinePeriods.Next() ) { // подразделение должности int podrDoljn = atoi(combinePeriods.GetCurCod(draftUzizpPodr)); // Если в справочнике должностей у должности была не нулевое подразделение то считаем, что именно оно является // подразделением, даже если у исп.должности (или ЛС) иное подразделение. // Связано это с тем, что у подраздления исп.должности и подраздления ЛС нет "историчности". if ( !podrDoljn || zpgosIgnorePodrDoljn ) podrDoljn = podrCombine; podrPeriods.AddFreePeriod(combinePeriods.GetCurBeg().GetStr(), combinePeriods.GetCurEnd().GetStr(), to_string(podrDoljn)); } string pskch = TrimN(GetCommonCnfStr("kch_podr",psZpgosCnfTable)); if ( pskch!="" && kch_num_sys(pskch) != -1 ) { var periods; KchToPeriods(pskch,DBeg.GetStr(),DEnd.GetStr(),0,periods); // Идем по всем периодам относящимся к подразделению for ( periods.SetBegin(); !periods.End(); periods.Next() ) { var db = periods.GetCurBeg(); var de = periods.GetCurEnd(); int podr = atoi(periods.GetCurCod()); if ( podr>0 ) podrPeriods.UpdateLevelCod(0,db.GetStr(), de.GetStr(), to_string(podr),"",0x01); } } // с учетом того что на входе получаем периоды исполняемой должности, это маловероятно if ( !podrPeriods.Count() ) podrPeriods.AddFreePeriod(DBeg.GetStr(), DEnd.GetStr(), to_string(podrCombine)); return podrPeriods; } GetZpGosDepartmentName(departmentCode,date) { return PriorityCall("UserGetZpGosDepartmentName","SysGetZpGosDepartmentName",departmentCode,date); } SysGetZpGosDepartmentName(departmentCode,date) { if( zpgosTakeDepartmentNameFromSet && VarHasValue(ZpGosMapDepartmentName) && ZpGosMapDepartmentName.IsExist(to_string(departmentCode)) ) return ZpGosMapDepartmentName.GetValue(to_string(departmentCode)); return TrimN(GetOtdName(departmentCode)); } //------------------------------------------------------------------------------------------------------------------------- GetZpGosDepartmentOID(departmentCode,date) { return PriorityCall("UserGetZpGosDepartmentOID","SysGetZpGosDepartmentOID",departmentCode,date); } SysGetZpGosDepartmentOID(departmentCode,date) { if ( !ZpGosMapDepartmentOID.IsExist(to_string(departmentCode)) ) return "OID подразделения не определен"; return ZpGosMapDepartmentOID.GetValue(to_string(departmentCode)); } //------------------------------------------------------------------------------------------------------------------------- GetZpGosKkpPeriods(Prop,DBeg,DEnd,combinePeriods) { return PriorityCall("UserGetZpGosKkpPeriods","SysGetZpGosKkpPeriods",Prop,DBeg,DEnd,combinePeriods); } SysGetZpGosKkpPeriods(Prop,DBeg,DEnd,combinePeriods) { // todo??? 651 и 655 сетки как в СИоРУН // todo Когда делали СИоРУН пердполагали что у всех настроены ЗП-формы (в реальности это оказалось не так) // todo Т.е. если делать как в СИоРУН то настройказ ЗПГос нужно будет указать какую ЗП-форму использует организация // todo затем по сеткам 601-605 получить "код строки ЗП-формы" по коду категории // todo и далее по сеткам 651-655 получить искомый ККП (код категории персоналша) // todo Пракрически, можно смотреть настройку TipOrgZp "По какой ЗП-форме отчитывается организация" в настройке СИоЗП // todo или сделать подобную настройку в настройках ЗПГос // todo И далее определять ККП как это делается в СИоЗП // todo Если использовать те же сетки (651-655), то проверить что коды те что нужны в ЗПГос var kkpPeriods = CreateObject("KDatePeriods"); string pskch = TrimN(GetCommonCnfStr("kch_kkp",psZpgosCnfTable)); if ( pskch!="" && kch_num_sys(pskch) != -1 ) { var tmpcomb = CreateObject("TmpCurCombine"); // Если вдруг почему-то коды категорий надо брать об "базовой исп.должности" переключаемся на нее временно if ( zpgosFlagKat==1 ) { var ZpGosCombList = CreateObject("CombineList"); tmpcomb.Init(atoi(ZpGosCombList.GetBaseID())); } var periods; KchToPeriods(pskch,DBeg.GetStr(),DEnd.GetStr(),0,periods); // Идем по всем периодам относящимся к подразделению for ( periods.SetBegin(); !periods.End(); periods.Next() ) { var db = periods.GetCurBeg(); var de = periods.GetCurEnd(); if ( !Str_Cmp(periods.GetCurCod()," ", " ") ) continue; // пустые коды нас не интересуют string katValue = periods.GetCurCod(); string kkpValue = katValue; if ( VarHasValue(ZpGosMapKKP) ) // задана сетка перекодировки перекодируем kkpValue = ZpGosMapKKP.IsExist(katValue)?ZpGosMapKKP.GetValue(katValue):zpgosDefaultKKP; // Работники организаций, не представляющих формы статистической отчетности в соответствии с приказом Росстата от 30 июля 2021 г. N 457 kkpPeriods.AddFreePeriod(db.GetStr(), de.GetStr(), to_string(kkpValue)); } } if ( !kkpPeriods.Count() ) kkpPeriods.AddFreePeriod(DBeg.GetStr(), DEnd.GetStr(), zpgosDefaultKKP); return kkpPeriods; } //------------------------------------------------------------------------------------------------------------------------- GetZpGosAcademDegree(Uzizp,Prop,DBeg,DEnd,periods) { return PriorityCall("UserGetZpGosAcademDegree","SysGetZpGosAcademDegree",Uzizp,Prop,DBeg,DEnd,periods); } var ZpGosMapAcademDegree = GetNothing(); // перекодировка значений ученых степеней SysGetZpGosAcademDegree(Uzizp,Prop,DBeg,DEnd,periods) { if ( !VarHasValue(ZpGosMapAcademDegree) ) ZpGosMapAcademDegree = ReadTableToMap("T_GUIDE\\a_degree.tab","Kod","kod_efs1",""); var cod = TrimN(GetKchValueCnfByDate("a_degree",psZpgosCnfTable,DEnd.GetStr())); // маловероятно, но вдруг if ( !VarHasValue(ZpGosMapAcademDegree) ) { var icod = atoi(cod); if ( icod == 1 ) return "ДН"; // доктор наук if ( icod == 2 ) return "КН"; // кандидат наук } else if ( ZpGosMapAcademDegree.IsExist(cod) ) return OemToAnsi(ZpGosMapAcademDegree.GetValue(cod)); return OemToAnsi(to_string(cod)); // без степени } //------------------------------------------------------------------------------------------------------------------------- GetZpGosAcademRank(Uzizp,Prop,DBeg,DEnd,periods) { return PriorityCall("UserGetZpGosAcademRank","SysGetZpGosAcademRank",Uzizp,Prop,DBeg,DEnd,periods); } var ZpGosMapAcademRank = GetNothing(); // перекодировка значений ученых званий SysGetZpGosAcademRank(Uzizp,Prop,DBeg,DEnd,periods) { if ( !VarHasValue(ZpGosMapAcademRank) ) ZpGosMapAcademRank = ReadTableToMap("T_GUIDE\\a_rank.tab","Kod","kod_efs1",""); var cod = TrimN(GetKchValueCnfByDate("a_rank",psZpgosCnfTable,DEnd.GetStr())); // маловероятно, но вдруг if ( !VarHasValue(ZpGosMapAcademRank) ) { var icod = atoi(cod); if ( icod == 1 ) return "АРАН"; // Академик Российской академии наук if ( icod == 2 ) return "АМАН"; // Академик международной академии наук if ( icod == 3 ) return "АДРА"; // Академик других академий: Российской академии образования, Российской академии художеств, Российской академии архитектуры и строительных наук, отраслевой академии наук if ( icod == 4 ) return "ЧРАН"; // Член-корреспондент Российской академии наук if ( icod == 5 ) return "ЧМАН"; // Член-корреспондент международной академии наук if ( icod == 6 ) return "ЧДРА"; // Член-корреспондент других академий: Российской академии образования, Российской академии художеств, Российской академии архитектуры и строительных наук, отраслевой академии наук if ( icod == 7 ) return "ПРФ"; // Профессор if ( icod == 8 ) return "ДЦ"; // Доцент if ( icod == 9 ) return "СНС"; // Старший научный сотрудник if ( icod == 10 ) return "МНС"; // Младший научный сотрудник if ( icod == 11 ) return "АСС"; // Ассистент if ( icod == 12 ) return "ЧЗАН"; // Член зарубежной академии наук } else if ( ZpGosMapAcademRank.IsExist(cod) ) return OemToAnsi(ZpGosMapAcademRank.GetValue(cod)); return OemToAnsi(to_string(cod)); // без ученого звания } //------------------------------------------------------------------------------------------------------------------------- GetZpGosHonorRank(Uzizp,Prop,DBeg,DEnd,periods) { return PriorityCall("UserGetZpGosHonorRank","SysGetZpGosHonorRank",Uzizp,Prop,DBeg,DEnd,periods); } SysGetZpGosHonorRank(Uzizp,Prop,DBeg,DEnd,periods) { return OemToAnsi(TrimN(GetKchValueCnfByDate("h_rank",psZpgosCnfTable,DEnd.GetStr()))); } //------------------------------------------------------------------------------------------------------------------------- GetZpGosContractKind(Uzizp,Prop,DBeg,DEnd,periods) { return PriorityCall("UserGetZpGosContractKind","SysGetZpGosContractKind",Uzizp,Prop,DBeg,DEnd,periods); } SysGetZpGosContractKind(Uzizp,Prop,DBeg,DEnd,periods) // Возвращает вид договора: // 1 - основная работа // 2 - внутреннее совместительство // 3 - внешнее совместительство // 4 - договорники и прочий несписочный состав { char buf[256]; int kodRab = GetZpGosSsFromKch("kod_rab", DEnd); int tipRab = atoi(GetKchValue("inc_type", buf, 255, DEnd)); int contractKind = kodRab == 2 ? 4 : (kodRab == 1 ? 3 : (kodRab == 0 && tipRab == 1 ? 2 : 1 )); return contractKind; } GetZpGosSsFromKch(kodkch, date) // Распределение работников по группам // на основании кода работы для среднесписочной численности // 0 - основное место работы; 1 - внешний совместитель; 2 - договорник и несписочный состав { char str[1024]; char buf[256]; int kr = atoi(GetKchValue(to_string(kodkch), buf, 255, date)); // допсвод: Настройка - Настройки параметров расчета - Дополнительные настройки для сводов str = p3get("допсвод","SPISCHISL"); // SPISCHISL - Коды ср.сп.числ-ти, не учит. в списочной var lst = CreateObject("ParamFuncRW"); lst.IInitial(to_string(str),",",25); int cn = lst.Count(); int group = 0; // возвращаемое значение: помечаем сначала как "списочный состав" for ( int i = 0; i < cn; i++ ) { // просматриваем список кодов которые не являются кодами стреднесписочной численности if ( kr == lst.Get(i) ) { group = 2; break; // если код работы есть в этом списке, помечаем его "несписочным" и выходим } } bool isExternal = kr == 9 || kr == 4; if ( isExternal ) group = 1; // помечаем как "внешний совместитель" return group; } //------------------------------------------------------------------------------------------------------------------------- GetZpGosContractTime(Uzizp,Prop,DBeg,DEnd,periods) { return PriorityCall("UserGetZpGosContractTime","SysGetZpGosContractTime",Uzizp,Prop,DBeg,DEnd,periods); } SysGetZpGosContractTime(Uzizp,Prop,DBeg,DEnd,periods) // Срок договора: 1 - бессрочный; 2 - срочный { var contractKind = Uzizp.Contract.Kind; int limitation = GetSioRunKchContractLimitation(DEnd.GetStr()); // todo? int contractTime = contractKind == 4 ? 2 : (atoi(limitation) ? atoi(limitation) : 1); return contractTime; } //------------------------------------------------------------------------------------------------------------------------- GetZpGosSoutPeriods(Prop,DBeg,DEnd,combinePeriods) { return PriorityCall("UserGetZpGosSoutPeriods","SysGetZpGosSoutPeriods",Prop,DBeg,DEnd,combinePeriods); } SysGetZpGosSoutPeriods(Prop,DBeg,DEnd,combinePeriods) { var soutPeriods = CreateObject("KDatePeriods"); string pskch = TrimN(GetCommonCnfStr("sout",psZpgosCnfTable)); if ( pskch=="" ) pskch = "status3"; if ( pskch!="" && kch_num_sys(pskch) != -1 ) { var periods; KchToPeriods(pskch,DBeg.GetStr(),DEnd.GetStr(),0,periods); // Идем по всем периодам относящимся к подразделению for ( periods.SetBegin(); !periods.End(); periods.Next() ) { var db = periods.GetCurBeg(); var de = periods.GetCurEnd(); string sout = ZpGosSoutConverter(TrimN(periods.GetCurCod()),Prop,DBeg,DEnd); if ( sout=="" ) sout = zpgosDefaultSout; soutPeriods.AddFreePeriod(db.GetStr(), de.GetStr(), OemToAnsi(sout)); } } if ( !soutPeriods.Count() ) soutPeriods.AddFreePeriod(DBeg.GetStr(), DEnd.GetStr(), zpgosDefaultSout); return soutPeriods; } ZpGosSoutConverter(sout,Prop,DBeg,DEnd) { return PriorityCall("UserZpGosSoutConverter","SysZpGosSoutConverter",sout,Prop,DBeg,DEnd); } SysZpGosSoutConverter(sout,Prop,DBeg,DEnd) { return TrimN(SIOZPMakeCodSoutByKch(sout)); } //------------------------------------------------------------------------------------------------------------- int isZpGosQualCatChecked = false; GetZpGosQualCatPeriods(Prop,DBeg,DEnd,combinePeriods) { return PriorityCall("UserGetZpGosQualCatPeriods","SysGetZpGosQualCatPeriods",Prop,DBeg,DEnd,combinePeriods); } SysGetZpGosQualCatPeriods(Prop,DBeg,DEnd,combinePeriods) { var qcPeriods = CreateObject("KDatePeriods"); string pskch = TrimN(GetCommonCnfStr("qual_cat",psZpgosCnfTable)); string sysPsKch = "qual_cat"; if ( pskch == "" ) pskch = sysPsKch; bool stdkch = pskch == sysPsKch; if ( pskch!="" && kch_num_sys(pskch) != -1 ) { var periods; KchToPeriods(pskch,DBeg.GetStr(),DEnd.GetStr(),0,periods); // Идем по всем периодам относящимся к подразделению for ( periods.SetBegin(); !periods.End(); periods.Next() ) { var db = periods.GetCurBeg(); var de = periods.GetCurEnd(); string qc = to_string(ZpGosQualCatConverter(TrimN(periods.GetCurCod()),Prop,db,de,stdkch)); if ( qc=="" ) qc = zpgosDefaultQualCat; qcPeriods.AddFreePeriod(db.GetStr(), de.GetStr(), OemToAnsi(qc)); } } if ( !qcPeriods.Count() ) qcPeriods.AddFreePeriod(DBeg.GetStr(), DEnd.GetStr(), zpgosDefaultQualCat); return qcPeriods; } ZpGosQualCatConverter(qc,Prop,DBeg,DEnd,stdkch) { return PriorityCall("UserZpGosQualCatConverter","SysZpGosQualCatConverter",qc,Prop,DBeg,DEnd,stdkch); } SysZpGosQualCatConverter(qc,Prop,DBeg,DEnd,stdkch) { if ( stdkch ) { int qualCat = atoi(qc); if ( qualCat == 1 ) return 2; // первая категория else if ( qualCat == 2 ) return 1; // вторая категория else if ( qualCat == 3 ) return 3; // высшая категория else return 0; // категория отсутствует } else return qc; } //------------------------------------------------------------------------------------------------------------- GetZpGosStaffUnitPeriods(Prop,DBeg,DEnd,combinePeriods) { return PriorityCall("UserGetZpGosStaffUnitPeriods","SysGetZpGosStaffUnitPeriods",Prop,DBeg,DEnd,combinePeriods); } SysGetZpGosStaffUnitPeriods(Prop,DBeg,DEnd,combinePeriods) { var staffunitPeriods = CreateObject("KDatePeriods"); int howCalcKEmpl = 0; // GetCommonCnfInt("howCalcKE",psZpgosCnfTable); // отключено определение по видам if ( (howCalcKEmpl & 0x01)!=0 ) { var periods = SioRunFindKEmplFromNU(DBeg.GetStr(),DEnd.GetStr()); if ( VarHasValue(periods) ) { if ( periods.Count() ) staffunitPeriods.AddFreePeriod(DBeg.GetStr(), DEnd.GetStr(), zpgosDefaultStaffUnit); for ( periods.SetBegin(); !periods.End(); periods.Next() ) { var db = periods.GetCurBeg(); var de = periods.GetCurEnd(); double k = RefineZpGosStaffUnit(atof(periods.GetCurCod())); staffunitPeriods.UpdateLevelCod(0,db.GetStr(), de.GetStr(), to_string(k)); } } } else { string pskch = TrimN(GetCommonCnfStr("k_employ",psZpgosCnfTable)); if ( pskch!="" && kch_num_sys(pskch) != -1 ) { var periods; KchToPeriods(pskch,DBeg.GetStr(),DEnd.GetStr(),0,periods); if ( periods.Count() ) staffunitPeriods.AddFreePeriod(DBeg.GetStr(), DEnd.GetStr(), zpgosDefaultStaffUnit); // Идем по всем периодам относящимся к подразделению for ( periods.SetBegin(); !periods.End(); periods.Next() ) { var db = periods.GetCurBeg(); var de = periods.GetCurEnd(); double k = RefineZpGosStaffUnit(atof(TrimN(periods.GetCurCod()))); staffunitPeriods.UpdateLevelCod(0,db.GetStr(), de.GetStr(), to_string(k)); } } } if ( !staffunitPeriods.Count() ) staffunitPeriods.AddFreePeriod(DBeg.GetStr(), DEnd.GetStr(), zpgosRecalcStaffUnit); return staffunitPeriods; } RefineZpGosStaffUnit(k) { roundd(k,3,k); if ( k<0.0000001 ) k = 1.0; if ( (zpgosUseLimits & 0x02)!=0 ) { if ( k<0.01 ) k = 0.01; // минимальное значение 0.01 if ( k>1. ) k = 1.; // максимальное значение 1. } return k; } //------------------------------------------------------------------------------------------------------------- GetZpGosWorkTimeNorm(Uzizp,Prop,DBeg,DEnd,periods,k) { return PriorityCall("UserGetZpGosWorkTimeNorm","SysGetZpGosWorkTimeNorm",Uzizp,Prop,DBeg,DEnd,periods,k); } SysGetZpGosWorkTimeNorm(Uzizp,Prop,DBeg,DEnd,periods,k) { int tmpMrasch = mrasch; s50(DEnd.GetAbs()); double nrv = norm(2); if ( mrasch!=tmpMrasch ) s50(tmpMrasch); if ( zpgosApplyKoefNRV ) nrv *= k; roundd(nrv,2,nrv); if ( (zpgosUseLimits & 0x01)!=0 ) { double minValue = 0.0; double maxValue = 372.0; if ( nrv < minValue ) nrv = minValue; if ( nrv > maxValue ) nrv = maxValue; } return nrv; } //------------------------------------------------------------------------------------------------------------- GetZpGosWorkTimeFact(Uzizp,Prop,DBeg,DEnd,periods,k) { return PriorityCall("UserGetZpGosWorkTimeFact","SysGetZpGosWorkTimeFact",Uzizp,Prop,DBeg,DEnd,periods,k); } SysGetZpGosWorkTimeFact(Uzizp,Prop,DBeg,DEnd,periods,k) { int stolbec = TVHColFromCnf(psZpgosCnfTable,"COL0TVH_12")-1; int tmpMrasch = mrasch; s50(DEnd.GetAbs()); double frv = 0.; double nrv = norm(2); if ( stolbec < 0 ) skoljko(frv,data,DBeg.GetDay(),DEnd.GetDay(),rsimv,calm,cht); else { // Два варианта: просто выборка из видов или через коэффициент ФРВ/НРВ bool byFrvNrv = (zpgosHowCalcFRV & 0x01)!=0; bool takeFirstNonZeroSrc = (zpgosHowCalcFRV & 0x02)!=0; // ФРВ в нескольких источниках/объектах брать первый ненулевой. bool byGeneralCombIfZero = (zpgosHowCalcFRV & 0x04)!=0; // из основной исп.должности при нулевом ФРВ char dopstbuf[MAXKOD]; memcpy(dopstbuf,dopst,MAXKOD); string cachedKey = "calcFrv"; if ( IsNothing(ZpGosCachedDopst) ) ZpGosCachedDopst= CreateObject("MapString"); if ( ZpGosCachedDopst.IsExist(cachedKey) ) memcpy(dopst,ZpGosCachedDopst.GetValue(cachedKey),MAXKOD); else { Fill_Dopst(dopst,stolbec); char BufDopst[MAXKOD+1]; memcpy(BufDopst,dopst,MAXKOD); BufDopst[MAXKOD]=0; ZpGosCachedDopst.Add(cachedKey, to_string(BufDopst)); } // Если найден единственный период по исп.должности то не зачем мучаться с разбивкой по подпериодам bool bSimpleSelect = periods.Count()<2; // DBeg.GetDay()==1 && DEnd.GetDay()==DEnd.CountDay(); string nuList=""; if ( !bSimpleSelect ) { var ar; int cnt = ColTvhToArray('d',"#nonzero#",0,ar); nuList = ArrayIntToString(ar,cnt,' ','-'); } // Если несколько источников объектов то надо сделать разные варианты var ListProp = CreateObject("APropArray"); if ( takeFirstNonZeroSrc ) ListProp.GetPropListLS(); int combFRV = Prop.GetCombine(); for ( int byGeneralComb = 0; byGeneralComb<2; ++byGeneralComb ) { for ( int idx=ListProp.Size()-1; idx>=0 || !takeFirstNonZeroSrc; --idx ) { var curProp=takeFirstNonZeroSrc?ListProp.Get(idx):Prop; // Рассматриваем только свойства к текущей исп.должности (если она задана) if ( takeFirstNonZeroSrc && combFRV && combFRV!=curProp.GetCombine() ) continue; if ( byFrvNrv ) // через часовую норму и коэффициент ФРВ/НРВ (это бывает полезно, если ФРВ в часах не ведется). { double frv_nrv = 0.; s98col('d',0,frv_nrv); frv = nrv*frv_nrv; } else // просто выборка по видам { var LS = CreateObject("LS"); LS.GetGlobalLS(); var MatrLS = LS.MatrLS(); // Если выборка за весь месяц, то не зачем выделываться, делаем обычную выборку по видам if ( bSimpleSelect ) { var SumElem = MatrLS.CollectSumm('d',mrasch,0,CL_COL|CL_M|CL_SOURCE,curProp); frv = SumElem.RV; } else // надо брать только из действующих в заданном периоде, а не всех { var periods; ListVidNUToPeriods(nuList,DBeg.GetStr(),DEnd.GetStr(),periods,curProp,0x04|0x08|0x10,1); frv = 0.; for ( periods.SetBegin(); !periods.End(); periods.Next() ) { int idNU = atoi(periods.GetCurCod()); double codeNU = GetFullCodeNUFromId(idNU); var SumElem = MatrLS.CollectSumm(codeNU,mrasch,0,CL_EXACT|CL_M|CL_SOURCE,curProp); frv += SumElem.RV; } } } // если не надо бегать по нескольким источникам или нашли ненулевое РВ - выходим if ( !takeFirstNonZeroSrc || frv>0.00001 ) break; } // Если при первом входе (то есть когда выбирали по заданной исп.должности) нашли ненулевое ФРВ - то заканчиваем, // иначе надо попробовать по основной исполняемой должности if ( byGeneralComb==0 && (frv>0.00001 || !byGeneralCombIfZero) ) break; combFRV = GetGeneralCombineLS(); } memcpy(dopst,dopstbuf,MAXKOD); } if ( mrasch!=tmpMrasch ) s50(tmpMrasch); if ( (zpgosApplyKoefNRV & 0x02)!=0 ) frv *= k; roundd(frv,2,frv); if ( (zpgosUseLimits & 0x01)!=0 ) { double minValue = 0.0; double maxValue = 496.0; if ( frv < minValue ) frv = minValue; if ( frv > maxValue ) frv = maxValue; } return frv; } //------------------------------------------------------------------------------------------------------------- IsZpGosZeroNrv(combine,DBeg,DEnd) { return PriorityCall("UserIsZpGosZeroNrv","SysIsZpGosZeroNrv",combine,DBeg,DEnd); } SysIsZpGosZeroNrv(combine,DBeg,DEnd) { return 0; return IsSioRunDecretStudent(dateBeg.GetStr(),dateEnd.GetStr(),combine); } //------------------------------------------------------------------------------------------------------------- GetZpGosSvedZp(Uzizp,Prop,DBeg,DEnd,periods,tarif,originalStvk) { return PriorityCall("UserGetZpGosSvedZp","SysGetZpGosSvedZp",Uzizp,Prop,DBeg,DEnd,periods,tarif,originalStvk); } SysGetZpGosSvedZp(Uzizp,Prop,DBeg,DEnd,periods,tarif,originalStvk); { bool bSplittedRow = Uzizp.Qualification.StaffUnit 0 ) { for ( bool Cur = ZpGosMapSvedZp.InitIterator(); Cur; Cur = ZpGosMapSvedZp.Next() ) { string code = OemToAnsi(ZpGosMapSvedZp.GetCurKey()); string listNu = ZpGosMapSvedZp.GetCurValue(); double Summ = GetZpGosSvedZpSumm(listNu,Prop,DBeg,DEnd); if ( bSplittedRow ) Summ *= Uzizp.Qualification.StaffUnit/originalStvk; roundd(Summ,2,Summ); if ( (zpgosUseLimits & 0x01)!=0 && code == "ОВ-04" ) { double limitKoeff = Uzizp.Qualification.WorkTimeNorm > 0.0 ? Uzizp.Qualification.StaffUnit * tarif * Uzizp.Qualification.WorkTimeFact / Uzizp.Qualification.WorkTimeNorm : 0.0; double minValue = 0.8 * limitKoeff; double maxValue = 1.2 * limitKoeff; if ( Summ < minValue ) Summ = minValue; if ( Summ > maxValue ) Summ = maxValue; } roundd(Summ,2,Summ); if ( nabs(Summ) > eps ) { var svedZp = Uzizp.Qualification.NewSvedZpItem(); svedZp.Code = code; svedZp.Summ = Summ; Uzizp.Qualification.SvedZpItems.Add(svedZp); itgSum += svedZp.Summ; } } } // Зафиксируем здесь, были добавлены выплаты или нет. Т.к. если нет, то основная выплата ОВ все равно должна быть bool needAddOBItem = Uzizp.Qualification.SvedZpItems.Count < 1; // Надо ли добаить "прочие выплаты" (ПВ-03) int needAddOtherSumm = GetCommonCnfInt("addOtherS",psZpgosCnfTable)==1; if ( needAddOtherSumm ) { if ( !VarHasValue(ZpGosListAllNUZp) ) FillZpGosListAllNUZp(); double totalSumm = GetZpGosSvedZpSumm(ZpGosListAllNUZp,Prop,DBeg,DEnd); if ( bSplittedRow ) totalSumm *= Uzizp.Qualification.StaffUnit/originalStvk; roundd(totalSumm,2,totalSumm); if ( nabs(totalSumm-itgSum)> eps ) { var svedZp = Uzizp.Qualification.NewSvedZpItem(); svedZp.Code = "ПВ-03"; double Sum = totalSumm-itgSum; roundd(Sum,2,Sum); itgSum += Sum; svedZp.Summ = Sum; Uzizp.Qualification.SvedZpItems.Add(svedZp); } } if ( needAddOBItem ) SetEmptySvedZp(Uzizp); roundd(itgSum,2,itgSum); return itgSum; } GetCodSvedZpByPaymentSystem(paymentSystem) { if ( paymentSystem==3 ) return "ОВ-03"; if ( paymentSystem==1 ) return "ОВ-01"; return "ОВ-04"; } SetEmptySvedZp(Uzizp) { var svedZp = Uzizp.Qualification.NewSvedZpItem(); svedZp.Code = GetCodSvedZpByPaymentSystem(Uzizp.Qualification.PaymentSystem); svedZp.Summ = 0.0; Uzizp.Qualification.SvedZpItems.Add(svedZp); } //------------------------------------------------------------------------------------------------------------- GetZpGosSvedZpSumm(listNu,Prop,DBeg,DEnd) { return PriorityCall("UserGetZpGosSvedZpSumm","SysGetZpGosSvedZpSumm",listNu,Prop,DBeg,DEnd); } SysGetZpGosSvedZpSumm(listNu,Prop,DBeg,DEnd); { // todo по датам а не замесяц var Arr; int CountElem = ListNUToSafeArray(listNu,' ',Arr); if ( CountElem == 0 ) return 0.; int absm = DEnd.GetAbs(); double sum = 0.; for ( bool Cur = SysMapSlaveCombines.InitIterator(); Cur; Cur = SysMapSlaveCombines.Next() ) { int combine = SysMapSlaveCombines.GetCurValue(); Prop.SetCombine(combine); for ( int i = 0; i < CountElem; i++ ) { int code = Arr[i]; if ( zpgosBelongingAccrualSign ) sum += CollectSummProp(code,0,absm,CL_MV,Prop); else sum += CollectSummProp(code,absm,0,CL_M,Prop); } } return sum; } //------------------------------------------------------------------------------------------------------------- AddTarifFixedValuesFromString(Uzizp,Prop,DBeg,DEnd,periods) { return PriorityCall("UserAddTarifFixedValuesFromString","SysAddTarifFixedValuesFromString",Uzizp,Prop,DBeg,DEnd,periods); } SysAddTarifFixedValuesFromString(Uzizp,Prop,DBeg,DEnd,periods) { string str = periods.GetCurCod(draftUzizpFixZP); var lst= CreateObject("ParamFuncRW"); lst.IInitial1(str,",",100); bool doItForPieceWorkPayment = (zpgosSingleFixPart & 0x04)!=0; bool takeItog = (zpgosSingleFixPart & 0x01)!=0; bool takeFirst = !takeItog && (zpgosSingleFixPart & 0x02)!=0; if ( !doItForPieceWorkPayment && Uzizp.Qualification.PaymentSystem==1 ) takeFirst = takeItog = false; double itogo = 0.; if ( !lst.Count() ) { var fixedItem = Uzizp.Qualification.NewFixedItem(); fixedItem.Value = 0.0; Uzizp.Qualification.FixedItems.Add(fixedItem); } else { for ( int i = 0; i < lst.Count(); i++ ) { double tarif = atof(lst.Get(i)); if ( (zpgosUseLimits & 0x01)!=0 ) { double minValue = 0.0; double maxValue = 1000000.00; if ( tarif < minValue ) tarif = minValue; if ( tarif > maxValue ) tarif = maxValue; } if ( !takeItog ) { var fixedItem = Uzizp.Qualification.NewFixedItem(); fixedItem.Value = tarif; Uzizp.Qualification.FixedItems.Add(fixedItem); } itogo += tarif; // выходим если берем первый if ( takeFirst && tarif>0.00001 ) break; } if ( takeItog ) { var fixedItem = Uzizp.Qualification.NewFixedItem(); fixedItem.Value = itogo; Uzizp.Qualification.FixedItems.Add(fixedItem); } } return itogo; } GetZpGosFixPeriods(Prop,DBeg,DEnd,combinePeriods) { return PriorityCall("UserGetZpGosFixPeriods","SysGetZpGosFixPeriods",Prop,DBeg,DEnd,combinePeriods); } SysGetZpGosFixPeriods(Prop,DBeg,DEnd,combinePeriods) { // РазмерФЧ - Размер фиксированной части в соответствии с трудовым договором var trfPeriods = CreateObject("KDatePeriods"); string pskch = TrimN(GetCommonCnfStr("kch_fix",psZpgosCnfTable)); if ( pskch!="" && kch_num_sys(pskch) != -1 ) { var periods; KchToPeriods(pskch,DBeg.GetStr(),DEnd.GetStr(),0,periods); periods.Update(DBeg.GetStr(),DEnd.GetStr(),""); // нужно для случая, когда первое (и ненулевое) значение действует не с начала (отчетного) месяца, чтобы "не потерять" пустое значение на начало месяца periods.Crop(DBeg.GetStr(),DEnd.GetStr()); // чтобы обрезать хвосты вылезающие за интересующий нас период (облегчит поиск по видам Н-У при пустых значениях ниже) // Идем по всем периодам относящимся к подразделению for ( periods.SetBegin(); !periods.End(); periods.Next() ) { var db = periods.GetCurBeg(); var de = periods.GetCurEnd(); string value = TrimN(periods.GetCurCod()); if ( value == "" ) // если в настройке задан псевдоним КЧ, но в ЛС в этом поле нет значения заполняем за этот период по видам GetZpGosFixPeriodsByNu(Prop,db,de,combinePeriods,trfPeriods); else trfPeriods.AddFreePeriod(db.GetStr(), de.GetStr(), value); } } if ( !trfPeriods.Count() ) // если в КЧ ничего не было, то заполняем по видам { GetZpGosFixPeriodsByNu(Prop,DBeg,DEnd,combinePeriods,trfPeriods); } if ( !trfPeriods.Count() ) trfPeriods.AddFreePeriod(DBeg.GetStr(), DEnd.GetStr(), "0"); return trfPeriods; } GetZpGosFixPeriodsByNu(Prop,DBeg,DEnd,combinePeriods,&trfPeriods) { var fixPeriods = CreateObject("KDatePeriods"); fixPeriods.AddFreePeriod(DBeg.GetStr(),DEnd.GetStr(),"0"); var LS = CreateObject("LS"); LS.GetGlobalLS(); var MatrLS = LS.MatrLS(); int numCol = GetCnfCol(GetCommonCnfStr("ColTVXStvk",psZpgosCnfTable),ST_STAVKA); string nuList=TrimN(GetCommonCnfStr("LST_NU_TRF",psZpgosCnfTable)); var Arr; int countNU = StringIntToArray(nuList," ,",1,'-',Arr); if ( countNU == 0 ) countNU = ColTvhToArray(numCol,"#nonzero#",0,Arr); int rowkod[ROWMAX]; bool takeFirstNonZeroSrc = (zpgosSingleFixPart & 0x08)!=0; // в нескольких источниках/объектах брать первый ненулевой. // Если несколько источников объектов то надо сделать разные варианты var ListProp = CreateObject("APropArray"); if ( takeFirstNonZeroSrc ) ListProp.GetPropListLS(); int countLevel = 1; int combine = Prop.GetCombine(); for ( int idx=ListProp.Size()-1; idx>=0 || !takeFirstNonZeroSrc; --idx ) { var curProp=takeFirstNonZeroSrc?ListProp.Get(idx):Prop; // Рассматриваем только свойства к текущей исп.должности (если она задана) if ( takeFirstNonZeroSrc && combine && combine!=curProp.GetCombine() ) continue; for ( int ii=0; ii=0;j--) { int row=rowkod[j]; var d1 = KDateFromD(GetBegDate(row)); var d2 = KDateFromD(GetEndDate(row)); if ( d2.LT(DBeg) || d1.GT(DEnd) ) continue; if ( d1.LT(DBeg) ) d1 = DBeg; if ( d2.GT(DEnd) ) d2 = DEnd; if ( d2.LT(d1) ) continue; double codeNU = GetCode(row); double bz = GetBase(row); double rz = bz; bz_kod(codeNU,d1.GetDouble(),bz,rz); roundd(rz,2,rz); if ( rz<1. ) continue; fixPeriods.UpdateLevelCod(countLevel++,d1.GetStr(),d2.GetStr(),to_string(rz)); } } // если не надо бегать по нескольким источникам или нашли ненулевое РВ - выходим if ( !takeFirstNonZeroSrc || countLevel>1 ) break; } for ( fixPeriods.SetBegin(); !fixPeriods.End(); fixPeriods.Next() ) { var db = fixPeriods.GetCurBeg(); var de = fixPeriods.GetCurEnd(); string totalfix = ""; int cnt=0; for ( int level = 1; level0.00001 ) { if ( cnt++ ) totalfix += ","; totalfix += to_string(trf); } } trfPeriods.AddFreePeriod(db.GetStr(), de.GetStr(), totalfix); } } //------------------------------------------------------------------------------------------------------------- GetZpGosPaymentSystem(Uzizp,Prop,DBeg,DEnd,periods) { return PriorityCall("UserGetZpGosPaymentSystem","SysGetZpGosPaymentSystem",Uzizp,Prop,DBeg,DEnd,periods); } SysGetZpGosPaymentSystem(Uzizp,Prop,DBeg,DEnd,periods) { int cod = atoi(GetKchValueCnfByDate("kch_sist",psZpgosCnfTable,DEnd.GetStr())); if ( cod ) return cod; if ( !VarHasValue(ZpGosMapPaymentSystem) ) return 4; if ( ZpGosMapPaymentSystem.Size() > 0 ) { for ( bool Cur = ZpGosMapPaymentSystem.InitIterator(); Cur; Cur = ZpGosMapPaymentSystem.Next() ) { string Code = TrimN(ZpGosMapPaymentSystem.GetCurKey()); string listNu = ZpGosMapPaymentSystem.GetCurValue(); bool result = IsPaymentSystemExist(listNu,Prop,DBeg,DEnd); if ( result ) { return atoi(Code); } } } return 4; // если не нашли в ЛС вида Н-У заданного в настройке сетки, возвращаем значение "Иная" } IsPaymentSystemExist(listNu,Prop,DBeg,DEnd) { listNu = TrimN(to_string(listNu)); if ( !strlen(listNu) ) return false; int absm = DEnd.GetAbs(); var Arr; int CountElem = ListNUToSafeArray(listNu,' ',Arr); if ( CountElem == 0 ) return 0.0; double BPer = DBeg.GetDouble(); double EPer = DEnd.GetDouble(); for( int i = 0; i < CountElem; i++ ) // цикл по видам в настройке { int code = Arr[i]; int rowkod[ROWMAX]; // массив с номерами строк int cntrow = poiskosnkodProp(code,rowkod,0,Prop);//получаем список строк //цикл по действующим строкам for ( int row = 0; row < cntrow; row++ ) { double BegDate = GetBegDate(rowkod[row]); double EndDate = GetEndDate(rowkod[row]); if ( BegDate <= EPer && EndDate >= BPer ) return true; } } return false; } //------------------------------------------------------------------------------------------------------------- GetZpGosPkgPeriods(Prop,DBeg,DEnd,combinePeriods) { return PriorityCall("UserGetZpGosPkgPeriods","SysGetZpGosPkgPeriods",Prop,DBeg,DEnd,combinePeriods); } SysGetZpGosPkgPeriods(Prop,DBeg,DEnd,combinePeriods) // Если код ПКГ не найден, нужно возвращать ноль (АФ.2.73.1д) { var pkgPeriods = CreateObject("KDatePeriods"); string pskch = TrimN(GetCommonCnfStr("kch_pkg",psZpgosCnfTable)); if ( pskch!="" && kch_num_sys(pskch) != -1 ) { bool bEfs1Pkg = pskch == "Efs1_pkg"; // Если в настройке задано имя поля КЧ "Efs1_pkg" и оно сущестует, то берем значение оттуда без переконвертации bool bComplexPkg = !bEfs1Pkg && (zpgosHowPkgKu & 0x02)!=0; var periods; KchToPeriods(pskch,DBeg.GetStr(),DEnd.GetStr(),0,periods); if ( !bComplexPkg ) // вариант когда не надо комбинировать ПКГ и КУ самостоятельно. Он(и) просто стоят в виде значения в КЧ { // Идем по всем периодам относящимся к подразделению for ( periods.SetBegin(); !periods.End(); periods.Next() ) { int ku = atoi(zpgosUnknownKU); var db = periods.GetCurBeg(); var de = periods.GetCurEnd(); string pkg = TrimN(periods.GetCurCod()); if ( !bEfs1Pkg ) pkg = ZpGosPkgConverter(pkg,Prop,db,de,ku); if ( pkg=="" ) pkg = zpgosDefaultPKG; pkgPeriods.AddFreePeriod(db.GetStr(), de.GetStr(), OemToAnsi(pkg)); if ( ku!=atoi(zpgosUnknownKU) ) pkgPeriods.UpdateLevelCod(draftUzizpKU, db.GetStr(), de.GetStr(), to_string(ku)); } } else // вариант, когда надо сначала собрать "комплексное" значение в виде "ПКГ.КУ" (точнее из пользовательских кодов ПКГ и КУ), а затем превратить их по сетке { // значения из поля КЧ уже выбраны в periods. Нам надо добрать КУ var perKU = GetZpGosKUPeriods(Prop,DBeg,DEnd,combinePeriods); periods.UpdateLevelCodPeriods(draftUzizpKU,perKU); for ( periods.SetBegin(); !periods.End(); periods.Next() ) { var db = periods.GetCurBeg(); var de = periods.GetCurEnd(); string userPkg = TrimN(periods.GetCurCod()); string userKu = TrimN(periods.GetCurCod(draftUzizpKU)); string PkgKu = ZpGosMakePkgKuValue(userPkg,userKu); int ku = atoi(zpgosUnknownKU); string pkg = ZpGosPkgConverter(PkgKu,Prop,db,de,ku); if ( pkg=="" ) pkg = zpgosDefaultPKG; pkgPeriods.AddFreePeriod(db.GetStr(), de.GetStr(), OemToAnsi(pkg)); if ( ku!=atoi(zpgosUnknownKU) ) pkgPeriods.UpdateLevelCod(draftUzizpKU, db.GetStr(), de.GetStr(), to_string(ku)); } } } if ( !pkgPeriods.Count() ) pkgPeriods.AddFreePeriod(DBeg.GetStr(), DEnd.GetStr(), zpgosDefaultPKG); return pkgPeriods; } ZpGosMakePkgKuValue(userPkg,userKu) { return TrimN(to_string(PriorityCall("UserZpGosMakePkgKuValue","SysZpGosMakePkgKuValue",userPkg,userKu))); } SysZpGosMakePkgKuValue(userPkg,userKu) { return TrimN(userPkg)+"."+TrimN(userKu); } //------------------------------------------------------------------------------------------------------------- ZpGosPkgConverter(userPkg,Prop,DBeg,DEnd,&ku) { return TrimN(to_string(PriorityCall("UserZpGosPkgConverter","SysZpGosPkgConverter",userPkg,Prop,DBeg,DEnd,ku))); } SysZpGosPkgConverter(userPkg,Prop,DBeg,DEnd,&ku) { string pkg = userPkg; if ( (zpgosHowPkgKu & 0x02)==0 ) { var lst = CreateObject("ParamFuncRW"); lst.IInitial(to_string(userPkg),", ",2); if ( lst.Count()>1 ) ku = atoi(lst.Get(1)); pkg = TrimN(lst.Get(0)); if ( VarHasValue(ZpGosMapPKG) && ZpGosMapPKG.IsExist(pkg) ) pkg = TrimN(ZpGosMapPKG.GetValue(pkg)); } else { if ( VarHasValue(ZpGosMapPKG) && ZpGosMapPKG.IsExist(userPkg) ) pkg = TrimN(ZpGosMapPKG.GetValue(userPkg)); if ( VarHasValue(ZpGosMapKU) && ZpGosMapKU.IsExist(userPkg) ) ku = atoi(TrimN(ZpGosMapKU.GetValue(userPkg))); } return pkg==""?zpgosDefaultPKG:pkg; } //------------------------------------------------------------------------------------------------------------- GetZpGosKUPeriods(Prop,DBeg,DEnd,combinePeriods) { return PriorityCall("UserGetZpGosKUPeriods","SysGetZpGosKUPeriods",Prop,DBeg,DEnd,combinePeriods); } SysGetZpGosKUPeriods(Prop,DBeg,DEnd,combinePeriods) { var kvuPeriods = CreateObject("KDatePeriods"); string pskch = TrimN(GetCommonCnfStr("kch_kvu",psZpgosCnfTable)); if ( pskch!="" && kch_num_sys(pskch) != -1 ) { var periods; KchToPeriods(pskch,DBeg.GetStr(),DEnd.GetStr(),0,periods); // Идем по всем периодам относящимся к подразделению for ( periods.SetBegin(); !periods.End(); periods.Next() ) { var db = periods.GetCurBeg(); var de = periods.GetCurEnd(); int level = atoi(ZpGosKvuLevelConverter(TrimN(periods.GetCurCod()),Prop,DBeg,DEnd)); if ( level<0 ) level = atoi(zpgosDefaultKU); kvuPeriods.AddFreePeriod(db.GetStr(), de.GetStr(), to_string(level)); } } else { var LS = CreateObject("LS"); LS.GetGlobalLS(); var MatrLS = LS.MatrLS(); string nuList=TrimN(GetCommonCnfStr("CllNU_40",psZpgosCnfTable)); var periods; ListVidNUToPeriods(nuList,DBeg.GetStr(),DEnd.GetStr(),periods,Prop,0x04|0x08,0); periods.Crop(DBeg.GetStr(),DEnd.GetStr()); for ( periods.SetBegin(); !periods.End(); periods.Next() ) { int idNU = atoi(periods.GetCurCod()); double codeNU = GetFullCodeNUFromId(idNU); var be=MatrLS.GetBaseElemByCode(codeNU); if ( VarHasValue(be) ) { double bz = be.Base(); int level = atoi(ZpGosKvuLevelConverter(TrimN(to_string(bz)),Prop,DBeg,DEnd)); if ( level<0 ) level = atoi(zpgosDefaultKU); kvuPeriods.AddFreePeriod(periods.GetCurBeg().GetStr(),periods.GetCurEnd().GetStr(), to_string(level)); } } } if ( !kvuPeriods.Count() ) kvuPeriods.AddFreePeriod(DBeg.GetStr(), DEnd.GetStr(), zpgosDefaultKU); return kvuPeriods; } //------------------------------------------------------------------------------------------------------------- ZpGosKvuLevelConverter(userLevel,Prop,DBeg,DEnd) { return PriorityCall("UserZpGosKvuLevelConverter","SysZpGosKvuLevelConverter",userLevel,Prop,DBeg,DEnd); } SysZpGosKvuLevelConverter(userLevel,Prop,DBeg,DEnd) { return userLevel; } //------------------------------------------------------------------------------------------------------------- GetZpGosPositionCodePeriods(Prop,DBeg,DEnd,combinePeriods) { return PriorityCall("UserGetZpGosPositionCodePeriods","SysGetZpGosPositionCodePeriods",Prop,DBeg,DEnd,combinePeriods); } SysGetZpGosPositionCodePeriods(Prop,DBeg,DEnd,combinePeriods) { var kndPeriods = CreateObject("KDatePeriods"); string pskch = TrimN(GetCommonCnfStr("kch_knd",psZpgosCnfTable)); if ( pskch!="" && kch_num_sys(pskch) != -1 ) { var periods; KchToPeriods(pskch,DBeg.GetStr(),DEnd.GetStr(),0,periods); // Идем по всем периодам относящимся к подразделению for ( periods.SetBegin(); !periods.End(); periods.Next() ) { var db = periods.GetCurBeg(); var de = periods.GetCurEnd(); string knd = OemToAnsi(TrimN(periods.GetCurCod())); if ( knd!="" ) kndPeriods.AddFreePeriod(db.GetStr(), de.GetStr(), knd); } } if ( !kndPeriods.Count() ) kndPeriods = GetNothing(); return kndPeriods; } //------------------------------------------------------------------------------------------------------------- GetZpGosSpecialHours(Uzizp,Prop,DBeg,DEnd,periods,originalStvk) { return PriorityCall("UserGetZpGosSpecialHours","SysGetZpGosSpecialHours",Uzizp,Prop,DBeg,DEnd,periods,originalStvk); } SysGetZpGosSpecialHours(Uzizp,Prop,DBeg,DEnd,periods,originalStvk) { double eps = 0.0001; if ( VarHasValue(ZpGosMapSpecialHours) && ZpGosMapSpecialHours.Size() > 0 ) { // Если строки бьем по ставке и спец.часы тоже надо бить по ставке bool bSplittedRow = (zpgosSplitBigStaffUnit & 0x02)!=0 && Uzizp.Qualification.StaffUnit eps ) { var specialHours = Uzizp.Qualification.NewSpecialHoursItem(); specialHours.Code = code; // КодСпецЧ - Код специальных часов работы specialHours.Value = rv; Uzizp.Qualification.SpecialHoursItems.Add(specialHours); } } } if ( Uzizp.Qualification.SpecialHoursItems.Count < 1 ) SetEmptySpecialHours(Uzizp); return; } SetEmptySpecialHours(Uzizp) { var specialHours = Uzizp.Qualification.NewSpecialHoursItem(); specialHours.Code = "0"; specialHours.Value = 0.; Uzizp.Qualification.SpecialHoursItems.Add(specialHours); } //------------------------------------------------------------------------------------------------------------- GetZpGosSpecialHoursValue(listNu,Prop,DBeg,DEnd) { return PriorityCall("UserGetZpGosSpecialHoursValue","SysGetZpGosSpecialHoursValue",listNu,Prop,DBeg,DEnd); } SysGetZpGosSpecialHoursValue(listNu,Prop,DBeg,DEnd); { int absm = DEnd.GetAbs(); var Arr; int CountElem = ListNUToSafeArray(listNu,' ',Arr); if ( CountElem == 0 ) return 0.0; bool takeFirstNonZeroSrc = (zpgosHowCalcFRV & 0x02)!=0; // РВ в нескольких источниках/объектах брать первый ненулевой. // Если несколько источников объектов то надо сделать разные варианты var ListProp = CreateObject("APropArray"); if ( takeFirstNonZeroSrc ) ListProp.GetPropListLS(); double rv = 0.0; int combine = Prop.GetCombine(); for ( int idx=ListProp.Size()-1; idx>=0 || !takeFirstNonZeroSrc; --idx ) { var curProp = takeFirstNonZeroSrc ? ListProp.Get(idx) : Prop; // Рассматриваем только свойства к текущей исп.должности (если она задана) if ( takeFirstNonZeroSrc && combine && combine!=curProp.GetCombine() ) continue; rv = 0.0; for ( int i = 0; i < CountElem; i++ ) { int code = Arr[i]; if ( zpgosBelongingAccrualSign ) rv += CashSummProp(0,code,absm,absm,42,CL_SOURCE|CL_MV,curProp); else rv += CashSummProp(0,code,absm,absm,42,CL_SOURCE|CL_M,curProp); } // если не надо бегать по нескольким источникам или нашли ненулевое РВ - выходим if ( !takeFirstNonZeroSrc || rv>0.001 ) break; } return rv; } //------------------------------------------------------------------------------------------------------------- AddSouzValuesFromString(Uzizp,strSouzValues) { if ( strSouzValues=="" ) return 0; var lstSouz = CreateObject("ParamFuncRW"); lstSouz.IInitial1(strSouzValues,",",100); int cnt = 0; for ( int i = 0; i < lstSouz.Count(); i++ ) { var lst = CreateObject("ParamFuncRW"); lst.IInitial1(lstSouz.Get(i)," ",2); var souz = Uzizp.NewSouzItem(); souz.Code = TrimN(lst.Get(0)); // Код - Код условий занятости работников медицинских организаций souz.Value = atoi(lst.Get(1)); // Значение - Принимает значения в зависимости от Кода if ( souz.Code!="" ) { Uzizp.SouzItems.Add(souz); ++cnt; } } return cnt; } GetZpGosSouzPeriods(Prop,DBeg,DEnd,combinePeriods) // Показатель множественный, т.е. в одном блоке УЗиЗП "Блок сведений об условиях занятости и заработной плате" // может быть несколько блоков СоУЗ "Сведения о специальных (отраслевых) условиях занятости" { return PriorityCall("UserGetZpGosSouzPeriods","SysGetZpGosSouzPeriods",Prop,DBeg,DEnd,combinePeriods); } SysGetZpGosSouzPeriods(Prop,DBeg,DEnd,combinePeriods) // Получение информации о СОУЗ (специальные отраслевые условия занятости) { var souzPeriods = CreateObject("KDatePeriods"); if ( zpgosSouzByPodr ) { for ( combinePeriods.SetBegin(); !combinePeriods.End(); combinePeriods.Next() ) { string podrDoljn = combinePeriods.GetCurCod(draftUzizpPodr); if ( ZpGosMapSouz.IsExist(podrDoljn) ) // значит это код, который надо "развернуть" по сетке souzPeriods.AddFreePeriod(combinePeriods.GetCurBeg().GetStr(), combinePeriods.GetCurEnd().GetStr(), OemToAnsi(ZpGosMapSouz.GetValue(podrDoljn))); } } string pskch = TrimN(GetCommonCnfStr("kch_souz",psZpgosCnfTable)); if ( pskch!="" && kch_num_sys(pskch) != -1 ) { // в поле КЧ могут быть полноценные коды СОУЗ или условный код, который отрабатывает по сетке 667 var periods; KchToPeriods(pskch,DBeg.GetStr(),DEnd.GetStr(),0,periods); // Идем по всем периодам относящимся к подразделению for ( periods.SetBegin(); !periods.End(); periods.Next() ) { var db = periods.GetCurBeg(); var de = periods.GetCurEnd(); string value = TrimN(periods.GetCurCod()); if ( ZpGosMapSouz.IsExist(value) ) // значит это код, который надо "развернуть" по сетке value = ZpGosMapSouz.GetValue(value); if ( value!="" ) souzPeriods.UpdateLevelCod(0,db.GetStr(), de.GetStr(), OemToAnsi(value),"",0x01); } } return souzPeriods; } ZeroSouz(Uzizp) { // для не медицинских организаций значения нулевые var souz = Uzizp.NewSouzItem(); souz.Code = "0"; souz.Value = 0; Uzizp.SouzItems.Add(souz); return; } //------------------------------------------------------------------------------------------------------------------------- // Вспомогалетльная функция для "закачки" справочников из xml-файлов // с минимальными корректировками подходит для справочников ЕФС-1 (ЕФС-1.2.72.3д\Справочники\ВС) //LoadReferenceToTable("D:\\test\\reference.xml","D:\\test\\Efs1_PositionCode.tab"); LoadReferenceToTable(xmlRefFullName,tableFullName) { int len = 1024; char ts[len]; char kod[len]; char value[len]; var CTabl = CreateObject("CurPrnTbl"); CTabl.InitialNameFile(to_string(tableFullName)); int CurRcr = 0; int idxKod = CTabl.Find_Name_Fld("Kod"); int idxValue = CTabl.Find_Name_Fld("Value"); UnloadScriptModule("msxml"); LoadScriptModule("msxml"); var XMLDoc = CreateXML(""); LoadFileXML(XMLDoc,to_string(xmlRefFullName)); var Root = XMLDoc.documentElement.childNodes(); if ( Root.length() ) { var Elems = Root.Item(0).childNodes(); int cntElems = Elems.length(); for ( int i = 0; i < cntElems; i++ ) { if ( Elems.item(i).nodeName() == "Ключ" ) { ts = ""; if ( IsAttrElemXMLExist(Elems.Item(i),"Код",ts) ) kod = ts; var Values = Elems.Item(i).childNodes(); value = Values.Item(0).text; CTabl.Add_Rcr(CurRcr,1); CTabl.SText(idxKod,CurRcr,AnsiToOem(kod)); CTabl.SText(idxValue,CurRcr,AnsiToOem(value)); CurRcr++; } } } CTabl.Rewrite(); } FillZpGosListAllNUZp() // Функция подготавливает список всех видов Н-У, которые есть в программе { var mapExlcludeOtherNU = CllNUToMap("CllNU_ExcO",psZpgosCnfTable); mapExlcludeOtherNU.Add(1,-1); // остаток всегда выбрасываем int arrNU[MAXKOD]; int cntNU=0; for(int pos=0;pos1.0 ) staffUnit = 1.; QualificationTarget.StaffUnit = staffUnit; } // Объединяем фактическое время double frv = QualificationTarget.WorkTimeFact + QualificationSrc.WorkTimeFact; QualificationTarget.WorkTimeFact = frv; // Объединяем "спец.часы" for ( int idx = 0; idx1 на несколько строк int zpgosHowCalcFRV = GetCommonCnfInt("howCalcFRV",psZpgosCnfTable); // как выбирать ФРВ int zpgosHowMakeIdUzizp = GetCommonCnfInt("howIdRow",psZpgosCnfTable); // как формировать уникальный ключ записи: 0 - с датами, 1 - без дат int zpgosHowMergeTheSameRow = GetCommonCnfInt("howMergeR",psZpgosCnfTable); // как объединять строки: 0 - не объединять, 1 - ФРВ, ставку, спец.время, суммы //------------------------------------------------------------------------------------------------------------------------- // Константы int draftUzizpComb = 0, // исп.должность (основа): draftUzizpDoljn = 1, // должность: draftUzizpPodr = 2, // подразделение: draftUzizpKND = 3, // код наименования должности draftUzizpKKP = 4, // код категории персонала (ККП) draftUzizpSOUZ = 5, // СОУЗ draftUzizpPKG = 6, // ПКГ draftUzizpKU = 7, // квалификационный уровень (КУ) draftUzizpSOUT = 8, // класс условий труда draftUzizpQualCat = 9, // квалификационная категория draftUzizpKEmpl = 10, // слой - число штатных единий (коэфф.занятости) draftUzizpFixZP = 11; // фиксированный размер оплаты труда string zpgosDefaultKKP = "600", zpgosRecalcStaffUnit="-1", zpgosDefaultStaffUnit="1", zpgosDefaultQualCat = "0", zpgosDefaultSout = to_string(atoi(GetCommonCnfStr("sout_def",psZpgosCnfTable))), zpgosUnknownKU ="-1", zpgosDefaultKU = "0", zpgosDefaultPKG = "0";