var logService;//объект, который через "скриптовые закладки" мониторит изменения к.ч. и видов и складывает информацию в sql
Logger_GetFlags()
/*
  UserLogIn = 0x01,
  UserLogoff = 0x02,
  ReadLs = 0x04,
  WriteLs = 0x08,
  TabelSimsChanged = 0x10,
  TabelHoursChanged = 0x20,
  KchChanged = 0x40,
  SummChanged = 0x80,
  RvChanged = 0x100, 
  NuChanged = 0x200, 
  LsDeleted = 0x400
*/
{
  int result=0x01|0x02|0x10|0x20|0x40|0x80|0x100|0x200|0x400;
  return result;
}

InitLogger()
{
  try
  {
    //GlobalBlockMonitorChangeTabel=0; 
    if(Logger_GetFlags() & 0x40)
      GlobalBlockMonitorChangeKch=0;
    if(Logger_GetFlags() & 0x80)
      GlobalBlockMonitorChangeSum=0;
    logService=NetDialogs().GetLogger(Logger_GetFlags(),1);
    logService.OnUserLogIn();
  }
  catch(interface IErrorInfo err)
  {
    string s;
    err.GetDescription(s); // в s будет описание ошибки,
    string sText = "Не удалось создать объект LogService:\n\n" + s;
    string ss;
    err.GetSource(ss);//  место ошибки в коде
    MsgBox(OemToAnsi(sText),OemToAnsi(ss),MB_ICONERROR);
  }
  catch(...)
  //обработка исключений
  {
    SayUndefinedScriptError();
  }
}
UserOnApplicationShutdown()
{
  if( LoggerOn )
    logService.OnUserLogoff();
}
AfterReadLS(Tn)  //после того как прочитали ЛС - очищаем "контейнер"
{
  if( LoggerOn )
    logService.OnReadLs(Tn);
}
/*
работает криво, т.к. вместо нормативных символов хранится пустая строка, а вместо нормативных часов хранится 0->
при изменении часов за один день генерируется событие "изменились часы" для всех дней, где стоят нормативные часы.
TabelMonitor(Tn,Combine,absm,&NewCalm,&OldCalm)
{
  var params[6];
  params[0]="TabelSimsChanged";
  params[1]=Tn;
  params[2]=Combine;
  params[3]=absm;
  params[4]=ToNetString(NewCalm);
  params[5]=ToNetString(OldCalm);
  logService.OnLsChanged(params);
  return 0;
}
ChtTabelMonitor(Tn,Combine,absm,&NewCalmCht,&OldCalmCht)
{
  var params[6];
  params[0]="TabelHoursChanged";
  params[1]=Tn;
  params[2]=Combine;
  params[3]=absm;
  params[4]=NewCalmCht;
  params[5]=OldCalmCht;
  logService.OnLsChanged(params);
  return 0;
}*/
double LoggerEps=0.0001;
BE_SummElemMonitor(tn,&baseElem,newValue,oldValue)
{
  int iCode=baseElem.Code;
  if( iCode==10000 || iCode==1 || iCode==200 ) //изменение суммы в ведомость, остатков и долгов не мониторим т.к. прилетает куча мусора при любом расчете
    return;
  if(LoggerOn && Logger_GetFlags() & 0x80 &&
     nabs(oldValue.Sum-newValue.Sum)>LoggerEps) //сумма изменилась
  {
    double code=baseElem.Code;
    var params[8];
    params[0]="SummChanged";
    params[1]=tn;
    params[3]=code;
    params[6]=oldValue;
    params[7]=newValue;
    logService.OnLsChanged(params);
  }   
  if( LoggerOn && Logger_GetFlags() & 0x100 && 
      nabs(oldValue.Rv-newValue.Rv)>LoggerEps) //рв изменилось
  {
    double code=baseElem.Code;
    var params[8];
    params[0]="RvChanged";
    params[1]=tn;
    params[3]=code;
    params[6]=oldValue;
    params[7]=newValue;
    logService.OnLsChanged(params);
  }
}
PutSummMonitor(tn,row,col,oldSumm,&newSumm)
{
  if(LoggerOn && Logger_GetFlags() & 0x80 &&
      nabs(oldSumm-newSumm)>LoggerEps) //сумма изменилась
  {    
    double code=GetCode(row);
    int m=MonthBySumCol(col);
    var params[8];
    params[0]="SummChanged";
    params[1]=tn;
    params[3]=code;
    params[4]=m;
    params[5]=mtek;
    params[6]=oldSumm;
    params[7]=newSumm;
    logService.OnLsChanged(params);
  }
}
PutTimeMonitor(tn,row,col,oldRv,&newRv)
{

  if( LoggerOn && Logger_GetFlags() & 0x100 &&
      nabs(oldRv-newRv)>LoggerEps) //рв изменилось
  {
    double code=GetCode(row);
    int m=MonthByWorkTimeCol(col);
    var params[8];
    params[0]="RvChanged";
    params[1]=tn;
    params[3]=code;
    params[4]=m;
    params[5]=mtek;
    params[6]=oldRv;
    params[7]=newRv;
    logService.OnLsChanged(params);
  }  
}
OnChangeKchStatic(tn,ps,&newValue,oldValue,&arr)
{
  if(ps=="fl_ved1")
    return;
  if( LoggerOn && Logger_GetFlags() & 0x40)
    OnChangeKchBase(tn,atoi(arr[2]),ps,GetNothing(),GetNothing(),oldValue,newValue);
}
OnChangeKch(tn,ps,&newValue,&newDate,oldValue,oldDate,&arr)
{
  if( LoggerOn && Logger_GetFlags() & 0x40)
    OnChangeKchBase(tn,atoi(arr[2]),ps,oldDate.GetStr(),newDate.GetStr(),oldValue,newValue);
}
OnChangeKchBase(tn,combine,ps,oldDate,newDate,oldValue,newValue)
{
  var params[8];
  params[0]="KchChanged";
  params[1]=tn;
  params[2]=combine;
  params[3]=OemToAnsi(ps);
  params[4]=oldDate;
  params[5]=newDate;
  params[6]=OemToAnsi(oldValue);
  params[7]=OemToAnsi(newValue);
  logService.OnLsChanged(params);
}

