// Платежная ведомость бюджетная

var CTabl;

int idxTN   = 0, //
    idxFIO  = 1, //
    idxPodr = 2, //
    idxSum  = 3, //
    idxTax  = 4, //

    nFld = 10;  // число элементов в массиве Fld

int Fld[nFld];

int shift = -10; // для изменения количества строк на листе
int strok_plast_list = 21; // на предпоследнем листе (не первый лист) не более строк
int strok_first_list = 12; // на предпоследнем листе (первый лист) не более строк

string tmpnm = "";
int cWb = 1;

int T_53 = 94;        // хозрасчетная форма Т-53
int T_403 = 92;       // бюджетная форма 0504403
int T_403_NDFL = 95;  // бюджетная форма 0504403 с НДФЛ

string cell = "";


t53(array_param) //sum_ob,pr_podr,pr_sum)
{
   int np = 3;
   var param[np];

   param[0] = to_string("");
   param[2] = 94; // Т-53
   param[1] = atoi(array_param[1]);


   main(param,np);


}




platv(nameSrc,sum_ob) // вызов ведомости без НДФЛ
{
   int np = 3;
   var param[np];

   param[0] = nameSrc;
   param[1] = sum_ob;
   param[2] = 92; // 403 - бюджетная форма

   main(param,np);
}

