
//TabelMonitor(Tn,Combine,absm,&NewCalm,&OldCalm)
//{
//  int idx=0;
//  while(idx < strlen(NewCalm))
//  {
//    if( OldCalm[idx]=='Р' && NewCalm[idx]=='Б' )
//    {
//      MsgBox(OemToAnsi("В табеле произошло наложение периода БЛ на рабочие дни"), "", MB_ICONWARNING);
//      break;
//    }
//    idx++;
//  }
//  return 0;
//}




paramBL(list_bl)
{

 var Razb = CreateObject("ParamFuncRW");
 Razb.IInitial(to_string(list_bl),",",100);
 int cnt = Razb.Count();
 char buf[999];
 int vseBL=0;
 int zabBL=0;  // заболевание

 for(int i=0; i<cnt; i++)         
  {
   string DatB = Razb.Get(i);   // Дата начала б/л
   
   int VidBL  = atoi(InfoBL(DatB,"ВИДБЛ"));
   int PreBL  = atoi(InfoBL(DatB,"ПРЕДБЛ"));    //дата предыдущего б/л (в иерархии "первичный б/л"-продолжение)
   if((VidBL==0) && (PreBL==0))  zabBL++;

   sprintf(buf,"%s%s _:_",buf,to_string(PreBL));  FreeSpaceString(buf,3,"");
  }

 return  zabBL;   //return buf;

}
InfoBL( DatB, What )
//===============================================================================
// Получение общей информации о б/л
//===============================================================================
{
   char Func[1024],Buf[256];
   sprintf(Func,"БЛ_ИНФО(%s,%s)",DatB,What);
   FreeSpaceString(Func,2,"");
   CallFuncReceive(Func,Buf,255,0);
   FreeSpaceString(Buf,2,"");
   return Buf;
}




//разбиваем список дат на строки (каждая дата в отдельной строке)
UsrGetRow_Bl()
{
  var modules=GetArray("forms\\blreestr_1","forms\\blreestr_2");
  
  ReLoadSMs(modules);
  try  {return UsrGetRowImpl(false); }
  catch(object err)
  {
    SayError(err);                  //выводим сообщение о ошибке
  }
  catch(...)
  {
    SayUndefinedScriptError();
  }

  UnLoadSMs(modules);
}
UsrGetRowImpl(byPeriods)
{
  //Инициализируем глобальные переменные для получения списка БЛ
  Type = TypeFull = 3;// способ выборки (по месяцу начисления)
  MBeg=Str_Date_0;
  MEnd=Str_Date_1; 
  
  char Buf[9999];
  Buf=GetSpisBL();

  var Razb = CreateObject("ParamFuncRW");Razb.IInitial(to_string(Buf),",",1000);
  int cnt = Razb.Count(); // кол-во дат начала б/л (кол-во б/л для текущего ЛС)
  if ( cnt && !Str_Cmp(Buf,""," ") )
    return; // Если нет б/л, то ничего и не печатаем
 
  var kcp = CreateObject("KPeriodsIterations");kcp.ClearAll();
  //цикл по датам БЛ
  for(int idxBl=0;idxBl<cnt;idxBl++)
  {
    var blBD =KDateFromStr(Razb.Get(idxBl));      //получаем очередную дату БЛ
    if (!blBD.IsValid()) 
      continue; //фильтр на пустую строку
    
    int cntPer = atoi(GetInfoBL(blBD.GetStr(),"КПЕР0"));   //количество периодов БЛ
    bool payByOrg=true;
    //цикл по периодам БЛ
    int totalCntDay  = 0;
    for ( int idxPeriod=0; idxPeriod<cntPer;  ++idxPeriod )
    {
      int daysPayOrg=atoi(GetInfoBL(blBD.GetStr(),"ДНПРЕД")); //количество дней за счет предприятия 
      var PeriodBlDB=KDateFromStr(GetInfoPBL(blBD.GetStr(),idxPeriod,"ДАТАН",false));
      var PeriodBlDE=KDateFromStr(GetInfoPBL(blBD.GetStr(),idxPeriod,"ДАТАК",false));
      totalCntDay+=PeriodBlDE.Diff(PeriodBlDB)+1;
      if(totalCntDay>daysPayOrg)
        payByOrg=false;
      if (!PeriodBlDB.IsValid()) 
        continue; //фильтр на пустую строку
      UsrAddKey(kcp,UsrMakeKey(blBD.GetStr(),PeriodBlDB.GetStr(),payByOrg,idxPeriod));
    }
  }
  return 0;
}


