//формирование файла на зачисление
TransfSumm( AdrCTabl,     // адрес передаваемой таблицы
            AdrCListTabl, // адрес списка таблиц
            RcrInList      // номер записи в списке таблиц
           )
{
  var CTabl=CreateObject("CurPrnTbl");
  CTabl.Initial(AdrCTabl);
  // определяем необходимые нам номера полей
  if ( !FillNumFld(CTabl) ) return false;
     
  string WorkFile=GetFileNameForGlobalData();
  if ( LoadGlobalData(WorkFile)==-1 ) return 0;
  

  
  // создадим временный файл в текущей директории
  char TmpFileName[200];
  sprintf(TmpFileName,"ChelindVed.tmp");
  DeleteFile(TmpFileName);
  int hf;
  if ((hf = CreateFile(TmpFileName,1073741824,1 ,0 ,1 ,128 ,0 )) == -1)
  {
    AmbaMessageBox("Невозможно создать файл ChelindVed.tmp.","ошибка",0, 0);
    return false;
  }
  
  //формируем заголовок реестра
  if (WriteHead(hf,CTabl)==ESC) return ESC;
  
  // заводим переменную, которая будет показывать процент выполнения (ProgressBar)
  var CMsg  = CreateObject("ProgressBar");
  CMsg.Initial(0,100,5);
  CMsg.SetShowTime(static_cast_to_int(0));
     
  int cr=CTabl.Count_Rcr();  // число рабочих зaписей в таблице
  int cntRec     =  0;   // количество записей в файле  
  // цикл по записям таблицы
  for (int zap=0; zap<cr; zap++)
  {
    // progress bar - чтобы видеть процент выполненной работы до того как появится результат
    if ( CMsg.Msg_Proc(" Подождите немного. Идет подготовка к печати. ",100.*zap/cr)==ESC )
    { 
       return 0;
    }
    if ( CTabl.Flag_Action_1(zap) ) WriteOneLS(hf,CTabl,zap,cntRec);
  }
  
  // определяем размер файла и заканчиваем работу с ним
  unsigned long FileSize=SetFilePointer(hf,0,0,1);
  CloseHandle(hf);

  // переписываем временный файл в файл заданный в панели запросов
  SaveTmpFile(TmpFileName);
  return true;
}

WriteHead(hf,&CTabl);
{
   
   char s[256],d[256],sum[256];
   s=CTabl.TextS("s",0);
   d=CTabl.TextS("d",0);
   FreeSpaceString(s,2,"");FreeSpaceString(d,2,"");
   if (!strlen(s) && !strlen(d))
   {
     s="1";
     Text_Text(d,datatek,10);
   }
   CTabl.Fill_Bottom_Text_1();
   double summ=atof(CTabl.Get_Bottom_Text(fld[idxSum]));
   sprintf(sum,"%.2f",summ);
   if (ESC==Panel_Zapros(" Введите дополнительные данные ","",
                    "  Номер платежного поручения",s, 20, 
                    "  Дата платежного поручения",d,10,
                    "  Сумма платежки",sum,14))
       return ESC;
   FreeSpaceString(s,2,"");FreeSpaceString(d,2,"");
   CTabl.STextS("s",0, static_cast_to_string(s));
   CTabl.STextS("d",0, static_cast_to_string(d));
   CTabl.Rewrite();

  char str[512];
    
  char Org[256];
  GetEnterpriseVar("ИМЯП", Org,255); // Наименование предприятия или отделения иностранной организации
  FreeSpaceString(Org,3,"");  
  
  char month[256];
  month=CTabl.TextS("month",0);FreeSpaceString(month,2,"");
  int year=atoi(CTabl.TextS("Year",0));
  char What[256];
  sprintf(What,"Заработная плата за %s %d года",month,year);
  
  
  char pp[256];
  sprintf(pp,"П/п №%s от %s|%.2f",s,d,atof(sum));
  sprintf(str,"%s|%s|%s|%s|%s||\r\n",FileName,Org,"АКБ \"ЧЕЛИНДБАНК\"",What,pp);
  
  unsigned long dwBytes;
  WriteFile(hf,str,strlen(str),dwBytes,0);
}

WriteOneLS(hf, &CTabl, zap, &cntRec)
{
  cntRec++;
  
  char Account[256];Account=CTabl.Text(fld[idxAcc],zap);FreeSpaceString(Account,3,"");
  char F[256];F=CTabl.Text(fld[idxF],zap);FreeSpaceString(F,3,"");  
  char I[256];I=CTabl.Text(fld[idxI],zap);FreeSpaceString(I,3,"");  
  char O[256];O=CTabl.Text(fld[idxO],zap);FreeSpaceString(O,3,"");
  double summ=atof(CTabl.Text(fld[idxSum],zap));
  int tn=atoi(CTabl.Text(fld[idxTn],zap));
  
  char str[512];
  sprintf(str,"%d|%s|%s|%s|%s|%s|%.2f|%d|%s|\r\n",cntRec,FileName,Account,F,I,O,summ,tn,"РУБ");
  
  unsigned long dwBytes;
  WriteFile(hf,str,strlen(str),dwBytes,0);
}
//индексы полей для работы с таблицей
int idxF=0,
    idxI=1,
    idxO=2,
    idxAcc=3,
    idxSum=4,
    idxTn=5,
    cntIdx=6;
    