main(&param,nm) // вызов ведомости с НДФЛ
{
  string nameSrc = to_string(param[0]);
  int sum_ob = atoi(param[1]);
  int codVed = atoi(param[2]);

  int pr_sum = GetCommonCnfInt("PR_SUM_1",AnsiToOem("касса")); // 1 - с первого, 0 - со второго (как в унифиц.форме)
  int pr_podr = GetCommonCnfInt("PODR_ALL_P",AnsiToOem("касса"));

  if ( pr_sum != 0 ) pr_sum = 1;
  if ( pr_podr != 0 ) pr_podr = 1;

  var CFile = CreateObject("CurPrnFile");
  CFile.SetFlagBrowse(0);
  CFile.SetFlag_Print(0);

  CTabl = CreateObject("CurPrnTbl");
  int cr = CTabl.Count_Rcr();
  TrySortVedTable(CTabl);
  try
  {
     char Dir[512];
     GetCurrentDirectory(511,Dir);

     string nm = "";

     switch ( codVed )
     {
        case T_53:       nm = "t53.xlt";        break;
        case T_403:      nm = "platved.xlt";    break;
        case T_403_NDFL: nm = "platved_mf.xlt"; break;
     }

     var fullFileName = GetPathXLT(NameCommonDir(),nm);
     tPrepereOfficeForWork();
     tCreateXlsObjects(fullFileName, codVed==T_53 ? AnsiToOem("Платежная ведомость для бюджетных организаций") :
                                                    AnsiToOem("Платежная ведомость(форма Т-53)"));
     tGetWshByIndex(1);
     tWshSelect();

     var CMsg = 0;

     int bTime = false;

     CMsg = CreateObject("ProgressBar");
     CMsg.Initial(0,100,1);
     CMsg.SetShowTime(static_cast_to_int(bTime));

     if ( !FillNumFld() ) return false; // определяем необходимые нам номера полей

     int len = 512;

     char Org[len],
          str[len],
          str1[len],
          str2[len],
          podr[len],
          arg[len],
          nnn[len],
          sss[len],
          ts[len];

     string strok;
     string podrazd = "";

     R_TEXT_FLD("C_PODR_DB",str,200,0); // Название подразделение
     FreeSpaceString(str,3,"");

     int cur_podr = atol(str);

     if ( cur_podr > 0 )
     {
        str = GetOtdName(atol(str));
        FreeSpaceString(str,3,""); OemToChar(str,str);
        podrazd = str;

        if ( codVed == T_53 ) cell = "A9"; else cell = "Y15";
        tWriteStringToCell(cell,str);

        Org = GetEnterpriseRefValueByPodr(cur_podr,AnsiToOem("ИМЯП"));
     }
     else
     {
        GetEnterpriseVar(AnsiToOem("ИМЯП"), Org,len-1); // Наименование предприятия или отделения иностранной организации
        pr_podr = 0; // если не задано подразделение, то отключаем настройку "печатать подразделение на каждом листе"
     }

     FreeSpaceString(Org,3,""); OemToChar(Org,Org);

     if ( codVed == T_53 ) cell = "A7"; else cell = "L12";
     tWriteStringToCell(cell,Org);

     if ( codVed != T_53 )
     {
        R_TEXT_FLD("SRC",str,200,0); // Название источника
        FreeSpaceString(str,3,"");

        if ( str != "" )
        {
           str = nameSrc;
           FreeSpaceString(str,3,""); OemToChar(str,str);
           tWriteStringToCell("V17",str);
        }
        else
        {
           tWriteStringToCell("A17"," "); // если общая ведомость
        }
     }

     char Okp[len]; // код общероссийского классификатора предприятий и организаций
     GetEnterpriseVar(AnsiToOem("ОКПО"), Okp,len-1);
     FreeSpaceString(Okp,3,""); UpperString(Okp); OemToChar(Okp,Okp);
     if ( codVed == T_53 ) cell = "CP7"; else cell = "CR12";
     tWriteStringToCell(cell,Okp);

     char Inn[len]; // идентификационный номер налогоплательщика
     GetEnterpriseVar(AnsiToOem("ИНН"),Inn,len-1);
     FreeSpaceString(Inn,3,"");
     if ( codVed != T_53 ) tWriteStringToCell("BO14",Inn);

     char Kpp[len]; // код причины постановки на учет
     GetEnterpriseVar(AnsiToOem("КОДПОСУЧ"),Kpp,len-1);
     FreeSpaceString(Kpp,3,"");
     if ( codVed != T_53 ) tWriteStringToCell("CR13",Kpp);

     char Ruk[len],Glb[len];
     GetEnterpriseVar(AnsiToOem("РУКП"),Ruk,127); // Руководитель
     GetEnterpriseVar(AnsiToOem("ГЛБУХ"),Glb,127); // Главбух
     FreeSpaceString(Ruk,3,""); OemToChar(Ruk,Ruk);
     FreeSpaceString(Glb,3,""); OemToChar(Glb,Glb);

     if ( codVed == T_53 ) cell = "BQ18"; else cell = "CB4";
     tWriteStringToCell(cell,Ruk);

     if ( codVed == T_53 ) cell = "AO20"; else cell = "CB6";
     tWriteStringToCell(cell,Glb);

     if ( codVed == T_53 )
     {
        GetEnterpriseVar(AnsiToOem("ДОЛЖ"), str,len-1); // Должность руководителя
        FreeSpaceString(str,3,""); OemToChar(str,str);
        tWriteStringToCell("AA18",str);
     }

     R_TEXT_FLD("PRINT_NUMB",str,200,0);  // номер ведомости
     FreeSpaceString(str,3,""); OemToChar(str,str);
     if ( codVed == T_53 ) cell = "AX26"; else cell = "BK9";
     tWriteStringToCell(cell,str);

//---------------------------------------------------------------------------------

     R_TEXT_FLD("D_DOC",ts,200,0);  // дата ведомости
     if ( codVed == T_53 ) cell = "BN26"; else cell = "CR11";
     tWriteStringToCell(cell,ts);

     var DataDoc = CreateObject("KDate");
     DataDoc.SetDate(to_string(ts));

     var nameMonth = CreateObject("ParamFuncRW");
     nameMonth.IInitial1(DataDoc.NameMonth()," ",2);

     int fpDM = GetCommonCnfInt("fpDM",AnsiToOem("касса"));

     char doc_date[len]; doc_date = ts;

     char StrDat[21];
     R_DATA_PROPIS(ts,StrDat,20,0);
     FreeSpaceString(StrDat,2," ");

     char god[3];

     if ( codVed != T_53 )
     {
        if ( strlen(StrDat) > 0 )
        {
           int i = strlen(StrDat)-1; // год
           god[0]= StrDat[i-1];
           god[1]= StrDat[i]; god[2]='\0';

           tWriteStringToCell("BH11",god);

           StrDat[i-4] = '\0'; // дата прописью
           OemToChar(StrDat,StrDat);

           if ( !fpDM )
              tWriteStringToCell("AJ11",StrDat);
           else
              tWriteStringToCell("AJ11",OemToAnsi(nameMonth.Get(0)));
        }
     }
     else
     { // дата в 22ой строке
        var d = KDateFromStr(ts);
        if( d.IsValid() )
        {
           tWriteStringToCell("AD22",d.GetDay());
           tWriteStringToCell("AK22",OemToAnsi(d.NameMonth(2,1)));
           tWriteStringToCell("BL22",d.GetYear()%100);
        }

        var BegMonPer = CreateObject("KMonth"); // месяц начала периода
        var EndMonPer = CreateObject("KMonth"); // месяц конца периода
        BegMonPer.SetMonthYear(Month_Cash,Year_Cash);
        EndMonPer.SetMonthYear(Month_Cash,Year_Cash);

        var BegDayPer = CreateObject("KDate"); // день начала периода
        var EndDayPer = CreateObject("KDate"); // день конца периода
        BegDayPer.SetDateIM(1,EndMonPer);
        EndDayPer.SetDateIM(EndMonPer.CountDay(),EndMonPer);

        char BegPer[len],
             EndPer[len];
        // отчетный период
        sprintf(BegPer,"%02d.%02d.%4d",BegDayPer.GetDay(),BegDayPer.GetMonth(),BegDayPer.GetYear());
        sprintf(EndPer,"%02d.%02d.%4d",EndDayPer.GetDay(),EndDayPer.GetMonth(),EndDayPer.GetYear());

        tWriteStringToCell("CG26",BegPer);
        tWriteStringToCell("CS26",EndPer);
     }

//---------------------------------------------------------------------------------

     R_TEXT_FLD("OC",str,255,0); // тип формы
     FreeSpaceString(str,3,""); OemToChar(str,str);
     tWriteStringToCell("B10",str);

//---------------------------------------------------------------------------------

     R_TEXT_FLD("SU_XOP",str1,200,2);
     FreeSpaceString(str1,3,"");
     if ( codVed == T_53 ) tWriteStringToCell("BQ16",atoi(str1));

     char doc_summa[len]; doc_summa = str1;

     double Itog = atof(str1);
     char Arg[81];
     Double_Text(Arg,Itog,2,14); FreeSpaceString(Arg,3,"");
     R_MAKE_SCRIPT(Arg,str,255,0);
     FreeSpaceString(str,3,"");
     OemToChar(str,str);

     if ( codVed != T_53 ) tWriteStringToCell("BH3",str);
     else
     {
        int i = strlen(str)-7; // копейки
        char kop[10];
        sprintf(kop,"%02ld",static_cast_to_long((Itog-static_cast_to_long(Itog+0.0001))*100.+0.0001));
        tWriteStringToCell("BD16",kop);
        tWriteStringToCell("CL16",kop);

        str[i-5] = '\0'; // рубли прописью
        FreeSpaceString(str,3,""); //OemToChar(str,str);

        var Razb = CreateObject("ParamFuncRW");
        Razb.IInitialW(static_cast_to_string(str),80,2," ,.;");
        tWriteStringToCell("H14",Razb.Get(0));
        if ( Razb.Count() == 2 ) tWriteStringToCell("A16",Razb.Get(1));
     }

//---------------------------------------------------------------------------------

     double sum      = 0.0,
            eps      = 0.001,
            tax      = 0.0,
            ItogList = 0.0,
            tek_sum  = 0.0;

     int tn = 0, // табельный номер
         j = 0;  // номер по прядку

     int cnt_ac = 0; // реальное количество строк в ведомости
     int counter = 0; // счетчик, используется чтобы выполнить переход на новый лист чтобы на последнем листе не оказалось много строк + подножие (не для первого листа)
     int fl_counter = 0; // то же что и counter для первого лист

     // посчитаем реальное количество строк в ведомости
     for ( int zap = 0; zap < cr; zap++ )
     {
        int tn_new = atoi(CTabl.Text(Fld[idxTN],zap));

        if ( sum_ob && tn_new == tn ) // если нужно объединить суммы
        {
           ;
        }
        else
        {
           j++;
           tn = atoi(CTabl.Text(Fld[idxTN],zap)); // tn
        } // else
     } // по ЛС

     cnt_ac = j; // реальное количество строк в ведомости

     if ( !cnt_ac )
     {
        // Заканчиваем работу с Excel
        tGetWshByIndex(2); tWshHide();
        tGetWshByIndex(1); tWshSelect();
        tWshCellSelect(1,1);

        tmpnm = GetOutFormTmpFileName(0);
        tSaveWorkbook(cWb,tmpnm);

        tEndXlsWork(1);
        return 0;
     }

     int strItog1 = codVed != T_53 ? 47 : 55;
     int strItog2 = strItog1 + shift;
     int strItog = strItog2;

     int strItogList1 = 54;
     int strItogList2 = strItogList1 + shift;
     int strItogList = strItogList2;

     int numPageItog = 2;

     tn = 0;
      j = 0;

     int begStr    = codVed != T_53 ? 4 : 6;
     int begStr1   = codVed != T_53 ? 25 : 33;

     int curStr    = begStr;
     int curStrPr  = 0; // фиксируется текущая позиция строки где идет печать - нужно чтобы удалить незаполненные строки на предпоследнем листе
     int curStrFl  = 0; // то же что и curStrPr, но для первого листа

     int strNaListFl = codVed != T_53 ? 46 : 53;
     int strNaList = strNaListFl + shift;

     int flag_plast_list = 0; //
     int flag_first_list = 0;

     int fns = 0; // флаг перехода на новый лист
     int cWsh = 2; // число worksheet'ов

     var wshName = ""; // имя для добавляемых worksheet'ов

     int nlst = 1; // номер листа

     int numStartPage = 2;

     if ( shift < 0 ) // если корректируем (уменьшаем) количество строк на листе
     {
        tGetWshByIndex(2); tWshSelect();
        tDeleteRows(strNaList+1,nabs(shift));

        tGetWshByIndex(1); tWshSelect();
        tWshCellSelect(1,1);
     }

     if ( pr_sum == 1 ) // печать сумм с первого листа
     {
        numStartPage = 1;
        curStr = begStr1;
        cWsh = 1;
        strNaList = strNaList - shift; // печатаем первый лист как есть не корректируюя количество строк
     }

     if ( codVed != T_403_NDFL && // ведомость без НДФЛ
          pr_sum == 1  && // печать с первого листа
          cWsh == 1    && // печать выполняется на первом листе
          cnt_ac <= strNaList - begStr1 && // это должен бы быть последний лист
          cnt_ac > strok_first_list  // превысили заданное количесво строк
        )
     {
        flag_first_list = 1; // флаг запуска обратного отсчета для  fl_counter
        fl_counter = cnt_ac; // на первом листе будет напечатано cnt_ac-1 строк
     }

     int cnt_first_page = 21; // количество строк на первом листе - одинаковое значение и у T_403 и у T_403_NDFL

     if ( pr_sum == 1 &&  // печать с первого листа
          cnt_ac <= cnt_first_page && // общее число записей для печати не превышает максимального значения для первого листа
          !flag_first_list ) // не будет выполняться досрочный переход на второй лист
     {  // итог будет на первом листе
        numPageItog = 1;
        strItog = strItog1;
        strItogList = strItogList1;
     }

     if ( codVed != T_53 ) PrintItog(strItog,codVed,numPageItog,len,god,doc_date,doc_summa);
     else
     {
        tGetWshByIndex(numPageItog);
        tWshSelect();

        Double_Text(str,Itog,2,14);
        nnn = "BF" + to_string(strItog);
        tWriteStringToCell(nnn,str);
     }

     tGetWshByIndex(numStartPage);
     tWshSelect();

     // цикл по записям таблицы
     for ( int zap = 0; zap < cr; zap++ )
     {
        // progress bar - чтобы видеть процент выполненной работы до того как появится результат
        if ( CMsg.Msg_Proc(AnsiToOem(" Подождите немного. Идет подготовка к печати. "),100.*zap/cr)==ESC )
        {
           return 0;
        }

        int tn_new = atoi(CTabl.Text(Fld[idxTN],zap));
        tek_sum = atof(CTabl.Text(Fld[idxSum],zap));

        if ( fns ) fns = 0; // сбрасываем флаг если переход на новый лист выполнен

        if ( !zap && cWsh > 1 ) fns = 1; // начинаем с печати нового листа

        if ( tn_new != tn || !sum_ob )
        {
            if ( tn_new != tn && curStr >= strNaList ) fns = 1; // печатам новый лист если заполнили предыдущий
       SetFlagNextList(flag_first_list,curStr,fl_counter,fns,curStrFl);
       SetFlagNextList(flag_plast_list,curStr,counter,fns,curStrPr);
        }

        if ( fns )
        { // печатаем новый лист
           if ( zap && codVed == T_53 )
           {  // итог по листу
              Double_Text(str,ItogList,2,14);

              // обрабатываем переход с первого листа на второй
              if ( pr_sum == 1 && cWsh == 1 ) nnn = "BF" + to_string(strItogList1);
              else                            nnn = "BF" + to_string(strItogList);

              tWriteStringToCell(nnn,str);
           }

           if ( pr_sum == 1 && cWsh == 1 ) // обрабатываем переход с первого листа на второй
           {
              if ( codVed != T_53 )
                 tWriteStringToCell("A22",to_string("Форма 0504403 с. ") + to_string(nlst));
              else
              {
                 if ( pr_podr ) tWriteStringToCell("A28",to_string("Подразделение: ") + podrazd);
                 tWriteStringToCell("CC28",to_string("Лист № ") + to_string(nlst));
              }

              tGetWshByIndex(2);
              cWsh++; // увеличиваем счетчик листов
              strNaList = strNaList + shift;
           }

           nlst++;
           wshName = "p" + to_string(nlst);

           tCopyWshByName(cWsh,wshName,"s");

           if ( codVed != T_53 )
              tWriteStringToCell("A1",to_string("Форма 0504403 с. ") + to_string(nlst));
           else
           {
              if ( pr_podr ) tWriteStringToCell("A1",to_string("Подразделение: ") + podrazd);
              tWriteStringToCell("CC1",to_string("Лист № ") + to_string(nlst));
           }

           cWsh++; // увеличиваем счетчик листов
           curStr = begStr;
           ItogList = 0.0;

           // обрабатываем переход на новый лист для случая
           // если на последнем листе получается много строк (для T_403 ведомости)
           if ( codVed != T_403_NDFL && !flag_plast_list && !flag_first_list )
           {  // в случае если лист второй или больше
              if ( cWsh >= 2 )
              {  // в случае если осталось напечатать не больше чем вмещается на один лист - т.е. последний лист
                 if ( cnt_ac - j <= strNaList - begStr )
                 {  // если получается много строк + подножие
                    if ( cnt_ac - j > strok_plast_list )
                    {  // устанавливаем флаг запускающий обратный отсчет переменной counter
                       counter = cnt_ac - j - 1;
                       flag_plast_list = 1;
                    }
                 }
              }
           }
        }

        if ( sum_ob && tn_new == tn )  // если нужно объединить суммы
        {
           round(sum);
           //sum += atof(CTabl.Text(Fld[idxSum],zap));
           sum += tek_sum; round(sum);
           round(sum);

           ItogList += tek_sum; round(ItogList);

//           round(tax);
//           tax += Fld[idxTax] == -1 ? 0.0 : atof(CTabl.Text(Fld[idxTax],zap));
//           round(tax);

           Double_Text(str,sum,2,14);

           if ( codVed == T_53 )  nnn = "BF"; else
           if ( codVed == T_403 ) nnn = "BW";
           else                   nnn = "CJ";

           nnn += to_string(curStr);

           tWriteStringToCell(nnn,str);


           if ( codVed == T_403_NDFL )
           {
//              Double_Text(str,tax,2,14);
//              nnn = "BW" + to_string(curStr);
//              tWriteStringToCell(nnn,str);
//
//              Double_Text(str,tax + sum,2,14);
//              nnn = "BL" + to_string(curStr);
//              tWriteStringToCell(nnn,str);
           }
        }
        else
        {
           j++;
           curStr++;

           nnn = "A" + to_string(curStr); // №
           tWriteStringToCell(nnn,j);

           tn = atoi(CTabl.Text(Fld[idxTN],zap)); // tn
           if ( codVed != T_53 ) nnn = "BA"; else nnn = "J";
           nnn += to_string(curStr);
           tWriteStringToCell(nnn,tn);

           str = OemToAnsi(CTabl.Text(Fld[idxFIO],zap)); // ФИО
           if ( codVed != T_53 ) nnn = "L"; else nnn = "V";
           nnn += to_string(curStr);
           tWriteStringToCell(nnn,str);

           sum = tek_sum; round(sum); // summa
           ItogList += sum; round(ItogList);
//           tax = Fld[idxTax] == -1 ? 0.0 : atof(CTabl.Text(Fld[idxTax],zap));

           if ( codVed == T_403_NDFL )
           {
//              Double_Text(str,tax + sum,2,14); // начислено
//              nnn = "BL" + to_string(curStr);
//              tWriteStringToCell(nnn,str);
//
//              Double_Text(str,tax,2,14); // НДФЛ
//              nnn = "BW" + to_string(curStr);
//              tWriteStringToCell(nnn,str);
           }

           Double_Text(str,sum,2,14); // К перечислению

           if ( codVed == T_53 )  nnn = "BF"; else
           if ( codVed == T_403 ) nnn = "BW";
           else                   nnn = "CJ";

           //nnn = codVed == T_403_NDFL ? "CJ" + to_string(curStr) : "BW" + to_string(curStr);
           nnn += to_string(curStr);
           tWriteStringToCell(nnn,str);
        } // else

     } // по ЛС

     var CMsg1 = 0; // Процент выполненной работы
     bTime = false; // false-показывать процент,
                    // true-показывать оставшееся время

     CMsg1 = CreateObject("ProgressBar");
     CMsg1.Initial(0,100,1);
     CMsg1.SetShowTime(static_cast_to_int(bTime));

     if ( pr_sum == 0 )
     { // печать со второго листа, поэтому убираем таблицу для сумм и подписи с первого
        tGetWshByIndex(1);

        if ( codVed != T_53 ) tDeleteRows(22,46); else tDeleteRows(28,46);
     }

     int cntWsh = tGetWshCount();

     int sPage = 2;

     if ( pr_sum == 1 ) sPage = 1;

     // корректируем листы
     int fpSign = GetCommonCnfInt("fpSign",AnsiToOem("касса"));

     for ( int i = sPage; i < cntWsh-1; i++ )
     {
        // progress bar - чтобы видеть процент выполненной работы до того как появится результат
        if ( CMsg1.Msg_Proc(AnsiToOem(" Подождите немного. "),100.*i/(cntWsh-1))==ESC )
        {
          return 0;
        }

        tGetWshByIndex(i);

        if ( i == 1 ) strItog = strItog1;
        else          strItog = strItog2;

        if ( codVed == T_403_NDFL ) // бюджетная ведомость с НДФЛ
        {
           tDeleteRows(strItog + 8,1); // дату
           if ( !fpSign ) tDeleteRows(strItog + 2,7); // убираем составил, проверил, дата
           tDeleteRows(strItog,3); // убираем итого
        }
        else if ( codVed == T_403 ) // бюджетная ведомость без НДФЛ
        {
           tDeleteRows(strItog + 20,14); // дату
           tDeleteRows(strItog + 2,14);  // убираем количество листов, выдано-невыдано-депонировано, кассир, раздатчик
           if ( !fpSign ) tDeleteRows(strItog + 2,5);  // убираем составил, проверил
           tDeleteRows(strItog,1); // убираем итого
        }
        else // T-53
        {
           if ( !fpSign ) tDeleteRows(strItog,18);
           else
           {
              tDeleteRows(strItog + 17,1);
              tDeleteRows(strItog,15);
           }
        }

        if ( i + 1 == cntWsh-1 && flag_plast_list )
        { // если это предпоследний лист и с этого листа был выполнен досрочный переход на новый лист, нужно убрать не заполненые строки
           tDeleteRows(curStrPr+1,strNaList - curStrPr);
        }

        if ( i == 1 && flag_first_list )
        { // если это предпоследний лист и с этого листа был выполнен досрочный переход на новый лист, нужно убрать не заполненые строки
           tDeleteRows(curStrFl+1,strNaListFl - curStrFl);
        }
     }

     if ( cntWsh-1 == 1 ) strItog = strItog1;
     else                 strItog = strItog2;

     // корректируем последний лист
     tGetWshByIndex(cntWsh-1);

     if ( codVed != T_53 )
     {
        nnn = "CU" + to_string(strItog + 2);
        tWriteStringToCell(nnn,nlst);
     }
     else
     {
        Double_Text(str,ItogList,2,14);
        nnn = "BF" + to_string(strItog - 1);
        tWriteStringToCell(nnn,str);

        Double_Text(str,Itog,2,14);
        nnn = "BF" + to_string(strItog);
        tWriteStringToCell(nnn,str);

        nnn = "CS" + to_string(strItog + 2);
        tWriteStringToCell(nnn,nlst);
     }

     if ( curStr < strNaList )
     {
        tDeleteRows(curStr+1,strNaList - curStr);
     }

     var CMsg2 = 0; // Процент выполненной работы
     bTime = false; // false-показывать процент,
                    // true-показывать оставшееся время

     CMsg2 = CreateObject("ProgressBar");
     CMsg2.Initial(0,100,1);
     CMsg2.SetShowTime(static_cast_to_int(bTime));

     for ( int i = cntWsh-1; i < cntWsh; i++ )
     {
        tGetWshByIndex(i);
        tWshSelect();

        // progress bar - чтобы видеть процент выполненной работы до того как появится результат
        if ( CMsg2.Msg_Proc(AnsiToOem(" Подождите немного. "),100.*i/(cntWsh-1))==ESC )
        {
          return 0;
        }

        int start = codVed != T_53 ? 25 : 33;

        if ( i > 1 ) start = codVed != T_53 ? 4 : 6;

        int xsh = strItog + 2 - (strNaList - curStr);

        for ( int j = start; j < xsh-1; j++ )
        {
           tRowHeight(j,20); if ( TYPE_OFFICE == MS_EXCEL ) { _WshObj.Rows(j).Hidden = 0; }
        }

        if ( codVed == T_53 )
        {
           start = xsh - 1;
           int stop = start + 14;

           for ( int j = start; j < stop; j++ )
           {  // корректируем высоту строк подножия
              tRowHeight(j, 12.00); if ( TYPE_OFFICE == MS_EXCEL ) { _WshObj.Rows(j).Hidden = 0; }
           }

           tRowHeight(stop, 20.00); if ( TYPE_OFFICE == MS_EXCEL ) { _WshObj.Rows(j).Hidden = 0; }
        }

        if ( codVed == T_403 )
        {  // корректируем высоту строк подножия
           tRowHeight(xsh-1,  6.00); if ( TYPE_OFFICE == MS_EXCEL ) { _WshObj.Rows(j).Hidden = 0; }
           tRowHeight(xsh,   12.75); if ( TYPE_OFFICE == MS_EXCEL ) { _WshObj.Rows(j).Hidden = 0; }
           tRowHeight(xsh+1,  6.00); if ( TYPE_OFFICE == MS_EXCEL ) { _WshObj.Rows(j).Hidden = 0; }
           tRowHeight(xsh+2, 21.00); if ( TYPE_OFFICE == MS_EXCEL ) { _WshObj.Rows(j).Hidden = 0; }
           tRowHeight(xsh+3,  6.00); if ( TYPE_OFFICE == MS_EXCEL ) { _WshObj.Rows(j).Hidden = 0; }
           tRowHeight(xsh+4, 21.00); if ( TYPE_OFFICE == MS_EXCEL ) { _WshObj.Rows(j).Hidden = 0; }
           tRowHeight(xsh+5,  6.00); if ( TYPE_OFFICE == MS_EXCEL ) { _WshObj.Rows(j).Hidden = 0; }
           tRowHeight(xsh+6, 21.00); if ( TYPE_OFFICE == MS_EXCEL ) { _WshObj.Rows(j).Hidden = 0; }
           tRowHeight(xsh+7,  6.00); if ( TYPE_OFFICE == MS_EXCEL ) { _WshObj.Rows(j).Hidden = 0; }
           tRowHeight(xsh+8, 12.75); if ( TYPE_OFFICE == MS_EXCEL ) { _WshObj.Rows(j).Hidden = 0; }
           tRowHeight(xsh+9, 12.75); if ( TYPE_OFFICE == MS_EXCEL ) { _WshObj.Rows(j).Hidden = 0; }
           tRowHeight(xsh+10,12.75); if ( TYPE_OFFICE == MS_EXCEL ) { _WshObj.Rows(j).Hidden = 0; }
           tRowHeight(xsh+11,16.00); if ( TYPE_OFFICE == MS_EXCEL ) { _WshObj.Rows(j).Hidden = 0; }
           tRowHeight(xsh+12,12.75); if ( TYPE_OFFICE == MS_EXCEL ) { _WshObj.Rows(j).Hidden = 0; }
           tRowHeight(xsh+13,12.75); if ( TYPE_OFFICE == MS_EXCEL ) { _WshObj.Rows(j).Hidden = 0; }
           tRowHeight(xsh+14,16.00); if ( TYPE_OFFICE == MS_EXCEL ) { _WshObj.Rows(j).Hidden = 0; }
           tRowHeight(xsh+15,12.75); if ( TYPE_OFFICE == MS_EXCEL ) { _WshObj.Rows(j).Hidden = 0; }
           tRowHeight(xsh+16,12.75); if ( TYPE_OFFICE == MS_EXCEL ) { _WshObj.Rows(j).Hidden = 0; }
           tRowHeight(xsh+17,12.75); if ( TYPE_OFFICE == MS_EXCEL ) { _WshObj.Rows(j).Hidden = 0; }
           tRowHeight(xsh+18,12.75); if ( TYPE_OFFICE == MS_EXCEL ) { _WshObj.Rows(j).Hidden = 0; }
        }

        tWshCellSelect(1,1);
     }

     // Заканчиваем работу с Excel
     tGetWshByIndex(cntWsh); tWshHide();
     tGetWshByIndex(1); tWshSelect();
     tWshCellSelect(1,1);

     tmpnm = GetOutFormTmpFileName(0);
     tSaveWorkbook(cWb,tmpnm);

     //По непонятным причинам Excel увеличивает высоту 
     //Если файл сохранить, закрыть, открыть снова - баги пропадают
     tEndXlsWork(0);
     tPrepereOfficeForWork();
     tOpenXlsObjects(tmpnm,""); // создание основных объектов
     tGetWshByIndex(1); // получаем ссылку на лист (worksheet)
     tWshSelect();
     
     //tEndXlsWork(1);
  }
  catch(object err)
  {
     SayError(err);
  }
  catch(...)
  {
     SayUndefinedScriptError();
  }

  tEndXlsWork(1);
  return 0;
}


