//    диалог для ввода данных при выборе таблицы из шаблона
//   
//    вызов прописан в startup     (TABLCTRL)
//                                   

int one  = 0;    // смещение для заголовков
int two  = one+2;    // смещение для данных
int s_01 = 0+one; 
int s_02 = 1+one;
int s_03 = 2+one;
int s_04 = 3+one;
int s_05 = 4+one;
int s_06 = 5+one;
int s_07 = 6+one;
int s_08 = 7+one;
int s_09 = 8+one;
 
int tabl_1 = 28;
int tabl_2 = 29;

Receive_TABLCTRL_body(&AdrMain,&__VarGMain)    
{

   // таблица со списком подготовленных таблиц
   var MainTable=CreateObject("VedListMainTable");
   MainTable.InitByAdr(AdrMain);

   // для функции, которая добавляет новую таблицу по шаблону необходим
   // параметр "фильтр" по источнику/объекту/подразделению.
   // в нашем случае он будет пустой
   var Filter = CreateObject("APropBE");

   //___________________подгот переменных для диалога
   char Part[90];       
   char CntrSum[9];          
   char NewDay[256];     NewDay=datatek;
    
   //___________________диалог
   if (ESC==Panel_Zapros(" 1- Контроль сумм;  0- Выход в список шаблонов ","",
                        " Контроль сумм по видам НУ (за месяц) ",CntrSum, 10,
                        " Укажите подразделение либо участок ",Part, 20,
                        " Дата_(дд.мм.гггг) : ",NewDay, 10)
                                                              ) return ESC;
   //___________________обраб переменных после диалога
   FreeSpaceString(CntrSum,3,"");       int cn_sm = atoi(CntrSum);
   FreeSpaceString(Part,3,"");          //int prt = atoi(Part);
   FreeSpaceString(NewDay,3,"");

   //___________________работа с текущей датой
      //var d  = CreateObject("KDate");  d.SetDate(static_cast_to_string(Month));     int m=d.GetAbs();   return m; 
      //var mes  = CreateObject("KDate");  mes.SetDate(static_cast_to_string(NewDay));     int m=mes.GetAbs();    
   int m = mrasch;

   if ( cn_sm == 0 ) return 0;  // если шаблон не выбран то 
                                // выходим в список шаблонов 
   
   var TablLS = CreateObject("CurPrnTbl");     // рабочая таблица

   //___________________подгот переменных для создания таблиц
   int NumShab = 0;   
   int NumTable = 0;
   int AdrT = 0;
   int FlagReceive = 0;

   //___________________переменные и массивы для обраб табличных данных
   int rec = 1;
   int kol_v = 1000;
   int tab_n[5000];     // массив ТН
   int vid_m[kol_v];     // массив видов НУ (внеш кодов)
   int cod_n[kol_v];     // массив видов НУ (внут кодов)
   double sum_v[5000];  // массив сумм по столбцу (по виду НУ)

//_______________создаем табл 1   
   NumShab  = tabl_1;
   NumTable = MainTable.Add_Rcr_Work(NumShab, Filter,0,"+_______("+datatek+") "+Part);
   AdrT = MainTable.GetTable(NumTable);       
   TablLS.Initial(AdrT);
      FlagReceive = TablLS.Audit_Receive();
      TablLS.Receive(0,0,FlagReceive,4);
//   TablLS.Rewrite();     
//   MainTable.Rewrite();

//_______________обрабатываем табл 1   
   int rec_tn = 1;   // счетчик записей (колич ТН)
   for ( int LRcr=0; LRcr<TablLS.Count_Rcr(); LRcr++ )
    {
      tab_n[rec_tn] = atoi(TablLS.TextS("C_FIO",LRcr));
      rec_tn++;
    }
   MainTable.Del_Table(NumTable);



//_______________создаем табл 2   
   NumShab  = tabl_2;
   NumTable = MainTable.Add_Rcr_Work(NumShab, Filter,0,"+_("+datatek+") "+Part);
   AdrT = MainTable.GetTable(NumTable);       
   TablLS.Initial(AdrT);
      FlagReceive = TablLS.Audit_Receive();
      TablLS.Receive(0,0,FlagReceive,4);
   TablLS.Rewrite();     
   MainTable.Rewrite();


//_______________обрабатываем табл 2   
   int CurRcr = 0;
   rec = 1;  // счетчик записей  (колич видов с суммами)

   //for ( int LRcr=0; LRcr<TablLS.Count_Rcr(); LRcr++ )        // просматр таблицу
   // {
   //   vid_m[rec] = atoi(TablLS.TextS("Ex_Cod",LRcr));     // заполн массив видами НУ
   //   cod_n[rec] = atoi(TablLS.TextS("Cod",LRcr));            // заполн массив видами НУ
   //   rec++;
   // }

   // для записи в vid_m[rec] кодовНУ по возраст используем промежуточный cod_n[ccc]
   for ( int LRcr=0; LRcr<TablLS.Count_Rcr(); LRcr++ )   // по записям таблицы
    {
     int ccc = atoi(TablLS.TextS("Ex_Cod",LRcr));
     cod_n[ccc] = 1;                          // промежут массив в котором  Код является Индексом
    }
   for ( int LRcr=1; LRcr<kol_v; LRcr++ )     // по массиву  cod_n[]
    {
     if(cod_n[LRcr] == 1)
      {
       vid_m[rec] = LRcr;
       rec++;
      }
    }

   TablLS.Clear();            

   //___________________создаем инфо-строки для преобразуемой таблицы 
   string str_1 = "        Виды НУ_---------->";
   string str_2 = "---------  ---------";
   string str_3 = "_Ф__И__О_";
   string str_4 = "Информация о расхождениях";
   string str_5 = "Абс", str_6 = "Мес";
   string str_7 = "Сумма по стлбцу_---------->";
   string str_8 = "Кол", str_9 = "Вид";
  
   //___________________вставляем инфо-строки в преобразуемую таблицу   
   TablLS.STextS("C_FIO",0, static_cast_to_string(two));      //величина смещения в левый верхний
   TablLS.STextS("Info",s_01, static_cast_to_string(str_1));
      CurRcr = TablLS.Count_Rcr()-1;
      TablLS.Add_Rcr(CurRcr,1);
   TablLS.STextS("Ex_Cod",s_02, static_cast_to_string(str_5));
   TablLS.STextS("Cod",s_02, static_cast_to_string(str_8));
   TablLS.STextS("Info",s_02, static_cast_to_string(str_7));
      CurRcr = TablLS.Count_Rcr()-1;
      TablLS.Add_Rcr(CurRcr,1);
   TablLS.STextS("F_I_O",s_03, static_cast_to_string(str_3));
   TablLS.STextS("Ex_Cod",s_03, static_cast_to_string(str_6));
   TablLS.STextS("Cod",s_03, static_cast_to_string(str_9));
   TablLS.STextS("Info",s_03, static_cast_to_string(str_4));

   for (int ord=1; ord <= rec; ord++)                          
    {
     TablLS.STextS(ord,0, static_cast_to_string(vid_m[ord]));  // пишем виды слева направо
    }

   //int CurRcr = 0;
   for ( int LRcr=1; LRcr<rec_tn; LRcr++ )       //______________________ цикл поТН
    {
      CurRcr = TablLS.Count_Rcr()-1;
      TablLS.Add_Rcr(CurRcr,1);                                           //___заполняем таблицу
      TablLS.STextS("C_FIO",LRcr+two, static_cast_to_string(tab_n[LRcr]));  //___    ТН
      TablLS.STextS("Ex_Cod",LRcr+two, static_cast_to_string(mrasch));      //___  расч месяц
      TablLS.STextS("Cod",LRcr+two, static_cast_to_string(rec-1));          //___  колич видов

      char ls1[90];
      int tbnm = tab_n[LRcr];
      lsname(Find_Full_TN(tbnm),ls1);   FreeSpaceString(ls1,3,"");    //double llss = atof(ls1);
      lsread(ls1,0);                    // инициализация ТН

      char fam[20];  kch_from("f",fam);
      TablLS.STextS("F_I_O",LRcr+two, static_cast_to_string(fam));

      for (int ord=1; ord <= rec; ord++)         //______________________ цикл по видам                 
       {
        int kod = vid_m[ord];
        double sm_kod = CollectSumm(kod,0,mrasch, CL_MV | CL_EXT );
        round2(sm_kod,1,0,sm_kod);
        TablLS.STextS(ord,LRcr+two, static_cast_to_string(sm_kod));  // пишем суммы _____ слева направо
        sum_v[ord] += sm_kod;
       }
    }

    for (int ord=1; ord <= rec; ord++)
     {
      TablLS.STextS(ord,one+1, static_cast_to_string(sum_v[ord]));  // пишем итоговые суммы по столбцам слева направо
     }


   TablLS.Rewrite();     
   MainTable.Rewrite();


   return ESC;
}