// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// "Передача сумм", "открытие счетов", "прием карт" Сбербанк (XML)
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

// 1. Если организация работает с несколькими отделениями Сбербанка,
// то нужно: 
// - завести поле КЧ с псевдонимом: numbank(если отделение одно - можно поле в к.ч. не заводить, а указать номер отделения в запросе)

//   В режиме "справочники кадровой части" находится справочник по кодам ОСБ и 
//   их наименованиям, (T_GUIDE\numbank.tab) если в этом справочнике нет названия для ОСБ в который 
//   мы передаем, то будет выдан запрос наименования ОСБ

// 2. Если требуется указать несколько филиалов отделения Сбербанка,
// то нужно:
// - завести поле КЧ с псевдонимом: numfilb (если филиал один - можно поле в к.ч. не заводить, а указать номер филиала в запросе)
int cntRowOnWshSber=50;
//***настройки для формирования файлов. 
int ShortNameOrg=1;       /*  Поступила информация, что сбербанк просит указывать краткое наименование(если краткое заполнено, то берем его)
                          1- передавать краткое наименование
                          2- передавать полное наименование  */
                          
int isRezident=1;         /*  Настройка для определения статуса (резидент/нерезидент)
                          на данный момент не понятно по какому признаку определять статус...

                          1-определяем резидентов по коду паспорта (если 21 - резидент, все остальные нерезиденты)  
                          2-определяем резидентов по коду паспорта (если 10 - нерезидент, все остальные резиденты)*/
                          
int Format=1;             /*  Формат передачи для полей "место рождения" и "пол"
                          1-Передавать как в "Dat_inp" (набивалка от сбербанка)
                          2-Передавать как в описании формата            
                          */

/*Временно закомментил эти настройки и ввел одну общую настройку  "Format"                         
int FormatMestoRogd=1;    
                          1-Передавать место рождения строкой (как в описании формата)            
                          2-Передавать как в "Dat_inp" (набивалка от сбербанка)
                          
int FormatPol=1;          
                          1-Пол - мужской = латинская M (от male), женский = латинская F (от female) (как в описании формата)            
                          2-Передавать как в "Dat_inp" (набивалка от сбербанка)
                          */
//***настройки для формирования файлов.