UsrAddKey(kcp,key)
{
  kcp.AddPeriod(to_string(key),to_string(datatek),to_string(datatek));//"добавляем"  строку в таблицу
}
UsrMakeKey(blBD,periodBlDB,payByOrg,idxPeriod)
{
  var periodBlCountDay=atof(GetRvBL(blBD, idxPeriod ,false));
  var periodBlSumm=atof(GetInfoPBLSum(blBD,idxPeriod,0,false));
  return blBD+","+
         periodBlDB+","+
         to_string(payByOrg)+","+
         to_string(periodBlCountDay)+","+
         to_string(periodBlSumm);
}
UsrGetDateBeginBl()
{
  var kcp = CreateObject("KPeriodsIterations");
  string key = kcp.GetCurCod();
  return SplitStr(key,",")[0];
}

UsrGetDateBeginPeriodBl()
{
  var kcp = CreateObject("KPeriodsIterations");
  string key = kcp.GetCurCod();
  return SplitStr(key,",")[1];
}
UsrGetWhoPay()
{
  var kcp = CreateObject("KPeriodsIterations");
  string key = kcp.GetCurCod();
  return SplitStr(key,",")[2];
}
UsrGetRv()
{
  var kcp = CreateObject("KPeriodsIterations");
  string key = kcp.GetCurCod();
  return SplitStr(key,",")[3];
}
UsrGetSumm()
{
  var kcp = CreateObject("KPeriodsIterations");
  string key = kcp.GetCurCod();
  return SplitStr(key,",")[4];
}




var usrMapNDFLDeduction=GetNothing();
usrNDFLDeductionCodPeriods_2NDFL()                //  для отчета по вычетам (Шинкарев)
{
   var kcp = CreateObject("KPeriodsIterations");
   kcp.ClearAll();
   kcp.AddPeriod("1",to_string(Str_Date_0),to_string(Str_Date_1));
   usrMapNDFLDeduction = CreateObject("Map");

   R_TaxSc11(8,"*","*",-205,14,0);
   string rezult = R_TaxSc(1112,255,0);

   var Param1 =  CreateObject("ParamFuncRW");
   var Param2 =  CreateObject("ParamFuncRW");
   Param1.IInitial(rezult,";",256);
   for ( int idx=0; idx<Param1.Count(); ++idx )
   {
      Param2.IInitial(Param1.Get(idx),",",4);
      int cod = atoi(Param2.Get(2));
      double Sum = atof(Param2.Get(3));
      if ( usrMapNDFLDeduction.IsExist(cod) )
         Sum += usrMapNDFLDeduction.GetValue(cod);
      usrMapNDFLDeduction.Add(cod,Sum);
   }
   rezult = R_TaxSc(107,255,0);
   Param1.IInitial(rezult,";",256);
   for ( int idx=0; idx<Param1.Count(); ++idx )
   {
      Param2.IInitial(Param1.Get(idx),",",4);
      int cod = atoi(Param2.Get(0));
      double Sum = atof(Param2.Get(1));
      if ( usrMapNDFLDeduction.IsExist(cod) )
         Sum += usrMapNDFLDeduction.GetValue(cod);
      usrMapNDFLDeduction.Add(cod,Sum);
   }
   return 0;
}
usrGetSumForDeduction(strcod)
{
   if ( !IsObject(usrMapNDFLDeduction) ) return 0.;
   int cod = atoi(strcod);
   return usrMapNDFLDeduction.IsExist(cod)?usrMapNDFLDeduction.GetValue(cod):0.;
}

CalcAndDelidery(tn,summ)    //запись через ф-цию расчета   (пример)
{
  LSReadTN(atoi(tn),0); 
  char arg[256];
  char Flag[256]; 
  Flag="BE_FREESUM ";
  /*
   "BE_EXACT"      // отбор по точному коду
   "BE_FREESUM"    // не заменять сумму, если она уже есть в ЛС
   "BE_MERGE_SUM"  // добавление суммы к существующей
   "BE_REPLACE"    // не добавлять новую строку при отсутствии в ЛС нужной строки                       
  */
  sprintf(arg,"%.2f,%d,%d,%s",Intern_To_ExternE(4),mtek,mtek,Flag);
  PutSummTime (arg,summ,14,2);
  
  char ls[256];
  long num;
  polnyi_tn(num);
  lsname(num,ls);
  lswrite(ls,0);

}