int fld[cntIdx];    
FillNumFld(CTabl)
//=============================================================================
// Находим поля в таблице
//=============================================================================
{
   fld[idxF]   = CTabl.Find_Name_Fld("FCf"),     
   fld[idxI]   = CTabl.Find_Name_Fld("FCi"),        
   fld[idxO]   = CTabl.Find_Name_Fld("FCo"),       
   fld[idxAcc] = CTabl.Find_Name_Fld("Account"), 
   fld[idxSum] = CTabl.Find_Name_Fld("Summa");
   fld[idxTn]  = CTabl.Find_Name_Fld("FCtn");
   for ( int ii=0; ii<cntIdx; ii++ )
      if ( fld[ii]==-1 )
      {
         AmbaMessageBox("Нет необходимых полей в таблице!","Ошибка!!!",MB_OK|MB_ICONERROR,0);
         return false;
      }
   return true;
}


char dt[11];  //дата формирования реестра
char NN[3];   //порядковый номер реестра за день
char EXT[4];  //условный код предприятия, присвоенный предприятию банком 
char FileName[256]; //имя файла

MakeNameSumm( AdrCTabl,    // адрес передаваемой таблицы    
              AdrCListTabl, // адрес списка таблиц           
              RcrInList    // номер записи в списке таблиц
            )   
{
  MakeNameChelind(AdrCTabl,AdrCListTabl,RcrInList,"R");
} 
MakeNameOtkr(  AdrCTabl,    // адрес передаваемой таблицы    
              AdrCListTabl, // адрес списка таблиц           
              RcrInList    // номер записи в списке таблиц
            )   
{
  MakeNameChelind(AdrCTabl,AdrCListTabl,RcrInList,"F");
}                    
//================================================================
// функция для генерации имени файла
/*Имя файла: 
R0MDDYNN.EXT, где 
R - начальная буква для реестров на зачисление сумм 
0 - направление реестра, 0 - реестр от предприятия в банк (в ответном реестре от банка будет 1) 
M - месяц даты формирования реестра в 16-ричной системе счисления, т.е. 1-январь, ... 9-сентябрь, A-октябрь, B-ноябрь, C-декабрь 
DD - день даты формирования реестра с ведущим 0 
Y - последняя цифра года даты формирования реестра 
NN - порядковый номер реестра за день 
EXT - условный код предприятия, присвоенный предприятию банком */ 
//================================================================
MakeNameChelind( AdrCTabl,    // адрес передаваемой таблицы    
                AdrCListTabl, // адрес списка таблиц           
                RcrInList,    // номер записи в списке таблиц
                SpecSimv      // R-зачисление, S/F - открытие, I - изменение реквизитов, D - реестр уволенных, Z- реестр на списание
              )                                                
{
  var OptionsT = CreateObject("TransferOptions");
 
  if (InputGlobalData(SpecSimv)==ESC) return 0;
  
  char Dir[512];
  char month[256]; 
  MakeNameDirMonth(month);
  sprintf(Dir,"C:\\ChelindBank%s\\",month);
  mkdirAll(Dir);//создаем каталог если его нет
  
  OptionsT.SetNameFile(static_cast_to_string(Dir+FileName));
}
//возвращает месяц в 16-ричной системе счисления для даты, заданой в виде ДД.ММ.ГГГГ                 
GetMonthHEX(data)
{
  var D = CreateObject("KDate");
  D.SetDate(static_cast_to_string(data));
  if (D.GetMonth()<10) return static_cast_to_string(D.GetMonth());
  else if (D.GetMonth()<11) return "A";
       else if (D.GetMonth()<12) return "B";
            else return "C";  
}

