// ЕФС-1. Раздел 2. Сведения о страховых взносах по травматизму (4-ФСС). // Заполнение данных по человеку int ossInitializationDone = 0; InitOssParams(ossParams, mainOrgId) { if (ossInitializationDone) return; // Код основной организации (по которой создаем отчёт) ossParams.MainOrgId = mainOrgId; // Как считать базу для взносов на травматизм ossParams.HowToCalcTravm = GetCommonCnfInt("TRAV", "fss4"); // Учитывать аттестованных: true - не учитывать, false - учитывать ossParams.SkipMilitary = GetCommonCnfInt("MilTr", "fss4") == 1; // Признак наличия частичного финансирования из бюджета ossParams.IsPartiallyBudget = Get_IS_BUDJET(); // Номер алгоритма взносов на травматизм для бюджетной части (тарифы бюджетной и коммерческой частей различны) ossParams.BudgetAlg = GetCommonCnfInt("TBALG", "fss4"); // Тариф из настроек алгоритма взносов для MainOrgId. Инициализируем -1, при чтении первого ЛС заполним из настроек 254 алгоритма (за последний месяц периода) ossParams.ItogTarifFromTaxAlg = -1; // Номер сетки для данных об аттестации рабочих мест ossParams.AttestRmTablSetNum = GetCommonCnfInt("SATT_22", "fss4"); if (ossParams.AttestRmTablSetNum == 0) ossParams.AttestRmTablSetNum = 63; // Номер сетки для страхового тарифа для MainOrgId ossParams.TarifTablSetNum = atoi(TrimN(GetEnterpriseRefValue(ossParams.MainOrgId, AnsiToOem("СТТАРИФ")))); if (ossParams.TarifTablSetNum == 0) ossParams.TarifTablSetNum = 60; // для удобства сохраним абсолютные месяцы начала/конца периода отчета ossParams.ReportBegAbsM = KDateFromStr(Str_Date_0).GetAbs(); ossParams.ReportEndAbsM = KDateFromStr(Str_Date_1).GetAbs(); var Efs1DateBeg = KDateFromInt_WithDay(1, ossParams.ReportBegAbsM); var Efs1DateEnd = KDateFromInt_LastDay(ossParams.ReportEndAbsM); var Efs1BegYear = CreateObject("KDate"); Efs1BegYear.SetDateIII(1,1,Efs1DateBeg.GetYear()); ossParams.ReportBegYearAbsM = Efs1BegYear.GetAbs(); // Если мы должны сами определить как считать травматизм (по ТВХ или по настройке налога), // то смотрим на первую строчку таблицы, на первый месяц - есть ли в лицевом счете (который попал в первую строчку) // вид 354-ый травматизм. if ( ossParams.HowToCalcTravm == 2 ) { if (IsAvalableKodAlgLSPeriod(254, ossParams.ReportBegYearAbsM, ossParams.ReportEndAbsM) <=0 ) { ossParams.HowToCalcTravm = 0; } if ( ossParams.HowToCalcTravm ) ossParams.HowToCalcTravm = 1; } // Дата начала деятельности и окончания деятельности влияют, как минимум на среднесписочную численность. string str = GetEnterpriseRefValue(ossParams.MainOrgId, AnsiToOem("ДАТАНАЧ")); var EnterpriseStartDate = KDateFromStr(TrimN(str)); if ( EnterpriseStartDate.IsValid() && Efs1DateBeg.GetYear() == EnterpriseStartDate.GetYear() ) { // количество месяцев которые нужно вычесть из CountMesPeriod (число месяцев в периоде) при вычеслении численности за период ossParams.CountMonthNotWorked = EnterpriseStartDate.GetMonth() - 1; // ossParams.WorkMes[i] - флаг является ли месяц i рабочим for ( int i = 0; i < ossParams.CountMonthNotWorked; i++ ) ossParams.WorkMes[i] = 0; } // кроме даты начала надо анализировать и дату ликвидации str = GetEnterpriseRefValue(ossParams.MainOrgId, AnsiToOem("ДАТАКОН")); var EnterpriseEndDate = KDateFromStr(TrimN(str)); if ( EnterpriseEndDate.IsValid() && Efs1DateBeg.GetYear() == EnterpriseEndDate.GetYear() && EnterpriseEndDate.GetMonth() < Efs1DateEnd.GetMonth()) { int CountMesPeriod = ossParams.ReportEndAbsM - ossParams.ReportBegYearAbsM + 1; // количество месяцев которые нужно вычесть из CountMesPeriod (число месяцев в периоде) при вычеслении численности за период ossParams.CountMonthNotWorked += CountMesPeriod - EnterpriseEndDate.GetMonth(); // ossParams.WorkMes[i] - флаг является ли месяц i рабочим for ( int i = EnterpriseEndDate.GetMonth(); i < 12; i++ ) ossParams.WorkMes[i] = 0; } //Авто-корректировака сумм взносов ossParams.AutoCorrectTaxes = GetCommonCnfInt("KorTravma", "fss4"); //Учет СКЕ (бывший параметр формы печати FSKE) ossParams.AllowSke = 1; // Признак что имеем дело с общственной организацией инвалидов ossParams.InvalidOrg = GetCommonCnfInt("OINV", "fss4"); int msgKorr = GetCommonCnfInt("MsgKorr", "fss4"); ossParams.ShowCorrectTaxMsg = (msgKorr == 0 || ossParams.HowToCalcTravm == 1) ? 1 : 0; ossInitializationDone = 1; } Efs1FillPersonOssPart(persData, ossParams, mainOrgId) { InitOssParams(ossParams, mainOrgId); var Efs1DateBeg = KDateFromInt_WithDay(1, ossParams.ReportBegAbsM); var Efs1DateEnd = KDateFromInt_LastDay(ossParams.ReportEndAbsM); var Efs1BegYear = KDateFromInt_WithDay(1, ossParams.ReportBegYearAbsM); //инициализируем глобальную переменную, в которой собираются данные по вредности, а также данные по суммам, в случае если выборка по ТВХ PayTravma(); //соберем данные о среднесписочной численности помесячно, аттестации, инвалидности, вредных условиях труда for (int monthAbs = Efs1BegYear.GetAbs(); monthAbs <= Efs1DateEnd.GetAbs(); monthAbs++) { FillOssOneMonthChisl(persData.OssData, monthAbs, ossParams); } // списочная численность на последний месяц периода var meanQ = CreateObject("KMeanQuantity"); meanQ.Initial(Efs1DateEnd.GetAbs(),Efs1DateEnd.GetAbs()); meanQ.Accuracy = 5; meanQ.CollectInfoFromLS(); persData.OssData.Quantity = meanQ.GetListQuantity(Efs1DateEnd.CountDay(), Efs1DateEnd.GetAbs()); // среднесписочная численность за период meanQ.Initial(Efs1BegYear.GetAbs(),Efs1DateEnd.GetAbs()); meanQ.Accuracy = 5; meanQ.CollectInfoFromLS(); persData.OssData.MeanQuantity = meanQ.GetMeanListQuantityP(Efs1BegYear.GetAbs(), Efs1DateEnd.GetAbs(), 0); // дополнительный учет вредных условий труда (пользовательская функция) int soutFlag = FlagKchVutPeriod(); if (soutFlag != 0) persData.OssData.UserSoutFlag = soutFlag; //получим список оквэдов в этом ЛС, которые надо заполнить var okvedList = FillOssOkvedArray(); //заполнение сумм по оквэдам for (int i=0; i <= GetUBound(okvedList); i++) { FillOssOkvedSums(persData.OssData, okvedList[i], ossParams); } } FillOssOkvedArray() { return PriorityCall("UserFillOssOkvedArray","SysFillOssOkvedArray"); } SysFillOssOkvedArray() { // сейчас по каждому ЛС всё относится только к одному оквэду int podr = kch_from_int("podr"); int idOrg = GetOrgForPodr(podr); string okvedList[1]; okvedList[0] = TrimN(GetEnterpriseRefValue(idOrg, AnsiToOem("ОКВЭД"))); return okvedList; } FillOssOkvedSums(persOssData, okved, ossParams) { return PriorityCall("UserFillOssOkvedSums","SysFillOssOkvedSums", persOssData, okved, ossParams); } SysFillOssOkvedSums(persOssData, okved, ossParams) { var Efs1DateBeg = KDateFromInt_WithDay(1, ossParams.ReportBegAbsM); var Efs1DateEnd = KDateFromInt_LastDay(ossParams.ReportEndAbsM); var Efs1BegYear = KDateFromInt_WithDay(1, ossParams.ReportBegYearAbsM); if (!persOssData.OkvedSums.ContainsKey(okved)) persOssData.OkvedSums.Add(okved, persOssData.NewOkvedSums()); var personDataSums = persOssData.OkvedSums.Get(okved); for (int monthAbs = Efs1BegYear.GetAbs(); monthAbs <= Efs1DateEnd.GetAbs(); monthAbs++) { int mCal = KDateFromInt(monthAbs).GetMonth(); // пропускаем аттестованных в этом месяце, если стоит соответствующая настройка if (ossParams.SkipMilitary && persOssData.Attest.Contains(mCal)) continue; // заполнение сумм месяца mmonthAbs FillOssOneMonthSums(personDataSums, monthAbs, okved, ossParams); } } FillOssOneMonthChisl(persOssData, monthAbs, ossParams) { return PriorityCall("UserFillOssOneMonthChisl","SysFillOssOneMonthChisl", persOssData, monthAbs, ossParams); } SysFillOssOneMonthChisl(persOssData, monthAbs, ossParams) { double eps = 0.001; var date = KDateFromInt_LastDay(monthAbs); int mCal = date.GetMonth(); //заполняем данные об аттестации, для того, чтобы учитывать аттестованных только в месяцах, где они не были таковыми if ( ossParams.SkipMilitary ) { char buf[256]; var attest = atoi(GetKchValue("attest", buf, 255, date)); if (attest != 0) persOssData.Attest.Add(mCal); } // заполнение данных об инвалидности, для подсчета численности инвалидов и сумм выплат в их пользу string invStr = TrimN(StrInvMes(monthAbs - mtek,0)); if (strlen(invStr)) { int groupInv = GetGroupInv(invStr); if (groupInv > 0) { if (IsNothing(persOssData.Invalid)) persOssData.Invalid = persOssData.CreateNewIntList(); persOssData.Invalid.Add(mCal, groupInv); } } // заполнение флагов наличия вредных условий труда по месяцам int sout = atoi(GetTravmaValue(mCal, 4, 10)); //10 - width if (sout != 0) persOssData.Sout.Add(mCal); // заполнение среднесписочной численности по месяцам для вычисления ССЧ за период для аттестованных if (ossParams.WorkMes[mCal - 1]) { var meanQ = CreateObject("KMeanQuantity"); meanQ.Initial(monthAbs,monthAbs); meanQ.Accuracy = 5; meanQ.CollectInfoFromLS(); double meanQuantity = meanQ.GetMeanListQuantity(monthAbs); if (meanQuantity > eps) persOssData.Ssch.Add(mCal, meanQuantity); } } FillOssOneMonthSums(personDataSums, monthAbs, okved, ossParams) { return PriorityCall("UserFillOssOneMonthSums","SysFillOssOneMonthSums", personDataSums, monthAbs, okved, ossParams); } SysFillOssOneMonthSums(personDataSums, monthAbs, okved, ossParams) { double eps = 0.001; int width = 14; int accuracy = 2; int taxAccuracy = 6; int mCal = KDateFromInt(monthAbs).GetMonth(); //не может быть, что ключ повторится в пределах массива, поэтому всегда новый var key = personDataSums.NewSumKey(); key.month = mCal; double sum = 0; // сумма выплат и иных вознаграждений, для строки 1 подраздел 2.1 if (ossParams.HowToCalcTravm == 0) sum = GetTravmaValue(mCal,1,width); else sum = R_TaxSc7(4, monthAbs - mtek, monthAbs - mtek, 254, width, accuracy); if (nabs(sum) > eps) personDataSums.FullIncomeSums.Add(key, sum); // сумма не подлежащая обложению взносами, для строки 2 подраздел 2.1 if (ossParams.HowToCalcTravm == 0) sum = GetTravmaValue(mCal,2,width); else { string par = "2200"; if (ossParams.SkipMilitary) par = "9900"; sum = res2(par, width, accuracy); } if (nabs(sum) > eps) personDataSums.UntaxedIncomeSums.Add(key, sum); // исчислено страховых взносов, строка 9 подраздел 2.1 // заполняется из ЛС только если собираем суммы по 254 алгоритму double taxSum = 0; if (ossParams.HowToCalcTravm == 1) { char Str[256]; taxSum = atof(R_Tax("7",Str,width,taxAccuracy)); if (nabs(taxSum) > eps) personDataSums.TaxSums.Add(key, taxSum); //заполним процент тарифа, если этот ЛС из основной организации, по которой отчёт, и если тариф ещё не заполняли (ItogTarifFromTaxAlg < 0) int podr = kch_from_int("podr"); int idOrg = GetOrgForPodr(podr); if (ossParams.ItogTarifFromTaxAlg < 0 && idOrg == ossParams.MainOrgId && monthAbs == ossParams.ReportEndAbsM) ossParams.ItogTarifFromTaxAlg = GetFirstProcentTax(); } //в случае наличия частичного финансирования из бюджета добавим эти суммы if ( ossParams.HowToCalcTravm == 1 && ossParams.IsPartiallyBudget > 0) { var key = personDataSums.NewSumKey(); key.month = mCal; key.isBudget = true; double budSum = R_TaxScISB(4, monthAbs - mtek, monthAbs - mtek, ossParams.BudgetAlg, ossParams.IsPartiallyBudget, width, accuracy); double budTax = RTSx(7, width, taxAccuracy); if ( ossParams.IsPartiallyBudget == 1 ) { if (nabs(budSum) > eps) personDataSums.FullIncomeSums.Add(key, budSum); double untaxedBudSum = res2("9800",width,accuracy); if (nabs(untaxedBudSum) > eps) personDataSums.UntaxedIncomeSums.Add(key, untaxedBudSum); } // в любом случае запоминаем сумму взносов. // для СКЕ в случае, если частичное финансирование через набор источников (ossParams.IsPartiallyBudget == 2) её надо будет вычесть из общей суммы взносов if (nabs(budTax) > eps) personDataSums.TaxSums.Add(key, budTax); } }