PoiskCodInt(Date,Cod,tn)      // для расчета "по-среднему" из таблицы
{
  LSReadTN(atoi(tn),0);

  var DateBeg=CreateObject("KDate");     
  DateBeg.SetDate(to_string(Date));          //Дата, на которую считаем  

  double CodeInt = 0.0;

  s73(); // Сортировка видов Н-У
  for ( int row = 0; row < countkod; row++ )       //  Цикл по строкам ЛС
  {
    int order = GetOrderRow(row);
    double code = GetCode(order);               // double code = GetCode(row);
    int aCod = Extern_To_Intern(atoi(Cod));

    if ( atoi(code) == aCod )                  
    {
     var DatB = CreateObject("KDate");    
     DatB.SetDateD(GetBegDate(order));               // дата начала вида
     if (DatB.IsEq(DateBeg))  { CodeInt  = code; }   // если даты совпадают
    }

  }
 return CodeInt;
}
WriSumASred(cod, sum, tim, sumsr)       // разноска сумм в ЛС (для расчета "по-среднему") из ф-ции разноски
{ 
  int row_n = GetRowForIntCode(cod); // номер строки по точному внутр коду
  //PutSumm(row_n, colc1, sum);

  char arg[256];
  char Flag[256]; 
  Flag="BE_EXACT ";
  /*
   "BE_EXACT"      // отбор по точному коду
   "BE_FREESUM"    // не заменять сумму, если она уже есть в ЛС
   "BE_MERGE_SUM"  // добавление суммы к существующей
   "BE_REPLACE"    // не добавлять новую строку при отсутствии в ЛС нужной строки                       
  */
  sprintf(arg,"%.2f,%d,%d,%s,%s",Intern_To_ExternE(cod),mtek,mtek,Flag,to_string(tim));
  PutSummTime (arg,sum,14,2);

  PutBase(row_n, sumsr);
}


WriSumAlim(ls, sm)       // разноска сумм в 708 вид в свой лс_получателя
{
  char str_ls_708[90], str_comm[90];

  for (int i=0; i<countkod; i++)                    
  {
    int Kod = GetIntegerCode(i);
    double ikod=GetCode(i); //вн.код вида
    if( Kod == 608 )            
     {
      Rkv_from(ikod,"лиц_счет", str_comm, str_ls_708);
      if( atoi(ls) == atoi(str_ls_708) )  PutSumm(i, colc1, sm);       //  PutSummByCod(0, 0, ikod, atof(sm) );
     }
  }
}


SrOtpTab(tab,Src,Beg,End)        // из  ReservOtp  для расч отп из табл
{
    int tn = atoi(tab);       
    char ls1[90];  lsname(Find_Full_TN(tn),ls1);   FreeSpaceString(ls1,3,"");    
    lsread(ls1,0);                  // инициализация ТН


  bool calcBySrc=false;
  if (Str_Cmp(Src," "," ")!=0) calcBySrc=true;     //указали источник 
      
  //var DateBeg=CreateObject("KDate");               //Дата, на которую считаем резерв
  //DateBeg.SetDate(static_cast_to_string(Date));
  //if ( !DateBeg.IsValid() ) return 0.;


      var BegKD=KDateFromStr(Beg);
      var EndKD=KDateFromStr(End);

      int tmpMrasch=mrasch;
      for ( int m=BegKD.GetAbs(); m<=EndKD.GetAbs(); m++ )
      {
         if (m<mtek-P2MES || m>mtek+B2MES)  continue;
         s50(m);
         int z1,z2;
         s6400(BegKD.GetDouble(),EndKD.GetDouble(),z1,z2,data);
         //zamena_simv_v_tab("nrsw",SimvTabel,calm,z1,z2,EOF,0); //меняем в табеле все нормативные, рабочие, выходные на наш символ (если уже заполнены О,Б,Д то они останутся)
         zamena_simv_v_tab("nrsw","О",calm,z1,z2,EOF,0);
         s145(colc2,1); //сохранение табеля за месяц
      }
      s50(tmpMrasch);
      //return 0;

      int TypeOtp;      TypeOtp = OTPUSK_OSN;
      var BegD=KDateFromStr(Beg);
      var EndD=KDateFromStr(End);
      int monthSr=0; // месяц для расчета среднего


  var Sredn = CreateObject("KCalcSredn");          //класс для расчета среднего
  //Sredn.InitOtp(DateBeg,0);                        // Инициализация способа расчета "по-среднему"
  Sredn.InitOtp2(BegD,EndD,TypeOtp,monthSr,0);

  var Nastr = Sredn.GetNastr();
  string OTPUSK_CNF_TABLE = "отпуск";
  int flag_rvmes=GetCommonCnfInt("FLAG_RVMES",OTPUSK_CNF_TABLE);
  int tip_koef  =GetCommonCnfInt("TIP_KOEF",OTPUSK_CNF_TABLE);
  Nastr.SetNastr(FLAG_RVMES,flag_rvmes);
  Nastr.SetNastr(TIP_KOEF,tip_koef);
  Nastr.SetNastr(FLAG_SILENT,1);

  //Sredn.Calculate(0);                              // расчет среднего
  Sredn.Calculate(1,2);   //Sredn.Calculate(1);

  if (!calcBySrc)  
    return Sredn.SumSredn();
  else 
  {  
    var Prop = CreateObject("APropBE"); Prop.InitSrc(ExtSrcToInt(Src[0]));
    return Sredn.SumSrednAProp(Prop);
  }  
}