//запрос номера ОСБ и филиала
ZaprOsb()
{
  //в к.ч. нет полей 
  if ((kch_num_sys("numbank")==-1)&&(kch_num_sys("numfilb")==-1))
  {
    string Title="Введите дополнительные данные ";
    string WorkFile=GetFileNameForGlobalData();
    //файла еще нет -> надо вывести запрос
    if (LoadGlobalData(WorkFile)==-1 )
    {
      while(1)
      {
        if (RequestGlobalData(Title,"summ")==ESC)
        {
          NOsb="";
          FOsb="";
          return ESC;
        }
        //номер ОСБ указали -> выходим
        if (atoi(NOsb)!=0) break;
        Title="Не указан номер ОСБ!!!";
      }
    }
    else if (atoi(NOsb)==0)
    //файл есть, но номер ОСБ не указан
    {
      while(1)
      {
        if (RequestGlobalData(Title,"summ")==ESC)
        {
          NOsb="";
          FOsb="";
          return ESC;
        }
        //номер ОСБ указали -> выходим
        if (atoi(NOsb)!=0) break;
        Title="Не указан номер ОСБ!!!";
      }
    }
    SaveGlobalData(WorkFile);  
  }
}
//Запрос вида карты и категории населения
string VidVklad ="";
int KategNas=207;
TipVklad()
{ 
  //запрос параметров списка на открытие счетов
  var NetD=NetDialogs();
  if (!IsObject(NetD))
    return ESC;
  string str=NetD.RequestForSberbankOpenCards(MainWindow());
  if (str=="" || !GetValueFromStr(str)) return ESC;
  return 1;
}
GetValueFromStr(str)
{
  /*на входе получаем строку, в которой через разделитель ";" идут:
  Вид карты                 VidVklad
  Категория населения       KategNas
  Признак зарплатной карты  SignSalaryCard
  Тариф на текущий год      RateForCurrentYear
  Тариф на следующий год    RateForNextYear
  */
  var Par = CreateObject("ParamFuncRW");
  Par.IInitial(static_cast_to_string(str),";",99);
  int cntPar=Par.Count();
  //пришла пустая строка - ничего не делаем
  if (!cntPar) return 0;

  //пишем выбраное значение в файл с настройками
  string WorkFile=GetFileNameForGlobalData();
  LoadGlobalData(WorkFile);
  
  VidVklad=Par.Get(0);
  TipOtkrKart=VidVklad; 
  if (Par.Count()>1) KategNas=atoi(Par.Get(1));
  CategoryOfPopulation=KategNas;
  if (Par.Count()>2) SignSalaryCard=Par.Get(2);
  if (Par.Count()>3) sprintf(RateForCurrentYear,"%15.2f",atof(Par.Get(3)));
  if (Par.Count()>4) sprintf(RateForNextYear   ,"%15.2f",atof(Par.Get(4)));

  SaveGlobalData(WorkFile);  
  return 1;
}
GetOrgDetails(&Org,&Inn)
{
  char str[256];
  GetEnterpriseVar("ИМЯП", Org,100); // Наименование предприятия или отделения иностранной организации
  FreeSpaceString(Org,2,""); OemToChar(Org,Org);
  if(ShortNameOrg==1)
  {
    GetEnterpriseVar("ИМЯП2", str,100); // Наименование предприятия или отделения иностранной организации
    FreeSpaceString(str,2,"");
    if (strlen(str))
    {
      Org=str;
      OemToChar(Org,Org);
    }
  }
  GetEnterpriseVar("ИНН", Inn,22); 
  FreeSpaceString(Inn,2,""); 
  
  /*GetEnterpriseVar("РСЧ",Schet,20); 
  FreeSpaceString(Schet,2,""); 
  
  GetEnterpriseVar("БИК",Bik,9); 
  FreeSpaceString(Bik,2,""); */
  
  GetEnterpriseVar("АДРПФ",str,255); 
  FreeSpaceString(str,2,""); 
  adresPr=str;
}
PanelVZa4(&rez)
{
  var MapVZa4 = CreateObject("MapString");
  MapVZa4.Add("01","Заработная плата");
  MapVZa4.Add("02","Стипендия учащимся");
  MapVZa4.Add("03","Пенсия социальная");
  MapVZa4.Add("04","Пенсия негосударственных пенсионных фондов");
  MapVZa4.Add("05","Пособия и другие выплаты по безработице");
  MapVZa4.Add("06","Пособия на детей");
  MapVZa4.Add("07","Прочие выплаты");
  MapVZa4.Add("08","Аванс по заработной плате");

  string Title = "Выберите вид зачисления";
  var MapRez = CreateObject("MapString");
  if ( PanelValueFromMap(MapVZa4,MapRez,1,Title) == ESC )
     return -1;
  if ( !MapRez.InitIterator() )
     return -1;
  rez=MapRez.GetCurKey();
  return 0;
}
//***Формирование файла xml на зачисление сумм
ToSB_SumXML(AdrCTabl, AdrCListTabl, RcrInList)
{
  CodEnterprise=GetCodEnterprise(AdrCListTabl, RcrInList);
  //создаем объект для работы с таблицей
  var Tabl = CreateObject("CurPrnTbl");
  Tabl.Initial(AdrCTabl); 
 
  //определяем номера полей в таблице
  if ( !FillFld(Tabl) ) return false; 
  int count_rec=Tabl.Count_Rcr();

  try
  {
    var XMLDoc= CreateXMLobj();
    var XMLDoc1 = CreateElemXML(XMLDoc,OemToAnsi("СчетаПК"));
    XMLDoc.documentElement= XMLDoc1;

    char Org[256],Inn[256];
    GetOrgDetails(Org,Inn);
    
    string WorkFile=GetFileNameForGlobalData();
    LoadGlobalData(WorkFile);

    
    XMLDoc1.setAttribute(OemToAnsi("ДатаФормирования"),static_cast_to_string(ModifDate(datatek)));
    XMLDoc1.setAttribute(OemToAnsi("НомерДоговора"),static_cast_to_string(nDogovor));
    XMLDoc1.setAttribute(OemToAnsi("ДатаДоговора"),static_cast_to_string(ModifDate(dDogovor)));
    XMLDoc1.setAttribute(OemToAnsi("НаименованиеОрганизации"),static_cast_to_string(Org));
    XMLDoc1.setAttribute(OemToAnsi("ИНН"),static_cast_to_string(Inn));
    {
      if (writeBikAndSchet)
      {
        XMLDoc1.setAttribute(OemToAnsi("РасчетныйСчетОрганизации"),static_cast_to_string(Schet));
        XMLDoc1.setAttribute(OemToAnsi("БИК"),static_cast_to_string(Bik));
      }
    }
    XMLDoc1.setAttribute(OemToAnsi("ИдПервичногоДокумента"),GetStrGUID());
    XMLDoc1.setAttribute(OemToAnsi("НомерРеестра"),to_string(NNN));
    XMLDoc1.setAttribute(OemToAnsi("ДатаРеестра"),to_string(ModifDate(dNNN)));

    var XMLZaZarp = CreateElemXML(XMLDoc,OemToAnsi("ЗачислениеЗарплаты"));

    int bTime  = false; // false-показывать процент,
                        // true-показывать оставшееся время
    //Инициализируем ProgressBar
    var CMsg  = CreateObject("ProgressBar");
    CMsg.Initial(0,100,1);
    CMsg.SetShowTime(static_cast_to_int(bTime));


    int NomerOsb=atoi(NOsb);
    int nomPP=0;
    char str[256];
    double ItogSum = 0;

    for (int zap=0; zap<count_rec; zap++)
    {
      if ( CMsg.Msg_Proc(" Подождите немного. Идет формирование файла.",100.*(zap+1)/count_rec)==ESC )
          return false;

      if (!Tabl.Flag_Action_1(zap) || atoi(Tabl.Text(fld[idxNomOsb],zap))!=NomerOsb) continue;
      nomPP++;

      var XMLSotr = CreateChildElemXML(XMLDoc,XMLZaZarp,OemToAnsi("Сотрудник"));
      XMLSotr.setAttribute(OemToAnsi("Нпп"),static_cast_to_string(nomPP));

      var XMLF = CreateChildElemXML(XMLDoc,XMLSotr,OemToAnsi("Фамилия"));
      str = Tabl.Text(fld[idxFam],zap); FreeSpaceString(str,2,"");
      XMLF.text = OemToAnsi(str);

      var XMLI = CreateChildElemXML(XMLDoc,XMLSotr,OemToAnsi("Имя"));
      str = Tabl.Text(fld[idxIm],zap); FreeSpaceString(str,2,"");
      XMLI.text = OemToAnsi(str);

      var XMLO = CreateChildElemXML(XMLDoc,XMLSotr,OemToAnsi("Отчество"));
      str = Tabl.Text(fld[idxOtch],zap); FreeSpaceString(str,2,"");
      XMLO.text = OemToAnsi(str);

      var XMLNomOsb = CreateChildElemXML(XMLDoc,XMLSotr,OemToAnsi("ОтделениеБанка"));
      XMLNomOsb.text = static_cast_to_string(NOsb);
       
      if (atoi(FOsb))
      {      
        var XMLNFilB = CreateChildElemXML(XMLDoc,XMLSotr,OemToAnsi("ФилиалОтделенияБанка"));
        XMLNFilB.text = static_cast_to_string(FOsb);
      }
      
      var XMLBankCard = CreateChildElemXML(XMLDoc,XMLSotr,OemToAnsi("ЛицевойСчет"));
      str = Tabl.Text(fld[idxBankCard],zap); FreeSpaceString(str,2,"");
      XMLBankCard.text = static_cast_to_string(str);

      var XMLSumm = CreateChildElemXML(XMLDoc,XMLSotr,OemToAnsi("Сумма"));
      str = Tabl.Text(fld[idxSumm],zap); FreeSpaceString(str,2,"");
      XMLSumm.text = static_cast_to_string(str);
      ItogSum += atof(str);
    }
    XMLDoc.documentElement.appendChild(XMLZaZarp);

    if(GetCommonCnfInt("unLoadPlat","sberbank")==1)
    {     
      var Plat = CreateElemXML(XMLDoc,OemToAnsi("ПлатежноеПоручение"));
      Plat.text = static_cast_to_string(nPlat);
      XMLDoc.documentElement.appendChild(Plat);
      
      Plat = CreateElemXML(XMLDoc,OemToAnsi("ДатаПлатежногоПоручения"));
      Plat.text = static_cast_to_string(ModifDate(dPlat));
      XMLDoc.documentElement.appendChild(Plat);
    }

    { //ВидЗачисления 
      int vidZach=-1;
      string codeZach="";
      if(GetCommonCnfInt("askVidZach","sberbank")==1) vidZach=PanelVZa4(codeZach);
      if(vidZach!=-1)
      {
        var vidZ = CreateElemXML(XMLDoc,OemToAnsi("ВидЗачисления"));
        vidZ.text = OemToAnsi(codeZach);
        XMLDoc.documentElement.appendChild(vidZ);
      }
    }
    
    var XMLKontrSumm = CreateElemXML(XMLDoc,OemToAnsi("КонтрольныеСуммы"));
    var XMLKol = CreateChildElemXML(XMLDoc,XMLKontrSumm,OemToAnsi("КоличествоЗаписей"));
    XMLKol.text = static_cast_to_string(nomPP);
    var XMLSumm = CreateChildElemXML(XMLDoc,XMLKontrSumm,OemToAnsi("СуммаИтого"));
    sprintf(str,"%.2f",ItogSum);
    XMLSumm.text = static_cast_to_string(str);
    XMLDoc.documentElement.appendChild(XMLKontrSumm);

    //формируем имя файла
    char NameFile[256];
    var OptionsTR = CreateObject("TransferOptions");
    stccpy(NameFile,OptionsTR.GetNameFile(),256);
    FreeSpaceString(NameFile,3," ");

    str=NameFile;
    mkdirAll(str);//создаем каталог если его нет

    char Path[256];
    Path=str;
    if ( Path[0]=='.' && Path[1]=='.' )
    {
      fullpath(Path,Path,255);
      FreeSpaceString(Path,3,"");
      str=Path;
    }
    if (!SaveFileXMLFine(XMLDoc,str," "))
    {   
      AmbaMessageBox("Невозможно сохранить файл "+NameFile,"ошибка",0, 0);
      return false;
    }
 }
  catch(object err)
  {
    SayError(err);
    return 0;
  }
  catch(...)
  {
    SayUndefinedScriptError();
    return 0;
  }
  return 1;
}
int CodEnterprise=0;
GetCodEnterprise(AdrCListTabl, RcrInList)
{
  var ListTabl = CreateObject("CurPrnTbl");
  ListTabl.Initial(AdrCListTabl);
  int fld=ListTabl.Find_Name_Fld("NumDep");
  if(fld==-1) return 0;
  
  string orgstr = ListTabl.Text(fld,RcrInList);
  string buf=SubStr(orgstr,0,4);
  if ( !Str_Cmp(buf,"Орг."," ") )
    return atoi(SubStr(orgstr,4));
  return 0;
}
SaveCodEnterprise(&__VarL,AdrCListTabl, RcrInList)
{
  __VarL=GetCodEnterprise(AdrCListTabl, RcrInList);
}
//***Формирование файла xml на открытие счетов
ToSB_OtkrXML(AdrCTabl, AdrCListTabl, RcrInList)
{
  CodEnterprise=GetCodEnterprise(AdrCListTabl, RcrInList);
  //создаем объект для работы с таблицей
  var Tabl = CreateObject("CurPrnTbl");
  Tabl.Initial(AdrCTabl);
  int count_rec=Tabl.Count_Rcr();
  if ( !FillFldO(Tabl) ) return false; //определяем необходимые нам номера полей
  try
  {
    char Org[256],Inn[256];
    GetOrgDetails(Org,Inn);
        
    string WorkFile=GetFileNameForGlobalData();
    LoadGlobalData(WorkFile);
        
    var XMLDoc= CreateXMLobj();
    XMLDoc.documentElement=CreateElemXML(XMLDoc,OemToAnsi("СчетаПК")); //корневой элемент

    XMLDoc.documentElement.setAttribute(OemToAnsi("ДатаФормирования"),static_cast_to_string(ModifDate(datatek)));
    XMLDoc.documentElement.setAttribute(OemToAnsi("НомерДоговора"),static_cast_to_string(nDogovor));
    XMLDoc.documentElement.setAttribute(OemToAnsi("ДатаДоговора"),static_cast_to_string(ModifDate(dDogovor)));
    XMLDoc.documentElement.setAttribute(OemToAnsi("НаименованиеОрганизации"),static_cast_to_string(Org));
    XMLDoc.documentElement.setAttribute(OemToAnsi("ИНН"),static_cast_to_string(Inn));
    if(writeBikAndSchet)
    {
      XMLDoc.documentElement.setAttribute(OemToAnsi("РасчетныйСчетОрганизации"),static_cast_to_string(Schet));
      XMLDoc.documentElement.setAttribute(OemToAnsi("БИК"),static_cast_to_string(Bik));
    }
    var XMLElemOtkr = CreateChildElemXML(XMLDoc,XMLDoc.documentElement,OemToAnsi("ОткрытиеСчетов"));
    int bTime  = false; // false-показывать процент,
                        // true-показывать оставшееся время
    //Инициализируем ProgressBar
    var CMsg  = CreateObject("ProgressBar");
    CMsg.Initial(0,100,1);
    CMsg.SetShowTime(static_cast_to_int(bTime));
    
    string scrf="BANK\\sbrbank4"; UnloadScriptModule(scrf); LoadScriptModule(scrf);
    char str[256];    
    int nomPP=0;
    //цикл по строкам таблицы
    for (int zap=0; zap<count_rec; zap++)
    {
      if ( CMsg.Msg_Proc(" Подождите немного. Идет формирование файла.",100.*(zap+1)/count_rec)==ESC )
          return false;

      if (!Tabl.Flag_Action_1(zap)) continue;
      nomPP++;

      var XMLElemSotr = CreateChildElemXML(XMLDoc,XMLElemOtkr,OemToAnsi("Сотрудник"));
      XMLElemSotr.setAttribute(OemToAnsi("Нпп"),static_cast_to_string(nomPP));
      
      var XMLElem = CreateChildElemXML(XMLDoc,XMLElemSotr,OemToAnsi("Фамилия"));
      str = Tabl.Text(Ofld[OidxF],zap); FreeSpaceString(str,2,"");
      SetValueElemXML(XMLElem,OemToAnsi(str));
      
      XMLElem = CreateChildElemXML(XMLDoc,XMLElemSotr,OemToAnsi("Имя"));
      str = Tabl.Text(Ofld[OidxI],zap); FreeSpaceString(str,2,"");
      SetValueElemXML(XMLElem,OemToAnsi(str));
      
      XMLElem = CreateChildElemXML(XMLDoc,XMLElemSotr,OemToAnsi("Отчество"));
      str = Tabl.Text(Ofld[OidxO],zap); FreeSpaceString(str,2,"");
      SetValueElemXML(XMLElem,OemToAnsi(str));
      
      XMLElem= CreateChildElemXML(XMLDoc,XMLElemSotr,OemToAnsi("ОтделениеБанка"));
      SetValueElemXML(XMLElem,OemToAnsi(NOsb));
      
      if (atoi(FOsb))
      {
        XMLElem= CreateChildElemXML(XMLDoc,XMLElemSotr,OemToAnsi("ФилиалОтделенияБанка"));
        SetValueElemXML(XMLElem,OemToAnsi(FOsb));
      }
      
      XMLElem= CreateChildElemXML(XMLDoc,XMLElemSotr,OemToAnsi("ВидВклада"));
      str=Tabl.Text(Ofld[OidxVidV],zap);FreeSpaceString(str,2,"");
      var Par = CreateObject("ParamFuncRW");
      Par.IInitial1(static_cast_to_string(str),"/",99); //разбиваем строку вида "XX/У" на элементы "XX" и "Y" 
      if (Par.Count()>1)
      {
        XMLElem.setAttribute(OemToAnsi("КодВидаВклада"),static_cast_to_string(Par.Get(0)));
        XMLElem.setAttribute(OemToAnsi("КодПодвидаВклада"),static_cast_to_string(Par.Get(1)));
      }
      XMLElem.setAttribute(OemToAnsi("КодВалюты"),static_cast_to_string("810"));
      
      XMLElem= CreateChildElemXML(XMLDoc,XMLElemSotr,OemToAnsi("МобильныйТелефон"));
      str = Tabl.Text(Ofld[OidxMobTel],zap); FreeSpaceString(str,2,"");
      SetValueElemXML(XMLElem,OemToAnsi(str));
      
      XMLElem= CreateChildElemXML(XMLDoc,XMLElemSotr,OemToAnsi("КонтрольнаяИнформация"));
      str = Tabl.Text(Ofld[OidxKontrInfo],zap); FreeSpaceString(str,2,"");
      SetValueElemXML(XMLElem,OemToAnsi(str));
      
      XMLElem= CreateChildElemXML(XMLDoc,XMLElemSotr,OemToAnsi("СНИЛС"));
      str = Tabl.Text(Ofld[OidxSnils],zap); FreeSpaceString(str,2,"");
      SetValueElemXML(XMLElem,OemToAnsi(str));
      
      XMLElem= CreateChildElemXML(XMLDoc,XMLElemSotr,OemToAnsi("КатегорияНаселения"));
      str = Tabl.Text(Ofld[OidxKategor],zap); FreeSpaceString(str,2,"");
      SetValueElemXML(XMLElem,OemToAnsi(str));
      
      XMLElem= CreateChildElemXML(XMLDoc,XMLElemSotr,OemToAnsi("ПризнакЗарплатный"));
      str =SignSalaryCard;   FreeSpaceString(str,2,"");
      SetValueElemXML(XMLElem,OemToAnsi(str));
      
      XMLElem= CreateChildElemXML(XMLDoc,XMLElemSotr,OemToAnsi("ТарифТекущийГод"));
      str = RateForCurrentYear; FreeSpaceString(str,2,"");
      SetValueElemXML(XMLElem,OemToAnsi(str));
      
      XMLElem= CreateChildElemXML(XMLDoc,XMLElemSotr,OemToAnsi("ТарифСледующийГод"));
      str = RateForNextYear; FreeSpaceString(str,2,"");
      SetValueElemXML(XMLElem,OemToAnsi(str));
      
      { //ПАСПОРТ
        var XMLElemPasp= CreateChildElemXML(XMLDoc,XMLElemSotr,OemToAnsi("УдостоверениеЛичности"));
        XMLElem= CreateChildElemXML(XMLDoc,XMLElemPasp,OemToAnsi("ВидДокумента"));
        str = Tabl.Text(Ofld[OidxNameDoc],zap); FreeSpaceString(str,2,"");
        SetValueElemXML(XMLElem,OemToAnsi(str));
        
        XMLElem= CreateChildElemXML(XMLDoc,XMLElemPasp,OemToAnsi("Серия"));
        str = Tabl.Text(Ofld[OidxSerDoc],zap); FreeSpaceString(str,2,"");
        SetValueElemXML(XMLElem,OemToAnsi(str));
        
        XMLElem= CreateChildElemXML(XMLDoc,XMLElemPasp,OemToAnsi("Номер"));
        str = Tabl.Text(Ofld[OidxNomDoc],zap); FreeSpaceString(str,2,"");
        SetValueElemXML(XMLElem,OemToAnsi(str));
        
        XMLElem= CreateChildElemXML(XMLDoc,XMLElemPasp,OemToAnsi("ДатаВыдачи"));
        str = Tabl.Text(Ofld[OidxDateDoc],zap); FreeSpaceString(str,2,"");
        SetValueElemXML(XMLElem,OemToAnsi(ModifDate(str)));
        
        XMLElem= CreateChildElemXML(XMLDoc,XMLElemPasp,OemToAnsi("КемВыдан"));
        str = Tabl.Text(Ofld[OidxKemDoc],zap); FreeSpaceString(str,2,"");
        SetValueElemXML(XMLElem,OemToAnsi(str));
        
        XMLElem= CreateChildElemXML(XMLDoc,XMLElemPasp,OemToAnsi("КодПодразделения"));
        str = Tabl.Text(Ofld[OidxKodPodrDoc],zap); FreeSpaceString(str,2,"");
        SetValueElemXML(XMLElem,OemToAnsi(str));
        
        XMLElem= CreateChildElemXML(XMLDoc,XMLElemPasp,OemToAnsi("КодВидаДокумента"));
        str = Tabl.Text(Ofld[OidxKodDoc],zap); FreeSpaceString(str,2,"");
        SetValueElemXML(XMLElem,OemToAnsi(str));
      }
      
      XMLElem= CreateChildElemXML(XMLDoc,XMLElemSotr,OemToAnsi("ДатаРождения"));
      str = Tabl.Text(Ofld[OidxFCdr],zap); FreeSpaceString(str,2,"");
      SetValueElemXML(XMLElem,OemToAnsi(ModifDate(str)));
      
      XMLElem= CreateChildElemXML(XMLDoc,XMLElemSotr,OemToAnsi("Пол"));
      str = Tabl.Text(Ofld[OidxFCpol],zap); FreeSpaceString(str,2,"");
      SetValueElemXML(XMLElem,OemToAnsi(ModifPol(str)));
      
      AddAdresToXML(XMLDoc,XMLElemSotr,"АдресМестаРаботы",adresPr);
      
      XMLElem= CreateChildElemXML(XMLDoc,XMLElemSotr,OemToAnsi("Должность"));
      str = Tabl.Text(Ofld[OidxDolgn],zap); FreeSpaceString(str,2,"");
      SetValueElemXML(XMLElem,OemToAnsi(str));
      
      str=Tabl.Text(Ofld[OidxAdres_reg],zap);
      AddAdresToXML(XMLDoc,XMLElemSotr,"АдресПрописки",str);
      
      str=Tabl.Text(Ofld[OidxAdres_fact],zap);FreeSpaceString(str,2,"");
      //если адрес факт не указан - берем вместо него адрес регистрации
      if(strlen(str)==0) str=Tabl.Text(Ofld[OidxAdres_reg],zap);
      AddAdresToXML(XMLDoc,XMLElemSotr,"АдресПроживания",str);

      XMLElem= CreateChildElemXML(XMLDoc,XMLElemSotr,OemToAnsi("ЭмбоссированныйТекст"));
      str= Tabl.Text(Ofld[OidxI],zap); FreeSpaceString(str,2,"");
      RusToTransSB(str,19,str);FreeSpaceString(str,2,"");
      XMLElem.setAttribute(OemToAnsi("Поле1"),static_cast_to_string(str));
      str= Tabl.Text(Ofld[OidxF],zap); FreeSpaceString(str,2,"");
      RusToTransSB(str,19,str);FreeSpaceString(str,2,"");
      XMLElem.setAttribute(OemToAnsi("Поле2"),static_cast_to_string(str));
      
      XMLElem= CreateChildElemXML(XMLDoc,XMLElemSotr,OemToAnsi("Резидент"));
      if(isRezident==1)
      {
        //определяем резидентов по коду паспорта (если 21 - резидент)
        if(atoi(Tabl.Text(Ofld[OidxKodDoc],zap))==21) SetValueElemXML(XMLElem,"true");
        else SetValueElemXML(XMLElem,"false");
      }
      else
      { 
        //определяем резидентов по коду паспорта (если 10 - нерезидент)
        if(atoi(Tabl.Text(Ofld[OidxKodDoc],zap))==10) SetValueElemXML(XMLElem,"false");
        else SetValueElemXML(XMLElem,"true");
      }
      
      XMLElem= CreateChildElemXML(XMLDoc,XMLElemSotr,OemToAnsi("МестоРождения"));
      if (Format!=1)
      {
  //     sprintf(str,"%s,%s,%s,%s",Tabl.Text(Ofld[OidxStrana_r],zap),Tabl.Text(Ofld[OidxObl_r],zap),Tabl.Text(Ofld[OidxRaion_r],zap),Tabl.Text(Ofld[OidxGorod_r],zap));FreeSpaceString(str,2,"");
        char tmp[256];
        str=Tabl.Text(Ofld[OidxGorod_r],zap); FreeSpaceString(str,3,"");
        tmp=Tabl.Text(Ofld[OidxRaion_r],zap); FreeSpaceString(tmp,3,"");
        if ( tmp!="" ) str += ","+tmp;
        tmp=Tabl.Text(Ofld[OidxObl_r],zap); FreeSpaceString(tmp,3,"");
        if ( tmp!="" ) str += ","+tmp;
        tmp=Tabl.Text(Ofld[OidxStrana_r],zap); FreeSpaceString(tmp,3,"");
        if ( tmp!="" ) str += ","+tmp;
        SetValueElemXML(XMLElem,OemToAnsi(str));
      }
      else
      {
        var XMLElemChild=CreateChildElemXML(XMLDoc,XMLElem,OemToAnsi("Регион"));
        CreateChildElemXML(XMLDoc,XMLElemChild,OemToAnsi("РегионНазвание"));
        XMLElemChild=CreateChildElemXML(XMLDoc,XMLElem,OemToAnsi("Район"));
        CreateChildElemXML(XMLDoc,XMLElemChild,OemToAnsi("РайонНазвание"));
        XMLElemChild=CreateChildElemXML(XMLDoc,XMLElem,OemToAnsi("НаселенныйПункт"));
        XMLElemChild=CreateChildElemXML(XMLDoc,XMLElemChild,OemToAnsi("НаселенныйПунктНазвание"));
        str=Tabl.Text(Ofld[OidxGorod_r],zap); FreeSpaceString(str,3,"");
        SetValueElemXML(XMLElemChild,OemToAnsi(str));
      }
      
      XMLElem= CreateChildElemXML(XMLDoc,XMLElemSotr,OemToAnsi("Гражданство"));
      char CountryName[140];;
      GetValueClassif("T_GUIDE\\country.tab",Tabl.Text(Ofld[OidxFCcitizen],zap),CountryName,120,"NAME","KOD");
      FreeSpaceString(CountryName,2,"");
      SetValueElemXML(XMLElem,OemToAnsi(CountryName));
      }
    
    UnloadScriptModule(scrf);
    var XMLElemKSumm = CreateChildElemXML(XMLDoc,XMLDoc.documentElement,OemToAnsi("КонтрольныеСуммы"));
    var XMLElemKolZap= CreateChildElemXML(XMLDoc,XMLElemKSumm,OemToAnsi("КоличествоЗаписей"));
    SetValueElemXML(XMLElemKolZap,static_cast_to_string(nomPP));
    //формируем имя файла
    char NameFile[256];
    var OptionsTR = CreateObject("TransferOptions");
    stccpy(NameFile,OptionsTR.GetNameFile(),256);
    FreeSpaceString(NameFile,3," ");


    str=NameFile;
    mkdirAll(str);//создаем каталог если его нет

    char Path[256];
    Path=str;
    if ( Path[0]=='.' && Path[1]=='.' )
    {
      fullpath(Path,Path,255);
      FreeSpaceString(Path,3,"");
      str=Path;
    }
    if (!SaveFileXMLFine(XMLDoc,str," "))
    {   
      AmbaMessageBox("Невозможно сохранить файл "+NameFile,"ошибка",0, 0);
      return false;
    }
  }
  catch(object err)
  {
    SayError(err);
    return 0;
  }
  catch(...)
  {
    SayUndefinedScriptError();
    return 0;
  }
  return 1;
}
//***Импорт карт из файла xml
ImportCardXML(AdrCTabl, AdrCListTabl, RcrInList)
{
  var Tabl = CreateObject("CurPrnTbl");
  Tabl.Initial(AdrCTabl);
  if ( !FillFldI(Tabl) ) return false; //определяем необходимые нам номера полей
  Tabl.Clear();
  
  //имя файла, указанное пользователем
  var OptionsTR = CreateObject("TransferOptions");
  char NameFile[256];
  stccpy(NameFile,OptionsTR.GetNameFile(),255);
  FreeSpaceString(NameFile,3,"");
  
  var Date = CreateObject("KDate");
  Date.SetDateII(1,mtek);
  try
  {
     //файл не нашли-> выходим
    if (access(NameFile,0)==-1) {AmbaMessageBox("Указанный файл не найден","Ошибка!",0,0);return -1;}

    var XMLDoc =CreateXMLobj();
    LoadFileXML(XMLDoc,NameFile); //грузим данные из XML
    
    var XMLRoot=XMLDoc.documentElement; //корневой элемент
    
    //проверяем - правильный ли файл выбрал пользователь? (проверка по наличию тега РезультатОткрытияСчетов)
    bool bNew=false;
    GetElemXMLByName(XMLDoc,XMLRoot,OemToAnsi("РезультатОткрытияСчетов"),bNew);
    if (bNew)
    {
      char tmp[256];
      sprintf(tmp,"В файле %s нет данных об открытии карт",NameFile);
      AmbaMessageBox(static_cast_to_string(tmp),"Ошибка",MB_OK|MB_ICONERROR,0);
      return;
    }
 
    var XMLSortList=XMLRoot.getElementsByTagName(OemToAnsi("Сотрудник")); //список сотрудников в файле с результатами открытия лицевых счетов
    
    var MapCard = CreateObject("MapString"); //ключ - Ф_И_О_серия_номер паспорта;значение - номер карты (данные в DOS кодировке)
    MapCard.Clear();
    
    //заполняем MapCard--->
    var CMsg  = CreateObject("ProgressBar");
    CMsg.Initial(0,100,5);
    CMsg.SetShowTime(static_cast_to_int(0));
    
    int cntRcr=XMLSortList.length();  //кол-во сотрудников в файле
    int ii=0;                         //порядковый номер
    
    //цикл по элементам "Сотрудник"
    for(int i=0; i<cntRcr; i++ )
    {
      ii++;
      if (CMsg.Msg_Proc(("Подождите немного. Идет обработка файла"),100.*ii/cntRcr)==ESC )   
      {
        MapCard=GetEmpty();
        return 0; 
      } 

      var XMLSotr =XMLSortList.item(i); //очередной сотрудник из списка XMLSortList

      //определяем данные по сотруднику
      string fam  =XMLSotr.getElementsByTagName(OemToAnsi("Фамилия"    )).item(0).text; FreeSpaceString(fam  ,2,"");
      string im   =XMLSotr.getElementsByTagName(OemToAnsi("Имя"        )).item(0).text; FreeSpaceString(im   ,2,""); 
      string otch =XMLSotr.getElementsByTagName(OemToAnsi("Отчество"   )).item(0).text; FreeSpaceString(otch ,2,"");
      string card =XMLSotr.getElementsByTagName(OemToAnsi("ЛицевойСчет")).item(0).text; FreeSpaceString(card ,2,"");
      string seria=XMLSotr.getElementsByTagName(OemToAnsi("Серия"      )).item(0).text; FreeSpaceString(seria,2,"");
      string nomer=XMLSotr.getElementsByTagName(OemToAnsi("Номер"      )).item(0).text; FreeSpaceString(nomer,2,"");
      
      char key[256];  sprintf(key,"%s_%s_%s_%s_%s",fam,im,otch,seria,nomer);
      CharToOem(key,key); //преобразуем в DOS кодировку
      UpperString(key);   //преобразуем в верхний регистр
      MapCard.Add(static_cast_to_string(key),static_cast_to_string(card));
    }
    //заполняем MapCard<---
    
    var MapTN = CreateObject("MapString"); //ключ - Ф_И_О_серия_номер паспорта;значение - ТН сотрудника
    MapTN.Clear();
    
    CMsg.Initial(0,100,5);
    //заполняем MapTN--->
    ii=0;
    for(int i=0;i<counttn;i++)
    {
      ii++;
      if (CMsg.Msg_Proc(("Подождите немного. Идет поиск ТН для сотрудников"),100.*ii/counttn)==ESC )   
      {
        MapCard=GetEmpty();
        MapTN=GetEmpty();
        return 0; 
      }
      int tnum=tn(i)%sizetn;
      int RC=LSReadTN(tnum, 1);
      if ( !RC || RC==ESC ) continue;
      char buf[256];
      
      kch_from("f",buf);
      string fam= buf; FreeSpaceString(fam,2,"");
      
      kch_from("i",buf);
      string im=  buf; FreeSpaceString(im,2,"");
      
      kch_from("o",buf);
      string otch=buf;FreeSpaceString(otch,2,"");
      
      kch_from("pasport",buf);FreeSpaceString(buf,2,"");
      var objP=CreateObject("Pasport");  //объект для работы с паспортом
      objP.Initial(static_cast_to_string(buf)); //инициализируем объект

      string seria=objP.GetSeries(); FreeSpaceString(seria,2,"");
      string nomer=objP.GetNumber(); FreeSpaceString(nomer,2,"");
      
      char key[256];  sprintf(key,"%s_%s_%s_%s_%s",fam,im,otch,seria,nomer);
      UpperString(key);   //преобразуем в верхний регистр
      MapTN.Add(static_cast_to_string(key),static_cast_to_string(tnum));
    }
    //заполняем MapTN<---
    
    CMsg.Initial(0,100,5);
    ii=0;
    bool bNeedAddRcr = false; // т.к. первая строка есть и она пустая
    //заполняем таблицу данными --->
    //(для тех сотрудников, по которым не удалось определись ТН в качестве значения ТН ставим 0, чтобы можно было проставить ТН ручками)
    for (bool Cur=MapCard.InitIterator();Cur;Cur=MapCard.Next())
    {
      ii++;
      if (CMsg.Msg_Proc(("Подождите немного. Идет поиск ТН для сотрудников"),100.*ii/MapCard.Size())==ESC )   
      {
        MapCard=GetEmpty();
        MapTN=GetEmpty();
        return 0; 
      }
      
      char key[256];key=MapCard.GetCurKey();
      var Par = CreateObject("ParamFuncRW");
      Par.IInitial1(static_cast_to_string(key),"_",99); //разбиваем строку на элементы 
      //определяем данные по сотруднику
      string fam  =Par.Get(0);
      string im   =Par.Get(1); 
      string otch =Par.Get(2);
      string seria=Par.Get(3);
      string nomer=Par.Get(4);
      
      string card =MapCard.GetCurValue();
      
      int CurRcr = Tabl.Count_Rcr()-1;
      // Добавляем, если надо, строку (первая строка есть и она пустая)
      if ( bNeedAddRcr && Tabl.Add_Rcr(CurRcr++,1)==-1 ) return 0;
      bNeedAddRcr =true;
      
      int tn=0;
      //если для данного ключа нашли в MapTN элемент - достаем значение ТН
      if (MapTN.IsExist(static_cast_to_string(key))) tn=atoi(MapTN.GetValue(static_cast_to_string(key)));
      //заполняем строку CurRcr данными по сотруднику
      Tabl.SText(Ifld[IidxTN]        ,CurRcr,static_cast_to_string(tn    ));
      Tabl.SText(Ifld[IidxF]         ,CurRcr,static_cast_to_string(fam   ));
      Tabl.SText(Ifld[IidxI]         ,CurRcr,static_cast_to_string(im    ));
      Tabl.SText(Ifld[IidxO]         ,CurRcr,static_cast_to_string(otch  ));
      Tabl.SText(Ifld[IidxSerDoc]    ,CurRcr,static_cast_to_string(seria ));
      Tabl.SText(Ifld[IidxNomDoc]    ,CurRcr,static_cast_to_string(nomer ));
      Tabl.SText(Ifld[IidxData]  ,CurRcr,static_cast_to_string(Date.GetStr()));
      Tabl.SText(Ifld[IidxBankCard]  ,CurRcr,static_cast_to_string(card  ));
    }
    //заполняем таблицу данными <---
    
  }
   catch(object err)
  {
    SayError(err);
    return 0;
  }
  catch(...)
  {
    SayUndefinedScriptError();
    return 0;
  }
  Tabl.Rewrite();
  return 1;
}
Print_xml_otkr(codCurOrg)
//печать реестра на открытие счетов
{
  CodEnterprise=atoi(codCurOrg);
  var CFile=CreateObject("CurPrnFile"); // объект класса для работы с текущим файлом печати
  CFile.SetFlagBrowse(0);
  CFile.SetFlag_Print(0);

  var CTabl=CreateObject("CurPrnTbl");  // объект класса для работы с текущей таблицей
  int cr=CTabl.Count_Rcr();         // число рабочих записей в таблице   

  char Dir[128];                              // строка для текущей директории
  GetCurrentDirectory(128,Dir);               // получаем текущую директорию (это корень каталога ZPL из которого запустили АМБу)
  string nm="\\"+NameCommonDir()+"\\sbr_xml_otkr.xlt";                        // имя Excel'евского файла

  char NameXlt[256];
  NameXlt = Dir+nm;
  
  // если шаблона нет, на лок.машине, и версия сетевая...то берем шаблон с
  // серверной машины
  if ( !IsLocalZPL() && IsCommonResource(NameCommonDir()) )
  {
    //берем путь к сетевому ZPL 
    GetCommonZPL(NameXlt,255);
    NameXlt = NameXlt+nm;
  }

  tPrepereOfficeForWork(); // определяем работать на Excel или на Calc (определяем какой из офисов (MS Office или OpenOffice) установлен и какой предпочтительнее)
  tCreateXlsObjects(static_cast_to_string(NameXlt),"Реестр на выпуск банковских карт"); // создание основных объектов
  try
  {
    tGetWshByIndex(1); // получаем ссылку на лист (worksheet)
    tWshSelect();

    var CMsg = 0;    // Процент выполненной работы
    int bTime = false;   // false-показывать процент,
                        // true-показывать оставшееся время
    CMsg=CreateObject("ProgressBar");
    CMsg.Initial(0,100,1);
    CMsg.SetShowTime(static_cast_to_int(bTime));
 
    if ( !FillFldO(CTabl) ) return false; //определяем необходимые нам номера полей

    string WorkFile=GetFileNameForGlobalData();
    LoadGlobalData(WorkFile);  

    tWriteStringToCell("I1",nDogovor);  //номер договора
    tWriteStringToCell("D2",NNN);       //номер реестра
    
    char str[256],value[256];
    var Par = CreateObject("ParamFuncRW");
    Par.IInitial1(static_cast_to_string(TipOtkrKart),"-",99); //разбиваем строку на элементы
    value=Par.Get(1);
    value+="(РУБ)";OemToChar(value,value);
    tWriteStringToCell("A3",value);  //тип карты
   
    char Org[256],Inn[256];
    GetOrgDetails(Org,Inn);
    
    str="Для сотрудников ";OemToChar(str,str);
    tWriteStringToCell("A4",str+Org); //название организации
    tWriteStringToCell("A20",Org);    //название организации
    
    int ShStr=8;
    int j=1;
    char nnn[256];
    int maxLen=25; //максимальная длина строки с паспортными данными (кем выдано может не влезть в колонку)
    // цикл по записям таблицы
    for (int zap=0; zap<cr; zap++)
    {
      // progress bar - чтобы видеть процент выполненной работы до того как появится результат
      if ( CMsg.Msg_Proc(" Подождите немного. Идет подготовка к печати. ",100.*zap/cr)==ESC )
      { 
         return 0;
      }

      // №
      sprintf(nnn,"A%d",ShStr);
      tWriteStringToCell(nnn,j);  

      // ФИО
      str=CTabl.Text(Ofld[OidxF],zap);
      FreeSpaceString(str,2,""); OemToChar(str,str);
      sprintf(nnn,"B%d",ShStr);
      tWriteStringToCell(nnn,str); 
      
      str=CTabl.Text(Ofld[OidxI],zap);
      FreeSpaceString(str,2,""); OemToChar(str,str);
      sprintf(nnn,"B%d",ShStr+1);
      tWriteStringToCell(nnn,str); 
      
      str=CTabl.Text(Ofld[OidxO],zap);
      FreeSpaceString(str,2,""); OemToChar(str,str);
      sprintf(nnn,"B%d",ShStr+2);
      tWriteStringToCell(nnn,str); 
      
      //паспортные данные
      str=CTabl.Text(Ofld[OidxNameDoc],zap);
      FreeSpaceString(str,2,""); OemToChar(str,str);
      char tmp[256];
      tmp = CTabl.Text(Ofld[OidxSerDoc],zap); FreeSpaceString(tmp,2,"");
      str+=" " +tmp; 
      tmp = CTabl.Text(Ofld[OidxNomDoc],zap); FreeSpaceString(tmp,2,"");
      str+=" " +tmp; 
      sprintf(nnn,"F%d",ShStr+0);
      tWriteStringToCell(nnn,str); 
      
      tmp = CTabl.Text(Ofld[OidxDateDoc],zap); FreeSpaceString(tmp,2,"");
      str="ВЫДАН: " +tmp; OemToChar(str,str);
      sprintf(nnn,"F%d",ShStr+1);
      tWriteStringToCell(nnn,str); 
      
      tmp = CTabl.Text(Ofld[OidxKodPodrDoc],zap); FreeSpaceString(tmp,2,"");
      str="КОД ПОДРАЗДЕЛЕНИЯ: " +tmp;OemToChar(str,str); 
      sprintf(nnn,"F%d",ShStr+2);
      tWriteStringToCell(nnn,str); 
      
      str = CTabl.Text(Ofld[OidxKemDoc],zap); FreeSpaceString(str,2,"");OemToChar(str,str);
      sprintf(nnn,"F%d",ShStr+3);
      tWriteStringToCell(nnn,str); 
      
      //чтобы значение поля "кем выдано" полностью влезло - "пилим" строку на несколько строк
      int kol_str=strlen(str)/maxLen;
      if (kol_str>1) tRowHeight(ShStr+3,kol_str*12.75); //увеличиваем высоту строки
      tTextWrap(nnn,1);  //разрешаем перенос 
      
      ShStr+=4;
      j++;
      
      // добaвляем строку
      tInsertRows(ShStr+4,4);
      //tCopyRow(ShStr+1);       
      tCopyRows(ShStr+4,4);
   }
    //_XlsObj.Columns(10).ColumnWidth = maxLen;
    
   //tColumnWidth(10,maxLen);
   tDeleteRows(ShStr,12);
   for (int row=ShStr;row<ShStr+30;row++) tRowHeight(row,12.75);
   // чтобы не было выделенной строки после всех манипуляций с копированием
   // выделим отдельную ячейку.
   tWshCellSelect(1,1);       
   } // блок try
   catch(object err)
   {
      tEndXlsWork(1); // делаем форму видимой
      SayError(err);
      return 1;
   }
   catch(...)
   {
     SayUndefinedScriptError();
   }
 
   tEndXlsWork(1); // делаем форму видимой
   return 0;
}

