// Полный(!) период за который создан отчет var Rsv2017DBeg,Rsv2017DEnd; bool isRsv2019=false; // признак: РСВ за 2019 и последующие года bool isRsv2020=false; // признак: РСВ за 2020 и последующие года bool wasMsgAboutChangeCodTarifa = false; // признак: выдавалось ли сообщение о замене устаревшего кода тарифа bool wasMsgAboutChangeCodCateg = false; // признак: выдавалось ли сообщение о замене устаревшего кода застрахованного // Период за который осуществляется выборка из ЛС (при разбивке по ОКТМО) var CurDBegOKTMO,CurDEndOKTMO; var CurCombineOKTMO=0; int Rsv2017OldTN = -1; // признаки аттестованности var Rsv2017Attest; // признаки "аттестованности" из КЧ // Статусы для доп.взносов var Rsv2017Status2; // полезно для расшифровки ФСС по временно пребывающим. Для всех остальных случаев заполнен GlobalStatus2PFMonth // Информация о кодах категории застрахованного лица из КЧ var Rsv2017CategoriesPF = GetNothing(); // Есть смешанные режимы: ОСНО+ЕНВД(01+03), УСН+ЕНВ(02+03), x+АСБ (x+09) // // В случае если в ЛС выделяется вмененный доход через процент а КЧ или каким-либо другим способом, // а также в случае необходимости выделять в отдельный раздел 2 доходы фармацевтов или экипажей судов // необходимо учитывать следующее: // // В ЛС должны быть заведены и действовать виды с алгоритмами 251, 252, 259 // (в поставке виды с кодами 351, 352, 359) // в "Специальных настройках расчета налога" должна быть заполнена строка // "Коды дохода учит. во вмененном доходе" - в том числе и для алгоритмов 241, 242 и 239 // (в поставке виды с кодами 341, 342, 339) // Виды без кода дохода отмененные символом "*" (звездочка без кавычек) в столбце Доп настройки налога // должны быть отмечены символом "9" в столбце 24 специальной таблицы входимости // // Другой способ учета фармацевтов: // суммы выбираются по тем же символам что и суммы обычных работников. Работник относится к АСБ // по наличию кода застрахованного АСБ в кадровой части. // 0 - просто нет, 1 - есть, но не надо выделять (данные суммируются на основной тариф), // 2 - есть и надо выделять, 4 - "инверсия налогов" (когда "ЕНВД" на видах 341,342 и 339 а не на 351,352,359) // 8 - есть АСБ, 16 - подразделения на своем тарифе var Rsv2017MultiTarif = GetCommonCnfInt("MultiTarif","rsv2017"); var Rsv2017OPSEnvd = GetCommonCnfInt("OPSEnvd","rsv2017"); var Rsv2017OMSEnvd = GetCommonCnfInt("OMSEnvd","rsv2017"); var Rsv2017OSSEnvd = GetCommonCnfInt("OSSEnvd","rsv2017"); var Rsv2017RecodeCodDoc19 = GetCommonCnfInt("CodDoc19","rsv2017"); // ╚эЇюЁьрЎш  яю фюуютюЁрь ├╧╒: 13 - ьхё Ў√ // 5 - Єшя шэЇюЁьрЎшш (0-юсырурхь√щ фюїюф, 1 - яЁхт√°хэшх яЁхфхы№эюую ышьшЄр ш Є.ф.) // 2 - фы  Єюую ўЄюс√ юЄфхы№эю яюыєўшЄ№ ╬╤═╬ ш ┼═┬─ т Єхї ёыєўр ї ъюуфр эрфю Ёрчфхы Є№ var Rsv2017SummDogov[13][5][2]; var UsedRsv2017SummDogov[13][2]; var Rsv2017Flyer = false; var Rsv2017Miner = false; // Номер поля для сохранения порядка записи (требуется для нового интерфейса) int Rsv2017fldNeedRestoreOrderRow = -1; // Если есть доход или налог - считаем застрахованным (речь идет об уволенных, по которым // дополнительно что-то начислили): // 0 - нет, 1 - по суммам взносов, 2 - по доходам (в т.ч. необлагаемым) // 3 - признак застрахованности не менять, но и суммы (необлагаемые) не отбрасывать. int Rsv2017InsuredAndSum = GetCommonCnfInt("InsAndSum","rsv2017"); // Включать незастрахованных в отчет или нет (ВКС, аттестованные и т.п.) int Rsv2017IncludeNotInsured = GetCommonCnfInt("InclNotIns","rsv2017"); CodPeriods_RSV2017(&ReportParams) // Начальная функция определяющая цикл по самостоятельно сдающим отчет подразделениям // в рамках одного работника // (речь идет о ситуациях, когда один и тот же человек может попадать в разные подразделения) { var Tbl = CreateObject("CurPrnTbl"); if ( !IsObject(CurDBegOKTMO) ) InitCreateReportParamRSV2017(Tbl); if ( !Rsv2017ReportVersion ) { Rsv2017ReportParams = ReportParams; Rsv2017ReportVersion = IsObject(ReportParams)?ReportParams.PfParamsVer():0; } // todo Разбивка по организациям после того как сможем ее поддерживать // внутри отчета // int IdOrg = GetOrgForPodr(!Poln_Tn?-1:Poln_Tn/sizetn); // Пока организация одна на весь отчет: // либо это организация выбранная в новой отчетности, либо это организация // выставленная таблице при разбивке по организациям в старом интерфейсе int IdOrg = GetOrgForPodr(-1); if ( Rsv2017ReportVersion != 0 ) IdOrg = Rsv2017ReportParams.PfPacketParams.OrgId; else { var ArrOrg; if ( Tbl.GetFilterByOrg(ArrOrg) ) IdOrg=atoi(ArrOrg[0]); else IdOrg=GetCurEnterprise(); } var kcp = CreateObject("KPeriodsIterations"); kcp.ClearAll(); kcp.AddPeriod(to_string(IdOrg),Rsv2017DBeg.GetStr(),Rsv2017DEnd.GetStr()); // Чтобы понимать что мы перешли к следующему работнику и надо // выполнить "одноразовый" сбор некоторой информации по нему Rsv2017CategoriesPF = GetNothing(); GlobalInfoAboutStatus3 = GetNothing(); Rsv2017Flyer = Str_Cmp(CodAdditionalTaxForFlyer(),""," ")!=0; Rsv2017Miner = Str_Cmp(CodAdditionalTaxForMiner(),""," ")!=0; return 0; } Rsv2017CalculateDogovorSum(bNeedSplitTax) { if ( !bNeedSplitTax ) // выбираем все в куче { for ( int m=0; m<13; ++m ) for (int t=0; t<5; ++t ) Rsv2017SummDogov[m][t][1] = 0.; CollectSumDogovorPF(Rsv2017DBeg,Rsv2017DEnd,3); } else { // ЕНВД CollectSumDogovorPF(Rsv2017DBeg,Rsv2017DEnd,2); for ( int m=0; m<13; ++m ) for (int t=0; t<5; ++t ) Rsv2017SummDogov[m][t][1] = GlobalSummDogov[m][t]; // ОСНО CollectSumDogovorPF(Rsv2017DBeg,Rsv2017DEnd,1); } for ( int m=0; m<13; ++m ) { UsedRsv2017SummDogov[m][0]=UsedRsv2017SummDogov[m][1]=0.; for (int t=0; t<5; ++t ) Rsv2017SummDogov[m][t][0] = GlobalSummDogov[m][t]; } } Rsv2017OneTimePerPersonCollectInfo() { char Buf[256]; // Нам потребуется информация о статусах для страховых взносов на конец месяца // соберем ее сразу один раз по человеку GetFromLSStatus2ByMonth(Rsv2017DBeg,Rsv2017DEnd); // Сразу же разберемся с необлагаемыми статусами из настроек налогов // оптимизация: выполняем один раз при создании отчета а не как сейчас - для каждого человека if ( IsEmpty(_VPStatusFSS) ) GetUntaxedStatusFromTaxSettings(Rsv2017DBeg); KchToPeriods("status2",Rsv2017DBeg.GetStr(),Rsv2017DEnd.GetStr(),1,Rsv2017Status2); // учет аттестованных при сборе информации GlobalAttestPeriods = CreateObject("KDatePeriods"); KchToPeriods("attest",Rsv2017DBeg.GetStr(),Rsv2017DEnd.GetStr(),1,Rsv2017Attest); for ( Rsv2017Attest.SetBegin(); !Rsv2017Attest.End(); Rsv2017Attest.Next() ) { if ( atoi(Rsv2017Attest.GetCurCod())==0 ) continue; GlobalAttestPeriods.UpdatePeriods(Rsv2017Attest.GetCurPer()); } if ( GlobalAttestPeriods.CountDays()==0 ) GlobalAttestPeriods = GetNothing(); // Собираем единожды по человеку информацию по договорам ГПХ FillPeriodsDogovGPX(); DefineFlagsOsnAndDogovor(Rsv2017DBeg,Rsv2017DEnd); // Необходимость выделять АСБ bool bNeedASB = (Rsv2017MultiTarif & 0x08)!=0; // Необходимость выделять отдельно суммы по группе налогов "ЕНВД" bool bNeedEnvd = (Rsv2017MultiTarif & 0x02)!=0; // Есть разделение налогов и надо брать их сумму bool bNeedSplitTax = bNeedASB || bNeedEnvd; // Вычисляем суммы по договорам ГПХ Rsv2017CalculateDogovorSum(bNeedSplitTax); // "Количество строк стажа" (работал человек или нет, с разбивкой по месяцам) // !Выше чем определение категорий ПФ, т.к. при определении категорий смотрится признак застрахованности) FillInfoAboutWorkInMonth(Rsv2017DBeg,Rsv2017DEnd); // признаки застрахованности (помесячно) FilllInsuredFlags(Rsv2017DBeg,Rsv2017DEnd); // статусы для доп.взносов (по всем совместительствам) FillInfoAboutStatus3(Rsv2017DBeg,Rsv2017DEnd); // Информация о кодах категории застрахованного лица из КЧ Rsv2017CategoriesPF = GetCategoriesPFfromKch(Rsv2017DBeg,Rsv2017DEnd); // Информация о некоторых видах больничных из реестра Rsv2017GetInfoAboutCostFromReestr(Rsv2017DBeg,Rsv2017DEnd); } ReceivePersonDataRSV2017(&person,__Rcr) // Сбор всей необходимой для отчета информации по одному работнику { if ( !IsObject(CurDBegOKTMO) ) { var Tbl = CreateObject("CurPrnTbl"); InitCreateReportParamRSV2017(Tbl); } int curTN = kch_from_int("tn"); if ( Rsv2017OldTN!=curTN && !IsNothing(Rsv2017CategoriesPF) ) { Rsv2017OldTN=curTN; // Чтобы понимать что мы перешли к следующему работнику и надо // выполнить "одноразовый" сбор некоторой информации по нему Rsv2017CategoriesPF = GetNothing(); GlobalInfoAboutStatus3 = GetNothing(); Rsv2017Flyer = Str_Cmp(CodAdditionalTaxForFlyer(),""," ")!=0; Rsv2017Miner = Str_Cmp(CodAdditionalTaxForMiner(),""," ")!=0; } // Если сюда попадаем впервый раз по данному работнику, выполняем // сбор общей информации if ( IsNothing(Rsv2017CategoriesPF) ) Rsv2017OneTimePerPersonCollectInfo(); char Buf[1024]; // Тут собственно ВСЁ заполнение int idOrg = person.IdDepart = GetIDDepartRSV2017(__Rcr); // Табельный person.Tn= curTN; // Подразделение из списка ЛС person.PodrLS = Poln_Tn/sizetn; // ID ЛС person.IdLS = GetCurLSId(); //todo яхЁхфхырЄ№ IdLS эр string // Фамилия GetKchValue("f",Buf,255,Rsv2017DEnd); person.Surname = StrToPerson(Buf); // Имя GetKchValue("i",Buf,255,Rsv2017DEnd); person.Name = StrToPerson(Buf); // Отчество GetKchValue("o",Buf,255,Rsv2017DEnd); person.Patronymic= StrToPerson(Buf); // Дата рождения в виде ГГГГММДД GetKchValue("data_r",Buf,255,Rsv2017DEnd); var Dat = KDateFromStr(to_string(Buf)); person.BirthDay=Dat.IsValid()?Dat.GetInt():0; // Гражданство (код страны) GetKchValue("citizen",Buf,255,Rsv2017DEnd); person.Citizenship=UpdateCitizenFld(Buf); // Пол (1 - мужчина, 2 - женщина) GetKchValue("pol",Buf,255,Rsv2017DEnd); person.Sex = UpdateSexFld(Buf); // ИНН GetKchValue("inn_fl",Buf,255,Rsv2017DEnd); person.INN=StrToPerson(Buf); // СНИЛС GetKchValue("strah_n",Buf,255,Rsv2017DEnd); person.SNILS=StrToPerson(Buf); // Номер в отчете person.NumberInReport = PersNumberRSV2017(person.Tn,person.IdLS,idOrg);; // паспорт // GetKchValue("pasport",Buf,255,Rsv2017DEnd); kch_from("pasport", Buf); var Pasp = CreateObject("Pasport"); Pasp.Initial(to_string(Buf)); string Ser = Pasp.GetPasport("СЕРИЯ"); FreeSpaceString(Ser,3,""); string Num = Pasp.GetPasport("НОМЕР"); FreeSpaceString(Num,5,""); person.Passport.Number = OemToAnsi(Ser + " " + Num); // Умники из ФНС код "Свидетельство о предоставлении временного убежища" для 2-НДФЛ закодировали 19, а для РСВ(2017) 18. int coddoc = atoi(Pasp.GetPasport("КОДДОК")); if ( Rsv2017RecodeCodDoc19 && coddoc == 19 ) coddoc = 18; person.Passport.Type = coddoc; // person.CodPeriod = GetCodPeriodRSV2017ByOrg(Rsv2017DEnd.GetStr(),atoi(person.IdDepart)); person.FlagAccept = 0; var FirstMonth = KDateFromInt(GetFirstMonthQuarterAbs(Rsv2017DEnd)); // Суммы для Приложения 10 (по студентам) if ( NeedPart10_RSV2017 ) { string kchStudOtr = TrimN(GetCommonCnfStr("SprStudOtr","rsv2017")); string kchFullTimeSpr = TrimN(GetCommonCnfStr("FullTimeSt","rsv2017")); bool iGetSprav = false; if ( Str_Cmp(kchFullTimeSpr," "," ") ) { string s = GetKchValue(kchFullTimeSpr,Buf,255,Rsv2017DEnd); if ( Str_Cmp(s," "," ") ) { iGetSprav = true; person.Student.FullTimeDocument.Number = s; person.Student.FullTimeDocument.XmlDate = to_string(GetKchDate(kchFullTimeSpr,Buf,255,Rsv2017DEnd)); } } if ( !iGetSprav && Str_Cmp(kchStudOtr," "," ") ) { string s = GetKchValue(kchStudOtr,Buf,255,Rsv2017DEnd); if ( Str_Cmp(s," "," ") ) { iGetSprav = true; person.Student.SquadDocument.Number = s; person.Student.SquadDocument.XmlDate = to_string(GetKchDate(kchStudOtr,Buf,255,Rsv2017DEnd)); } } int amb = Rsv2017DBeg.GetAbs(), ame = Rsv2017DEnd.GetAbs(), qm1 = FirstMonth.GetAbs(); for ( int am=amb; am<=ame; ++am ) { double sum = CollectSummSrcSimv("*",PARCOL+GPCN_RSV2017_STUDENTS,0,am,CL_MV,0); if ( am0.001 ) person.FlagAccept = 1; } // порядок перечисления алгоритмов связан с int RSV2017idxPF=0,RSV2017idxOMS=1,RSV2017idxFSS=2; var arAlgTax[2]; // 0 - группа ОСНО, 1 - группа "ЕНВД" (если не включена инверсия) arAlgTax[0] = GetArray("А","М","Ц"); // алгоритмы ОСНО или УСН (если не включена "инверсия") arAlgTax[1] = GetArray("О","259","258"); // алгоритмы ЕНВД или АСБ (если не включена "инверсия") // Информация о расходах ФСС заполняется без разбивки по кодам тарифа // Отдельно собираем информацию по страховым взносам с доп.дней по уходу за детьми инвалидами double SumStrDI[4]; SumStrDI[0]=CalcualateTaxForDaysInvNU("",Rsv2017DBeg.GetRel(),Rsv2017DEnd.GetRel()); if ( nabs(SumStrDI[0]) < 0.001 ) SumStrDI[1]=SumStrDI[2]=SumStrDI[3]=0.; else { var Cost = person.GetFSSCost(Rsv2017CostInvalidDaysStr); Cost.CountPerson = 1; Cost.CountDays = 0; var fedBudg = person.GetFSSCostFB(Rsv2017CostInvalidDaysStr, Rsv2017FBTotal); fedBudg.CountPerson = 1; // Для федерального бюджета собираем именно число получателей fedBudg.CountDays = 0; int relm1 = FirstMonth.GetRel(); SumStrDI[1]=CalcualateTaxForDaysInvNU("",relm1,relm1); SumStrDI[2]=CalcualateTaxForDaysInvNU("",relm1+1,relm1+1); SumStrDI[3]=CalcualateTaxForDaysInvNU("",relm1+2,relm1+2); Cost.Total = SumStrDI[0]; fedBudg.Total = SumStrDI[0]; } InitPaySocStr(); InitFssSocPays(); // Выборка данных осуществляется функцией за период [Str_Date_0,Str_Date_1] string AllTypeBL = "92345678АБВГДЭЮЯЩЫЬЪУЧ"; // todo количество дней и случаев из реестра больничных AllPaySocStr(AllTypeBL,0,1); // Суммарно расходы, с разбивкой по месяцам (без детализации по совместителям, временно пребывающим и т.п.) // Информация хранится в в виде: количество получателей(0), количество дней(1), сумма(2) // Для пособий до 1.5 лет, информация "удвоена" (на второго ребенка): количество получателей(3), количество дней(4), сумма(5) var Costs = person.AllFSSCosts; int qm1 = FirstMonth.GetMonth(); var lst = CreateObject("ParamFuncRW"); for ( int m=qm1-1; m<=qm1+2; ++m ) { string value = ReadFssLineMonth(AllTypeBL,m5 ) Sum += atof(lst.Get(5)); if ( m0.001 ) person.FlagAccept = 1; // те же самые расходы суммарно за период (без разбивки по месяцам), но с разбивкой по типам больничных // внешним совместителями и возмещению из Федерального бюджета // Простые случаи (без выделения федерального бюджета) // единовременное пособие при рождении ребенка RSV2017FSSCostSimple(person,"4",Rsv2017CostLumpSumBirth); // единовременное пособие за постановку в ранние сроки RSV2017FSSCostSimple(person,"7",Rsv2017CostLumpSumEarlyDate); // пособие на погребение RSV2017FSSCostSimple(person,"5",Rsv2017CostBurialBenefit); // оплата доп.дней по уходу за детьми инвалидами тоже относим к простым // потому что там ВСЯ сумма идет за счет фед.бюджета var Cost = RSV2017FSSCostSimple(person,"6",Rsv2017CostInvalidDays); if ( !IsNothing(Cost) ) { var fedBudg = person.GetFSSCostFB(Rsv2017CostInvalidDays, Rsv2017FBTotal); fedBudg.CountPerson = 1; // Для федерального бюджета собираем именно число получателей fedBudg.CountDays = Cost.CountDays; fedBudg.Total = Cost.Total; } // больничные // в том числе с выделением временно пребывающих // В 4-ФСС был признак что на тарифе не требуется выделение временно пребывающих (для тарифов со ставками ниже, чем по временно-пребывающим(1.8)) // В новой форме РСВ такого требования не найдено, поэтому пока тариф никак не учитывается // Коды новых тарифов, по которым ставка по ФСС ниже 1.8: 07 - 16 var arFedBudgSimv = GetArray( "Щ", // ЧАЭС "Ы", // "Маяк" "Ъ", // Семипалатинский полигон "Ь", // радиация "У", // зачет нестраховых периодов в стаж "" // итого по всем основаниям ); RSV2017FSSCostWithExtCombine(person,"9",Rsv2017CostSimple,Rsv2017CostSimplePartTime, Rsv2017CostSimpleTemp,Rsv2017CostSimpleTempPartTime,true, arFedBudgSimv); // по беременности и родам // (по ним выделять временно пребывающих не надо) arFedBudgSimv = GetArray( "", // ЧАЭС "", // "Маяк" "", // Семипалатинский полигон "", // радиация "Ч",// зачет нестраховых периодов в стаж "" // итого по всем основаниям ); RSV2017FSSCostWithExtCombine(person,"2",Rsv2017CostPregnancy,Rsv2017CostPregnancyPartTime, -1,-1,false,arFedBudgSimv); // пособия до 1.5 лет. RSV2017FSSCost15(person); // Информация далее заполняется с учетом возможной разбивки одного работника // по разным организациям (ОКТМО). Поэтому далее в качестве ограничительных дат используются // CurDBegOKTMO,CurDEndOKTMO // Цикл по кодам тарифа организации var EnterpriseTariffPeriods; var idOrgForTarif = idOrg; if ( (Rsv2017MultiTarif & 0x10)!=0 ) // тариф определяется подразделением в котором находится ЛС { int idOrgLS = GetOrgForPodr(Poln_Tn/sizetn); if ( idOrgForTarif!=idOrgLS ) idOrgForTarif=idOrgLS; } EnterpriseSettingsToPeriods(idOrgForTarif,"ТАРИФФНС",CurDBegOKTMO.GetStr(),CurDEndOKTMO.GetStr(),1,EnterpriseTariffPeriods); // ╥ръюх с√трхЄ хёыш эхЄ эрёЄЁющъш "ъюф юёэютэюую ЄрЁшЇр ╘═╤" (эряЁшьхЁ эр Ёрсюўхь ьхёЄх тэхфЁхэЎр) if ( EnterpriseTariffPeriods.Count()<1 ) EnterpriseTariffPeriods.Update(CurDBegOKTMO.GetStr(),CurDEndOKTMO.GetStr(),"01"); SubstituteTarif2x(idOrgForTarif, EnterpriseTariffPeriods); var periods20 = EnterpriseTariffPeriods.GetPeriods("20"); // ╤ 2019 уюфр яЁютхЁ хь эрышўшх эхяЁртшы№э√ї ъюфют ЄрЁшЇр. // ┼ёыш эрїюфшь "чряЁх∙хээ√щ" т уюфє ЄрЁшЇ, Єю: // - яюфьхэ хь эр юёэютэющ // - т√фрхь яЁхфєяЁхцфхэшх, хёыш х∙х эх т√фртрыш if ( isRsv2020 ) { var arrForbiddenTarifs = GetArray("02","03","04","05"); SubstituteForbiddenCodTarif(2020,arrForbiddenTarifs,EnterpriseTariffPeriods,wasMsgAboutChangeCodTarifa); } if ( isRsv2019 ) { var arrForbiddenTarifs = GetArray("08","09","12"); SubstituteForbiddenCodTarif(2019,arrForbiddenTarifs,EnterpriseTariffPeriods,wasMsgAboutChangeCodTarifa); } // Если в основном тарифе уже указан АСБ, то все работники относятся к АСБ 100% bool bOsnTarifASB = EnterpriseTariffPeriods.CountPeriodsCod("09")!=0; // Признак что работник относится к АСБ bool bHaveASB = Rsv2017CategoriesPF.CountPeriodsCod("АСБ")!=0 || Rsv2017CategoriesPF.CountPeriodsCod("ВЖСБ")!=0 || Rsv2017CategoriesPF.CountPeriodsCod("ВПСБ")!=0; // Необходимость выделять АСБ bool bNeedASB = (Rsv2017MultiTarif & 0x08)!=0; // Необходимость выделять отдельно суммы по группе налогов "ЕНВД" bool bNeedEnvd = (Rsv2017MultiTarif & 0x02)!=0; // Есть разделение налогов и надо брать их сумму bool bNeedMergeTax = !bNeedASB && !bNeedEnvd && (Rsv2017MultiTarif & 0x01)!=0; // "инверсия налогов" bool bInverseTax = (Rsv2017MultiTarif & 0x04)!=0; // Разбираемся с возможным действием нескольких тарифов в один и тот же период времени ОСНО+ЕНВД(01+03), УСН+ЕНВД(02+03), // +АСБ (х+09) if ( bNeedEnvd && !EnterpriseTariffPeriods.CountPeriodsCod("03") ) EnterpriseTariffPeriods.Update(CurDBegOKTMO.GetStr(),CurDEndOKTMO.GetStr(),"03"); // Если сказано, что в организации есть АСБ, и основной тариф не АСБ - добавляем код АСБ в тарифы // Можно было бы и по наличию категории АСБ добавлять, но пролблема в том что категория АСБ еще может быть // у тарифов 10 и 11. if ( (bNeedASB /*|| bHaveASB*/) && !bOsnTarifASB && !bNeedMergeTax ) { EnterpriseTariffPeriods.Update(CurDBegOKTMO.GetStr(),CurDEndOKTMO.GetStr(),"09"); /* не переопределяем флаг по наличию категории, т.к. АСБ не только у 09 if ( !bNeedASB ) // забыли указать в настройках? Вся организация 100% на АСБ, но забыли указать в справке о предприятии? { bNeedASB = bHaveASB; // суммы по договорам ГПХ в этом случае не были "разделены", поэтому перевычисляем их Rsv2017CalculateDogovorSum(true); } */ } // признак, что в организации две группы страховых (ОСНО и ЕНВД) bool bMultiTax = bNeedEnvd || bNeedASB || bNeedMergeTax; int cntTarifs = 0; // счетчик расмотренных тарифов EnterpriseTariffPeriods.SetBegin(); for ( ; !EnterpriseTariffPeriods.End(); EnterpriseTariffPeriods.Next() ) { var Periods = EnterpriseTariffPeriods.GetCurPer(); Periods.Cut(CurDBegOKTMO.GetStr(),CurDEndOKTMO.GetStr()); Periods.OnlyOneCodPerMonth(1); if ( !Periods.Count() ) continue; ++cntTarifs; string strTarif = EnterpriseTariffPeriods.GetCurCod(); if ( !Str_Cmp(strTarif," "," ") ) strTarif = "01"; int iTarif = atoi(strTarif); bool idxAlgTax = bInverseTax?1:0; bool bENVD = false; // спец.режимы ЕНВД и АСБ if ( iTarif == 3 || iTarif == 9 ) { // Если код тарифа "ЕНВД" или "АСБ", то индекс переопределяем на ЕНВДшный, только в том случае, если // требуется выделять ЕНВД или АСБ... в противном случае считается, что суммы проходят по основным видам, без дополнительных // видов страховых if ( (iTarif == 3 && bNeedEnvd) || (iTarif == 9 && bNeedASB) ) { idxAlgTax = bInverseTax?0:1; bENVD = true; } } var Tarif = person.GetTarif(strTarif); int cntPeriodsTarif = 0; for ( Periods.SetBegin(); !Periods.End(); Periods.Next() ) { ++cntPeriodsTarif; // яЁшчэръ Єюую ўЄю є эрё хёЄ№ 20 ЄрЁшЇ (ётхЁї ╠╨╬╥) bool isTarif20Exist = !periods20.IsPeriodFree(Periods.GetCurBeg().GetStr(),Periods.GetCurEnd().GetStr()); // ╩ръ т√сшЁрЄ№ шэЇюЁьрЎш■: 0 - юс√ўэ√ь ёяюёюсюь (юс∙шщ шЄюу), 1 - яю яхЁтющ ЄрсышЎх, 2 - ётхЁї ╠╨╬╥ (яю тЄюЁющ ЄрсышЎх) int TypeSelectTax = iTarif==20?2:0; if ( isTarif20Exist && iTarif!=20 ) TypeSelectTax=1; int WhatTax = bNeedMergeTax?0:(bENVD?2:1); // ъръющ эрыюу: 0 - ёєььрЁэю ╬╤═╬+┼═┬─, 1 - ╬╤═╬, 2-┼═┬─ // ╠хфёЄЁрї FillTaxBlock(Tarif.OMS,Periods.GetCurBeg(),Periods.GetCurEnd(),arAlgTax[idxAlgTax][RSV2017idxOMS],person,1,TypeSelectTax); // чэръ ё ъюЄюЁ√ь эрфю юсЁрсрЄ√трЄ№ тЄюЁющ эрыюу хёыш хёЄ№ фтх уЁєяя√ эрыюуют (╬╤═╬ ш ┼═┬─) int SgnMultiTax = DefineSgnMultiTax(bMultiTax,Rsv2017OMSEnvd,WhatTax); if ( SgnMultiTax ) // хёыш эрфю єўхёЄ№ тЄюЁє■ уЁєяяє эрыюуют FillTaxBlock(Tarif.OMS,Periods.GetCurBeg(),Periods.GetCurEnd(),arAlgTax[idxAlgTax?0:1][RSV2017idxOMS],person,SgnMultiTax,TypeSelectTax); // ╤юЎ.ёЄЁрї (т√сшЁрхь юфшэ Ёрч Єръ ъръ юэ эх ЄЁхсєхЄ Ёрчсшхэш  яю ЄрЁшЇрь), шёъы■ўхэшх ╨╤┬2020 ш яючфэхх if ( cntTarifs==1 || isRsv2020 ) { var dbegFSS = CurDBegOKTMO; var dendFSS = CurDEndOKTMO; // ╥.ъ. т√сшЁрхь хфшэюцф√... Єю т√сшЁрхь чр тхё№ яхЁшюф ёЁрчє... р эх ъръ ╘╬╠╤ ш ╧╘ чр яхЁшюф фхщёЄтш  ЄрЁшЇр if ( isRsv2020 ) { dbegFSS = Periods.GetCurBeg(); dendFSS = Periods.GetCurEnd(); } FillTaxBlock(Tarif.FSS,dbegFSS,dendFSS,arAlgTax[idxAlgTax][RSV2017idxFSS],person,1,TypeSelectTax); SgnMultiTax = DefineSgnMultiTax(bMultiTax,Rsv2017OSSEnvd,0); // эрь эєцхэ ╘╤╤ ёєььрЁэ√щ, яю¤Єюьє яюёыхфэшщ ярЁрьхЄЁ 0 if ( SgnMultiTax ) // хёыш эрфю єўхёЄ№ тЄюЁє■ уЁєяяє эрыюуют FillTaxBlock(Tarif.FSS,dbegFSS,dendFSS,arAlgTax[idxAlgTax?0:1][RSV2017idxFSS],person,SgnMultiTax,TypeSelectTax); // ╨рё°шЇЁютър срч√ яю ╘╤╤ bool bCheckedDetails = false; if ( !isRsv2020 ) { // var strTarifs = GetArray("09","07","12"); var strTarifs = GetArray("09","07","12"); var strCodCat = GetArray("АСБ","ЧЭС","ПНЭД"); var idxDetails = GetArray(Rsv2017Pharmacy,Rsv2017TeamOfShips,Rsv2017SpecialOKVED); for ( int idxD = 0; idxD<=GetUBound(strTarifs); ++idxD ) { // Если указан код тарифа который нужен для этой категории а его нет, то не заполняем if ( Str_Cmp(strTarifs[idxD]," "," ") && EnterpriseTariffPeriods.CountPeriodsCod(strTarifs[idxD])<1 ) continue; var PeriodsCat = Rsv2017CategoriesPF.GetPeriods(strCodCat[idxD]); if ( PeriodsCat.Count()>0 && GetDetailsFSS(Tarif.FSS,PeriodsCat,idxDetails[idxD],CurDBegOKTMO,CurDEndOKTMO,SgnMultiTax,TypeSelectTax)!=-1 ) bCheckedDetails = true; } } if ( !bCheckedDetails ) // проверим еще временно пребывающих (их не надо проверять, если сработала детализация по { // другим типам льгот, т.к. те льготы более выгодные // Получаем список кодов статуса2, считающихся "временно пребывающими" для ФСС var Arr; int cntVPStatus=ListNUToSafeArray(_VPStatusFSS,' ',Arr); for ( int i=0; i0.001 ) { if ( idxm 384; if (!IsForm2020)// фы  ьхё Ўхт эрўшэр  ё 01.2020 ёўшЄрхь DeductibleExpenses ш эх тъы■ўрхь шї т Discount !!! { Discount+= DeductibleExpenses; DeductibleExpenses=0.; } if ( Rsv2017IncludeNotInsured ) Discount += atof(res2("2200",W,A)); else { Discount += atof(res2("9900",W,A)); // фы  эхчрёЄЁрїютрээ√ї тючьюцэю яю тыхэшх эхюсырурхь√ї ёєьь, яю¤Єюьє хёыш фрцх "яюЄхэЎшры№эю" эхчрёЄЁрїютрэ // ш эх тчтхфхэр эрёЄЁющър "═┼ юсэєы Є№ эхюсырурхь√х ёєьь" фы  эхчрёЄЁрїютрээ√ї, Єю юсэєы хь.. if ( nabs(Discount+DeductibleExpenses)>0.001 && Rsv2017InsuredAndSum!=3 ) { // ┼ёыш эх  ты хЄё  яюЄхэЎшры№эю чрёЄЁрїютрээ√ь Єю ёЁрчє юсэєы хь // ┼ёыш цх тхЁэєыш Їыру, ўЄю "яюЄхэЎшры№эю чрёЄЁрїютрэ", Єю т ёыєўрх // ъюуфр ь√ ЁрёёьрЄЁштрхь яхЁшюф сюы№°х юфэюую ьхё Ўр, яЁшфхЄё  // фюяюыэшЄхы№эю яЁюсхцрЄ№ё  яю ьхё Ўрь яхЁшюфр ш яЁютхЁшЄ№ Їыру яюьхё ўэю // ш юёЄртшЄ№ Єюы№ъю ёєьь√ юЄэюё ∙шхё  ъ яюЄхэЎшры№эю чрёЄЁрїютрээ√ь ьхё Ўрь if ( !IsPotentialyInsured(omb,ome,TypeTax) ) { Discount = 0.; DeductibleExpenses=0.; } else if ( omb!=ome ) { for ( int om = omb; om<=ome; ++om ) { // т яхЁшюфх эр°ыш ьхё Ў ъюуфр эх с√ы фрцх яюЄхэЎшры№эю чрёЄЁрїютрэ // (фюуютюЁэшъ шыш рЄЄхёЄютрээ√щ ш Є.я.) // ёєьь√ фы  ¤Єюую ьхё Ўр єсшЁрхь шч эхюсырурхь√ї if ( !IsPotentialyInsured(om,om,TypeTax) ) { TaxValueMonthChanged = true; // ┬рцэю!!! ╟фхё№ яюьхэ ыш яхЁшюф чр ъюЄюЁ√щ чряюыэхэр шэЇюьрЎш  т // TaxValue.... double MonthDiscount = R_TaxSc2Ex(71,om,om,TypeTax,W,A); double MonthDeductibleExpenses = atof(res2("2100",W,A)); if (IsForm2020) DeductibleExpenses-=MonthDeductibleExpenses; else MonthDiscount += MonthDeductibleExpenses; MonthDiscount += atof(res2("9900",W,A)); Discount -= MonthDiscount; } } } } } } // !!!─ры№°х эхы№ч  яюы№чютрЄ№ё  TaxValue(╒╒) яюЄюьє ўЄю Ўшъы яю ьхё Ўрь // ъюуфр ъюЁЁхъЄшЁютрыш ёєььє т√ўхЄют // ьюу шчьхэшЄ№ ьхё Ў фы  ъюЄюЁюую шэшЎшрышчшЁютрэр шэЇюЁьрЎш !!! // ┼ёыш тёх Ёртэю эрфю, Єю ЁрёъюььхэЄшЁютрЄ№ єёыютшх if ( 0 /*TaxValueMonthChanged*/ ) { R_TaxSc2Ex(7,omb,ome,TypeTax,W,A); } } FillTaxBlock(&TaxBlock,&DB,&DE,TypeTax,&person,SgnTax,TypeSelectTax) // ╟р яхЁшюф [DB,DE] чряюыэ хЄё  шэЇюЁьрЎш  яю эрыюує TypeTax // т ЁрчЁхчх ├юф - эр эрўрыю ътрЁЄрыр - ътрЁЄры - ьхё Ў√ ътрЁЄрыр // ┴рчр т яЁхфхырї ышьшЄр, // ┴рчр ётхЁї.ышьшЄр // эхюсырурхьр  ёєььр // ╧юыэ√щ фюїюф // тчэюё√ т яЁхфхырї ышьшЄр // тчэюё√ ётхЁї.ышьшЄр // яЁшчэръ, ўЄю ўхыютхъ чрёЄЁрїютрэ // яЁшчэръ, ўЄю ёЄЁрїют√х тчэюё√ хёЄ№ // !ёхщўрё хёЄ№ "эхЄюўэюёЄ№" хёыш хёЄ№ // юЄЁшЎрЄхы№э√х яхЁхёўхЄэ√х ёєьь√ эрыюур Ёртэ√х яюыюцшЄхы№э√ь чр яхЁшюф // ╥ю хёЄ№ т юЄфхы№э√ї ьхё Ўрї ёєььр эхэєыхтр , р т Ўхыюь чр яхЁшюф - эєыхтр . // ╧Ёшчэръ т ¤Єюь ёыєўрх т√ёЄртшЄ№ё  ўЄю "ёЄЁрїют√ї эхЄ". // !!! ┬рцэр  юёюсхээюёЄ№ чряюыэхэш : // ╘єэъЎш  ╧╬─╤╙╠╠╚╨╙┼╥ ёю чэръюь SgnTax шэЇюЁьрЎш■ ъ єцх шьх■∙шхщё  т TaxBlock // ёт чрэю ¤Єю ё Єхь, ўЄю ўшёЄю ЄхюЁхЄшўхёъш юфшэ ш ЄюЄ цх ъюф ЄрЁшЇр ьюцхЄ с√Є№ эхёъюы№ъю Ёрч // т яЁюьхцєЄъх фю юЄўхЄэюую ътрЁЄрыр ш эр ърцф√щ яхЁшюф фхщёЄтш  ¤Єюую ъюфр ЄрЁшЇр т√ч√трхЄё  // фрээр  ЇєэъЎш  // ─ы  ьхё Ўхт ътрЁЄрыр яюфёєььшЁютрэшх ёт чрэю ё тючьюцэюёЄ№■ Єюую, ўЄю ьюцхЄ с√Є№ Ёрчфхыхэшх // юфэюЄшяэюую эрыюур эр фтх ўрёЄш (╬╤═╬ ш ┼═┬─ шыш ┼═┬─ ш ╙╤═) эю яЁш ¤Єюь юЁурэшчрЎш  эх їюўхЄ яюърч√трЄ№ хую юЄфхы№эю // { // ╫Єюс√ яюэшьрЄ№ ъюуфр эрўшэр■Єё  ьхё Ў√ юЄўхЄэюую ътрЁЄрыр var FirstMonth = KDateFromInt(GetFirstMonthQuarterAbs(Rsv2017DEnd)); int FirstMonthRel = FirstMonth.GetRel(); // int FirstMonthAbs = FirstMonth.GetAbs(); int omb = DB.GetRel(), ome = DE.GetRel(); // ┼ёыш ўхыютхъ ёютёхь-ёютёхь эх чрёЄЁрїютрэ, Єю эшўхую яю эхьє эх ёюсшЁрхь // (т яЁюЄштэюь ёыєўрх хую ёєьь√ яюярфєЄ ъръ "эхюсырурхь√х" if ( !Rsv2017InsuredAndSum && !IsPotentialyInsured(omb,ome,TypeTax) && !Rsv2017IncludeNotInsured ) return 0; double TaxL = 0., TaxU = 0., BaseL = 0., BaseU = 0., Discount = 0., DeductibleExpenses=0.; char Buf[256]; double Epsilon = 0.0000001; // -- ═р эрўрыю ътрЁЄрыр (т√яюыэ хЄё  ╧╬─╤╙╠╠╚╨╬┬└═╚┼!!!) int m = FirstMonthRel-1; if ( ombEpsilon?1:0; TaxBlock.TaxedExceedLimit.BeforeQuarter = nabs(TaxBlock.BaseExceedLimit.BeforeQuarter)>Epsilon?1:0; int Insured = (TaxBlock.Insured.BeforeQuarter || IsInsured(omb,m,TypeTax))?1:0; if ( !Insured ) { if ( Rsv2017InsuredAndSum==1 ) Insured = TaxBlock.Taxed.BeforeQuarter; else if ( Rsv2017InsuredAndSum==2 ) Insured = nabs(TaxBlock.IncomeFull.BeforeQuarter)>0.001?1:0; } TaxBlock.Insured. BeforeQuarter = Insured; } // -- ╧хЁт√щ ьхё Ў ътрЁЄрыр m = FirstMonthRel; if ( m>=omb && m<=ome ) { GetSumForTaxBlock(m,m,TypeTax,TypeSelectTax,TaxBlock.IsBaseSplitted,BaseL,BaseU,Discount,DeductibleExpenses,TaxL,TaxU); TaxBlock.BaseBelowLimit. FirstMonth += SgnTax*BaseL; TaxBlock.BaseExceedLimit. FirstMonth += SgnTax*BaseU; TaxBlock.Discount. FirstMonth += SgnTax*Discount; TaxBlock.DeductibleExpenses.FirstMonth += SgnTax*DeductibleExpenses; TaxBlock.TaxBelowLimit. FirstMonth += SgnTax*TaxL; TaxBlock.TaxExceedLimit. FirstMonth += SgnTax*TaxU; TaxBlock.Taxed. FirstMonth = nabs(TaxBlock.TaxFull.FirstMonth)>Epsilon?1:0; TaxBlock.TaxedExceedLimit.FirstMonth = nabs(TaxBlock.BaseExceedLimit.FirstMonth)>Epsilon?1:0; int Insured = (TaxBlock.Insured.FirstMonth || IsInsured(m,m,TypeTax))?1:0; if ( !Insured ) { if ( Rsv2017InsuredAndSum==1 ) Insured = TaxBlock.Taxed.FirstMonth; else if ( Rsv2017InsuredAndSum==2 ) Insured = nabs(TaxBlock.IncomeFull.FirstMonth)>0.001?1:0; } TaxBlock.Insured. FirstMonth = Insured; } // -- ┬ЄюЁющ ьхё Ў ътрЁЄрыр m = FirstMonthRel+1; if ( m>=omb && m<=ome ) { GetSumForTaxBlock(m,m,TypeTax,TypeSelectTax,TaxBlock.IsBaseSplitted,BaseL,BaseU,Discount,DeductibleExpenses,TaxL,TaxU); TaxBlock.BaseBelowLimit. SecondMonth += SgnTax*BaseL; TaxBlock.BaseExceedLimit. SecondMonth += SgnTax*BaseU; TaxBlock.Discount. SecondMonth += SgnTax*Discount; TaxBlock.DeductibleExpenses.SecondMonth += SgnTax*DeductibleExpenses; TaxBlock.TaxBelowLimit. SecondMonth += SgnTax*TaxL; TaxBlock.TaxExceedLimit. SecondMonth += SgnTax*TaxU; TaxBlock.Taxed. SecondMonth = nabs(TaxBlock.TaxFull.SecondMonth)>Epsilon?1:0; TaxBlock.TaxedExceedLimit.SecondMonth = nabs(TaxBlock.BaseExceedLimit.SecondMonth)>Epsilon?1:0; int Insured = (TaxBlock.Insured.SecondMonth || IsInsured(m,m,TypeTax))?1:0; if ( !Insured ) { if ( Rsv2017InsuredAndSum==1 ) Insured = TaxBlock.Taxed.SecondMonth; else if ( Rsv2017InsuredAndSum==2 ) Insured = nabs(TaxBlock.IncomeFull.SecondMonth)>0.001?1:0; } TaxBlock.Insured. SecondMonth = Insured; } // -- ╥ЁхЄшщ ьхё Ў ътрЁЄрыр m = FirstMonthRel+2; if ( m>=omb && m<=ome ) { GetSumForTaxBlock(m,m,TypeTax,TypeSelectTax,TaxBlock.IsBaseSplitted,BaseL,BaseU,Discount,DeductibleExpenses,TaxL,TaxU); TaxBlock.BaseBelowLimit. ThirdMonth += SgnTax*BaseL; TaxBlock.BaseExceedLimit. ThirdMonth += SgnTax*BaseU; TaxBlock.Discount. ThirdMonth += SgnTax*Discount; TaxBlock.DeductibleExpenses.ThirdMonth += SgnTax*DeductibleExpenses; TaxBlock.TaxBelowLimit. ThirdMonth += SgnTax*TaxL; TaxBlock.TaxExceedLimit. ThirdMonth += SgnTax*TaxU; TaxBlock.Taxed. ThirdMonth = nabs(TaxBlock.TaxFull.ThirdMonth)>Epsilon?1:0; TaxBlock.TaxedExceedLimit.ThirdMonth = nabs(TaxBlock.BaseExceedLimit.ThirdMonth)>Epsilon?1:0; int Insured = (TaxBlock.Insured.ThirdMonth || IsInsured(m,m,TypeTax))?1:0; if ( !Insured ) { if ( Rsv2017InsuredAndSum==1 ) Insured = TaxBlock.Taxed.ThirdMonth; else if ( Rsv2017InsuredAndSum==2 ) Insured = nabs(TaxBlock.IncomeFull.ThirdMonth)>0.001?1:0; } TaxBlock.Insured. ThirdMonth = Insured; } // хёыш чрёЄЁрїютрэ т Єхўхэшш уюфр шыш хёЄ№ ёЄЁрїют√х - тъы■ўрхь т юЄўхЄ if ( TaxBlock.Taxed.Year || TaxBlock.Insured.Year || nabs(TaxBlock.IncomeFull.Year)>0.0001 ) person.FlagAccept = 1; } GetDetailsFSS(&FSS,&PeriodsCat,typeDetails,DBeg,DEnd,SgnMultiTax,TypeSelectTax) // Получение базы для детализации базы по ФСС. // В функции выполняется подсуммирование информации { PeriodsCat.Cut(DBeg.GetStr(),DEnd.GetStr()); PeriodsCat.OnlyOneCodPerMonth(1); if ( !PeriodsCat.Count() ) return -1; for ( PeriodsCat.SetBegin(); !PeriodsCat.End(); PeriodsCat.Next() ) { int oCatMonthBeg = PeriodsCat.GetCurBeg().GetRel(); int oCatMonthEnd = PeriodsCat.GetCurEnd().GetRel(); // Если период действия категории не пересекается с периодом действия рассматриваемого тарифа - переходим к следующему периоду категории // Делать это дополнительно не надо, т.к. выше PeriodsCat.Cut(...) оставил только периоды попадающие в нужный диапазон. // if ( oCatMonthEndDEnd.GetRel() ) continue; // Сначала самое простое - помесячные суммы за квартал // Простое, т.к. всю собранную базу за месяц относим на определенный тип "детализации". // Возможно потребует доработки в будущем, если будут заказчики где в рамках одного работника // совмещаются доходы по АСБ и "не АСБ" см. bGlobalPureASB int oFirstMonth = GetFirstMonthQuarterAbs(Rsv2017DEnd)-mtek; int oThirdMonth = oFirstMonth + 2; var FSSDetails = FSS.GetDetails(typeDetails); // Для временно пребывающих для приложения 9 надо еще сохранить полную сумму выплат var FSSDetailsFull; bool bNeedFullSum = false; if ( typeDetails==Rsv2017TempStay ) { FSSDetailsFull = FSS.GetDetails(Rsv2017TempStayFull); bNeedFullSum = true; } for ( int om = oFirstMonth; om<=oThirdMonth; ++om ) { // нас интересуют только месяцы относящиеся к рассматриваемой категории if ( om>= oCatMonthBeg && om<=oCatMonthEnd ) if ( om==oFirstMonth ) { FSSDetails.FirstMonth += FSS.BaseBelowLimit.FirstMonth; if ( bNeedFullSum ) FSSDetailsFull.FirstMonth += FSS.IncomeFull.FirstMonth; } else if ( om==oFirstMonth+1 ) { FSSDetails.SecondMonth += FSS.BaseBelowLimit.SecondMonth; if ( bNeedFullSum ) FSSDetailsFull.SecondMonth += FSS.IncomeFull.SecondMonth; } else if ( om==oFirstMonth+2 ) { FSSDetails.ThirdMonth += FSS.BaseBelowLimit.ThirdMonth; if ( bNeedFullSum ) FSSDetailsFull.ThirdMonth += FSS.IncomeFull.ThirdMonth; } } // Если период данной категории есть и до начала квартала, то мы не можем взять просто BeforeQuarter, // надо взять базу только за те месяцы, когда действовал данная категория if ( oCatMonthBeg=DEnd.GetRel() ) { FSSDetails.BeforeQuarter += FSS.BaseBelowLimit.BeforeQuarter; if ( bNeedFullSum ) FSSDetailsFull.BeforeQuarter += FSS.IncomeFull.BeforeQuarter; } else // иначе придется сделать самостоятельную выборку базы { double TaxL = 0., TaxU = 0., BaseL = 0., BaseU = 0., Discount = 0., DeductibleExpenses=0.; int mend = MIN(oCatMonthEnd,oFirstMonth-1); GetSumForTaxBlock(oCatMonthBeg,mend,"Ц",TypeSelectTax,true,BaseL,BaseU,Discount,DeductibleExpenses,TaxL,TaxU); FSSDetails.BeforeQuarter += BaseL; if ( bNeedFullSum ) FSSDetailsFull.BeforeQuarter += BaseL+BaseU+Discount+DeductibleExpenses; // если с выделением ЕНВД на независимом виде, то досуммируем еще ЕНВД if ( SgnMultiTax>0 ) { GetSumForTaxBlock(oCatMonthBeg,mend,"258",TypeSelectTax,true,BaseL,BaseU,Discount,DeductibleExpenses,TaxL,TaxU); FSSDetails.BeforeQuarter += BaseL; if ( bNeedFullSum ) FSSDetailsFull.BeforeQuarter += BaseL+BaseU+Discount+DeductibleExpenses; } } } } return 0; } GetIDDepartRSV2017(__Rcr) { // if ( bRsv2017Update ) return Rsv2017Person.IdDepart; var kcp = CreateObject("KPeriodsIterations"); // Если находимся в режиме приема - берем из структуры if ( kcp.Size() && !kcp.End() ) return atoi(kcp.GetCurCod()); // если находимся в режиме обновления строки var Tbl = CreateObject("CurPrnTbl"); if ( __Rcr>=0 && __Rcr=2020 ) isRsv2020=true; if ( Rsv2017DBeg.GetYear()>=2019 ) isRsv2019=true; } StrToPerson(Str) { return TrimN(OemToAnsi(Str)); } /* тест var Tbl = CreateObject("CurPrnTbl"); Tbl.InitialNameFile("E:\\!!!RSV2017Zpl\\ZPL\\TABREFER\\2017_01\\Tabl5.Sum"); // return Tbl.GetKeyValueCollections(true).IsKeyExist("Org_1/Pers_1"); var mainMgr = CreateMainManagerRsv2017(Tbl); var Person = mainMgr.GetManager("1").GetPersonData(2); // return ("Вениамин"); // Oem return Person.Surname+" "+Person.Name+" "+Person.Patronymic; */ /* Тест получения KDatePeriods из поля КЧ var Periods; SettingsToPeriods("CalcMROT","блист","01.01.2010","31.12.2017",0,Periods); EnterpriseSettingsToPeriods(1,"ТАРИФФНС","01.01.2010","31.12.2017",0,Periods); KchToPeriods("status2","01.01.2010","31.12.2017",0,Periods); Periods.SetBegin(); string str=Periods.GetCurBeg().GetStr()+"-"+Periods.GetCurEnd().GetStr()+" "+Periods.GetCurCod(); while ( Periods.Next() ) { str = str+" === "; str+=Periods.GetCurBeg().GetStr()+"-"+Periods.GetCurEnd().GetStr()+" "+Periods.GetCurCod(); } return str; var PerG; SettingsToPeriods("CalcMROT","блист","01.01.2010","31.12.2017",0,Periods); EnterpriseSettingsToPeriods(1,"ТАРИФФНС","01.01.2010","31.12.2017",1,PerG); KchToPeriods("status2","01.01.2010","31.12.2017",1,PerG); PerG.SetBeginCod("4"); string strG = ""; while ( !PerG.End() ) { string str=PerG.GetCurCod() + " *** "; var Periods = PerG.GetCurPer(); Periods.SetBegin(); str += Periods.GetCurBeg().GetStr()+"-"+Periods.GetCurEnd().GetStr()+" "+Periods.GetCurCod(); while ( Periods.Next() ) { str = str+" === "; str+=Periods.GetCurBeg().GetStr()+"-"+Periods.GetCurEnd().GetStr()+" "+Periods.GetCurCod(); } str += "///"; strG+=str; PerG.Next(); } return strG; */ RSV2017FSSCostSimple(&person,Simv,TypeCost) // Простые случаи расходов ФСС (без выделения фед.бюджета, совместительств и т.п.) { // единовременное пособие при рождении ребенка char Buf[256]; Buf=Simv; string value = ReadFssLine(Buf[0]); var lst = CreateObject("ParamFuncRW"); lst.IInitial1(value,",",99); int cnt = atoi(lst.Get(0))+atoi(lst.Get(3)); // количество случаев int days = atoi(lst.Get(1))+atoi(lst.Get(4)); // дни double sum = atof(lst.Get(2))+atof(lst.Get(5)); // сумма var Cost = GetNothing(); if ( cnt || days || nabs(sum)>0.00001 ) { // есть расходы ФСС - уже включаем в таблицу person.FlagAccept = 1; Cost = person.GetFSSCost(TypeCost); // Для случаев выплат по уходу за детьми-инвалидов, количество случаев выставляем равным 1 // (так делалось в 4-ФСС) Cost.CountPerson = (cnt && TypeCost==Rsv2017CostInvalidDays)?1:cnt; Cost.CountDays = days; if ( Cost.DaysAreCases ) { Cost.CountDays = cnt; Cost.CountPerson = 1; } Cost.Total = sum; } return Cost; } RSV2017FSSCostWithExtCombine(&person,Simv,TypeCost,TypeCostExt, TypeCostVP,TypeCostVPExt,ExtractVP,&arSimvFB) // Cлучаи расходов ФСС с совместительством { // Если по настройке мы должны количество случаев и РВ брать из реестра, то берем из реестра int idxOverrideInfo = -1; if ( Rsv2017TypeRvBl ) idxOverrideInfo = TypeCost==Rsv2017CostPregnancy?1:0; int idxsovm = 0; int idxvp = 0; char Buf[256]; Buf=Simv; string value = ReadFssLine(Buf[0]); var lst = CreateObject("ParamFuncRW"); lst.IInitial1(value,",",99); // "+" - это суммирование ОСНО и ЕНВД int cnt = atoi(lst.Get(0))+atoi(lst.Get(3)); // количество случаев int days = atoi(lst.Get(1))+atoi(lst.Get(4)); // дни double sum = atof(lst.Get(2))+atof(lst.Get(5)); // сумма // Если надо переопределить значения случаев и дней - переопределяем if ( idxOverrideInfo!=-1 ) { idxsovm = 0; idxvp = 0; cnt = Rsv2017InfoAboutRvBLFromReestr[idxOverrideInfo][idxsovm][idxvp][0]; days = Rsv2017InfoAboutRvBLFromReestr[idxOverrideInfo][idxsovm][idxvp][1]; } var Cost = GetNothing(); if ( cnt || days || nabs(sum)>0.00001 ) { // есть расходы ФСС - уже включаем в таблицу person.FlagAccept = 1; Cost = person.GetFSSCost(TypeCost); Cost.CountPerson = cnt; Cost.CountDays = days; Cost.Total = sum; } // внешнее совместительство cnt = atoi(lst.Get(6))+atoi(lst.Get(9)); // количество случаев days = atoi(lst.Get(7))+atoi(lst.Get(10)); // дни sum = atof(lst.Get(8))+atof(lst.Get(11)); // сумма // Если надо переопределить значения случаев и дней - переопределяем if ( idxOverrideInfo!=-1 ) { idxsovm = 1; idxvp = 0; cnt = Rsv2017InfoAboutRvBLFromReestr[idxOverrideInfo][idxsovm][idxvp][0]; days = Rsv2017InfoAboutRvBLFromReestr[idxOverrideInfo][idxsovm][idxvp][1]; } var CostSovm = GetNothing(); if ( cnt || days || nabs(sum)>0.00001 ) { // есть расходы ФСС - уже включаем в таблицу person.FlagAccept = 1; CostSovm = person.GetFSSCost(TypeCostExt); CostSovm.CountPerson = cnt; CostSovm.CountDays = days; CostSovm.Total = sum; } // Если надо учитывать временно-пребывающих для основного места if ( TypeCostVP!=-1 ) { cnt = atoi(lst.Get(18)); // количество случаев days = atoi(lst.Get(19)); // дни sum = atof(lst.Get(20)); // сумма // Если надо переопределить значения случаев и дней - переопределяем if ( idxOverrideInfo!=-1 ) { idxsovm = 0; idxvp = 1; cnt = Rsv2017InfoAboutRvBLFromReestr[idxOverrideInfo][idxsovm][idxvp][0]; days = Rsv2017InfoAboutRvBLFromReestr[idxOverrideInfo][idxsovm][idxvp][1]; } if ( cnt || days || nabs(sum)>0.00001 ) { // есть расходы ФСС - уже включаем в таблицу person.FlagAccept = 1; if ( ExtractVP ) { var CostVP = person.GetFSSCost(TypeCostVP); CostVP.CountPerson = cnt; CostVP.CountDays = days; CostVP.Total = sum; } else { if ( IsNothing(Cost) ) Cost = person.GetFSSCost(TypeCost); Cost.CountPerson = cnt; Cost.CountDays = days; Cost.Total = sum; } } } // временно пребывающий внешний совместитель if ( TypeCostVPExt!=-1 ) { cnt = atoi(lst.Get(21)); // количество случаев days = atoi(lst.Get(22)); // дни sum = atof(lst.Get(23)); // сумма // Если надо переопределить значения случаев и дней - переопределяем if ( idxOverrideInfo!=-1 ) { idxsovm = 1; idxvp = 1; cnt = Rsv2017InfoAboutRvBLFromReestr[idxOverrideInfo][idxsovm][idxvp][0]; days = Rsv2017InfoAboutRvBLFromReestr[idxOverrideInfo][idxsovm][idxvp][1]; } if ( cnt || days || nabs(sum)>0.00001 ) { // есть расходы ФСС - уже включаем в таблицу person.FlagAccept = 1; if ( ExtractVP ) { var CostVPSovm = person.GetFSSCost(TypeCostVPExt); CostVPSovm.CountPerson = cnt; CostVPSovm.CountDays = days; CostVPSovm.Total = sum; } else { if ( IsNothing(CostSovm) ) CostSovm = person.GetFSSCost(TypeCostExt); CostSovm.CountPerson = cnt; CostSovm.CountDays = days; CostSovm.Total = sum; } } } RSV2017FSSCostFederalBudget(person,TypeCost,TypeCostExt,arSimvFB); return Cost; } RSV2017FSSCostFederalBudget(&person,TypeCost,TypeCostExt,&arSimvFB) // выборка сумм расходов по федеральному бюджету { int cntFedBudg = GetUBound(arRSV2017FedBudg)+1; var lst = CreateObject("ParamFuncRW"); char Buf[256]; for ( int ifb = 0; ifb0.00001 ) { // есть расходы ФСС - уже включаем в таблицу person.FlagAccept = 1; // Сумму по фед.бюджету не забываем суммировать к обычной // (только сумму! число пособий и дней не суммируем если они выбираются по реестру) var Cost = person.GetFSSCost(TypeCost); if ( !Rsv2017TypeRvBl ) { if ( !Cost.CountPerson ) Cost.CountPerson = 1; Cost.CountDays += days; } Cost.Total += sum; var fedBudg = person.GetFSSCostFB(TypeCost, arRSV2017FedBudg[ifb]); fedBudg.CountPerson = 1; // Для федерального бюджета собираем именно число получателей fedBudg.CountDays = days; fedBudg.Total = sum; } cnt = atoi(lst.Get(6))+atoi(lst.Get(9)); // случаев (не требуется для ФБ) days = atoi(lst.Get(7))+atoi(lst.Get(10)); // дней sum = atof(lst.Get(8))+atof(lst.Get(11)); // сумма if ( nabs(sum)>0.00001 ) { // есть расходы ФСС - уже включаем в таблицу person.FlagAccept = 1; // Сумму по фед.бюджету не забываем суммировать к обычной // (только сумму! число пособий и дней не суммируем если они выбираются по реестру) var CostSovm = person.GetFSSCost(TypeCostExt); if ( !Rsv2017TypeRvBl ) { if ( !CostSovm.CountPerson ) CostSovm.CountPerson = 1; CostSovm.CountDays += days; } CostSovm.Total += sum; var fedBudg = person.GetFSSCostFB(TypeCostExt, arRSV2017FedBudg[ifb]); fedBudg.CountPerson = 1; // Для федерального бюджета собираем именно число получателей fedBudg.CountDays = days; fedBudg.Total = sum; } } } RSV2017FSSCost15FederalBudget(&person,&cntFB1,&sumFB1,&cntFB2,&sumFB2) { cntFB1 = cntFB2 = 0; sumFB1 = sumFB2 = 0.; int cntFedBudg = GetUBound(arRSV2017FedBudg)+1; // Федеральный бюджет var arSimvFB = GetArray( "Э",// ЧАЭС "Ю",// "Маяк" "", // Семипалатинский полигон "Я",// радиация "", // зачет нестраховых периодов в стаж "" // итого по всем основаниям ); var lst = CreateObject("ParamFuncRW"); char Buf[256]; for ( int ifb = 0; ifb0.001 ) { bFirst = true; First_15 = person.GetFSSCostFB(Rsv2017CostMonthlyBaby1, arRSV2017FedBudg[ifb]); First_15.CountPerson = 1; First_15.CountDays = first_cnt; First_15.Total = first_sum; } var Second_15 = GetNothing();// 2-ой bool bSecond = false; if ( second_cnt || nabs(second_sum)>0.001 ) { bSecond = true; Second_15 = person.GetFSSCostFB(Rsv2017CostMonthlyBaby2, arRSV2017FedBudg[ifb]); Second_15.CountPerson = 1; Second_15.CountDays = second_cnt; Second_15.Total = second_sum; } // всего var Total_15 = GetNothing(); // всего if ( bFirst || bSecond ) { Total_15 = person.GetFSSCostFB(Rsv2017CostMonthlyBaby0, arRSV2017FedBudg[ifb]); // количество получателей все равно остается 1, т.к. работник это один получатель Total_15.CountPerson = 1; if ( bFirst ) { Total_15.CountDays += First_15.CountDays; Total_15.Total += First_15.Total; } if ( bSecond ) { Total_15.CountDays += Second_15.CountDays; Total_15.Total += Second_15.Total; } // есть расходы ФСС - уже включаем в таблицу if ( nabs(Total_15.Total)>0.001 || Total_15.CountDays>0 ) person.FlagAccept = 1; } } } RSV2017FSSCost15(&person); // Пособия до 1.5 лет { // Сначала соберем информацию по расходам из федерального бюджета. double first_sum = 0.; // сумма 1-ый double second_sum = 0.; // сумма 2-ой int first_cnt = 0; // количество 1-ый int second_cnt = 0; // количество 2-ой RSV2017FSSCost15FederalBudget(person,first_cnt,first_sum,second_cnt,second_sum); // после расходов финансируемых из фед.бюджета соберем информацию о расходах // финансируемых ФСС (суммиря с расходами из фед.бюджета) string value = ReadFssLine('3'); var lst = CreateObject("ParamFuncRW"); lst.IInitial1(value,",",99); // "Магические" индексы в Get взяты из 4-ФСС first_sum += atof(lst.Get(8)) + atof(lst.Get(11))+atof(lst.Get(20))+atof(lst.Get(23)); second_sum += atof(lst.Get(14))+ atof(lst.Get(17))+atof(lst.Get(26))+atof(lst.Get(29)); first_cnt += atoi(lst.Get(6)) + atoi(lst.Get(9)) +atoi(lst.Get(18))+atoi(lst.Get(21)); second_cnt += atoi(lst.Get(12))+ atoi(lst.Get(15))+atoi(lst.Get(24))+atoi(lst.Get(27)); var First_15 = GetNothing(); // 1-ый bool bFirst = false; if ( first_cnt || nabs(first_sum)>0.001 ) { bFirst = true; First_15 = person.GetFSSCost(Rsv2017CostMonthlyBaby1); First_15.CountPerson = 1; First_15.CountDays = first_cnt; First_15.Total = first_sum; } var Second_15 = GetNothing();// 2-ой bool bSecond = false; if ( second_cnt || nabs(second_sum)>0.001 ) { bSecond = true; Second_15 = person.GetFSSCost(Rsv2017CostMonthlyBaby2); Second_15.CountPerson = 1; Second_15.CountDays = second_cnt; Second_15.Total = second_sum; } // всего var Total_15 = GetNothing(); // всего if ( bFirst || bSecond ) { Total_15 = person.GetFSSCost(Rsv2017CostMonthlyBaby0); // количество получателей все равно остается 1, т.к. работник это один получатель Total_15.CountPerson = 1; if ( bFirst ) { Total_15.CountDays += First_15.CountDays; Total_15.Total += First_15.Total; } if ( bSecond ) { Total_15.CountDays += Second_15.CountDays; Total_15.Total += Second_15.Total; } // есть расходы ФСС - уже включаем в таблицу if ( nabs(Total_15.Total)>0.001 || Total_15.CountDays>0 ) person.FlagAccept = 1; } } var arRSV2017FedBudg = GetArray( Rsv2017FBChernobyl, // ЧАЭС Rsv2017FBMayak, // "Маяк" Rsv2017FBSemipalatinsk, // Семипалатинский полигон Rsv2017FBRadiation, // радиация Rsv2017FBExtraStag, // зачет нестраховых периодов в стаж Rsv2017FBTotal // Итого по всем основаниям ); // Информация о рассчитанных б/л из реестра больничных // первый индекс - тип больничных (обычный(0) и декретный(1)) // второй индекс - дополнительная разбивка: 0 - общее количество, 1 - из них по совместительству // третий индекс - дополнительная разбивка: 0 - не временно пербывающие, 1 - временно пребывающие (только для обычных больничных) // четвертый индекс - "что": 0 - число случаев, 1 - количество дней. double Rsv2017InfoAboutRvBLFromReestr[2][2][2][2]; // Способ вычисления РВ для таблиц расшифровки выплат по соцстраху // 0 - из строк видов начислений по месяцу начисления // 1 - как в реестре по БЛ (пока только для видов помеченых 9 и 2 в ст.2 ТВХ для сводов) int Rsv2017TypeRvBl = GetCommonCnfInt("TypeRvBl","fss4"); Rsv2017GetInfoAboutCostFromReestr(&DBeg,&DEnd) { if ( !Rsv2017TypeRvBl ) return; // учитывать в РВ и количестве случаев результаты перерасчета больничных или нет int bCheckRvRecalcBL=GetCommonCnfInt("RV_REC_BL","fss4"); for ( int x=0; x<2; ++x ) for ( int y=0; y<2; ++y ) for ( int z=0; z<2; ++z ) for ( int t=0; t<2; ++t ) Rsv2017InfoAboutRvBLFromReestr[x][y][z][t]=0; UnloadScriptModule("forms\\blreestr_1"); UnloadScriptModule("forms\\blreestr_2"); LoadScriptModule("forms\\blreestr_1"); LoadScriptModule("forms\\blreestr_2"); // Параметры нужные для работы реестра по б/л Type = 1; // способ выборки (по месяцу начисления) // if ( Type & 0x02 ) Type &= ~0x02; MBeg = DBeg.GetStr(); MEnd = DEnd.GetStr(); MonthBegPer = CreateObject("KMonth"); // период выборки MonthEndPer = CreateObject("KMonth"); MonthBegPer.SetDate(DBeg.GetStr()); MonthEndPer.SetDate(DEnd.GetStr()); PrintDopl = 2;// Доплата до среднего за счет организации - отдельно PrintVm = 3;// Печать вмененку VidReestr = 3;// Оплата за счет соц.страха и работодателя - отдельно char Func[256],Buf[512]; var January = CreateObject("KDate"); January.SetDateIII(1,1,DBeg.GetYear()); // Выборка больничных по месяцу начисления ограничивая глубину просмотра "не далее чем на 12 месяцев назад от января отчетного года" sprintf(Func,"СПИСОК_БЛ(%d,%s,%s,%d)",Type,DBeg.GetStr(),DEnd.GetStr(),January.GetAbs()-12); CallFuncReceive(Func,Buf,255,0); FreeSpaceString(Buf,3,""); if ( !Str_Cmp(Buf," "," .,;") ) { UnloadScriptModule("forms\\blreestr_1"); UnloadScriptModule("forms\\blreestr_2"); return; } // коды временно пребывающих статусов var Arr; int cntVPStatus=ListNUToSafeArray(_VPStatusFSS,' ',Arr); // чтобы откидывать дубликаты var CheckDoubleBL = CreateObject("MapString"); var m = CreateObject("KMonth"); var d = CreateObject("KDate"); var Razb = CreateObject("ParamFuncRW"); Razb.IInitial(to_string(Buf),",",1000); int cnt = Razb.Count(); // кол-во дат начала б/л (кол-во б/л для текущего ЛС) for ( int ii = 0; ii < cnt; ++ii ) { // Дата начала б/л string DatB = Razb.Get(ii); if ( !Str_Cmp(DatB," ",". ") ) continue; int VidBL = 0, // вид б/л TypR = 0, // вид РВ cntPer = 0, // кол-во периодов оплаты DnPred = 0, // кол-во дней за счет предприятия cntPerVm = 0, // для вмененки DnPredVm = 0; // кол-во дней за счет предприятия char DatReg[256]; bool bNRegim=false, bExistParentBL=false, bRecalcBL=false; double ORv = 0., OSum=0., OSumD = 0., PRv = 0., PSum=0., PSumD = 0.; // РВ и сумма по б/л double ORvVm = 0., OSumVm=0., OSumDVm = 0., PRvVm = 0., PSumVm=0., PSumDVm = 0.; // РВ и сумма по б/л (вмененка) string DatBBl = static_cast_to_string(DatB); string DatEBl = static_cast_to_string(GetInfoBL(DatB,"ДАТАК")); string DatChd = ""; double SSum = 0, SRv = 0, VSSum = 0, VSRv = 0; // Общий блок определющий параметры БЛ CommBlokGetParamBL(DatBBl,Type,VidBL,DatReg,bNRegim,TypR, bExistParentBL,bRecalcBL, DnPred,cntPer,DnPredVm,cntPerVm, ORv,OSum,OSumD,ORvVm,OSumVm,OSumDVm, PRv,PSum,PSumD,PRvVm,PSumVm,PSumDVm); int bPilotFSS = atoi(GetInfoBL(DatB,"ПИЛОТ"))!=0; // Нас не интересует то, что относится к травматизму и того, что еще не реализовано в расчетах if ( VidBL==TYPE_BL_TR || VidBL==TYPE_BL_PROF || VidBL==TYPE_BL_SAN_KUR || VidBL==TYPE_BL_UH15 || bPilotFSS ) continue; /* TYPE_BL_BOL = 0, ///< по болезни TYPE_BL_BER = 1, ///< по беременности и родам TYPE_BL_TR = 2, ///< производственная травма TYPE_BL_HTR = 3, ///< бытовая травма TYPE_BL_UHOD = 4, ///< по уходу TYPE_BL_ABORT= 5, ///< искусственное прерывание беременности TYPE_BL_PROF = 6, ///< профессиональное заболевание TYPE_BL_UH15 = 7, ///< по уходу до 1.5 лет TYPE_BL_KARANTIN=8,///< карантин TYPE_BL_SAN_KUR=9, ///< санаторно-курортные TYPE_BL_PROTEZ=10, ///< протезирование */ int idxbl = VidBL==TYPE_BL_BER?1:0; int idxsovm = 0; int idxvp = 0; var b_break = CreateObject("ParamFuncRW"); b_break.IInitial(DatBBl,"~",2); m.SetMonthYear(atoi(SubStr(b_break.Get(0),3,2)),atoi(SubStr(b_break.Get(0),6,4))); if ( !m.IsEqI(INVALID_MONTH_VALUE) ) { d.SetDateIM(m.CountDay(),m); // Рассматриваем совместительство или нет (допущение смотрим на код среднесписочной на конец месяца) GetKchValue("kod_rab",Buf,255,d); int kod_rab = atoi(Buf); // 4,9 - совместительство idxsovm = (4 == kod_rab || 9 == kod_rab)?1:0; if ( VidBL!=TYPE_BL_BER ) // для больнчных еще разбивка по временно-пребывющим { d.SetDate(to_string(b_break.Get(0))); GetKchValue("status2",Buf,255,d); // Определяем временную-пребываемость int status2 = atoi(Buf); // статус страховых взносов for ( int i=0; i 0.001 ) { // в количестве больничных учитываем, только если б/л с таким номером // не попадался и если это первичный б/л и не пересчет if ( !bExistBL && !bExistParentBL && !bRecalcBL) { // по совместительству считаем "в том числе"... поэтому ++Rsv2017InfoAboutRvBLFromReestr[idxbl][0][idxvp][0]; if ( idxsovm ) ++Rsv2017InfoAboutRvBLFromReestr[idxbl][idxsovm][idxvp][0]; } if ( bCheckRvRecalcBL || !bRecalcBL ) { Rsv2017InfoAboutRvBLFromReestr[idxbl][0][idxvp][1] += SRv+0.00001; if ( idxsovm ) Rsv2017InfoAboutRvBLFromReestr[idxbl][idxsovm][idxvp][1] += SRv+0.00001; } } // if ( nabs(SSum) > eps ) } // for ( int ii=0; ii0 ) { EnterpriseTariffPeriods.ClearCod(tarif); EnterpriseTariffPeriods.UpdatePeriods(periods,"01"); codTarifWasChanged = true; } } // Если меняли неподходящий код тарифа на основной и еще не выдавали сообщение // выдаем сообщение if ( codTarifWasChanged && !wasMsgAboutChangeCodTarifa ) { wasMsgAboutChangeCodTarifa=true; var kd=CreateObject("KDate"); kd.SetDateIII(1,1,Year); string msg = "С "+kd.GetStr()+" перестали действовать льготные тарифы с кодами:\n"; msg += allforbiddentarifs+"\n"; msg += "При подготовке отчета устаревшие коды тарифа будут заменены на основной код тарифа - 01\n" "Чтобы избежать появления этого сообщения при подготовке отчета, необходимо в \"Справке о предприятии\" в настройке \"Код основного тарифа стр. взносов ФНС\", с "; msg += kd.GetStr()+" поставить актуальный код тарифа."; AmbaMessageBox(msg,"",MB_OK|MB_ICONWARNING,0); } return; }