SetFlagNextList(flag_list,curStroka,&count,&flagNextList,&curStrList)
{
   count--;
   if ( !count )
   {
      flagNextList = 1;
      curStrList = curStroka;
   }
}


GetStrCell(cel)
{
  char bc[1024]; bc = "";
  bc = Trim(tReadStringFromCell(static_cast_to_string(cel)));
  Upst(bc);
  if ( bc == "VOID" ) bc = "";
  return static_cast_to_string(bc);
}


Upst(&s)
{
  CharToOem(s,s);
  UpperString(s);
  OemToChar(s,s);
}


PrintItog(strItog,codVed,nWsh,len,god,doc_date,doc_summa)
{
   char str[len],
        str1[len],
        str2[len],
        arg[len],
        nnn[len],
        ts[len];

   tGetWshByIndex(nWsh);
   tWshSelect();

   if ( codVed == T_403_NDFL ) // ведомость с НДФЛ
   {
//      nnn = "CJ" + to_string(strItog);
//      tWriteStringToCell(nnn,doc_summa);

//      R_TEXT_FLD("TAX",str,200,2);
//      FreeSpaceString(str,3,"");
//      nnn = "BW" + to_string(strItog);
//      tWriteStringToCell(nnn,str);

//      Double_Text(str2,atof(str) + atof(doc_summa),2,14);
//      FreeSpaceString(str2,3,"");
//      nnn = "BL" + to_string(strItog);
//      tWriteStringToCell(nnn,str2);

//      var pdata = CreateObject("KDate");
//      pdata.SetDate(to_string(doc_date));
//      sprintf(str1,"%02d",pdata.GetDay());
//      nnn = "C" + to_string(strItog + 8);
//      tWriteStringToCell(nnn,str1);

//      arg = "11," + static_cast_to_string(pdata.GetAbs());
//      R_DATA_EX(arg,ts,len-1,len-1);
//      FreeSpaceString(ts,3,"");
//      nnn = "J" + to_string(strItog + 8);
//      tWriteStringToCell(nnn,OemToAnsi(ts)); // дата в подножии / месяц

//      nnn = "AL" + to_string(strItog + 8);
//      tWriteStringToCell(nnn,god);
   }
   else
   {
      R_TEXT_FLD("SU_XOP",str,200,2);
      FreeSpaceString(str,3,"");
      nnn = "BW" + to_string(strItog);
      Double_Text(str,atof(str),2,14); // К перечислению
      tWriteStringToCell(nnn,str);
   }

   return 0;
}


