// Сведения о заработной плате и условиях осуществления деятельности работников государственных (муниципальных) учреждений ЕФС-1. Раздел 1.3 //------------------------------------------------------------------------------------------------------------------------- FillEfs1UzizpItem(part, periods, Prop, cntuzizp); // Заполнение информации по одной строке в таблице ЕФС-1 1.3 { var DBeg = periods.GetCurBeg(); var DEnd = periods.GetCurEnd(); string BegWorkDat = DBeg.GetStr(); string EndWorkDat = DEnd.GetStr(); int combine = Prop.GetCombine(); var Uzizp = part.NewUzizpItem(); // УЗиЗП - Блок сведений об условиях занятости и заработной плате (одна строка в таблице отчета) // Сведения о договоре // Вид договора (графа 10) Uzizp.Contract.Kind = GetZpGosContractKind(DEnd); // Срок договора (графа 11) (1 - бессрочный, 2 - срочный) Uzizp.Contract.Time = GetZpGosContractTime(EndWorkDat, Uzizp.Contract.Kind); // Договорников в отчет не включаем (пункт 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(DEnd); // ученое звание Uzizp.Rank.AcademDegree = GetZpGosAcademDegree(DEnd); // ученая степень Uzizp.Rank.HonorRank = GetZpGosHonorRank(DEnd); // почетное звание // Сведения о структурном подразделении 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 = GetKoefEmployment(DEnd,combine,0x01); roundd(k,3,k); if ( k<0.0000001 ) k = 1.0; if ( k<0.01 ) k = 0.01; // минимальное значение 0.01 } Uzizp.Qualification.StaffUnit = k; // Система оплаты (графа 17) Uzizp.Qualification.PaymentSystem = GetZpGosPaymentSystem(Prop,DBeg,DEnd); // Размер фиксированной части в соответствии с трудовым договором (графа 18) double tarif = AddTarifFixedValuesFromString(Uzizp,periods.GetCurCod(draftUzizpFixZP)); // Надо ли "обнулять" время (например если в декрете или еще по каким условиям) int isZeroNrv = IsZpGosZeroNrv(combine,DBeg,DEnd); // В отпуске по беременности и родам, по уходу за ребенком или в отпуске на время учебы // Норма рабочих часов (графа 19) Uzizp.Qualification.WorkTimeNorm = !isZeroNrv ? GetZpGosWorkTimeNorm(Prop,DBeg,DEnd,k) : 0.0; // РабВремяНорма - Норма рабочих часов // Количество фактически отработанных рабочих часов (графа 20) Uzizp.Qualification.WorkTimeFact = !isZeroNrv ? GetZpGosWorkTimeFact(Prop,DBeg,DEnd,k) : 0.0; // РабВремяФакт - Количество фактически отработанных рабочих часов if ( !cntuzizp ) // пока не умеем бить суммы все ставим на первую строку в периоде по данный исп.должности { // Сведения о количестве специальных часов работы (графа 21 и графа 22) GetZpGosSpecialHours(Uzizp,Prop,DBeg,DEnd); // Сведения о заработной плате (графа 23, графа 24) double itogSumm = GetZpGosSvedZp(Uzizp,Prop,DBeg,DEnd,tarif); // Итого - Общая сумма всех выплат (графа 25) Uzizp.Qualification.ItogSumm = itogSumm; } else { var specialHours = Uzizp.Qualification.NewSpecialHoursItem(); specialHours.Code = "0"; specialHours.Value = 0; Uzizp.Qualification.SpecialHoursItems.Add(specialHours); var svedZp = Uzizp.Qualification.NewSvedZpItem(); svedZp.Code = "ОВ-04"; svedZp.Summ = 0.0; Uzizp.Qualification.SvedZpItems.Add(svedZp); Uzizp.Qualification.ItogSumm = 0.0; } part.UzizpItems.Add(Uzizp); } //------------------------------------------------------------------------------------------------------------------------- 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 = GetCommonCnfInt("howCombine",psZpgosCnfTable); 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); // выборка по видам и т.п // Определяем период работы по данной исп.должности 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); if ( VarHasValue(per) ) combinePeriods.UpdateLevelCodPeriods(draftUzizpPodr,per); // код наименования должности per = GetZpGosPositionCodePeriods(Prop,Efs1DateBeg,Efs1DateEnd); if ( VarHasValue(per) ) combinePeriods.UpdateLevelCodPeriods(draftUzizpKND,per); // код категории персонала per = GetZpGosKkpPeriods(Prop,Efs1DateBeg,Efs1DateEnd); if ( VarHasValue(per) ) combinePeriods.UpdateLevelCodPeriods(draftUzizpKKP,per,"",zpgosDefaultKKP+","); // СОУЗ per = GetZpGosSouzPeriods(Prop,Efs1DateBeg,Efs1DateEnd); if ( VarHasValue(per) ) combinePeriods.UpdateLevelCodPeriods(draftUzizpSOUZ,per,"","#emptystring#"); // ПКГ per = GetZpGosPkgPeriods(Prop,Efs1DateBeg,Efs1DateEnd); 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+","); } } // КУ per = GetZpGosKUPeriods(Prop,Efs1DateBeg,Efs1DateEnd); if ( VarHasValue(per) ) combinePeriods.UpdateLevelCodPeriods(draftUzizpKU,per,"",zpgosDefaultKU+","); // СОУТ per = GetZpGosSoutPeriods(Prop,Efs1DateBeg,Efs1DateEnd); if ( VarHasValue(per) ) combinePeriods.UpdateLevelCodPeriods(draftUzizpSOUT,per,"",zpgosDefaultSout+","); // квалификационная категория per = GetZpGosQualCatPeriods(Prop,Efs1DateBeg,Efs1DateEnd); if ( VarHasValue(per) ) combinePeriods.UpdateLevelCodPeriods(draftUzizpQualCat,per,"",zpgosDefaultQualCat+","); // ставка per = GetZpGosStaffUnitPeriod(Prop,Efs1DateBeg,Efs1DateEnd); if ( VarHasValue(per) ) combinePeriods.UpdateLevelCodPeriods(draftUzizpKEmpl,per); // фиксированный размер зарплаты per = GetZpGosFixPeriods(Prop,Efs1DateBeg,Efs1DateEnd); 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 ( zpgosUseOldPKG ) // использовать старый ПКГ { 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 = GetCommonCnfInt("howCombine",psZpgosCnfTable); // Сейчас ЕФС-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(); // Блок сведений об отчитывающейся организации 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.SetBegin(); !draftUzizpItems.End(); draftUzizpItems.Next() ) 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 cntuzizp=0; var periods = draftUzizpItems.GetCurValue(); // Идем по всем периодам относящимся к данной исп.должности for ( periods.SetBegin(); !periods.End(); periods.Next(), ++cntuzizp) { var db = periods.GetCurBeg(); var de = periods.GetCurEnd(); // пропускаем периоды не относящиеся к рассматриваемому месяцу if ( db.GT(lastdayM) ) break; if ( de.LT(firstdayM) ) continue; FillEfs1UzizpItem(part, periods, Prop, cntuzizp); } } 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 = GetZpGosContractId(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 РазмерФЧ GetZpGosContractId(Uzizp) { return PriorityCall("UserGetZpGosContractId","SysGetZpGosContractId",Uzizp); } SysGetZpGosContractId(Uzizp) // todo Вычисление этого идентификатора нужно и в шарпе (например, при валидачии редактируемых данных). Скорее всего его нужно сделать в шарпе (чтобы бы единый вариант). // Идентификатор трудового договора для ЗЛ (для одного Item) (для отдельного элемента блока УЗиЗП) { string contractId = ""; var db = CreateObject("KDate"); var de = CreateObject("KDate"); db.SetVariantDate(Uzizp.Period.DateBeg); de.SetVariantDate(Uzizp.Period.DateEnd); contractId += db.GetStr(); contractId += de.GetStr(); contractId += Uzizp.Podr.Name; contractId += Uzizp.Podr.Oid; contractId += Uzizp.PositionCode; for ( int i = 0; i < Uzizp.SouzItems.Count; i++ ) { var souzItem = Uzizp.SouzItems.Get(i); contractId += souzItem.Code; contractId += to_string(souzItem.Value); } contractId += to_string(Uzizp.Contract.Kind); contractId += to_string(Uzizp.Contract.Time); contractId += Uzizp.Qualification.Code; contractId += to_string(Uzizp.Qualification.Level); contractId += to_string(Uzizp.Qualification.StaffUnit); for ( int i = 0; i < Uzizp.Qualification.SpecialHoursItems.Count; i++ ) { var specialHoursItem = Uzizp.Qualification.SpecialHoursItems.Get(i); contractId += to_string(specialHoursItem.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) { // На всякий случай сделал контроль не просто инициализированности, а с учетом даты (на тот случай если вдруг модуль останется загруженным по каким-либо причинам). if ( VarHasValue(isInitialisationDoneDate) && isInitialisationDoneDate.IsEq(date) ) return; isInitialisationDoneDate = date; psSiozpCnfTable = psZpgosCnfTable; // у нас подгружен модуль "siorun" и там свои настройки, поэтому нужно "переключить" их на таблицу настроек ЗПГос // Загрузка таблиц соотвествия "подразделение - OID" и "подразделение - название подразделения" InitDepartmentSettings(idOrg,date); // Инициализация таблиц соответствия "код - набор видов Н-У" // Для видов выплаты ZpGosMapSvedZp = ReadSetka2ToMap(idOrg,date,663,"Id","ListNU"," ",psZpgosCnfTable,"setPayCode"); // для определения системы оплаты труда (???) ZpGosMapPaymentSystem = ReadSetka2ToMap(idOrg,date,664,"Id","ListNU"," ",psZpgosCnfTable,"setPaySyst"); // для выборки информации о специальном рабочем времени ZpGosMapSpecialHours = ReadSetka2ToMap(idOrg,date,665,"Id","ListNU"," ",psZpgosCnfTable,"setSpHours"); // Для конвертации "старых" ПКГ 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",""); // инициализация таблицы соответствия "код - набор СОУЗ" ZpGosMapSouz = ReadSetka2ToMap(idOrg,date,667,"Id","Value",",",psZpgosCnfTable,"setSouz"); // инициализация сетки для перекодировки кода категории персонала ZpGosMapKKP = ReadSetka1ToMap(idOrg,-1,"",date.GetStr(),"",psZpgosCnfTable,"setKKP"); return; } //------------------------------------------------------------------------------------------------------------------------- GetZpGosDepartmentCodePeriods(Prop,DBeg,DEnd) // Должна вернуть KDatePeriods с периодами действия разных подразделений по указанному Prop { return PriorityCall("UserGetZpGosDepartmentCodePeriods","SysGetZpGosDepartmentCodePeriods",Prop,DBeg,DEnd); } SysGetZpGosDepartmentCodePeriods(Prop,DBeg,DEnd) { int combine = Prop.GetCombine(); int podrCombine = kch_from_int("podr"); var ZpGosCombList = CreateObject("CombineList"); if( ZpGosCombList.GetPodr(combine) > 0 ) podrCombine = ZpGosCombList.GetPodr(combine); var podrPeriods = CreateObject("KDatePeriods"); string pskch = TrimN(GetCommonCnfStr("kch_podr",psZpgosCnfTable)); if ( 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()); podrPeriods.AddFreePeriod(db.GetStr(), de.GetStr(), to_string(podr>0?podr:podrCombine)); } } 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) { return PriorityCall("UserGetZpGosKkpPeriods","SysGetZpGosKkpPeriods",Prop,DBeg,DEnd); } SysGetZpGosKkpPeriods(Prop,DBeg,DEnd) { // 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 ( kch_num_sys(pskch) != -1 ) { var tmpcomb = CreateObject("TmpCurCombine"); // Если вдруг почему-то коды категорий надо брать об "базовой исп.должности" переключаемся на нее временно if ( GetCommonCnfInt("FlagKat", psZpgosCnfTable)==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(date) { return PriorityCall("UserGetZpGosAcademDegree","SysGetZpGosAcademDegree",date); } var ZpGosMapAcademDegree = GetNothing(); // перекодировка значений ученых степеней SysGetZpGosAcademDegree(date) { if ( !VarHasValue(ZpGosMapAcademDegree) ) ZpGosMapAcademDegree = ReadTableToMap("T_GUIDE\\a_degree.tab","Kod","kod_efs1",""); var cod = TrimN(GetKchValueCnfByDate("a_degree",psZpgosCnfTable,date.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 to_string(""); // без степени } //------------------------------------------------------------------------------------------------------------------------- GetZpGosAcademRank(date) { return PriorityCall("UserGetZpGosAcademRank","SysGetZpGosAcademRank",date); } var ZpGosMapAcademRank = GetNothing(); // перекодировка значений ученых званий SysGetZpGosAcademRank(date) { if ( !VarHasValue(ZpGosMapAcademRank) ) ZpGosMapAcademRank = ReadTableToMap("T_GUIDE\\a_rank.tab","Kod","kod_efs1",""); var cod = GetKchValueCnfByDate("a_rank",psZpgosCnfTable,date.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 to_string(""); // без ученого звания } //------------------------------------------------------------------------------------------------------------------------- GetZpGosHonorRank(date) { return PriorityCall("UserGetZpGosHonorRank","SysGetZpGosHonorRank",date); } SysGetZpGosHonorRank(date) { return OemToAnsi(GetKchValueCnfByDate("h_rank",psZpgosCnfTable,date.GetStr())); } //------------------------------------------------------------------------------------------------------------------------- GetZpGosContractKind(date) // todo { return PriorityCall("UserGetZpGosContractKind","SysGetZpGosContractKind",date); } SysGetZpGosContractKind(date) // Возвращает вид договора: // 1 - основная работа // 2 - внутреннее совместительство // 3 - внешнее совместительство // 4 - договорники и прочий несписочный состав { char buf[256]; int kodRab = GetZpGosSsFromKch("kod_rab", date); int tipRab = atoi(GetKchValue("inc_type", buf, 255, date)); int contractKind = kodRab == 0 ? 4 : (kodRab == 2 ? 3 : (kodRab == 1 && 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 = 1; // возвращаемое значение: помечаем сначала как "списочный состав" for ( int i = 0; i < cn; i++ ) { // просматриваем список кодов которые не являются кодами стреднесписочной численности if ( kr == lst.Get(i) ) { group = 0; break; // если код работы есть в этом списке, помечаем его "несписочным" и выходим } } bool isExternal = kr == 9 || kr == 4; if ( isExternal ) group = 2; // помечаем как "внешний совместитель" return group; } //------------------------------------------------------------------------------------------------------------------------- GetZpGosContractTime(dateKch,contractKind) // todo { return PriorityCall("UserGetZpGosContractTime","SysGetZpGosContractTime",dateKch,contractKind); } SysGetZpGosContractTime(dateKch,contractKind) // Срок договора: 1 - бессрочный; 2 - срочный { int limitation = GetSioRunKchContractLimitation(dateKch); int contractTime = contractKind == 4 ? 2 : (atoi(limitation) ? atoi(limitation) : 1); return contractTime; } //------------------------------------------------------------------------------------------------------------------------- GetZpGosSoutPeriods(Prop,DBeg,DEnd) { return PriorityCall("UserGetZpGosSoutPeriods","SysGetZpGosSoutPeriods",Prop,DBeg,DEnd); } SysGetZpGosSoutPeriods(Prop,DBeg,DEnd) { var soutPeriods = CreateObject("KDatePeriods"); string pskch = TrimN(GetCommonCnfStr("sout",psZpgosCnfTable)); if ( pskch=="" ) pskch = "status3"; if ( 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) { return PriorityCall("UserGetZpGosQualCatPeriods","SysGetZpGosQualCatPeriods",Prop,DBeg,DEnd); } SysGetZpGosQualCatPeriods(Prop,DBeg,DEnd) { var qcPeriods = CreateObject("KDatePeriods"); string pskch = TrimN(GetCommonCnfStr("qual_cat",psZpgosCnfTable)); string sysPsKch = "qual_cat"; if ( pskch == "" ) pskch = sysPsKch; bool stdkch = pskch == sysPsKch; if ( 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; } //------------------------------------------------------------------------------------------------------------- GetZpGosStaffUnitPeriod(Prop,DBeg,DEnd) { return PriorityCall("UserGetZpGosStaffUnitPeriod","SysGetZpGosStaffUnitPeriod",Prop,DBeg,DEnd); } SysGetZpGosStaffUnitPeriod(Prop,DBeg,DEnd) { 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 = atof(periods.GetCurCod()); roundd(k,3,k); if ( k<0.0000001 ) k = 1.0; if ( k<0.01 ) k = 0.01; // минимальное значение 0.01 staffunitPeriods.UpdateLevelCod(0,db.GetStr(), de.GetStr(), to_string(k)); } } } else { string pskch = TrimN(GetCommonCnfStr("k_employ",psZpgosCnfTable)); if ( 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 = atof(TrimN(periods.GetCurCod())); roundd(k,3,k); if ( k<0.0000001 ) k = 1.0; if ( k<0.01 ) k = 0.01; // минимальное значение 0.01 staffunitPeriods.UpdateLevelCod(0,db.GetStr(), de.GetStr(), to_string(k)); } } } if ( !staffunitPeriods.Count() ) staffunitPeriods.AddFreePeriod(DBeg.GetStr(), DEnd.GetStr(), zpgosRecalcStaffUnit); return staffunitPeriods; } //------------------------------------------------------------------------------------------------------------- GetZpGosWorkTimeNorm(Prop,DBeg,DEnd,k) { return PriorityCall("UserGetZpGosWorkTimeNorm","SysGetZpGosWorkTimeNorm",Prop,DBeg,DEnd,k); } SysGetZpGosWorkTimeNorm(Prop,DBeg,DEnd,k) { int applyKoef = GetCommonCnfInt("koefNRV",psZpgosCnfTable); int tmpMrasch = mrasch; s50(DEnd.GetAbs()); double nrv = norm(2); if ( mrasch!=tmpMrasch ) s50(tmpMrasch); if ( applyKoef ) nrv *= k; roundd(nrv,2,nrv); if ( zpgosUseLimits ) { double minValue = 0.0; double maxValue = 372.0; if ( nrv < minValue ) nrv = minValue; if ( nrv > maxValue ) nrv = maxValue; } return nrv; } //------------------------------------------------------------------------------------------------------------- GetZpGosWorkTimeFact(Prop,DBeg,DEnd,k) { return PriorityCall("UserGetZpGosWorkTimeFact","SysGetZpGosWorkTimeFact",Prop,DBeg,DEnd,k); } SysGetZpGosWorkTimeFact(Prop,DBeg,DEnd,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 { // Два варианта: просто выборка из видов или через коэффициент ФРВ/НРВ int howCalcFRV = GetCommonCnfInt("howCalcFRV",psZpgosCnfTable); bool byFrvNrv = (howCalcFRV & 0x01)!=0; bool byMultipleSrc = (howCalcFRV & 0x02)!=0; // ФРВ в нескольких источниках/объектах брать первый ненулевой. bool byGeneralCombIfZero = (howCalcFRV & 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)); } // Если несколько источников объектов то надо сделать разные варианты var ListProp = CreateObject("APropArray"); if ( byMultipleSrc ) ListProp.GetPropListLS(); int combFRV = Prop.GetCombine(); for ( int byGeneralComb = 0; byGeneralComb<2; ++byGeneralComb ) { for ( int idx=ListProp.Size()-1; idx>=0 || !byMultipleSrc; --idx ) { var curProp=byMultipleSrc?ListProp.Get(idx):Prop; // Рассматриваем только свойства к текущей исп.должности (если она задана) if ( byMultipleSrc && 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(); var SumElem = MatrLS.CollectSumm('d',mrasch,0,CL_COL|CL_M|CL_SOURCE,curProp); frv = SumElem.RV; } // если не надо бегать по нескольким источникам или нашли ненулевое РВ - выходим if ( !byMultipleSrc || frv>0.00001 ) break; } // Если при первом входе (то есть когда выбирали по заданной исп.должности) нашли ненулевое ФРВ - то заканчиваем, // иначе надо попробовать по основной исполняемой должности if ( byGeneralComb==0 && (frv>0.00001 || !byGeneralCombIfZero) ) break; combFRV = GetGeneralCombineLS(); } memcpy(dopst,dopstbuf,MAXKOD); } if ( mrasch!=tmpMrasch ) s50(tmpMrasch); int applyKoef = (GetCommonCnfInt("koefNRV",psZpgosCnfTable) & 0x02)!=0; if ( applyKoef ) frv *= k; roundd(frv,2,frv); if ( zpgosUseLimits ) { 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,tarif) { return PriorityCall("UserGetZpGosSvedZp","SysGetZpGosSvedZp",Uzizp,Prop,DBeg,DEnd,tarif); } SysGetZpGosSvedZp(Uzizp,Prop,DBeg,DEnd,tarif); { double eps = 0.0001; double itgSum = 0.0; if ( VarHasValue(ZpGosMapSvedZp) && ZpGosMapSvedZp.Size() > 0 ) { for ( bool Cur = ZpGosMapSvedZp.InitIterator(); Cur; Cur = ZpGosMapSvedZp.Next() ) { var svedZp = Uzizp.Qualification.NewSvedZpItem(); svedZp.Code = OemToAnsi(ZpGosMapSvedZp.GetCurKey()); string listNu = ZpGosMapSvedZp.GetCurValue(); svedZp.Summ = GetZpGosSvedZpSumm(listNu,Prop,DBeg,DEnd); roundd(svedZp.Summ,2,svedZp.Summ); if ( zpgosUseLimits && svedZp.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 ( svedZp.Summ < minValue ) svedZp.Summ = minValue; if ( svedZp.Summ > maxValue ) svedZp.Summ = maxValue; } roundd(svedZp.Summ,2,svedZp.Summ); if ( nabs(svedZp.Summ) > eps ) { Uzizp.Qualification.SvedZpItems.Add(svedZp); itgSum += svedZp.Summ; } } } if ( Uzizp.Qualification.SvedZpItems.Count < 1 ) { var svedZp = Uzizp.Qualification.NewSvedZpItem(); svedZp.Code = "ОВ-04"; svedZp.Summ = 0.0; Uzizp.Qualification.SvedZpItems.Add(svedZp); } roundd(itgSum,2,itgSum); return itgSum; } //------------------------------------------------------------------------------------------------------------- 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 = Extern_To_Intern(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,str) { var lst= CreateObject("ParamFuncRW"); lst.IInitial1(str,",",100); 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 ) { double minValue = 0.0; double maxValue = 1000000.00; if ( tarif < minValue ) tarif = minValue; if ( tarif > maxValue ) tarif = maxValue; } var fixedItem = Uzizp.Qualification.NewFixedItem(); fixedItem.Value = tarif; Uzizp.Qualification.FixedItems.Add(fixedItem); itogo += tarif; } } return itogo; } GetZpGosFixPeriods(Prop,DBeg,DEnd) { return PriorityCall("UserGetZpGosFixPeriods","SysGetZpGosFixPeriods",Prop,DBeg,DEnd); } SysGetZpGosFixPeriods(Prop,DBeg,DEnd) { // РазмерФЧ - Размер фиксированной части в соответствии с трудовым договором // Множественный // todo Сделать множестивенный вариант фиксированной части (для сдельной системы оплаты) // if ( Uzizp.Qualification.PaymentSystem == 1 ) // todo Можно в этом случае, например, смотреть сетку 664 - "ЕФС-1 ЗПГос. Система оплаты труда", брать оттуда из строки с id Системы оплаты, равной 1, набор видов Н-У // todo и, для каждой строки действующей в периоде BegWorkDat - EndWorkDat, получать РазмерФЧ // int paymentSystem = Uzizp.Qualification.PaymentSystem; // todo Это будет нужно когда/если будем делать множественный вариант для сдельной системы оплаты var trfPeriods = CreateObject("KDatePeriods"); string pskch = TrimN(GetCommonCnfStr("kch_fix",psZpgosCnfTable)); if ( 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 value = TrimN(periods.GetCurCod()); trfPeriods.AddFreePeriod(db.GetStr(), de.GetStr(), value); } } if ( !trfPeriods.Count() ) // если в КЧ ничего не было, то заполняем по видам { 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]; int countLevel = 1; 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) ) contine; 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); fixPeriods.UpdateLevelCod(countLevel++,d1.GetStr(),d2.GetStr(),to_string(rz)); } } 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); } } if ( !trfPeriods.Count() ) trfPeriods.AddFreePeriod(DBeg.GetStr(), DEnd.GetStr(), "0"); return trfPeriods; } //------------------------------------------------------------------------------------------------------------- GetZpGosPaymentSystem(Prop,DBeg,DEnd) { return PriorityCall("UserGetZpGosPaymentSystem","SysGetZpGosPaymentSystem",Prop,DBeg,DEnd); } SysGetZpGosPaymentSystem(Prop,DBeg,DEnd) { 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 = Extern_To_Intern(atoi(Arr[i])); int rowkod[ROWMAX]; // массив с номерами строк int cntrow = poiskosnkodProp(code,rowkod,0,Prop);//получаем список строк //цикл по действующим строкам for ( int row = 0; row < cntrow; row++ ) { double BegDate = GetBegDate(row); double EndDate = GetEndDate(row); if ( BegDate <= EPer && EndDate >= BPer ) return true; } } return false; } //------------------------------------------------------------------------------------------------------------- GetZpGosPkgPeriods(Prop,DBeg,DEnd) { return PriorityCall("UserGetZpGosPkgPeriods","SysGetZpGosPkgPeriods",Prop,DBeg,DEnd); } SysGetZpGosPkgPeriods(Prop,DBeg,DEnd) // Если код ПКГ не найден, нужно возвращать ноль (АФ.2.73.1д) { var pkgPeriods = CreateObject("KDatePeriods"); string pskch = TrimN(GetCommonCnfStr("kch_pkg",psZpgosCnfTable)); if ( kch_num_sys(pskch) != -1 ) { bool bEfs1Pkg = pskch == "Efs1_pkg"; // Если в настройке задано имя поля КЧ "Efs1_pkg" и оно сущестует, то берем значение оттуда без переконвертации var periods; KchToPeriods(pskch,DBeg.GetStr(),DEnd.GetStr(),0,periods); // Идем по всем периодам относящимся к подразделению 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)); } } if ( !pkgPeriods.Count() ) pkgPeriods.AddFreePeriod(DBeg.GetStr(), DEnd.GetStr(), zpgosDefaultPKG); return pkgPeriods; } //------------------------------------------------------------------------------------------------------------- ZpGosPkgConverter(userPkg,Prop,DBeg,DEnd,&ku) { return TrimN(to_string(PriorityCall("UserZpGosPkgConverter","SysZpGosPkgConverter",userPkg,Prop,DBeg,DEnd,ku))); } SysZpGosPkgConverter(userPkg,Prop,DBeg,DEnd,&ku) { var lst = CreateObject("ParamFuncRW"); lst.IInitial(to_string(userPkg),", ",2); if ( lst.Count()>1 ) ku = atoi(lst.Get(1)); string pkg = TrimN(lst.Get(0)); if ( VarHasValue(ZpGosMapPKG) && ZpGosMapPKG.IsExist(pkg) ) pkg = TrimN(ZpGosMapPKG.GetValue(pkg)); return pkg==""?"0":pkg; } //------------------------------------------------------------------------------------------------------------- GetZpGosKUPeriods(Prop,DBeg,DEnd) { return PriorityCall("UserGetZpGosKUPeriods","SysGetZpGosKUPeriods",Prop,DBeg,DEnd); } SysGetZpGosKUPeriods(Prop,DBeg,DEnd) { var kvuPeriods = CreateObject("KDatePeriods"); string pskch = TrimN(GetCommonCnfStr("kch_kvu",psZpgosCnfTable)); if ( 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 { string nuList=TrimN(GetCommonCnfStr("CllNU_40",psZpgosCnfTable)); var periods; FindPeriodsByNUEx(nuList,DBeg.GetStr(),DEnd.GetStr(),periods,1); 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) { return PriorityCall("UserGetZpGosPositionCodePeriods","SysGetZpGosPositionCodePeriods",Prop,DBeg,DEnd); } SysGetZpGosPositionCodePeriods(Prop,DBeg,DEnd) { var kndPeriods = CreateObject("KDatePeriods"); string pskch = TrimN(GetCommonCnfStr("kch_knd",psZpgosCnfTable)); if ( 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) { return PriorityCall("UserGetZpGosSpecialHours","SysGetZpGosSpecialHours",Uzizp,Prop,DBeg,DEnd); } SysGetZpGosSpecialHours(Uzizp,Prop,DBeg,DEnd) { double eps = 0.0001; if ( VarHasValue(ZpGosMapSpecialHours) && ZpGosMapSpecialHours.Size() > 0 ) { for ( bool Cur = ZpGosMapSpecialHours.InitIterator(); Cur; Cur = ZpGosMapSpecialHours.Next() ) { var specialHours = Uzizp.Qualification.NewSpecialHoursItem(); specialHours.Code = OemToAnsi(ZpGosMapSpecialHours.GetCurKey()); // КодСпецЧ - Код специальных часов работы string listNu = ZpGosMapSpecialHours.GetCurValue(); specialHours.Value = GetZpGosSpecialHoursValue(listNu,Prop,DBeg,DEnd); // КоличСпецЧ - Количество специальных часов работы roundd(specialHours.Value,2,specialHours.Value); if ( zpgosUseLimits ) { if ( specialHours.Value < 0.0 ) specialHours.Value = 0.0; if ( specialHours.Code == "СРПР" ) if ( specialHours.Value > 44.0 ) specialHours.Value = 44.0; if ( specialHours.Code == "СРДР" ) if ( specialHours.Value > 22.0 ) specialHours.Value = 22.0; if ( specialHours.Code == "КЧНВ" ) if ( specialHours.Value > 150.0 ) specialHours.Value = 150.0; if ( specialHours.Code == "КЧДД" ) if ( specialHours.Value > 255.0 ) specialHours.Value = 255.0; if ( specialHours.Code == "КЧДЧ" ) if ( specialHours.Value > 496.0 ) specialHours.Value = 496.0; if ( specialHours.Code == "ВПДН" || specialHours.Code == "ВПДС" ) if ( specialHours.Value > 120.0 ) specialHours.Value = 120.0; } roundd(specialHours.Value,2,specialHours.Value); if ( nabs(specialHours.Value) > eps ) { Uzizp.Qualification.SpecialHoursItems.Add(specialHours); } } } if ( Uzizp.Qualification.SpecialHoursItems.Count < 1 ) { var specialHours = Uzizp.Qualification.NewSpecialHoursItem(); specialHours.Code = "0"; specialHours.Value = 0; Uzizp.Qualification.SpecialHoursItems.Add(specialHours); } return; } //------------------------------------------------------------------------------------------------------------- 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; double rv = 0.0; for ( int i = 0; i < CountElem; i++ ) { int code = Extern_To_Intern(atoi(Arr[i])); if ( zpgosBelongingAccrualSign ) rv += CashSummProp(0,code,absm,absm,42,CL_SOURCE|CL_MV,Prop); else rv += CashSummProp(0,code,absm,absm,42,CL_SOURCE|CL_M,Prop); } 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) // Показатель множественный, т.е. в одном блоке УЗиЗП "Блок сведений об условиях занятости и заработной плате" // может быть несколько блоков СоУЗ "Сведения о специальных (отраслевых) условиях занятости" { return PriorityCall("UserGetZpGosSouzPeriods","SysGetZpGosSouzPeriods",Prop,DBeg,DEnd); } SysGetZpGosSouzPeriods(Prop,DBeg,DEnd) // Получение информации о СОУЗ (специальные отраслевые условия занятости) { var souzPeriods = CreateObject("KDatePeriods"); string pskch = TrimN(GetCommonCnfStr("kch_souz",psZpgosCnfTable)); if ( 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); souzPeriods.AddFreePeriod(db.GetStr(), de.GetStr(), OemToAnsi(value)); } } 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(); } //------------------------------------------------------------------------------------------------------------------------- var isInitialisationDoneDate = GetNothing(); var ZpGosMapDepartmentName = CreateObject("MapString"); // список "код подразделения" - "наименование подразделения" var ZpGosMapDepartmentOID = CreateObject("MapString"); // список "код подразделения" - OID подразделения var ZpGosMapSvedZp = GetNothing(); // данные из сетки "Виды оплаты" (код - набор видов) var ZpGosMapPaymentSystem = GetNothing(); // данные из сетки "Система оплаты труда" (код - набор видов) var ZpGosMapSpecialHours = GetNothing(); // данные из сетки "Специальные часы работы" (код - набор видов) var ZpGosMapSouz = GetNothing(); // данные из сетки "Специальные условия занятости" (код - набор СОУЗ) var ZpGosMapKKP = GetNothing(); // данные из сетки "ЕФС1-ЗПГос Код катег. персонала" (код - код категории персонала ЕФС-1) var ZpGosMapPKG = GetNothing(); // перекодировка значений ПКГ var ZpGosCachedDopst = GetNothing(); // закэшированные dopst bool zpgosTakeDepartmentNameFromSet = false; //------------------------------------------------------------------------------------------------------------------------- // Настройки по исходному заполнению ЗПГос string psZpgosCnfTable = "zpgos"; // псевдоним таблицы астройка "ЗПГос сведения о заработной плате" int zpgosBelongingAccrualSign = GetCommonCnfInt("howSumCalc", psZpgosCnfTable); // Признак учета сумм: 0 - по месяцу начисления; 1 - по месяцу начисления int zpgosUseLimits = GetCommonCnfInt("useLimits", psZpgosCnfTable); // 0 - не применять (по умолчанию); 1 - применять ограничение к суммам int zpgosTypeSouz = GetCommonCnfInt("TypeSouz", psZpgosCnfTable); // 0 - из справочника должностей; 1 - из сетки 667 int zpgosTypePkg = GetCommonCnfInt("TypePkg", psZpgosCnfTable); // 0 - из справочника должностей; 1 - "прежний" способ int zpgosTypeKkp = GetCommonCnfInt("TypeKkp", psZpgosCnfTable); // 0 - из справочника должностей; 1 - "прежний" способ int zpgosUseOldPKG = GetCommonCnfInt("oldPKGDljn",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";