Wri_BZ(cod,sum_bz)
{
   int cod1 = Extern_To_Intern(atoi(cod));  // внутр код
   int row_n = GetRowForIntCode(cod1); // номер строки
   PutBase(row_n,atof(sum_bz)); 
}


SetRkvForOtp(Cod,Date_Beg,nprikaz,dprikaz,beg_per,end_per)
//ф-ция разносит nprikaz,dprikaz,beg_per,end_per в доп.реквизит вида Cod с датой начала Date_Beg
{
 try
 {
  if (atoi(Cod)<=0)
   {
    AmbaMessageBox("Не указан код вида","ошибка",MB_OK|MB_ICONERROR,0);
    return;
   }
  
  var db = CreateObject("KDate");
  db.SetDate(static_cast_to_string(Date_Beg));

  if(db.IsEqI(INVALID_DATE_VALUE ))
   {
    AmbaMessageBox("Не указана дата начала","ошибка",MB_OK|MB_ICONERROR,0);
    return;
   }
  
  //получаем список строк с кодом==kod 
  unsigned char Src = GetCommonSrc(CLL_TOTAL_SRC);
  int rowkod[ROWMAX];
  int cntrow=poiskosnkod(Extern_To_Intern(atoi(Cod)),rowkod,0,Src);       

  int find_row[cntrow]; //строки из rowkod, у которых дата начала совпадает с Date_Beg
  int cnt_find_row=0;

  //перебираем найденные строки и запоминаем только те, у которых дата начала совпадает с Date_Beg 
  for (int i=0; i<cntrow; i++)                    
  {
    double ikod=GetCode(rowkod[i]); //вн.код вида
    var DatB = CreateObject("KDate");
    DatB.SetDateD(GetBegDate(rowkod[i])); //дата начала вида
    //даты совпадают
    if (DatB.IsEq(db))
    {
      find_row[cnt_find_row]=rowkod[i];
      cnt_find_row++;
    }
  }

  //не нашли ни одного подходящего вида
  if (!cnt_find_row)
   {
    AmbaMessageBox("В ЛС не обнаружено подходящих для разноски видов. Отсутствует вид с соотв датой начала д-вия ","ошибка",MB_OK|MB_ICONERROR,0);
    return;
   }

  //нашли один вид ->разносим
  else if(cnt_find_row==1)
   {
    Rkv_in(GetCode(find_row[0]),"нприказ",nprikaz);
    Rkv_in(GetCode(find_row[0]),"дприказ",dprikaz);
    Rkv_in(GetCode(find_row[0]),"нач_пер",beg_per);
    Rkv_in(GetCode(find_row[0]),"кон_пер",end_per);
   }
    //нашли больше одного вида
    else
    {
      char s[256];
      sprintf(s,"В ЛС нашли %d подходящих для разноски видов\r\nРазнести информацию во все виды?",cnt_find_row);
      if (AmbaMessageBox(s,"Внимание!",MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2, 0)==IDYES)
      {
        for (int i=0; i<cnt_find_row; i++)
         {
          Rkv_in(GetCode(find_row[i]),"нприказ",nprikaz);
          Rkv_in(GetCode(find_row[i]),"дприказ",dprikaz);
          Rkv_in(GetCode(find_row[i]),"нач_пер",beg_per);
          Rkv_in(GetCode(find_row[i]),"кон_пер",end_per);  
         }
      }
      else return;
    }
 }
 catch(...)
  {
     AmbaMessageBox("Ошибка при разноске","ошибка",MB_OK|MB_ICONERROR,0);
  }
}

GetProfName(Prof)
{
   char s[256];
   GetValueClassif("T_GUIDE\\prof.tab",Prof,s,255,"Value","Kod");
   return s;
}

Message ( &Arg,  &pcT, W, A)
//////////////////////////////////////////////////////////////////
// Сообщение(парам1,парам2)
// парам1 - текст сообщения
// парам2 - заголовок окна
//////////////////////////////////////////////////////////////////
{
   var FuncParam =  CreateObject("ParamFuncRW");
   FuncParam.IInitial(static_cast_to_string(Arg),",",10);
   int CountParam=FuncParam.Count();

   if ( CountParam )
   {
      MessageBox(0,FuncParam.Get(0),FuncParam.Get(1),1);
   }
   return pcT;
}

ToLeft( &Arg,  &pcT, W, A)
//////////////////////////////////////////////////////////////////
// Выравнивание числа по левому краю
//////////////////////////////////////////////////////////////////
{
   double Sum = atof(GetVarValue(Arg));
   char StrTmp[W+256];
   sprintf(StrTmp,"%-*.*f",W,A,Sum);
   Text_Text(pcT,StrTmp,W);
   return pcT;
}
