var B9SumElemsMap; B9DefineCodPeriods_Impl(mode) { int mBeg = Transl_Date_To_Abs(Str_Date_0); int mEnd = Transl_Date_To_Abs(Str_Date_1); int m2Beg = Transl_Date_To_Abs(Str_Date_2); int m2End = Transl_Date_To_Abs(Str_Date_3); B9SumElemsMap = CreateObject("Map"); var kcp = CreateObject("KPeriodsIterations"); kcp.ClearAll(); var CurAProp=GetCommonProp(CMN_SRC_REFS); var MapCodeNU = CreateObject("MapLong"); char FlagIns=!Str_Cmp(Str_Cod,"***","")?1:0; if ( !FlagIns ) MapCodeNU.Add(Extern_To_Intern(atoi(Str_Cod)),0); else { for ( int iC=0; iCmEnd || sumElem.mvm2End) continue; string key = baseKey+to_string(mapindex); B9SumElemsMap.Add(mapindex++,sumElem); if (mode==9 || mode==91) // выборка B9 по месяцам начисления/принадлежности { kcp.AddPeriod(key, to_string(Str_Date_0), to_string(Str_Date_1)); } else if (mode==92 || mode==93 || mode==94) // Реестр по выплатам { mapPays.Clear(); int paysCount= sumElem.PaysCount(); double sumAll=0; for(int p = 0; p=0.005) { mapPays.Add(0,sumElem.Sum-sumAll); } for(mapPays.InitIterator(); !mapPays.IsEnd(); mapPays.Next()) { int idVed = mapPays.GetCurKey(); string payDateForKey; if (mode==93 || mode==94) { var payDate = FilteredPayDateForReestrPaidIncome(mBeg,mEnd,be.Code,sumElem, idVed); if (IsEmpty(payDate)) continue; payDateForKey += "," + payDate; } string keyVypl=key+","+to_string(idVed)+","+to_string(mapPays.GetCurValue()) + payDateForKey; kcp.AddPeriod(keyVypl, to_string(Str_Date_0), to_string(Str_Date_1)); } } } } } } B9DefineCodPeriods() { return B9DefineCodPeriods_Impl(9); // выборка B9 по месяцам нач/прин } B92DefineCodPeriods() { return B9DefineCodPeriods_Impl(92); // реестр выплат } B91DefineCodPeriods() { return B9DefineCodPeriods_Impl(91); // выборка B91 по месяцам нач/прин ВСЕ СУММЫ без запроса периода (и за границами действия системы) } int ReestrPaidIncomeAlgTax = 0; var ReestrPaidIncomeTaxCollector; int ReestrPaidIncomeTypeOKTMO = -1; ReestrPaidIncomeDefineCodPeriods() { if (ReestrPaidIncomeAlgTax == 0) { VidInTaxCnfNote(0, 0, 0); // очистка кэша ReestrPaidIncomeAlgTax = PanelNalogNdfl(); if (ReestrPaidIncomeAlgTax == 0) BreakTableReceive(); for(int i=0;i Таблицы контроля -> Перенос отрицательного НДФЛ на вид "Возврат НДФЛ" { // и в "Реестр удержанного НДФЛ" (Отчеты -> Отчетность по налогам и взносам в ФНС -> F9) if (ReestrPaidIncomeAlgTax == 0) { VidInTaxCnfNote94(0, 0, 0); // очистка кэша ReestrPaidIncomeAlgTax =205; //PanelNalogNdfl(); if (ReestrPaidIncomeAlgTax == 0) BreakTableReceive(); for(int i=0;i1) return keys[2]; } B92CurVSum() { var kcp = CreateObject("KPeriodsIterations"); var keys = Split(kcp.GetCurCod(),","); if (GetUBound(keys)>2) return keys[3]; if (ReestrPaidIncomeAlgTax>237) return B9CurSE.Sum; // если выбрали алгоритм страховых то по выплатам не будет цикла } ReestrPaidIncomeCurPaidDateForTax() { var kcp = CreateObject("KPeriodsIterations"); var keys = Split(kcp.GetCurCod(),","); if (GetUBound(keys)>3) return keys[4]; } ReestrPaidIncomeOrgId(paramsAr) { return PriorityCall("UserReestrPaidIncomeOrgId", "SysReestrPaidIncomeOrgId", paramsAr); } SysReestrPaidIncomeOrgId(paramsAr) // вызывается с параметром GetArray(TaxDate, TaxInfo)); { var taxDate = paramsAr[0]; // string дата учета ( не всегда равен дате ведомости) //var taxInfo = paramsAr[1]; // string Доход 2000, Вычет 311, "НДФЛ" : "Стр.взнос" см VidInTaxCnfNote double codeNU = Extern_To_InternE(atof(B9CurExtCode())); var date = KDateFromStr(taxDate); int month; if (date.IsValid()) month = date.GetAbs(); else month = B9CurSE.mv; // Если разбивка по ОКТМО по полю КЧ int TypeIteration = 0; string ps_kch = ""; bool bCodOrgKch = false; bool bStringKch = false; DefineParamsKchOKTMO(ReestrPaidIncomeTypeOKTMO, TypeIteration,ps_kch,bCodOrgKch,bStringKch); if (TypeIteration == 2) // для этого режима в absm передана ДАТА month = date.IsValid() ? date.GetInt() : KDateFromAbsMonth(month).GetInt(); int orgId = DefineIdOrgForIncome(ReestrPaidIncomeTypeOKTMO, month, codeNU); return orgId; } PanelNalogNdfl() { var mapRezPanelNalogNdfl; //if (!VarHasValue(mapRezPanelNalogNdfl)) { var MapNal = CreateObject("MapString"); MapNal.Add("205",Oem("(205) НДФЛ резидент")); MapNal.Add("206",Oem("(206) НДФЛ сверх 5млн.р")); MapNal.Add("207",Oem("(207) НДФЛ нерезидент")); MapNal.Add("208",Oem("(208) НДФЛ дивиденды")); MapNal.Add("211",Oem("(211) НДФЛ дивиденды сверх 5млн.р")); MapNal.Add("209",Oem("(209) НДФЛ с выгоды")); MapNal.Add("241",Oem("(241) Страховые взносы")); string Title = Oem("Выберите вид налога"); mapRezPanelNalogNdfl = CreateObject("MapString"); if ( PanelValueFromMap(MapNal,mapRezPanelNalogNdfl,1,Title) == ESC ) return 0; } return atoi(mapRezPanelNalogNdfl.GetCurKey()); } CellToExcel(tabl, rcr, fld) // возвращает либо string либо double { char format = tabl.Format_Fld(fld); char accuracy = tabl.Accurasy_Fld(fld); var value=TrimN(OemToAnsi(tabl.Text(fld,rcr))); if (accuracy != 0) { value = atof(value); if (format == 'Q') value = CodeNUToStringEx(value,1,NUExtPrecision()); } if ( TYPE_OFFICE == MS_EXCEL && format == 'D') // формат поля в шаблоне xltx должен быть Дата! { var kd = KDateFromStr(value); value = kd.IsValid() ? kd.GetVariantDate() : GetEmpty(); } return value; } PrintReestrPaidIncomes() { PrintReestrPaidIncomesBase(93); } PrintReestrPaidIncomesBase(mode) { var CFile=CreateObject("CurPrnFile"); // объект класса для работы с текущим файлом печати CFile.SetFlagBrowse(0); // запрещаем просмотр var Tabl=CreateObject("CurPrnTbl"); int countInsertRcr = Tabl.GetCountInsertRcr(); // число выделенных записей int countRcr = countInsertRcr ? countInsertRcr : Tabl.Count_Rcr(); var NameXlt = GetPathXLTForTable(Tabl, mode==94 ? "NdflReestr.xltx" : "ReestrPaidIncomes.xltx"); tPrepereOfficeForWork(); try { tOpenXlsObjects(to_string(NameXlt), TrimN(to_string(Tabl.Heading()))); tGetWshByName("Реестр"); var countFld = Tabl.Count_Fld(); var ar[countFld][countRcr]; int rcr = 0, tableRcr = 0; var CMsg = CreateObject("ProgressBar"); CMsg.SetShowTime(to_int(true)); string MsgProcStr = AnsiToOem(" Подождите немного. Идет подготовка к печати. "); var tableCountRcr = Tabl.Count_Rcr(); for (; tableRcr < tableCountRcr; tableRcr++) { if (!Tabl.Flag_Action_1(tableRcr)) continue; for (int fld = 0; fld < countFld; fld++) ar[fld][rcr] = CellToExcel(Tabl, tableRcr, fld); ++rcr; if (CMsg.Msg_Proc(MsgProcStr, 100.*tableRcr/ tableCountRcr) == ESC) break; } // в шаблоне ReestrPaidIncomes.xltx на листе Реестр есть 2 строки заполненнные 0 и на них настроена сводная таблица на листе Свод if (countRcr > 2) // при вставке строк у сводной таблицы автоматически обновляется диапазон "Источник" tInsertRows(3, countRcr - 2); else if (countRcr < 2) tDeleteRows(3, 1); tSetRangeValue(2, 1, countRcr + 1, countFld, ar); tGetWshByName("Свод"); tPivotTablesRefresh(); tEndXlsWork(1); } catch(...) { tEndXlsWork(1); // делаем форму видимой throw; } }