Print_xml_perev(codCurOrg)
//печать реестра на перевыпуск карт
{
  CodEnterprise=atoi(codCurOrg);
  var CFile=CreateObject("CurPrnFile"); // объект класса для работы с текущим файлом печати
  CFile.SetFlagBrowse(0);
  CFile.SetFlag_Print(0);

  var CTabl=CreateObject("CurPrnTbl");  // объект класса для работы с текущей таблицей
  int cr=CTabl.Count_Rcr();         // число рабочих записей в таблице   

  char Dir[128];                              // строка для текущей директории
  GetCurrentDirectory(128,Dir);               // получаем текущую директорию (это корень каталога ZPL из которого запустили АМБу)
  string nm="\\"+NameCommonDir()+"\\sbr_xml_perev.xlt";                        // имя Excel'евского файла

  char NameXlt[256];
  NameXlt = Dir+nm;
  
  // если шаблона нет, на лок.машине, и версия сетевая...то берем шаблон с
  // серверной машины
  if ( !IsLocalZPL() && IsCommonResource(NameCommonDir()) )
  {
    //берем путь к сетевому ZPL 
    GetCommonZPL(NameXlt,255);
    NameXlt = NameXlt+nm;
  }

  tPrepereOfficeForWork(); // определяем работать на Excel или на Calc (определяем какой из офисов (MS Office или OpenOffice) установлен и какой предпочтительнее)
  tCreateXlsObjects(static_cast_to_string(NameXlt),"Реестр на перевыпуск банковских карт"); // создание основных объектов
  try
  {
    tGetWshByIndex(1); // получаем ссылку на лист (worksheet)
    tWshSelect();
    //tMakeXlsVisible();
    var CMsg = 0;    // Процент выполненной работы
    int bTime = false;   // false-показывать процент,
                        // true-показывать оставшееся время
    CMsg=CreateObject("ProgressBar");
    CMsg.Initial(0,100,1);
    CMsg.SetShowTime(static_cast_to_int(bTime));
 
    if ( !FillFldO(CTabl) ) return false; //определяем необходимые нам номера полей

    string WorkFile=GetFileNameForGlobalData();
    LoadGlobalData(WorkFile);  

    tWriteStringToCell("I1",nDogovor);  //номер договора
    tWriteStringToCell("D2",NNN);       //номер реестра
    
    char str[256],value[256];
    var Par = CreateObject("ParamFuncRW");
    Par.IInitial1(static_cast_to_string(TipOtkrKart),"-",99); //разбиваем строку на элементы
    value=Par.Get(1);
    value+="(РУБ)";OemToChar(value,value);
    tWriteStringToCell("A3",value);  //тип карты
   
    char Org[256],Inn[256];
    GetOrgDetails(Org,Inn);
    
    str="Для сотрудников ";OemToChar(str,str);
    tWriteStringToCell("A4",str+Org); //название организации
    tWriteStringToCell("A12",Org);    //название организации
    
    int ShStr=9;
    int j=1;
    char nnn[256];
    int maxLen=25; //максимальная длина строки с паспортными данными (кем выдано может не влезть в колонку)
    // цикл по записям таблицы
    for (int zap=0; zap<cr; zap++)
    {
      // progress bar - чтобы видеть процент выполненной работы до того как появится результат
      if ( CMsg.Msg_Proc(" Подождите немного. Идет подготовка к печати. ",100.*zap/cr)==ESC )
      { 
         return 0;
      }

      // №
      sprintf(nnn,"A%d",ShStr);
      tWriteStringToCell(nnn,j);  

      // ФИО
      str=CTabl.Text(Ofld[OidxF],zap);
      FreeSpaceString(str,2,""); OemToChar(str,str);
      sprintf(nnn,"B%d",ShStr);
      tWriteStringToCell(nnn,str); 
      
      str=CTabl.Text(Ofld[OidxI],zap);
      FreeSpaceString(str,2,""); OemToChar(str,str);
      sprintf(nnn,"C%d",ShStr);
      tWriteStringToCell(nnn,str); 
      
      str=CTabl.Text(Ofld[OidxO],zap);
      FreeSpaceString(str,2,""); OemToChar(str,str);
      sprintf(nnn,"D%d",ShStr);
      tWriteStringToCell(nnn,str); 
      
      //паспортные данные
       //str=CTabl.Text(Ofld[OidxNameDoc],zap);
       //FreeSpaceString(str,2,""); OemToChar(str,str);
       //char tmp[256];
      str = CTabl.Text(Ofld[OidxSerDoc],zap); FreeSpaceString(str,2,"");
      OemToChar(str,str); sprintf(nnn,"F%d",ShStr);
      tWriteStringToCell(nnn,str);
             
      str = CTabl.Text(Ofld[OidxNomDoc],zap); FreeSpaceString(str,2,"");
      OemToChar(str,str); sprintf(nnn,"E%d",ShStr);
      tWriteStringToCell(nnn,str); 
      
      str = CTabl.Text(Ofld[OidxDateDoc],zap); FreeSpaceString(str,2,"");
      OemToChar(str,str); sprintf(nnn,"G%d",ShStr);
      tWriteStringToCell(nnn,str); 
      
      str = CTabl.Text(Ofld[OidxKodPodrDoc],zap); FreeSpaceString(str,2,"");
      OemToChar(str,str); sprintf(nnn,"I%d",ShStr);
      tWriteStringToCell(nnn,str); 
      
      str = CTabl.Text(Ofld[OidxKemDoc],zap); FreeSpaceString(str,2,"");
      OemToChar(str,str); sprintf(nnn,"H%d",ShStr);
      tWriteStringToCell(nnn,str);
      //чтобы значение поля "кем выдано" полностью влезло - "пилим" строку на несколько строк
      int kol_str=strlen(str)/maxLen;
      if (kol_str>1) tRowHeight(ShStr,kol_str*12.75); //увеличиваем высоту строки
      tTextWrap(nnn,1);  //разрешаем перенос 
      
      // Дата рождения
      str = CTabl.Text(Ofld[OidxFCdr],zap); FreeSpaceString(str,2,"");
      OemToChar(str,str); sprintf(nnn,"J%d",ShStr);
      tWriteStringToCell(nnn,str); 

      // Пол
      str = CTabl.Text(Ofld[OidxFCpol],zap); FreeSpaceString(str,2,"");
      OemToChar(str,str); sprintf(nnn,"K%d",ShStr);
      tWriteStringToCell(nnn,str);

      // Место рождения (Область)
      str = CTabl.Text(Ofld[OidxObl_r],zap); FreeSpaceString(str,2,"");
      OemToChar(str,str); sprintf(nnn,"L%d",ShStr);
      tWriteStringToCell(nnn,str);

      // Гражданство
      str = CTabl.Text(Ofld[OidxFCcitizen],zap); FreeSpaceString(str,2,"");
      OemToChar(str,str); sprintf(nnn,"M%d",ShStr);
      tWriteStringToCell(nnn,str);

      // Адрес регистрации
      str = CTabl.Text(Ofld[OidxAdres_reg],zap);
      FreeSpaceString(str,2,"");
       var Adr = CreateObject("Adres");
       Adr.Initial(static_cast_to_string(str),0);
       //индекс 
          str = Adr.GetAdres("ИНДЕКС","НОРМА"); 
          FreeSpaceString(str,2,""); OemToChar(str,str);
          sprintf(nnn,"N%d",ShStr);
          tWriteStringToCell(nnn,str);
       // Страна
          str = Adr.GetAdres("СТРАНА","НОРМА"); 
          FreeSpaceString(str,2,""); OemToChar(str,str);
          sprintf(nnn,"O%d",ShStr);
          tWriteStringToCell(nnn,str);
       // Область
          str = Adr.GetAdres("РЕГИОН","НОРМА"); 
          FreeSpaceString(str,2,""); OemToChar(str,str);
          sprintf(nnn,"P%d",ShStr);
          tWriteStringToCell(nnn,str);
       // Район
          str = Adr.GetAdres("РАЙОН","НОРМА"); 
          FreeSpaceString(str,2,""); OemToChar(str,str);
          sprintf(nnn,"Q%d",ShStr);
          tWriteStringToCell(nnn,str);
       // Город
          str = Adr.GetAdres("ГОРОД","НОРМА"); 
          FreeSpaceString(str,2,""); OemToChar(str,str);
          sprintf(nnn,"R%d",ShStr);
          tWriteStringToCell(nnn,str);
       // Поселок
          str = Adr.GetAdres("НПУНКТ","НОРМА"); 
          FreeSpaceString(str,2,""); OemToChar(str,str);
          sprintf(nnn,"S%d",ShStr);
          tWriteStringToCell(nnn,str);
       // Улица
          str = Adr.GetAdres("УЛИЦА","НОРМА"); 
          FreeSpaceString(str,2,""); OemToChar(str,str);
          sprintf(nnn,"T%d",ShStr);
          tWriteStringToCell(nnn,str);
       // Дом
          str = Adr.GetAdres("ДОМ","НОРМА"); 
          FreeSpaceString(str,2,""); OemToChar(str,str);
          sprintf(nnn,"U%d",ShStr);
          tWriteStringToCell(nnn,str);
       // Корпус
          str = Adr.GetAdres("КОРПУС","НОРМА"); 
          FreeSpaceString(str,2,""); OemToChar(str,str);
          sprintf(nnn,"V%d",ShStr);
          tWriteStringToCell(nnn,str);
       // Квартира
          str = Adr.GetAdres("КВ-РА","НОРМА"); 
          FreeSpaceString(str,2,""); OemToChar(str,str);
          sprintf(nnn,"W%d",ShStr);
          tWriteStringToCell(nnn,str);

      // Адрес фактический
      str = CTabl.Text(Ofld[OidxAdres_fact],zap); 
      FreeSpaceString(str,2,"");
       Adr.Initial(static_cast_to_string(str),0);
       //индекс 
          str = Adr.GetAdres("ИНДЕКС","НОРМА"); 
          FreeSpaceString(str,2,""); OemToChar(str,str);
          sprintf(nnn,"X%d",ShStr);
          tWriteStringToCell(nnn,str);
       // Страна
          str = Adr.GetAdres("СТРАНА","НОРМА"); 
          FreeSpaceString(str,2,""); OemToChar(str,str);
          sprintf(nnn,"Y%d",ShStr);
          tWriteStringToCell(nnn,str);
       // Область
          str = Adr.GetAdres("РЕГИОН","НОРМА"); 
          FreeSpaceString(str,2,""); OemToChar(str,str);
          sprintf(nnn,"Z%d",ShStr);
          tWriteStringToCell(nnn,str);
       // Район
          str = Adr.GetAdres("РАЙОН","НОРМА"); 
          FreeSpaceString(str,2,""); OemToChar(str,str);
          sprintf(nnn,"AA%d",ShStr);
          tWriteStringToCell(nnn,str);
       // Город
          str = Adr.GetAdres("ГОРОД","НОРМА"); 
          FreeSpaceString(str,2,""); OemToChar(str,str);
          sprintf(nnn,"AB%d",ShStr);
          tWriteStringToCell(nnn,str);
       // Поселок
          str = Adr.GetAdres("НПУНКТ","НОРМА"); 
          FreeSpaceString(str,2,""); OemToChar(str,str);
          sprintf(nnn,"AC%d",ShStr);
          tWriteStringToCell(nnn,str);
       // Улица
          str = Adr.GetAdres("УЛИЦА","НОРМА"); 
          FreeSpaceString(str,2,""); OemToChar(str,str);
          sprintf(nnn,"AD%d",ShStr);
          tWriteStringToCell(nnn,str);
       // Дом
          str = Adr.GetAdres("ДОМ","НОРМА"); 
          FreeSpaceString(str,2,""); OemToChar(str,str);
          sprintf(nnn,"AE%d",ShStr);
          tWriteStringToCell(nnn,str);
       // Корпус
          str = Adr.GetAdres("КОРПУС","НОРМА"); 
          FreeSpaceString(str,2,""); OemToChar(str,str);
          sprintf(nnn,"AF%d",ShStr);
          tWriteStringToCell(nnn,str);
       // Квартира
          str = Adr.GetAdres("КВ-РА","НОРМА"); 
          FreeSpaceString(str,2,""); OemToChar(str,str);
          sprintf(nnn,"AG%d",ShStr);
          tWriteStringToCell(nnn,str);

      
      ShStr+=1;
      j++;
      // добaвляем строку
        tInsertRows(ShStr,1);   
        tCopyRows(ShStr,1);
   }

   tDeleteRows(ShStr,3);
   for (int row=ShStr;row<ShStr+30;row++) tRowHeight(row,12.75);
   // чтобы не было выделенной строки после всех манипуляций с копированием
   // выделим отдельную ячейку.
   tWshCellSelect(1,1);       
   } // блок try
   catch(object err)
   {
      tEndXlsWork(1); // делаем форму видимой
      SayError(err);
      return 1;
   }
   catch(...)
   {
     SayUndefinedScriptError();
   }
 
   tEndXlsWork(1); // делаем форму видимой
   return 0;
}