FillNumFld()
//=============================================================================
// Находим поля в таблице
//=============================================================================
{
  Fld[idxTN]   = CTabl.Find_Name_Fld("TN");          //CTabl.Find_Name_Fld("C_FIO");
  Fld[idxFIO]  = CTabl.Find_Name_Fld("FIO");
  Fld[idxPodr] = CTabl.Find_Name_Fld("FCpodr");      //CTabl.Find_Name_Fld("C_PODR");
  Fld[idxSum]  = CTabl.Find_Name_Fld("ITRA");        //CTabl.Find_Name_Fld("SU_");
  //Fld[idxTax]  = CTabl.Find_Name_Fld("TAX");

//  for ( int i = 0; i < nFld; i++ )
//  {
//     if ( i != idxTax && Fld[i] == -1 )
//     {
//        AmbaMessageBox(AnsiToOem("Нет необходимых полей в таблице!"),AnsiToOem("Ошибка!!!"),MB_OK|MB_ICONERROR,0);
//        return false;
//     }
//  }

  return true;
}

Trim(&str)
{
   var s = TrimN(str);
   str = s;
   return s;
}
TrySortVedTable(&CTabl)
{
	int howSort=atoi(GetCommonCnfS("HowSort",AnsiToOem("касса")));
	if (howSort==0)
		return;
	
	string fldName=(howSort==1)?"FIO":"C_FIO";
	int idxFld=CTabl.Find_Name_Fld(fldName);
  if(idxFld==-1)
		return;
	
	CTabl.Sort_Field(idxFld);
}