//инициализируем глобальные переменые
InputGlobalData(SpecSimv)
{
   // Ищем файл ..\\SCRIPT\\BANK\\ChelindBank.xml
   // Если файл есть, берем настройки оттуда и перезапрашиваем значения
   // Если файла нет, то запрашиваем.
  
   string TitleForm="Введите дополнительные данные ";

   string WorkFile=GetFileNameForGlobalData();
   if ( LoadGlobalData(WorkFile)==-1 )
       SetGlobalDefault();
   
   if (InputPGlobalData(TitleForm,SpecSimv)==ESC)
      return ESC;
 
   SaveGlobalData(WorkFile);  
   return 1;   
  
}
//определяем путь до файла с настройками
GetFileNameForGlobalData()
{
  char StrP[256], CurrentDir[256];
  char Dir[21], nam[81], ext[21];
  string NameExe = namexe();
  splitpath(NameExe,Dir,StrP,nam,ext);
  CurrentDir = Dir+StrP+"..\\SCRIPT\\BANK\\ChelindBank.xml";
  fullpath(CurrentDir,CurrentDir,255);
  FreeSpaceString(CurrentDir,2,"");
  string WorkFile=CurrentDir;
  return WorkFile;
}
//грузим данные из файла
LoadGlobalData(WorkFile)
{

  //файл не нашли-> выходим
  if (access(WorkFile,0)==-1) return -1;

  var XMLDoc =CreateXMLobj();
  LoadFileXML(XMLDoc,WorkFile); //грузим данные из XML

  //инициализируем переменные данными из файла
  bool bNew=false;
  var XMLRoot=XMLDoc.documentElement; //корневой элемент
  
  var Elem=GetElemXMLByName(XMLDoc,XMLRoot,OemToAnsi("УсловныйКодПредприятия"),bNew);
  EXT=Elem.text;
  
  Elem=GetElemXMLByName(XMLDoc,XMLRoot,OemToAnsi("ДатаФормированияРеестра"),bNew);
  dt=Elem.text;
  
  Elem=GetElemXMLByName(XMLDoc,XMLRoot,OemToAnsi("ПорядковыйНомерРеестра"),bNew);
  NN=Elem.text;
  
  Elem=GetElemXMLByName(XMLDoc,XMLRoot,OemToAnsi("ИмяФайла"),bNew);
  FileName=Elem.text;
  //проверка даты, запись порядкового номера документа за день     
  int nom;
  char dat[11];
  Text_Text(dat,datatek,10);
  nom =atoi(NN);
  if (dt==dat) 
  { 
    nom++;
    if ( nom>99 ) nom=1;
    sprintf(NN,"%02d",nom);
  }
  else 
  { 
    Text_Text(dt,datatek,10);
    NN="01";
  }
   
  XMLDoc=0;
  return 0;
}

// Ввод/редактирование данных
InputPGlobalData(caption,SpecSimv)
{
  if (Panel_Zapros("", caption,
                  " Условный код предприятия",EXT,3,
                  " Дата формирования реестра",dt ,10,
                  " Порядковый номер реестра за день",NN,2
                  )==ESC)
    return ESC;
        
  string monthHEX=GetMonthHEX(dt);  //месяц даты формирования реестра в 16-ричной системе счисления  
  sprintf(FileName,"%s0%s%c%c%c%s.%s",SpecSimv,monthHEX,dt[0],dt[1],dt[9],NN,EXT);
  return 1;
}
//значения по умолчанию
SetGlobalDefault()
{
  EXT="001";
  NN="01";
  Text_Text(dt,datatek,10);
}
// Сохраняет глобальные данные. Принимает имя файла.
SaveGlobalData(WorkFile)
{
  var XMLDoc = CreateXMLobj();
  XMLDoc.documentElement=CreateElemXML(XMLDoc,OemToAnsi("ДопДанные"));                  
  var XMLElem=XMLDoc.documentElement;
  
  var XMLChildElem = CreateChildElemXML(XMLDoc,XMLElem,OemToAnsi("УсловныйКодПредприятия"));            
  FreeSpaceString(EXT,2,"");
  SetValueElemXML(XMLChildElem,static_cast_to_string(EXT));
  
  XMLChildElem = CreateChildElemXML(XMLDoc,XMLElem,OemToAnsi("ДатаФормированияРеестра"));    
  FreeSpaceString(dt,2,"");
  SetValueElemXML(XMLChildElem,OemToAnsi(dt));
  
  XMLChildElem = CreateChildElemXML(XMLDoc,XMLElem,OemToAnsi("ПорядковыйНомерРеестра"));         
  FreeSpaceString(NN,2,"");
  SetValueElemXML(XMLChildElem,static_cast_to_string(NN));
  
  XMLChildElem = CreateChildElemXML(XMLDoc,XMLElem,OemToAnsi("ИмяФайла"));         
  FreeSpaceString(FileName,2,"");
  SetValueElemXML(XMLChildElem,static_cast_to_string(FileName));
  
  DeleteFile(WorkFile);
  if ( !SaveFileXMLFine(XMLDoc,WorkFile,"   ") )
  {   
    char s[256];
    sprintf(s,"Невозможно создать файл %s",WorkFile);
    AmbaMessageBox(static_cast_to_string(s),"ошибка",0,0);
    return false;
  }

  XMLDoc = 0;
  return 1;
}
CreateXMLobj()
// Создание XML файла
{   
   UnloadScriptModule("msxml");
   LoadScriptModule("msxml");
   var XMLDoc = CreateXML("");
   return XMLDoc;
}