PrintSB(codCurOrg)
{
   CodEnterprise=atoi(codCurOrg);
   int curWsh=0;
   var CFile=CreateObject("CurPrnFile"); // объект класса для работы с текущим файлом печати
   CFile.SetFlagBrowse(0);
   CFile.SetFlag_Print(0);

   var CTabl=CreateObject("CurPrnTbl");  // объект класса для работы с текущей таблицей
   int cr=CTabl.Count_Rcr();         // число рабочих записей в таблице   
   
   char Dir[128];                              // строка для текущей директории
   GetCurrentDirectory(128,Dir);               // получаем текущую директорию (это корень каталога ZPL из которого запустили АМБу)
   string nm="\\"+NameCommonDir()+"\\sberbank.xlt";                        // имя Excel'евского файла

   char NameXlt[256];
   NameXlt = Dir+nm;

   // если шаблона нет, на лок.машине, и версия сетевая...то берем шаблон с
   // серверной машины
   if ( !IsLocalZPL() && IsCommonResource(NameCommonDir()) )
   {
      //берем путь к сетевому ZPL 
      GetCommonZPL(NameXlt,255);
      NameXlt = NameXlt+nm;
   }

   tPrepereOfficeForWork(); // определяем работать на Excel или на Calc (определяем какой из офисов (MS Office или OpenOffice) установлен и какой предпочтительнее)
   tCreateXlsObjects(static_cast_to_string(NameXlt),"Список на зачисление денежных средств"); // создание основных объектов

   try
   {
      int ShStr=17;
      CopyWorkSheet(curWsh,ShStr,0);
     

   var CMsg = 0;    // Процент выполненной работы

   int bTime = false;   // false-показывать процент,
                        // true-показывать оставшееся время

   CMsg=CreateObject("ProgressBar");
   CMsg.Initial(0,100,1);
   CMsg.SetShowTime(static_cast_to_int(bTime));
 
   if ( !FillFld(CTabl) ) return false; //определяем необходимые нам номера полей

   int len =256;
   char str[256],str2[256],str3[256], nnn[256], sss[256];
   double sum, ItogSum=0,ItogWsh=0; 

   bool flag=true ;
   bool fl  =true ;
   int tn,j=1;

    char Org[256],Inn[256];
    GetOrgDetails(Org,Inn);

  var RazbW = CreateObject("ParamFuncRW");
  RazbW.IInitialW(to_string(Org),60,255," ,.;'\"");
  double hig = 15*RazbW.Count(); 
  if (hig>15) 
  {
    tRowHeight(7,hig);
    tTextWrap("BG7",1);  //разрешаем перенос 
  } 
   tWriteStringToCell("BG7",Org);
   tWriteStringToCell("BG8",Inn);           // пишем в ячейку ИНН

   tWriteStringToCell("BG12",cr);

   string WorkFile=GetFileNameForGlobalData();
   LoadGlobalData(WorkFile);  
  //GetEnterpriseVar("РСЧ", str,len-1);   // расчетный счет предприятия
   str=Schet;
   FreeSpaceString(str,2,""); OemToChar(str,str);
   tWriteStringToCell("BG9",str);           // пишем в ячейку рсч 

   
   tWriteStringToCell("BG5",nDogovor);  //номер договора
   tWriteStringToCell("BG6",dDogovor);  //дата  договора 
   
   OprNameOsb(atoi(NOsb),WorkFile);
   if (strlen(NameOsb)) tWriteStringToCell("BG10",OemToAnsi(NameOsb));  //наименование ОСБ
   tWriteStringToCell("BG13","810");    //валюта счета 
//===========

  if ( IsCommonCnfExist("cntRowWsh","sberbank") )
  {
    char str[81];
    GetCommonCnf("cntRowWsh","sberbank",str,80);  
    if(atoi(str)>8) 
      cntRowOnWshSber=atoi(str); 
  }      
   // цикл по записям таблицы
   for (int zap=0; zap<cr; zap++)
   {
      // progress bar - чтобы видеть процент выполненной работы до того как появится результат
      if ( CMsg.Msg_Proc(" Подождите немного. Идет подготовка к печати. ",100.*zap/cr)==ESC )
      { 
         return 0;
      }
      //пора добавить новую страницу
      if (NeedCopyWsh(curWsh,ShStr))
      {
        CopyWorkSheet(curWsh,ShStr,ItogWsh);
      }
      if (!CTabl.Flag_Action_1(zap)) continue; //пропускаем не выделенные записи

      // №
      sprintf(nnn,"A%d",ShStr);
      tWriteStringToCell(nnn,j);  

      // ФИО
      str=CTabl.Text(fld[idxFam],zap);
      FreeSpaceString(str,2,""); OemToChar(str,str);
      str2=CTabl.Text(fld[idxIm],zap);
      FreeSpaceString(str2,2,""); OemToChar(str2,str2);
      str3=CTabl.Text(fld[idxOtch],zap);
      FreeSpaceString(str3,2,""); OemToChar(str3,str3);

      sprintf(nnn,"G%d",ShStr);
      tWriteStringToCell(nnn,str+" "+str2+" "+str3);  

      // № счета
      str=CTabl.Text(fld[idxBankCard],zap);
      FreeSpaceString(UpperString(str),2,""); OemToChar(str,str);
      sprintf(nnn,"AX%d",ShStr);
      tWriteStringToCell(nnn,str);

      // summa
      sum = atof(CTabl.Text(fld[idxSumm],zap));
      sprintf(nnn,"CG%d",ShStr);
      tWriteNumToCell(nnn,sum); 

      ItogWsh+=sum;
      ItogSum = ItogSum+sum; 

      ShStr++;
      j++;

      // добaвляем строку
      tInsertRows(ShStr+1,1);
      tCopyRow(ShStr+1);       
   }
   //если напечатано больше одной страницы
   if(curWsh>1)
   {
    tDeleteRows(ShStr,1);
    //"итого по листу" для последней страницы
    char nnn[256];
    sprintf(nnn,"CG%d",ShStr);
    tWriteNumToCell(nnn,ItogWsh); ItogWsh=0.;
    tMergeCells2(ShStr,1,ShStr,84,1);
    tWriteStringToCell2(ShStr,1,OemToAnsi("Итого по листу ("+to_string(curWsh)+"):"));
    tHorizontalAlignment2(ShStr,1,ShStr,1,1); 
    ShStr++;
   }
   else
    tDeleteRows(ShStr,2);
   
  //общий итог 
  sprintf(nnn,"CG%d",ShStr);
  tWriteNumToCell(nnn,ItogSum); 
   
  //Ф.И.О., должность уполномоченного сотрудника Предприятия (Организации)  
  {
    int whoFirstUpSotr=GetCommonCnfInt("WhoUpSot","sberbank"); //кого печатаем в первую строку "уполномоченный сотрудник" (0 - того кто указан в настройке fioUpSotr, 1 - руководителя из справке о предприятии )
    bool bPrintFirstRuk= (whoFirstUpSotr & 0x01)!=0;
    char    fioFirst[81];
    char  dolgnFirst[81];
    char   fioSecond[81];
    char dolgnSecond[81];
    if( bPrintFirstRuk )
    {
      GetEnterpriseVar("РУКПП",fioFirst,80);FreeSpaceString(fioFirst,2,""); 
      GetEnterpriseVar("ДОЛЖ",dolgnFirst,80);FreeSpaceString(dolgnFirst,2,"");
      GetCommonCnf("fioUpSotr","sberbank",fioSecond,80);  FreeSpaceString(fioSecond,2,"");  
      GetCommonCnf("dolgnUpSotr","sberbank",dolgnSecond,80);  FreeSpaceString(dolgnSecond,2,""); 
    }
    else
    {
      GetCommonCnf("fioUpSotr","sberbank",fioFirst,80);  FreeSpaceString(fioFirst,2,"");  
      GetCommonCnf("dolgnUpSotr","sberbank",dolgnFirst,80);  FreeSpaceString(dolgnFirst,2,""); 
    }
    {//первый уполномоченный:
      if(strlen(fioFirst)) 
      {
        sprintf(nnn,"D%d",ShStr+3);
        tWriteStringToCell(nnn,OemToAnsi(fioFirst));
      }
      if(strlen(dolgnFirst))
      {
        sprintf(nnn,"BV%d",ShStr+3);
        tWriteStringToCell(nnn,OemToAnsi(dolgnFirst));
      }      
    }
    
    {//второй уполномоченный( в качестве второго уполномоченного печатаем сотрудника из настройки:
      if(strlen(fioSecond)) 
      {
        sprintf(nnn,"D%d",ShStr+6);
        tWriteStringToCell(nnn,OemToAnsi(fioSecond));
      }
      if(strlen(dolgnSecond))
      {
        sprintf(nnn,"BV%d",ShStr+6);
        tWriteStringToCell(nnn,OemToAnsi(dolgnSecond));
      }      
    }
  }
  //скрыли лист с шаблоном 
  tGetWshByIndex(tGetWshCount()); // получаем ссылку на лист (worksheet)
  tWshHide();
  //выделили первую страницу и вывели итог в шапку
  tGetWshByIndex(1);
  tWshSelect();
  tWriteNumToCell("BG14",ItogSum); 
  // чтобы не было выделенной строки после всех манипуляций с копированием
  // выделим отдельную ячейку.
  tWshCellSelect(1,1);       
  } // блок try
  catch(object err)
  {
    tEndXlsWork(1); // делаем форму видимой
    SayError(err);
    return 1;
  }
  catch(...)
  {
    SayUndefinedScriptError();
  }
  tEndXlsWork(1); // делаем форму видимой
  return 0;
}
NeedCopyWsh(curWsh,ShStr)
{
  int cntRowOnFirstWsh=cntRowOnWshSber-7;
  
  if (curWsh==1)
  {
    if (ShStr>cntRowOnFirstWsh) return true;
  }  
  else if (ShStr>cntRowOnWshSber) return true;
  return false;
}
CopyWorkSheet(&curWsh,&ShStr,&ItogWsh)
{
  //выводим итого по листу для предыдущей страницы
  if (curWsh>0)
  {
    char nnn[256];
    sprintf(nnn,"CG%d",ShStr);
    tWriteNumToCell(nnn,ItogWsh); ItogWsh=0.;
    tMergeCells2(ShStr,1,ShStr,84,1);
    tWriteStringToCell2(ShStr,1,OemToAnsi("Итого по листу ("+to_string(curWsh)+"):"));
    tHorizontalAlignment2(ShStr,1,ShStr,1,1); 
    //убираем подножие
    tDeleteRows(ShStr+1,10);
  }
  int cwsh = tGetWshCount(); // количество Worksheet'ов
  /*tGetWshByIndex(1); // получаем ссылку на лист (worksheet)
  tWshSelect();*/
  // создаем новый лист копированием шаблонного листа
  curWsh++;
  tCopyWshByIndex(cwsh,"л"+static_cast_to_string(curWsh));
  tGetWshByIndex(cwsh);
  tWshSelect();
  
  //печатаем вторую страницу -> убираем шапку и меняем номер строки
  if(curWsh>1)
  {
    tDeleteRows(1,15);
    ShStr=2;
  } 
  //n = nStart; // устанавливаем номер печатаемой строки

}
//название ОСБ из справочника
OprNameOsb(NomerOsb,WorkFile)
{
  //нужно определиться со справочником, в кот. будем хранить названия (NomOsb.tab)
  char str[256];
  char N_OSB[99];
  sprintf(N_OSB,"%04d",NomerOsb);
  
  char Dir[128];                              
  GetCurrentDirectory(128,Dir);               
  var WorkDir = Dir;           
  string FileGUIDE=WorkDir+"\\T_GUIDE\\numbank.tab";

  if ( !access(FileGUIDE,0) )
  {
    GetValueClassif("T_GUIDE\\numbank.tab",N_OSB,str,120,"Value","Kod");
    FreeSpaceString(str,2,"");
  }
  if (strlen(str)==0)
  {
    str=NameOsb;
    //CharToOem(str,str);
    if (Panel_Zapros("","Введите дополнительные данные",
        "Наименование ОСБ",str,30)==ESC) return "";
    //OemToChar(str,str);
    NameOsb=str;
    SaveGlobalData(WorkFile);  
  }
  return str;
}
CreateXMLobj()
// Создание XML файла
{   
   UnloadScriptModule("msxml");
   LoadScriptModule("msxml");
   var XMLDoc = CreateXML("");
   return XMLDoc;
}
//поля для работы с таблицей "прием карт"
int IidxTN         =  0 , // ТН(C_FIO)
    IidxF          =  1 , // Фамилия (FCf)
    IidxI          =  2 , // Имя (FCi)
    IidxO          =  3 , // Отчество (FCo)
    IidxSerDoc     =  4 , // Серия
    IidxNomDoc     =  5,  // Номер
    IidxBankCard   =  6,  // номер карты
    IidxData       =  7,  // дата для разноски карт (1 число тек. месяца)
    CountIdxI      =  8;