GenerateEventBase(tn,code,message,eventType)
{
  var params[8];
  params[0]=eventType;
  params[1]=tn;
  params[2]=OemToAnsi(message);
  params[3]=code;
  logService.OnLsChanged(params);
}
BE_Add(tn, &baseElem)
{
  if(LoggerOn && Logger_GetFlags() & 0x200)
  {
    double code=baseElem.Code;
    char message[256];sprintf(message,"Добавили вид с кодом \"%.2f\"",code);
    GenerateEventBase(tn,code,message,"NuChanged");
  }
}
BE_Del(tn, &baseElem)
{
  if(LoggerOn && Logger_GetFlags() & 0x200)
  {
    double code=baseElem.Code;
    char message[256];sprintf(message,"Удалили вид с кодом \"%.2f\"",code);
    GenerateEventBase(tn,code,message,"NuChanged");
  }
}
//дата начала
BE_BegDateMonitor(tn,&baseElem,newValue)
{
  if(LoggerOn && Logger_GetFlags() & 0x200)
  {
    var oldValue=baseElem.DateBeg.GetDouble();
    double code=baseElem.Code;
    char message[256];sprintf(message,"У вида с кодом \"%.2f\" изменилась дата начала: \"%s\"->\"%s\"",code,KDateFromD(oldValue).GetStr(),KDateFromD(newValue).GetStr());
    GenerateEventBase(tn,code,message,"NuChanged");
  }
}
PutBegDateMonitor(tn,row,oldValue,&newValue)
{
  if(LoggerOn && Logger_GetFlags() & 0x200)
  {
    double code=GetCode(row);
    char message[256];sprintf(message,"У вида с кодом \"%.2f\" изменилась дата начала: \"%s\"->\"%s\"",code,KDateFromD(oldValue).GetStr(),KDateFromD(newValue).GetStr());
    GenerateEventBase(tn,code,message,"NuChanged");
  }
}
BE_EndDateMonitor(tn,&baseElem,newValue)
{
  if (!baseElem.DateEnd.IsValid() && KDateFromD(newValue).GetStr()=="01.01.2050") //мусорное событие при добавлении нового вида - не логируем
    return;
  if(LoggerOn && Logger_GetFlags() & 0x200)
  {
    var oldValue=baseElem.DateEnd.GetDouble();
    double code=baseElem.Code;
    char message[256]; sprintf(message,"У вида с кодом \"%.2f\" изменилась дата окончания: \"%s\"->\"%s\"",code,KDateFromD(oldValue).GetStr(),KDateFromD(newValue).GetStr());
    GenerateEventBase(tn,code,message,"NuChanged");
  }
}
PutEndDateMonitor(tn,row,oldValue,&newValue)
{
  if (!KDateFromD(oldValue).IsValid() && KDateFromD(newValue).GetStr()=="01.01.2050") //мусорное событие при добавлении нового вида - не логируем
    return;
  
  if(LoggerOn && Logger_GetFlags() & 0x200)
  {
    double code=GetCode(row);
    char message[256];sprintf(message,"У вида с кодом \"%.2f\" изменилась дата окончания: \"%s\"->\"%s\"",code,KDateFromD(oldValue).GetStr(),KDateFromD(newValue).GetStr());
    GenerateEventBase(tn,code,message,"NuChanged");
  }
}