int Ifld[CountIdxI]; // массив номеров полей таблицы

FillFldI(&Tabl)
//=============================================================================
// Находим поля в таблице
//=============================================================================
{
  Ifld[IidxTN]       = Tabl.Find_Name_Fld("C_FIO");
  Ifld[IidxF]        = Tabl.Find_Name_Fld("FCf");
  Ifld[IidxI]        = Tabl.Find_Name_Fld("FCi");
  Ifld[IidxO]        = Tabl.Find_Name_Fld("FCo");
  Ifld[IidxSerDoc]   = Tabl.Find_Name_Fld("seria");
  Ifld[IidxNomDoc]   = Tabl.Find_Name_Fld("nomer");
  Ifld[IidxBankCard] = Tabl.Find_Name_Fld("FCBankCard");
  Ifld[IidxData]     = Tabl.Find_Name_Fld("data");
  for ( int ii=0; ii<CountIdx; ii++ )
    if ( fld[ii]==-1 )
    {
      AmbaMessageBox("Нет необходимых полей в таблице!","Ошибка!!!",MB_OK|MB_ICONERROR,0);
      return false;
    }
  return true;
}
    
//поля для работы с таблицей "открытие"
int OidxF          =  1 , // Фамилия (NAM3)
    OidxI          =  2 , // Имя (NAM1)
    OidxO          =  3 , // Отчество (NAM2)
    OidxVidV       =  4 , // Вид вклада (VidV)       
    OidxKontrInfo  =  5 , // контрольная информация сотрудника (пароль)
    OidxSnils      =  6 , // СНИЛС
    OidxKategor    =  7 , // КатегорияНаселения
    
    //ПАСПОРТ
    OidxNameDoc    =  8 , // ВидДокумента
    OidxSerDoc     =  9 , // Серия
    OidxNomDoc     =  10, // Номер
    OidxDateDoc    =  11, // ДатаВыдачи
    OidxKemDoc     =  12, // КемВыдан
    OidxKodPodrDoc =  13, // КодПодразделения
    OidxKodDoc     =  14, // КодВидаДокумента
    
    OidxFCdr       =  15, // Дата рождения (FCdata_r)
    OidxFCpol      =  16, // Пол (FCpol)
    OidxDolgn      =  17, // должность
    OidxAdres_reg  =  18, // адрес регистрации
    OidxAdres_fact =  19, // адрес фактический
    
    //Место рождения
    OidxStrana_r   =  20, // страна рождения
    OidxObl_r      =  21, // область рождения
    OidxRaion_r    =  22, // район рождения
    OidxGorod_r    =  23, // город рождения
    
    OidxFCcitizen  =  24, // Гражданство
    
    //решил пока не связываться с необязательными полями...
    OidxMobTel     =  25 , // мобильный телефон
    /*OidxMobBank    =  6 , // мобильный банк
    OidxBKI        =  7 , // передача БКИ*/
   
    CountIdxO      =  26;
int Ofld[CountIdxO]; // массив номеров полей таблицы
FillFldO(&Tabl)
//=============================================================================
// Находим поля в таблице
//=============================================================================
{
  Ofld[OidxF]          = Tabl.Find_Name_Fld("NAM3");
  Ofld[OidxI]          = Tabl.Find_Name_Fld("NAM1");
  Ofld[OidxO]          = Tabl.Find_Name_Fld("NAM2");
 
  Ofld[OidxVidV]       = Tabl.Find_Name_Fld("VidV");
  Ofld[OidxKontrInfo]  = Tabl.Find_Name_Fld("kontr_i");
  Ofld[OidxSnils]      = Tabl.Find_Name_Fld("FCstrah_n");
  Ofld[OidxKategor]    = Tabl.Find_Name_Fld("Kateg");
  
  //ПАСПОРТ
  Ofld[OidxNameDoc]    = Tabl.Find_Name_Fld("nameDoc");
  Ofld[OidxSerDoc]     = Tabl.Find_Name_Fld("PSP1");
  Ofld[OidxNomDoc]     = Tabl.Find_Name_Fld("PSP2");
  Ofld[OidxDateDoc]    = Tabl.Find_Name_Fld("PSP3");
  Ofld[OidxKemDoc]     = Tabl.Find_Name_Fld("PSP4");
  Ofld[OidxKodPodrDoc] = Tabl.Find_Name_Fld("PSP5");
  Ofld[OidxKodDoc]     = Tabl.Find_Name_Fld("KODDOC");
  
  Ofld[OidxFCdr]       = Tabl.Find_Name_Fld("FCdata_r");
  Ofld[OidxFCpol]      = Tabl.Find_Name_Fld("FCpol");
  Ofld[OidxDolgn]      = Tabl.Find_Name_Fld("FCdolgnost");
  Ofld[OidxAdres_reg]  = Tabl.Find_Name_Fld("adres_reg");
  Ofld[OidxAdres_fact] = Tabl.Find_Name_Fld("adres_fak");
  
  Ofld[OidxStrana_r]   = Tabl.Find_Name_Fld("FCstrana_r");
  Ofld[OidxObl_r]      = Tabl.Find_Name_Fld("FCoblast_r");
  Ofld[OidxRaion_r]    = Tabl.Find_Name_Fld("FCrajon_r");
  Ofld[OidxGorod_r]    = Tabl.Find_Name_Fld("FCgorod_r");
  
  Ofld[OidxFCcitizen]  = Tabl.Find_Name_Fld("FCcitizen");
  Ofld[OidxMobTel]  = Tabl.Find_Name_Fld("FCphone"); 
  for ( int ii=1; ii<CountIdxO; ii++ )
  {
    if ( Ofld[ii]==-1 )
    {
      AmbaMessageBox("Нет необходимых полей в таблице!","Ошибка!!!",MB_OK|MB_ICONERROR,0);
      return false;
    }
  }  
  return true;
}

//поля для работы с таблицей "суммы"
int idxFam        = 1, 
    idxIm         = 2, 
    idxOtch       = 3,
    idxBankCard   = 4,
    idxSumm       = 5,
    idxNomOsb     = 6,
    idxNFilB      = 7,

    CountIdx      = 8;
int fld[CountIdx]; // массив номеров полей таблицы