BE_BaseMonitor(tn,&baseElem,newValue)
{
  int iCode=baseElem.Code;
  if( iCode==10000 ) //мусор
    return;
  if(LoggerOn && Logger_GetFlags() & 0x200)
  {
    var oldValue=baseElem.Base;
    double code=baseElem.Code;
    char message[256];sprintf(message,"У вида с кодом \"%.2f\" изменилось БЗ: \"%.2f\"->\"%.2f\"",code,oldValue,newValue);
    GenerateEventBase(tn,code,message,"NuChanged");
  }
}
PutBaseMonitor(tn,row,oldValue,&newValue)
{
  if (!KDateFromD(GetEndDate(row)).IsValid()) //пересчетная строка
    return;
    
  if(LoggerOn && Logger_GetFlags() & 0x200)
  {
    double code=GetCode(row);
    char message[256];sprintf(message,"У вида с кодом \"%.2f\" изменилось БЗ: \"%.2f\"->\"%.2f\"",code,oldValue,newValue);
    GenerateEventBase(tn,code,message,"NuChanged");    
  }
}
BE_ShzMonitor(tn,&baseElem,newValue)
{
  if(LoggerOn && Logger_GetFlags() & 0x200)
  {
    var oldValue=baseElem.ShifrZ;
    double code=baseElem.Code;
    char message[1024];sprintf(message,"У вида с кодом \"%.2f\" изменилось ШЗ: \"%s\"->\"%s\"",code,oldValue,newValue);
    GenerateEventBase(tn,code,message,"NuChanged");    
  }
}
PutOldShzMonitor(tn,row,oldValue,&newValue)
{
  if(LoggerOn && Logger_GetFlags() & 0x200)
  {
    double code=GetCode(row);
    char message[1024];sprintf(message,"У вида с кодом \"%.2f\" изменилось ШЗ: \"%s\"->\"%s\"",code,oldValue,newValue);
    GenerateEventBase(tn,code,message,"NuChanged");    
  }
}
AfterDeleteLS(tn, lsid, bFromIntegration)
{
  if(LoggerOn && Logger_GetFlags() & 0x400)
  {
    char message[256];sprintf(message,"lsid: \"%s\" bFromIntegration: \"%s\"",lsid,bFromIntegration?"true":"false");
    var params[3];
    params[0]=tn;
    params[1]=OemToAnsi("ЛС удален");
    params[2]=OemToAnsi(message);
    logService.OnLsDeleted(params);
  }
}


AfterWriteLS(tn)
{
  try
  {
    AfterWriteLS_Impl(tn);
  }
  catch(...)
  {
    ;
  }
}
AfterWriteLS_Impl(tn) 
{
   if( LoggerOn )
    logService.OnWriteLs(tn);  
}