FillFld(&Tabl)
//=============================================================================
// Находим поля в таблице
//=============================================================================
{
  fld[idxFam]       = Tabl.Find_Name_Fld("FCf");
  fld[idxIm]        = Tabl.Find_Name_Fld("FCi");
  fld[idxOtch]      = Tabl.Find_Name_Fld("FCo");
  fld[idxBankCard]  = Tabl.Find_Name_Fld("FCBankCard");
  fld[idxSumm]      = Tabl.Find_Name_Fld("CASHSUM");
  fld[idxNomOsb]    = Tabl.Find_Name_Fld("FCnumbank");
  fld[idxNFilB]     = Tabl.Find_Name_Fld("NFilB");
  for ( int ii=1; ii<CountIdx; ii++ )
    if ( fld[ii]==-1 )
    {
      AmbaMessageBox("Нет необходимых полей в таблице!","Ошибка!!!",MB_OK|MB_ICONERROR,0);
      return false;
    }
  return true;
}

//================================================================

//глобальные переменные
char NOsb[5];      //номер ОСБ
char FOsb[5];      //ФилиалОтделенияБанка
char NNN[6];       //порядковый номер реестра
char dNNN[11];     //дата  реестра
char nDogovor[9];  //номер договора 
char dDogovor[11]; //дата  договора
string adresPr=""; //адрес предприятия
string NameOsb=""; //наименование ОСБ
char TipOtkrKart[256];//Тип открываемых карт
char nPlat[7];     //ПлатежноеПоручение
char dPlat[11];     //ДатаПлатежногоПоручения

char CategoryOfPopulation[256]; //Категория населения
char SignSalaryCard      [256]; //Признак зарплатной карты
char RateForCurrentYear  [256]; //Тариф на текущий год
char RateForNextYear     [256]; //Тариф на следующий год

bool writeBikAndSchet;
string Bik;
string Schet;
// функция для генерации имени файла
MakeNameSBOtkr(   AdrCTabl,  // адрес передаваемой таблицы    
              AdrCListTabl,  // адрес списка таблиц           
              RcrInList      // номер записи в списке таблиц 
              )
{
  MakeName(AdrCTabl,AdrCListTabl,RcrInList,"o");
}             
MakeNameSBSumm(   AdrCTabl,  // адрес передаваемой таблицы    
              AdrCListTabl,  // адрес списка таблиц           
              RcrInList      // номер записи в списке таблиц 
              )
{
  MakeName(AdrCTabl,AdrCListTabl,RcrInList,"z");
}             

MakeName(   AdrCTabl,         // адрес передаваемой таблицы    
              AdrCListTabl,   // адрес списка таблиц           
              RcrInList,      // номер записи в списке таблиц 
              SpecSimv        //z- начисления  o- открытие
        )                                                
{
  CodEnterprise=GetCodEnterprise(AdrCListTabl, RcrInList);
  var OptionsT = CreateObject("TransferOptions");
  if (SpecSimv=="z")
  {
    if (InputGlobalData("summ")==ESC) return 0;
  }
  else if  (SpecSimv=="o")
       {
          if (InputGlobalData("otkr")==ESC) return 0;
       }   
  else return 0; 

  char NameFile[512];
  char month[256]; 
  MakeNameDirMonth(month);
  
  char dir[256];dir=GetDirTransf(AdrCListTabl,RcrInList);
  if(!strlen(dir)) dir="c:\\SberBank";  //каталог по умолчанию
  
  int nnnLength=GetCommonCnfInt("NomRLength","sberbank"); if (nnnLength<3) nnnLength=3;else if (nnnLength>5) nnnLength=5;
  if(CodEnterprise==0) 
    sprintf(NameFile,"%s%s\\%04d%0*d%s%s",dir,month,atoi(NOsb),nnnLength,atoi(NNN),SpecSimv,".xml");
  else  
    sprintf(NameFile,"%s%s\\Org_%03d\\%04d%0*d%s%s",dir,month,CodEnterprise,atoi(NOsb),nnnLength,atoi(NNN),SpecSimv,".xml");
  OptionsT.SetNameFile(static_cast_to_string(NameFile));
}                  
GetFileNameForGlobalData()
{
  char StrP[256], CurrentDir[256];
  char Dir[21], nam[81], ext[21];
  string NameExe = namexe();
  splitpath(NameExe,Dir,StrP,nam,ext);
  GetCurrentDirectory(255,CurrentDir);
  //CurrentDir+="\\"+NameCommonDir()+"\\_infoSberBank.xml";
  CurrentDir+="\\TABLBANK\\_infoSberBank.xml";
  fullpath(CurrentDir,CurrentDir,255);
  FreeSpaceString(CurrentDir,3,"");
  string WorkFile=CurrentDir;
  return WorkFile;
}
GetOldFileNameForGlobalData()
{
  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\\zSB.xml";
  fullpath(CurrentDir,CurrentDir,255);
  FreeSpaceString(CurrentDir,3,"");
  string WorkFile=CurrentDir;
  return WorkFile;
}
InputGlobalData(what)
{
  // ищем файл в локальном ZPL   
  // Если файла нет, ищем файл в ..\\SCRIPT\\BANK\\zSB.xml
  
  // Если файл нашли, берем настройки оттуда и перезапрашиваем значения
  // Иначе показываем пустую панельку

  string TitleForm="Введите дополнительные данные ";
  string WorkFile=GetFileNameForGlobalData();
  if ( LoadGlobalData(WorkFile)==-1 )
    LoadGlobalData(GetOldFileNameForGlobalData());
    
  if (RequestGlobalData(TitleForm,what)==ESC)
    return ESC;

  SaveGlobalData(WorkFile);
    
  return 0;   
}

//====================================================================
// Ввод и данных
RequestGlobalData(caption,what)
{
  int resultBaseRequest=baseRequestGlobalData(caption,what);
  if(writeBikAndSchet)  RequestBikAndSchet();
}
RequestBikAndSchet()
{
  char schet[21],bik[10];
  //первый запрос -> берем значения из справки о предприятии
  if (access(GetFileNameForGlobalData(),0)==-1)
  {  
    GetEnterpriseVar("РСЧ",schet,20); 
    Schet=schet; 
    GetEnterpriseVar("БИК",bik,9); 
    Bik=bik;
  }  
        
  schet=Schet,  bik=Bik;
  if (Panel_Zapros("", "Данные для перечисления",
                      " Расчетный Счет",schet,20,
                      " Бик ",bik,9)!=ESC)

  {
    Schet=schet;
    Bik=bik;
  }
}
baseRequestGlobalData(caption,what)
{
  //считаем порядковый номер
  int num=atoi(NNN);
  num++; 
  int nnnLength=GetCommonCnfInt("NomRLength","sberbank"); if (nnnLength<3) nnnLength=3;else if (nnnLength>5) nnnLength=5;
  switch(nnnLength)
  {
    case 4:if (num>9999) num=1;break;
    case 5:if (num>99999) num=1;break;
    default:if (num>999) num=1;break;
  }
  sprintf(NNN,"%0*d",nnnLength,num);
  
  dNNN=datatek;
  if(what=="summ")
  {
    if (GetCommonCnfInt("unLoadPlat","sberbank")==1) 
    {
      if (Panel_Zapros("", caption,
                      " Номер ОСБ",NOsb,4,
                      " Филиал отделения банка",FOsb,4,
                      " Номер договора",nDogovor,8,
                      " Дата  договора",dDogovor,10,
                      " Порядковый номер реестра",NNN,nnnLength,
                      " Дата  реестра",dNNN,10,
                      " Номер платежного поручения",nPlat,6,
                      " Дата платежного поручения",dPlat,10
                      )==ESC)
       return ESC;
    }
    else
    {
      if (Panel_Zapros("", caption,
      " Номер ОСБ",NOsb,4,
      " Филиал отделения банка",FOsb,4,
      " Номер договора",nDogovor,8,
      " Дата  договора",dDogovor,10,
      " Порядковый номер реестра",NNN,nnnLength,
      " Дата  реестра",dNNN,10
      )==ESC)
      return ESC;
    }
  }   
  else if(what=="otkr")
  {
    if (Panel_Zapros("", caption,
    " Номер ОСБ",NOsb,4,
    " Филиал отделения банка",FOsb,4,
    " Номер договора",nDogovor,8,
    " Дата  договора",dDogovor,10,
    " Порядковый номер реестра",NNN,nnnLength
    )==ESC)
    return ESC;
    
  }
  return 1;
}

//====================================================================
// Сохраняет глобальные данные. Принимает имя файла.
SaveGlobalData(WorkFile)
{
  var XMLDoc = CreateXMLobj();
  if (access(WorkFile,0)==0) //файл уже существует - загрузим его и добавим "новые" данные
  {
    LoadFileXML(XMLDoc,WorkFile); //грузим данные из XML
  }
  else
  {
    XMLDoc.documentElement= CreateElemXML(XMLDoc,OemToAnsi("ДопДанные"));
  }
  var XMLRoot=XMLDoc.documentElement;
  bool bNew; 
  var XMLElem=XMLRoot;
  if(CodEnterprise>0) //таблицы подготовили "по организациям"
  {
    char s[256];sprintf(s,"Орг_%03d",CodEnterprise);
    XMLElem=GetElemXMLByNameFirstChildOnly(XMLDoc,XMLRoot,OemToAnsi(s),bNew);    // Элемент для "текущей" организации
  }
  var XMLChildElem;  
  //данные в разрезе организаций
  {
    XMLChildElem = GetElemXMLByNameFirstChildOnly(XMLDoc,XMLElem,OemToAnsi("НомерОСБ"),bNew);
    FreeSpaceString(NOsb,2,"");
    SetValueElemXML(XMLChildElem,static_cast_to_string(NOsb));
    
    XMLChildElem = GetElemXMLByNameFirstChildOnly(XMLDoc,XMLElem,OemToAnsi("НаименованиеОСБ"),bNew);
    FreeSpaceString(NameOsb,2,"");
    SetValueElemXML(XMLChildElem,OemToAnsi(NameOsb));
    
    XMLChildElem = GetElemXMLByNameFirstChildOnly(XMLDoc,XMLElem,OemToAnsi("ФилиалОтделенияБанка"),bNew);
    FreeSpaceString(FOsb,2,"");
    SetValueElemXML(XMLChildElem,static_cast_to_string(FOsb));
    
    XMLChildElem = GetElemXMLByNameFirstChildOnly(XMLDoc,XMLElem,OemToAnsi("НомерДоговора"),bNew);
    FreeSpaceString(nDogovor,2,"");
    SetValueElemXML(XMLChildElem,static_cast_to_string(nDogovor));
    
    XMLChildElem = GetElemXMLByNameFirstChildOnly(XMLDoc,XMLElem,OemToAnsi("ДатаДоговора"),bNew);
    FreeSpaceString(dDogovor,2,"");
    SetValueElemXML(XMLChildElem,static_cast_to_string(dDogovor));
    
    XMLChildElem = GetElemXMLByNameFirstChildOnly(XMLDoc,XMLElem,OemToAnsi("ПорядковыйНомерРеестра"),bNew);
    FreeSpaceString(NNN,2,"");
    SetValueElemXML(XMLChildElem,static_cast_to_string(NNN));
    
    XMLChildElem = GetElemXMLByNameFirstChildOnly(XMLDoc,XMLElem,OemToAnsi("ДатаРеестра"),bNew);
    FreeSpaceString(dNNN,2,"");
    SetValueElemXML(XMLChildElem,static_cast_to_string(dNNN));
    
    XMLChildElem = GetElemXMLByNameFirstChildOnly(XMLDoc,XMLElem,OemToAnsi("ПлатежноеПоручение"),bNew);
    FreeSpaceString(nPlat,2,"");
    SetValueElemXML(XMLChildElem,static_cast_to_string(nPlat));

    XMLChildElem = GetElemXMLByNameFirstChildOnly(XMLDoc,XMLElem,OemToAnsi("ДатаПлатежногоПоручения"),bNew);
    FreeSpaceString(dPlat,2,"");
    SetValueElemXML(XMLChildElem,static_cast_to_string(dPlat));
    
    if(writeBikAndSchet)
    {
      XMLChildElem = GetElemXMLByNameFirstChildOnly(XMLDoc,XMLElem,OemToAnsi("РасчетныйСчетОрганизации"),bNew);
      FreeSpaceString(Schet,2,"");
      SetValueElemXML(XMLChildElem,static_cast_to_string(Schet));
      
      XMLChildElem = GetElemXMLByNameFirstChildOnly(XMLDoc,XMLElem,OemToAnsi("БИК"),bNew);
      FreeSpaceString(Bik,2,"");
      SetValueElemXML(XMLChildElem,static_cast_to_string(Bik));
    }
  }  
  //общие данные
  {
    XMLChildElem = GetElemXMLByNameFirstChildOnly(XMLDoc,XMLRoot,OemToAnsi("ТипКарт"),bNew);
    FreeSpaceString(TipOtkrKart,2,"");
    SetValueElemXML(XMLChildElem,static_cast_to_string(TipOtkrKart));
    
    XMLChildElem = GetElemXMLByNameFirstChildOnly(XMLDoc,XMLRoot,OemToAnsi("КатегорияНаселения"),bNew);
    FreeSpaceString(CategoryOfPopulation,2,"");
    SetValueElemXML(XMLChildElem,static_cast_to_string(CategoryOfPopulation));
    
    XMLChildElem = GetElemXMLByNameFirstChildOnly(XMLDoc,XMLRoot,OemToAnsi("ПризнакЗарплатный"),bNew);
    FreeSpaceString(SignSalaryCard,2,"");
    SetValueElemXML(XMLChildElem,static_cast_to_string(SignSalaryCard));
    
    XMLChildElem = GetElemXMLByNameFirstChildOnly(XMLDoc,XMLRoot,OemToAnsi("ТарифТекущийГод"),bNew);
    FreeSpaceString(RateForCurrentYear,2,"");
    SetValueElemXML(XMLChildElem,static_cast_to_string(RateForCurrentYear));
    
    XMLChildElem = GetElemXMLByNameFirstChildOnly(XMLDoc,XMLRoot,OemToAnsi("ТарифСледующийГод"),bNew);
    FreeSpaceString(RateForNextYear,2,"");
    SetValueElemXML(XMLChildElem,static_cast_to_string(RateForNextYear));
  }
  //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;
}
//====================================================================
// Загрузка данных.

LoadGlobalData(WorkFile)
{
  char tmp[81];GetCommonCnf("noWriteBik","sberbank",tmp,80);
  writeBikAndSchet=(atoi(tmp)!=1);

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

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

  //инициализируем переменные данными из файла
  bool bNew=false;
  var XMLRoot=XMLDoc.documentElement; //корневой элемент
  var XMLElem=XMLRoot;
  if(CodEnterprise>0)
  {
    char s[256];sprintf(s,"Орг_%03d",CodEnterprise);
    XMLElem=GetElemXMLByNameFirstChildOnly(XMLDoc,XMLRoot,OemToAnsi(s),bNew);
  }
  var Elem;
  //данные в разрезе организаций
  {
    Elem=GetElemXMLByNameFirstChildOnly(XMLDoc,XMLElem,OemToAnsi("НомерОСБ"),bNew);
    NOsb=Elem.text;

    Elem=GetElemXMLByNameFirstChildOnly(XMLDoc,XMLElem,OemToAnsi("НаименованиеОСБ"),bNew);
    NameOsb=Elem.text;
  NameOsb=AnsiToOem(NameOsb);
    Elem=GetElemXMLByNameFirstChildOnly(XMLDoc,XMLElem,OemToAnsi("ФилиалОтделенияБанка"),bNew);
    FOsb=Elem.text;

    Elem=GetElemXMLByNameFirstChildOnly(XMLDoc,XMLElem,OemToAnsi("НомерДоговора"),bNew);
    nDogovor=Elem.text;

    Elem=GetElemXMLByNameFirstChildOnly(XMLDoc,XMLElem,OemToAnsi("ДатаДоговора"),bNew);
    dDogovor=Elem.text;

    Elem=GetElemXMLByNameFirstChildOnly(XMLDoc,XMLElem,OemToAnsi("ПорядковыйНомерРеестра"),bNew);
    NNN=Elem.text;
    
    Elem=GetElemXMLByNameFirstChildOnly(XMLDoc,XMLElem,OemToAnsi("ДатаРеестра"),bNew);
    dNNN=Elem.text;
    
    Elem=GetElemXMLByNameFirstChildOnly(XMLDoc,XMLElem,OemToAnsi("ПлатежноеПоручение"),bNew);
    nPlat=Elem.text;
    
    Elem=GetElemXMLByNameFirstChildOnly(XMLDoc,XMLElem,OemToAnsi("ДатаПлатежногоПоручения"),bNew);
    dPlat=Elem.text;
    
    if(writeBikAndSchet)
    {
      Elem=GetElemXMLByNameFirstChildOnly(XMLDoc,XMLElem,OemToAnsi("РасчетныйСчетОрганизации"),bNew);
      Schet=Elem.text;
      
      Elem=GetElemXMLByNameFirstChildOnly(XMLDoc,XMLElem,OemToAnsi("БИК"),bNew);
      Bik=Elem.text;
      
      if(bNew) //берем "Расчетный счет" и "Бик" из справки о предприятии
      {
        char schet[21],bik[10];
        GetEnterpriseVar("РСЧ",schet,20); 
        GetEnterpriseVar("БИК",bik,9); 
        Schet=schet; 
        Bik=bik;
      }
    }
  }  
  //общие данные
  {
    Elem=GetElemXMLByNameFirstChildOnly(XMLDoc,XMLRoot,OemToAnsi("ТипКарт"),bNew);
    TipOtkrKart=Elem.text;

    Elem=GetElemXMLByNameFirstChildOnly(XMLDoc,XMLRoot,OemToAnsi("КатегорияНаселения"),bNew);
    CategoryOfPopulation=Elem.text;
    
    Elem=GetElemXMLByNameFirstChildOnly(XMLDoc,XMLRoot,OemToAnsi("ПризнакЗарплатный"),bNew);
    SignSalaryCard=Elem.text;

    Elem=GetElemXMLByNameFirstChildOnly(XMLDoc,XMLRoot,OemToAnsi("ТарифТекущийГод"),bNew);
    RateForCurrentYear=Elem.text;
    Elem=GetElemXMLByNameFirstChildOnly(XMLDoc,XMLRoot,OemToAnsi("ТарифСледующийГод"),bNew);
    RateForNextYear=Elem.text;
  }
  XMLDoc=0;
  return 0;
}
//======================================
ModifDate(date)
//на входе дата в виде строки ДД.ММ.ГГГГ(разделитель не важен)
//на выходе дата в формате YYYY-MM-DD
{
  FreeSpaceString(date,2,"");
  if (strlen(date)==0) return "";
  
  var d=KDateFromStr(date);
  if (!d.IsValid()) return "";
  
  char delim[256];GetCommonCnf("SimForData","sberbank",delim,2);
  char rez[256];
  sprintf(rez,"%04d%c%02d%c%02d",d.GetYear(),delim[0],d.GetMonth(),delim[0],d.GetDay());
  return rez;
}
ModifPol(str)
//пол-мужской = латинская M (от male), женский = латинская F (от female)
{
  if(Format!=1)
  {
    if ((str=="м")||(str=="М")) return "M";
    if ((str=="ж")||(str=="Ж")) return "F";
  }
  else
  {
    if ((str=="м")||(str=="М")) return "М";
    if ((str=="ж")||(str=="Ж")) return "Ж";
  }
  return "";
}

AddAdresToXML(&XMLDoc,&XMLElem,what,adres_str)
/*
  добавляем в XML компонент "Адрес"
  название элемента определено переменной what 
  (у сбербанка возможны 3 значения: "АдресМестаРаботы", "АдресПрописки", "АдресПроживания")
*/
//переменные для хранения "элементов" адреса
{
  char  strana  [256],
        region  [256],
        region_t[256],
        raion   [256],
        raion_t [256],
        gorod   [256],
        gorod_t [256],
        nasp    [256],
        nasp_t  [256],
        ul      [256],
        ul_t    [256],
        index   [256],
        dom     [256],
        kor     [256],
        kv      [256];

  var Adres = CreateObject("Adres");      //объкт для работы с адресом 
  Adres.Initial(static_cast_to_string(adres_str),0);
   
  //инициализируем   
  strana   = Adres.GetAdres("СТРАНА" ,"ЗНАЧ"); FreeSpaceString(strana ,2,"");  
  region   = Adres.GetAdres("РЕГИОН" ,"ЗНАЧ"); FreeSpaceString(region ,2,"");  
  raion    = Adres.GetAdres("РАЙОН"  ,"ЗНАЧ"); FreeSpaceString(raion  ,2,"");
  gorod    = Adres.GetAdres("ГОРОД"  ,"ЗНАЧ"); FreeSpaceString(gorod  ,2,"");
  nasp     = Adres.GetAdres("НПУНКТ" ,"ЗНАЧ"); FreeSpaceString(nasp   ,2,"");
  ul       = Adres.GetAdres("УЛИЦА"  ,"ЗНАЧ"); FreeSpaceString(ul     ,2,"");
  dom      = Adres.GetAdres("ДОМ"    ,"ЗНАЧ"); FreeSpaceString(dom    ,2,"");
  kor      = Adres.GetAdres("КОРПУС" ,"ЗНАЧ"); FreeSpaceString(kor    ,2,"");
  kv       = Adres.GetAdres("КВ-РА"  ,"ЗНАЧ"); FreeSpaceString(kv     ,2,"");
  index    = Adres.GetAdres("ИНДЕКС" ,"ЗНАЧ"); FreeSpaceString(index  ,2,"");

  region_t = Adres.GetAdres("РЕГИОН" ,"ТИП"); FreeSpaceString(region_t,2,"");
  raion_t  = Adres.GetAdres("РАЙОН"  ,"ТИП"); FreeSpaceString(raion_t ,2,"");
  gorod_t  = Adres.GetAdres("ГОРОД"  ,"ТИП"); FreeSpaceString(gorod_t ,2,"");
  nasp_t   = Adres.GetAdres("НПУНКТ" ,"ТИП"); FreeSpaceString(nasp_t  ,2,"");
  ul_t     = Adres.GetAdres("УЛИЦА"  ,"ТИП"); FreeSpaceString(ul_t    ,2,"");

  //добавлем адрес в XML файл 
  var XMLAdres= CreateChildElemXML(XMLDoc,XMLElem,OemToAnsi(what));
    
  var XMLAdresElem= CreateChildElemXML(XMLDoc,XMLAdres,OemToAnsi("Страна"));
  var XMLAdresChildElem= CreateChildElemXML(XMLDoc,XMLAdresElem,OemToAnsi("СтранаНазвание"));
  //  SetValueElemXML(XMLAdresChildElem,OemToAnsi(strana));     // было
  SetValueElemXML(XMLAdresChildElem,OemToAnsi("РОССИЯ"));       // стало
  
  XMLAdresElem= CreateChildElemXML(XMLDoc,XMLAdres,OemToAnsi("Регион"));
  XMLAdresChildElem= CreateChildElemXML(XMLDoc,XMLAdresElem,OemToAnsi("РегионНазвание"));
  SetValueElemXML(XMLAdresChildElem,OemToAnsi(region));
  XMLAdresChildElem= CreateChildElemXML(XMLDoc,XMLAdresElem,OemToAnsi("РегионСокращение"));
  SetValueElemXML(XMLAdresChildElem,OemToAnsi(region_t));
  
  XMLAdresElem= CreateChildElemXML(XMLDoc,XMLAdres,OemToAnsi("Район"));
  XMLAdresChildElem= CreateChildElemXML(XMLDoc,XMLAdresElem,OemToAnsi("РайонНазвание"));
  SetValueElemXML(XMLAdresChildElem,OemToAnsi(raion));
  XMLAdresChildElem= CreateChildElemXML(XMLDoc,XMLAdresElem,OemToAnsi("РайонСокращение"));
  SetValueElemXML(XMLAdresChildElem,OemToAnsi(raion_t));
  
  XMLAdresElem= CreateChildElemXML(XMLDoc,XMLAdres,OemToAnsi("Город"));
  XMLAdresChildElem= CreateChildElemXML(XMLDoc,XMLAdresElem,OemToAnsi("ГородНазвание"));
  SetValueElemXML(XMLAdresChildElem,OemToAnsi(gorod));
  XMLAdresChildElem= CreateChildElemXML(XMLDoc,XMLAdresElem,OemToAnsi("ГородСокращение"));
  SetValueElemXML(XMLAdresChildElem,OemToAnsi(gorod_t));
  
  XMLAdresElem= CreateChildElemXML(XMLDoc,XMLAdres,OemToAnsi("НаселенныйПункт"));
  XMLAdresChildElem= CreateChildElemXML(XMLDoc,XMLAdresElem,OemToAnsi("НаселенныйПунктНазвание"));
  SetValueElemXML(XMLAdresChildElem,OemToAnsi(nasp));
  XMLAdresChildElem= CreateChildElemXML(XMLDoc,XMLAdresElem,OemToAnsi("НаселенныйПунктСокращение"));
  SetValueElemXML(XMLAdresChildElem,OemToAnsi(nasp_t));
  
  XMLAdresElem= CreateChildElemXML(XMLDoc,XMLAdres,OemToAnsi("Улица"));
  XMLAdresChildElem= CreateChildElemXML(XMLDoc,XMLAdresElem,OemToAnsi("УлицаНазвание"));
  SetValueElemXML(XMLAdresChildElem,OemToAnsi(ul));
  XMLAdresChildElem= CreateChildElemXML(XMLDoc,XMLAdresElem,OemToAnsi("УлицаСокращение"));
  SetValueElemXML(XMLAdresChildElem,OemToAnsi(ul_t));
  
  XMLAdresElem= CreateChildElemXML(XMLDoc,XMLAdres,OemToAnsi("Индекс"));
  SetValueElemXML(XMLAdresElem,OemToAnsi(index));
      
  XMLAdresElem= CreateChildElemXML(XMLDoc,XMLAdres,OemToAnsi("Дом"));
  SetValueElemXML(XMLAdresElem,OemToAnsi(dom));
  
  XMLAdresElem= CreateChildElemXML(XMLDoc,XMLAdres,OemToAnsi("Корпус"));
  SetValueElemXML(XMLAdresElem,OemToAnsi(kor));
  
  XMLAdresElem= CreateChildElemXML(XMLDoc,XMLAdres,OemToAnsi("Квартира"));
  SetValueElemXML(XMLAdresElem,OemToAnsi(kv));
}