-- Шаблон создан мастером бланков
-- 17.02.2007 13:19:07
--
БланкСШаблоном "Выгрузка запроса на аннулирование заявки (формат TXZA120101)";

var Упр:Handle;

FlagЛВС  :L;
FlagПравила:L=True;
XXXXX:S;
var ДатаРейс:D;
var DD:S=if(Day(ДатаРейс)<10, Str(Day(ДатаРейс)), Chr(65+Day(ДатаРейс)-10));
var M:S=if(Mon(ДатаРейс)<10,Str(Mon(ДатаРейс)),""+Chr(65+Mon(ДатаРейс)-10));
НомРейс_:I;
var НомРейс :S=if(FlagЛВС,Раб.Бюджет2005.Format36(1007+НомРейс_), Раб.Бюджет2005.Format36(НомРейс_));
ИмяРейс_:S;
var ИмяРейс:S=if(FlagПравила,XXXXX+DD+НомРейс+".ZA"+M,ИмяРейс_);
Путь:S;

var ДН:D=[ToDay];
var ДК:D=[ToDay];
ИсклВыгруж:L=[True];
Рекв:Record;
Банк:Record;
Отправ:S;
ОтправБанк:S;

var accept:String;

func ТипДок (aТип:S):S;
var res:S;
res='';
 if aТип="ZR": res="Заявка на кассовый расход";
   |aТип="ZV": res="Заявка на возврат";
   |aТип="ZS": res="Заявка на получение наличных денег";
 fi;
^res;
end;

var A:S="+";
var D:S="-";

var пп[]:i=$;
var НомДок[]:S;
var НомДок_:S="";
var ДатаДок[]:D;
var ДатаДок_:D=1.1.100;
--var ЛС[]:S;
var АнДок[]:S;
var Msg[]:S;
var Msg_:S="";
var Wrng[]:I;
var Err[]:I;
var UKey[]:S;
var FTmp[]:S;
var FName[]:S;
var WrngT[]:S;
var ErrT[]:S;


--var ВсегоСумДок:N=SumOfArray(СумДок,Упр);

var ДовЛицо_Должн:S;
var ДовЛицо_ФИО:S;


var ППП:S;
var ФКР:S;
var КЦСР:S;
var КВР:S;
var ЭКР:S;
var КИВнФ:S;
var КИВФ:S;
var КД:S;
var ДКЛ:S;
var СумБК:N;
var Тип:S;

Folder:S;

var SelfCrd:S="РПО_ЗАПРОС_АННУЛ";

var Buf[]:S;
--
--Процедуры и функции -------------
Proc Инициализация;
var i:i;
 accept='';
 for i=32..123 do
  accept=accept+chr(i);
 od;
 accept=accept+chr(125);
 accept=accept+chr(126);
 for i=192..255 do
  accept=accept+chr(i); 
 od;
 accept=accept+chr(185);
 accept=accept+chr(168);
 accept=accept+chr(184);
end;

Proc AddMsg(warn:string;Iter:I;Crit:L);
 if Err[Iter]=0 then ErrT[Iter]=''; else if crit: ErrT[Iter]=ErrT[Iter]+Chr(13); fi; fi;
 if Wrng[Iter]=0 then WrngT[Iter]=''; else if not crit: WrngT[Iter]=WrngT[Iter]+Chr(13); fi; fi;
 if Crit :
    ErrT[Iter]=ErrT[Iter]+warn;
    Err[Iter]=Err[Iter]+1;
   else
    WrngT[Iter]=WrngT[Iter]+warn;
    Wrng[Iter]=Wrng[Iter]+1;
 fi;
 Msg[Iter]=if(Err[Iter]>0,"Ошибка! "+ErrT[Iter]+chr(13),'')+if(Wrng[Iter]>0,"Предупреждение! "+WrngT[Iter],'');
end;

func fixN(Mystring:S):string;
-- ^Up(Раб.Формат.ReplaceSubstr(Mystring,"№","N"));
 ^Trim(Mystring);
end;

proc НаОшибку;
var i:I;
 for  i= 1 to Упр do
   if Err[i]>0: Template.Field='Msg'; Template.Frame=i; Exit; fi;
 od;
end;

proc НаПредупр;
var i:I;
 for  i= 1 to Упр do
   if Wrng[i]>0: Template.Field='Msg'; Template.Frame=i; Exit; fi;
 od;
end;

func ПроверкаНаСтандарт (Must:I; Len:I; MyField:String;FieldName: String; Iter:I):S;
var Res:S;
var i:integer;
--Must -1 - не важно
--      0 - предупреждать
--      1 - ошибка
 Res='';
 if MyField="" then
    if Must=0: AddMsg('Поле "'+FieldName+'" не заполнено.',Iter,False); ^'';
      |Must=1: AddMsg('Обязательное поле "'+FieldName+'" не заполнено.',Iter,True); ^'';
    fi;
 fi;
 for i= 1..Length(MyField) do
   if not(Pos(SubStr(MyField,i,1),accept)>0):
     if res='':Res='Поле "'+FieldName;
       else res=res+';';
     fi;
   res=res+'" содержит недопустимый символ('+SubStr(MyField,i,1)+') на позиции ' +Str(i);
   fi;
 od;
 if Length(MyField)>Abs(Len) then AddMsg('Поле "'+FieldName+'" превышает максимальную длину(' + Str(Abs(Len))+')',Iter,True);
   |Len>0 and Length(MyField)<Len and Length(MyField)>0 then AddMsg('Поле "'+FieldName+'" меньше обязательной длины(' + Str(Len)+')',Iter,True);
 fi;
 if res<>'' then res=res+'.'; fi;
 ^Res;
end;

Proc ЗаполнитьРекв (aРекв:Record);
 Рекв=aРекв;
 if Рекв=nil:
    Отправ="";
   else
    Отправ=GetCardFieldS("Контрагент",Рекв,"КорИмя");
 fi;
 Банк=nil;
 ОтправБанк="";
end;

Proc Очистить;
 ClearVariable(Упр);
 ClearVariable(НомДок);
 ClearVariable(ДатаДок);
 ClearVariable(АнДок);
 ClearVariable(Msg);
 ClearVariable(Wrng);
 ClearVariable(Err);
 ClearVariable(UKey);
 ClearVariable(FTmp);
 ClearVariable(FName);
end;

Proc УдалитьПустыеСтроки;
var Iter:i;
 Iter=1;
 While Iter<=Упр do
  if UKey[Iter]="": DeleteFrame(Упр,Iter);
   else 
    Iter=Iter+1;
  fi; 
 od;
end;

Func Проверить(Iter:I; Full:L):L;
var OWA,OA,n,nr,n2,nr2,z1,z2,i,БК:i;
var tmp:S;
var isBUAU:L;
 if Iter=0: 
    УдалитьПустыеСтроки; 
    if Ukey[1]="": Message("Заполните список выгружаемых заявок",mtError); ^False; fi;
 fi;
 if Full:
    if ДатаРейс=1.1.100: Message("Введите дату формирования документов (рейса)",mtError); Template.Field="ДатаРейс"; ^False; fi;
    if НомРейс_=0: Message("Введите порядковый номер рейса",mtError);  Template.Field="НомРейс_"; ^False; fi;
    if FlagЛВС:
       if НомРейс_<1 or НомРейс_>288: Message("Выход за границы диапазона номеров 1..288 для выделенной ЛВС",mtError); Template.Field="НомРейс_"; ^False; fi;
      else
       if НомРейс_<1 or НомРейс_>1007: Message("Выход за границы диапазона номеров 1..1007",mtError); Template.Field="НомРейс_"; ^False; fi;
    fi;
    if FlagПравила:
       if XXXXX="": Message("Введите код организации",mtError); Template.Field="XXXXX"; ^False; fi;
       if not Length(XXXXX)=5: Message("Длина кода организации должна быть 5 символов",mtError); Template.Field="XXXXX"; ^False; fi;
      else
       if ИмяРейс="": Message("Введите имя рейса",mtError); Template.Field="ИмяРейс"; ^False; fi;
    fi;
 fi;
 if Iter>0: z1=Iter; z2=Iter; Msg[Iter]=""; Wrng[Iter]=0; Err[Iter]=0;
   |True: z1=1; z2=Упр;  ClearVariable(Msg); ClearVariable(Wrng); ClearVariable(Err);
 fi;
 OWA=OpenWorkArea(SelfCrd,"","1=0");
 if z2-z1>0: ShowProgress(z2-z1,"Проверка...."); fi;
 Try
  for n=z1..z2 do
   ProgressPos(n);
   SetFilter(OWA,"UKey="+UKey[n]);
   if Records(OWA)>0:
      if SearchInArray(Ukey,Ukey[n],False,n+1)>0 then AddMsg("Строка дублирует строку№"+Str(SearchInArray(Ukey,Ukey[n],False,n+1)),n,True); fi;
      --Общая информация
      --N Заявки
      tmp=ПроверкаНаСтандарт (1,-15,Trim(GetFieldS(OWA,1,"НомерДок")),"Номер запроса",n);
      if tmp<>"" : AddMsg(tmp,n,True);   fi;
      --Дата заявки
      if GetFieldD(OWA,1,"ДатаДок")=1.1.100: AddMsg("Заполните дату запроса",n,True);     fi;
      --Информация о платильщеке
      isBUAU=False;
      if GetFieldR(OWA,1,"Рекв")=nil:
         AddMsg("Выберите плательщика",n,True);
        else
         --Код бюджетополучателя - платильщика
         tmp=ПроверкаНаСтандарт (1,5,Trim(GetFieldS(OWA,1,"Рекв.РПО_КБП")),"Код бюджетополучателя - платильщика",n);
         if tmp<>"" : AddMsg(tmp,n,True);   fi;
         --Полное наименование бюджетополучателя - платильщика
         tmp=ПроверкаНаСтандарт (1,-255,GetFieldS(OWA,1,"Рекв.ПолнИмя"),"Полное наименование платильщика",n);
         if tmp<>"" : AddMsg(tmp,n,True);   fi;
         tmp=ПроверкаНаСтандарт (-1,-255,GetFieldS(OWA,1,"Рекв.РПО_ПолнИмя2"),"Полное наименование платильщика",n);
         if tmp<>"" : AddMsg(tmp,n,True);   fi;
         isBUAU=GetFieldS(OWA,1,"Рекв.РПО_ТипУчр")="АУ" or GetFieldS(OWA,1,"Рекв.РПО_ТипУчр")="БУ";
      fi; --if GetFieldR(OWA,1,"ПБС")=nil:
      if GetFieldR(OWA,1,"БАНК")=nil:
         AddMsg("Не выбран банковский реквизит клиента",n,True);
        else
         --Уровень бюджета
         tmp=ПроверкаНаСтандарт (1,1,Trim(GetFieldS(OWA,1,"Банк.РПО_КОДБЮДЖ")),"Уровень бюджета",n);
         if tmp<>"" : AddMsg(tmp,n,True);   fi;
         --Наименование бюджета
         tmp=ПроверкаНаСтандарт (if(isBUAU,-1,1),-255,Trim(GetFieldS(OWA,1,"Банк.РПО_НАИМБЮДЖ")),"Наименование бюджета",n);
         if tmp<>"" : AddMsg(tmp,n,not isBUAU);   fi;
         --Финансовый орган
         tmp=ПроверкаНаСтандарт (if(isBUAU,-1,1),-255,Trim(GetFieldS(OWA,1,"Банк.РПО_ФО_НАИМ1")),"Наименование финансового органа",n);
         if tmp<>"" : AddMsg(tmp,n,not isBUAU);   fi;
         tmp=ПроверкаНаСтандарт (-1,-255,Trim(GetFieldS(OWA,1,"Банк.РПО_ФО_НАИМ2")),"Наименование финансового органа",n);
         if tmp<>"" : AddMsg(tmp,n,True);   fi;
         --Лицевой счет плательщика
         tmp=ПроверкаНаСтандарт (1,11,Trim(GetFieldS(OWA,1,"Банк.РПО_ЛСЧЕТ")),"Лицевой счет плательщика",n);
         if tmp<>"" : AddMsg(tmp,n,True);   fi;
         --Код ТОФК
         tmp=ПроверкаНаСтандарт (1,4,Trim(GetFieldS(OWA,1,"Банк.РПО_ОФК_Код")),"Код ТОФК плательщика",n);
         if tmp<>"" : AddMsg(tmp,n,True);   fi;
         --Наименование органа ФК - плательщика
         tmp=ПроверкаНаСтандарт (1,-255,Trim(GetFieldS(OWA,1,"Банк.РПО_ОФК_Имя")),"Наименование органа ФК плательщика",n);
         if tmp<>"" : AddMsg(tmp,n,True);   fi;
         tmp=ПроверкаНаСтандарт (-1,-255,Trim(GetFieldS(OWA,1,"Банк.РПО_ОФК_Имя2")),"Наименование органа ФК плательщика",n);
         if tmp<>"" : AddMsg(tmp,n,True);   fi;
      fi;--if GetFieldR(OWA,1,"ПБС_БАНК")=nil:
      --Главный распорядитель
      tmp=ПроверкаНаСтандарт (1,-255,Trim(GetFieldS(OWA,1,"ГРБС")),"Главный распорядитель бюджетных средств",n);
      if tmp<>"" : AddMsg(tmp,n,True);   fi;
      --Глава по БК
      tmp=ПроверкаНаСтандарт (if(isBUAU,-1,1),-255,Trim(GetFieldS(OWA,1,"Глава")),"Глава по БК",n);
      if tmp<>"" : AddMsg(tmp,n,not isBUAU);   fi;
--      if tmp<>"" : AddMsg(tmp,n,True);   fi;
      --Должность руководителя
      tmp=ПроверкаНаСтандарт (-1,-100,Trim(GetFieldS(OWA,1,"ДолжнРУК")),"Должность руководителя",n);
      if tmp<>"" : AddMsg(tmp,n,True);   fi;
      --ФИО руководителя
      tmp=ПроверкаНаСтандарт (1,-50,Trim(GetFieldS(OWA,1,"ФИОРук")),"ФИО руководителя",n);
      if tmp<>"" : AddMsg(tmp,n,True);   fi;
      --Должность главного бухгалтера
      tmp=ПроверкаНаСтандарт (1,-100,Trim(GetFieldS(OWA,1,"ДОЛЖНБух")),"Должность главного бухгалтера",n);
      if tmp<>"" : AddMsg(tmp,n,True);   fi;
      --ФИО главного бухгалтера
      tmp=ПроверкаНаСтандарт (1,-50,Trim(GetFieldS(OWA,1,"ФИОБух")),"ФИО главного бухгалтера",n);
      if tmp<>"" : AddMsg(tmp,n,True);   fi;
      --Дата подписания документа
      if GetFieldD(OWA,1,"ДАТАПОДПИСИ")=1.1.100: AddMsg("Заполните дату подписания документа",n,True);     fi;
      --Тип аннулируемого документа
      tmp=ПроверкаНаСтандарт (1,2,Trim(GetFieldS(OWA,1,"АННУЛТИПДОК")),"Тип аннулируемого документа",n);
      if tmp<>"" : AddMsg(tmp,n,True);   fi;
      --Внутренний номер аннулируемого документа
      tmp=ПроверкаНаСтандарт (1,-15,Trim(GetFieldS(OWA,1,"АННУЛНОМДОК")),"Внутренний номер аннулируемого документа",n);
      if tmp<>"" : AddMsg(tmp,n,True);   fi;
      --Дата аннулируемого документа
      if GetFieldD(OWA,1,"АННУЛДАТДОК")=1.1.100: AddMsg("Заполните дату аннулируемого документа",n,True);     fi;
      --Примечание
      tmp=ПроверкаНаСтандарт (1,-254,Trim(GetFieldS(OWA,1,"ПРИМЕЧ")),"Примечание",n);
      if tmp<>"" : AddMsg(tmp,n,True);   fi;
      --Проверка выгрузки
      if not GetFieldI(OWA,1,"НОМРЕЙС")=0 and not GetFieldD(OWA,1,"ДАТАРЕЙС")=1.1.100:
         Msg[n]=Msg[n]+if(Msg[n]='','',Chr(13))+ "Заявка уже выгружалсь рейсом №"+Str(GetFieldI(OWA,1,"НОМРЕЙС"))+" от "+DateToString(GetFieldD(OWA,1,"ДАТАРЕЙС"));
       fi;
     else
      AddMsg("Заявка не найдена",n,True);
   fi; --if Records(OWA)>0:
   if Err[n]=0 and Wrng[n]=0: Msg[n]="Проверка пройдена"; fi;
   if Length(Msg[n])>252: Msg[n]=SubStr(Msg[n],1,252)+"...."; fi;
  od;
 Finally
  CloseWorkArea(OWA);
  CloseProgress;
 end;
 ^True;
end;

Proc НомРейсСлед;
var OWA,nr:I;
 if ДатаРейс=1.1.100: Message("Введите дату формирования документов (файла)",mtError); Template.Field="ДатаРейс"; Exit; fi;
 OWA=OpenWorkArea(SelfCrd,"НомРейс","ДатаРейс>="+DateToString(ДатаРейс)+" and ДатаРейс<="+DateToString(ДатаРейс));
 Try
  Nr=Records(OWA);
  if Nr=0: 
     НомРейс_=1;
    else
     НомРейс_=Abs(GetFieldI(OWA,Nr,"НомРейс"))+1;
     if FlagЛВС:
        if НомРейс_<1 or НомРейс_>288 : Message("Выход за границы диапазона номеров 1..288 для выделенной ЛВС",mtError); fi;
       else
        if НомРейс_<1 or НомРейс_>1007: Message("Выход за границы диапазона номеров 1..1007",mtError); fi;
     fi;
  fi;
 Finally
  CloseWorkArea(OWA);
 end;
end;

Func НомРейсИспользуется (ДР:D; НР:I):L;
var OWA,nr:I;
 OWA=OpenWorkArea(SelfCrd,"","НомРейс="+Str(НР)+" and ДатаРейс>="+DateToString(ДР)+" and ДатаРейс<="+DateToString(ДР));
 Try
  if Records(OWA)=0: ^False; else ^True; fi;
 Finally
  CloseWorkArea(OWA);
 end;
end;

Proc ЗагрузитьРейс (ДР:D; НР:I);
var OWA,n,nr:I;
 Очистить;
 OWA=OpenWorkArea(SelfCrd,"","НомРейс="+Str(НР)+" and ДатаРейс>="+DateToString(ДР)+" and ДатаРейс<="+DateToString(ДР));
 Try
  Nr=Records(OWA);
  for n=1..Nr do
   InsertFrame(Упр,Упр+1);
   НомДок[Упр]=GetFieldS(OWA,n,"НОМЕРДОК");
   ДатаДок[Упр]=GetFieldD(OWA,n,"ДАТАДОК");

   АнДок[Упр]=ТипДок(GetFieldS(OWA,n,"АННУЛТИПДОК"))+" №"+GetFieldS(OWA,n,"АННУЛНОМДОК");
   UKey[Упр]=RecordToString(GetRecordKey(OWA,n));
  od;
 Finally
  CloseWorkArea(OWA);
 end;
 Проверить(0,False);
end;

Proc ВыгрузитьРейс;
var OWA,OA,State,Iter,F,n,nr,hНомРейс_:I;
var Buf,Cache:S;
var Услуга:L;
var isBUAU:L;
 for n=1..Упр do
  Msg[n]="Ожидание выгрузки...";
 od;
 hНомРейс_=НомРейс_;
 Cache=PlanVar("CACHE")+"\";
 ShowProgress(Упр,"Формирование рейса....");
 Try
  OWA=OpenWorkArea(SelfCrd,"","1=0");
  Try
   for Iter=1..Упр do
    ProgressPos(Iter);
    FTmp[Iter]=Cache+GetGUID;
    FName[Iter]=Folder+ИмяРейс;
    if not State=4 and not State=3 and ExistFile(FName[Iter]):
        State=Enquiry("","Файл "+FName[Iter]+" уже существует, перезаписать ?","Нет;Да;Нет для всех;Да для всех;Отмена",mtWarning);
        if State=5: Message("Отказ от формирования рейса",mtWarning); Exit; fi;
    fi;
    if not State=1 and not State=3:
       SetFilter(OWA,"UKey="+UKey[Iter]);
       F=TextFileCreate(FTmp[Iter]);
       Try
        isBUAU=GetFieldS(OWA,1,"Рекв.РПО_ТипУчр")="АУ" or GetFieldS(OWA,1,"Рекв.РПО_ТипУчр")="БУ";
        Msg[Iter]="ОШИБКА ВЫГРУЗКИ";
        TextFileWriteLn(F,"FK|TXZA120101|Турбо Бухгалтер 6.9 Бюджет-157н|"+SubStr(Str(Версия.Сборка0)+if(Версия.Сборка1<>0,"."+Str(Версия.Сборка1),"")+Версия.Сборка2,1,10)+"||");
        --Информация об отправителе
        TextFileAppendLn(F,"FROM|");
        --Уровень бюджета
        Buf=Trim(GetFieldS(OWA,1,"Банк.РПО_КОДБЮДЖ"));
        Buf=SubStr(Buf,1,1);
        TextFileAppendLn(F,Buf);
        TextFileAppendLn(F,"|");
        --Код УБП
        Buf=Trim(GetFieldS(OWA,1,"Рекв.РПО_КБП"));
        Buf=SubStr(Buf,1,5);
        TextFileAppendLn(F,Buf);
        TextFileAppendLn(F,"|");
        --Наименование УБП
        Buf=Trim(GetFieldS(OWA,1,"Рекв.ПолнИмя"));
        Buf=SubStr(Buf,1,255);
        TextFileAppendLn(F,Buf);
        Buf=TrimRight(GetFieldS(OWA,1,"Рекв.РПО_ПолнИмя2"));
        Buf=SubStr(Buf,1,255);
        TextFileAppendLn(F,Buf);
        TextFileAppendLn(F,"|");
        --Код ОрФК
        TextFileAppendLn(F,"|");
        --Наименование ОрФК
        TextFileWriteLn(F,"|");
        --Информация о получателе
        TextFileAppendLn(F,"TO|");
        --Код ОФК
        Buf=Trim(GetFieldS(OWA,1,"Банк.РПО_ОФК_Код"));
        Buf=SubStr(Buf,1,4);
        TextFileAppendLn(F,Buf);
        TextFileAppendLn(F,"|");
        --Наименование ОФК
        Buf=Trim(GetFieldS(OWA,1,"Банк.РПО_ОФК_Имя"));
        Buf=SubStr(Buf,1,255);
        TextFileAppendLn(F,Buf);
        Buf=Trim(GetFieldS(OWA,1,"Банк.РПО_ОФК_Имя2"));
        Buf=SubStr(Buf,1,255);
        TextFileAppendLn(F,Buf);
        TextFileWriteLn(F,"|");
        --Общая информация
        TextFileAppendLn(F,"ZA|");
        --Глобальный уникальный идентификатор
        TextFileAppendLn(F,"|");
        --Глобальный уникальный идентификатор аннулируемого документа
        TextFileAppendLn(F,"|");
        --N Запроса
        Buf=Trim(GetFieldS(OWA,1,"НомерДок"));
        Buf=SubStr(Buf,1,15);
        TextFileAppendLn(F,Buf);
        TextFileAppendLn(F,"|");
        --Дата запроса
        Buf=DateToString(GetFieldD(OWA,1,"ДатаДок"));
        Buf=Trim(Buf);
        TextFileAppendLn(F,Buf);
        TextFileAppendLn(F,"|");
        --Наименование УБП
        Buf=Trim(GetFieldS(OWA,1,"Рекв.ПолнИмя"));
        Buf=SubStr(Buf,1,255);
        TextFileAppendLn(F,Buf);
        Buf=TrimRight(GetFieldS(OWA,1,"Рекв.РПО_ПолнИмя2"));
        Buf=SubStr(Buf,1,255);
        TextFileAppendLn(F,Buf);
        TextFileAppendLn(F,"|");
        --Код УБП
        if Trim(GetFieldS(OWA,1,"Банк.РПО_КОДБЮДЖ"))="1" and not isBUAU then
           Buf=Trim(GetFieldS(OWA,1,"Рекв.РПО_КБП"));
           Buf=SubStr(Buf,1,5);
           TextFileAppendLn(F,Buf);
        fi;
        TextFileAppendLn(F,"|");
        --N лицевого счета
        Buf=Trim(GetFieldS(OWA,1,"Банк.РПО_ЛСЧЕТ"));
        Buf=SubStr(Buf,1,11);
        TextFileAppendLn(F,Buf);
        TextFileAppendLn(F,"|");
        --Главный распорядитель
        Buf=Trim(GetFieldS(OWA,1,"ГРБС"));
        Buf=SubStr(Buf,1,255);
        TextFileAppendLn(F,Buf);
        TextFileAppendLn(F,"|");
        --Глава
        Buf=Trim(GetFieldS(OWA,1,"Глава"));
        if isBUAU:  Buf="";       fi;
        Buf=SubStr(Buf,1,3);
        TextFileAppendLn(F,Buf);
        TextFileAppendLn(F,"|");
        --Наименование бюджета
        Buf=Trim(GetFieldS(OWA,1,"Банк.РПО_НАИМБЮДЖ"));
        if isBUAU:  Buf="";       fi;
        Buf=SubStr(Buf,1,255);
        TextFileAppendLn(F,Buf);
        TextFileAppendLn(F,"|");
        --Наименование финансового органа
        if not isBUAU:
           Buf=Trim(GetFieldS(OWA,1,"Банк.РПО_ФО_НАИМ1"));
           Buf=SubStr(Buf,1,255);
           TextFileAppendLn(F,Buf);
           Buf=Trim(GetFieldS(OWA,1,"Банк.РПО_ФО_НАИМ2"));
           Buf=SubStr(Buf,1,255);
          else
           Buf="";
        fi;
        TextFileAppendLn(F,Buf);
        TextFileAppendLn(F,"|");
        --Наименование ОФК
        Buf=Trim(GetFieldS(OWA,1,"Банк.РПО_ОФК_Имя"));
        Buf=SubStr(Buf,1,255);
        TextFileAppendLn(F,Buf);
        Buf=Trim(GetFieldS(OWA,1,"Банк.РПО_ОФК_Имя2"));
        Buf=SubStr(Buf,1,255);
        TextFileAppendLn(F,Buf);
        TextFileAppendLn(F,"|");
        --Код ОФК
        Buf=Trim(GetFieldS(OWA,1,"Банк.РПО_ОФК_Код"));
        Buf=SubStr(Buf,1,4);
        TextFileAppendLn(F,Buf);
        TextFileAppendLn(F,"|");
        --Тип аннулируемого документа
        Buf=Trim(GetFieldS(OWA,1,"АННУЛТИПДОК"));
        Buf=SubStr(Buf,1,2);
        TextFileAppendLn(F,Buf);
        TextFileAppendLn(F,"|");
        --Внутренний номер аннулируемого документа
        Buf=Trim(GetFieldS(OWA,1,"АННУЛНОМДОК"));
        Buf=SubStr(Buf,1,16);
        TextFileAppendLn(F,Buf);
        TextFileAppendLn(F,"|");
        --Дата аннулируемого документа
        Buf=DateToString(GetFieldD(OWA,1,"АННУЛДАТДОК"));
        Buf=Trim(Buf);
        TextFileAppendLn(F,Buf);
        TextFileAppendLn(F,"|");
        --Примечание
        Buf=Trim(GetFieldS(OWA,1,"ПРИМЕЧ"));
        Buf=SubStr(Buf,1,254);
        TextFileAppendLn(F,Buf);
        TextFileAppendLn(F,"|");
        --Должность руководителя
        Buf=Trim(GetFieldS(OWA,1,"ДОЛЖНРУК"));
        Buf=SubStr(Buf,1,100);
        TextFileAppendLn(F,Buf);
        TextFileAppendLn(F,"|");
        --ФИО руководителя
        Buf=Trim(GetFieldS(OWA,1,"ФИОРук"));
        Buf=SubStr(Buf,1,50);
        TextFileAppendLn(F,Buf);
        TextFileAppendLn(F,"|");
        --Должность главного бухгалтера
        Buf=Trim(GetFieldS(OWA,1,"ДОЛЖНБух"));
        Buf=SubStr(Buf,1,100);
        TextFileAppendLn(F,Buf);
        TextFileAppendLn(F,"|");
        --ФИО главного бухгалтера
        Buf=Trim(GetFieldS(OWA,1,"ФИОБух"));
        Buf=SubStr(Buf,1,50);
        TextFileAppendLn(F,Buf);
        TextFileAppendLn(F,"|");
        --Дата подписания документа
        Buf=DateToString(GetFieldD(OWA,1,"ДАТАПОДПИСИ"));
        Buf=Trim(Buf);
        TextFileAppendLn(F,Buf);
        TextFileAppendLn(F,"|");
        --Номер
        TextFileAppendLn(F,"|");
         --Дата
        TextFileAppendLn(F,"|");
        --Должность
        TextFileAppendLn(F,"|");
        --Фио
        TextFileAppendLn(F,"|");
        --Телефон
        TextFileWriteLn(F,"|");
       Finally
        TextFileClose(F);
       end;
       CopyFile(FTmp[Iter],FName[Iter]);
       if not ExistFile(FName[Iter]): Message("Выгрузка прервана",mtError); Exit; fi;
       Msg[Iter]="Заявка успешно выгружена в файл: "+FName[Iter];
       if CanUpdate(SelfCrd):
          BeginChanging(OWA,True);
          Try
           n=PutFieldI(OWA,1,"НомРейс",НомРейс_);
           n=PutFieldD(OWA,1,"ДатаРейс",ДатаРейс);
           EndChanging(OWA);
          Except
           CancelChanging(OWA);
           Raise;
          end;
          НомРейсСлед;
         else
          НомРейс_=НомРейс_+1;
          While НомРейсИспользуется(ДатаРейс,НомРейс_) do
           НомРейс_=НомРейс_+1;
          od;
       fi;
      else
       Msg[Iter]="Файл уже существует. Выгрузка не производилась";
    fi; --if not State=1:
   od; --for Iter=1..Упр do
  Finally
   CloseWorkArea(OWA);
   CloseProgress;
  end;
  if Match(Folder,"A:*") or Match(Folder,"B:*"):
     if EnqOkCancel("Сделать копию выгруженных данных ?",mtConfirmation)=cmOk:
        State=0;
        for Iter=1..Упр do
         if not State=4 and not State=3 and ExistFile(FName[Iter]):
             State=Enquiry("","Файл "+FName[Iter]+" уже существует, перезаписать ?","Нет;Да;Нет для всех;Да для всех;Отмена",mtWarning);
             if State=5: Message("Отказ от создания копии",mtWarning); Exit; fi;
         fi;
         if not State=1 and not State=3:
            CopyFile(FTmp[Iter],FName[Iter]);
         fi;
        od;
     fi;
  fi;
 Finally
  for Iter=1..Упр do
   if ExistFile(FTmp[Iter]): DeleteFile(FTmp[Iter]); FTmp[Iter]=""; fi;
  od;
 end;
 if not hНомРейс_=НомРейс_:
    Message("Рейс успешно сформирован"+Chr(13)+"Для просмотра сформированных файлов нажмите на поле 'Статус'");
    Template.Field="Msg"; Template.Frame=1;
 fi;
end;
--Процедуры и функции -------------
--
--Обработчики событий полей шаблона-----
Func XXXXX_onValidate (Field:S; Iter:I; Value:S):L;
 if not Length(Value)=5: Message("Длина кода должна быть 5 символов",mtError); ^false; fi;
 ^True;
end;

Func XXXXX_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var Rec:Record;
var tmp:S;
 Template.HideEditor(False);
 Rec=OpenCardFile("Контрагент","--Наше",nil,crdRecordOnly);
 if Rec=nil: ^Cur; fi;
 tmp=GetCardFieldS("Контрагент",Rec,"РПО_КБП");
 if not Length(tmp)=5: Message("Длина кода должна быть 5 символов",mtError); ^Cur; fi;
 XXXXX=tmp;
 if not Рекв=Rec: Очистить; fi;
 ЗаполнитьРекв(Rec);
 Return Cur;
end;

Proc Перейтинаошибку_OnClick(Row: Integer; Col: Integer; Double: Logical);
 if SumOfArray(Err)=0 then 
   If SumOfArray(Wrng)=0 then Message('Ошибок не обнаружено'); Exit; fi;
   НаПредупр;
 fi;
 НаОшибку;
end;

Proc ДатаРейс_OnExit(FieldName: String; Iter: Integer);
 if not ДатаРейс=1.1.100: НомРейсСлед; fi;
end;

Func ДатаРейс_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var tmp:D;
 Template.HideEditor(False);
 tmp=Calendar;
 if tmp=1.1.100: ^Cur; fi;
 ДатаРейс=tmp;
 НомРейсСлед;
 Return Cur;
end;

Func НомРейс_onEnter (Field:S; Iter:I):L;
 if ДатаРейс=1.1.100: Message("Введите дату формирования документов (рейса)",mtError); Template.Field="ДатаРейс"; ^False; fi;
 ^True;
end;

Func НомРейс_onValidate (Field:S; Iter:I; Value:I):L;
 if FlagЛВС:
    if Value<1 or Value>288: Message("Выход за границы диапазона номеров 1..288 для выделенной ЛВС",mtError); ^False; fi;
   else
    if Value<1 or Value>1007: Message("Выход за границы диапазона номеров 1..1007",mtError); ^False; fi;
 fi;
 if НомРейсИспользуется(ДатаРейс, Value)=False: ^True; fi;
 if EnqOkCancel("Рейс с номером "+Str(Value)+" за дату "+DateToString(ДатаРейс)+" существует."+Chr(13)+"Загрузить документы данного рейса ?",mtWarning)=cmCancel: ^True; fi;
 ЗагрузитьРейс(ДатаРейс,Value);
 ^True;
end;

Func НомРейс_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var OWA,nr,n:I;
 Template.HideEditor(False);
 ClearVariable(Buf);
 OWA=OpenWorkArea(SelfCrd,"НомРейс","not ДатаРейс=1.1.100 and ДатаРейс="+DateToString(ДатаРейс));
 Try
   nr=Records(OWA);
   for n=1..nr do
     Buf[n]="Рейс №"+Str(GetFieldI(OWA,n,"НомРейс"))+" -- Заявка №"+GetFieldS(OWA,n,"НОМЕРДОК")+" от "+GetFieldS(OWA,n,"ДАТАДОК");
   od;
 Finally
   CloseWorkArea(OWA);
 end;
 if nr=0: Message("За "+DateToString(ДатаРейс)+" выгрузка не производилась"); ^Cur; fi;
 n=Alternate("Список рейсов",Buf,-1,1,12);
 if n=0: ^Cur; fi;
 n=Int(SubStr(Buf[n],7,Pos(" --",Buf[n])-7));
 ЗагрузитьРейс(ДатаРейс,n);
 Return Cur;
end;

Func Путь_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var path:String;
 Template.HideEditor(False);
 path=Путь;
 if ChooseFolder(path,"Путь выгрузки для рейса")= cmOk then  fi;
 Путь=path;
 Return Cur;
end;

Func Отправ_OnEnter(FieldName: String; Iter: Integer): logical;
var Rec,Rr:Record;
var tmp:S;
 Rec=OpenCardFile("Контрагент","--Наше",Рекв,crdRecordOnly);
 if Rec=nil: ^False; fi;
 ЗаполнитьРекв(Rec);
 Очистить;
 Return False ;
end;

Proc Отправ_OnExit(FieldName: String; Iter: Integer);
 ЗаполнитьРекв(nil);
 Очистить;
end;

Func ОтправБанк_OnEnter(FieldName: String; Iter: Integer): logical;
var Rec: Record;
 if Рекв=nil then 
    Рекв=OpenCardFile("Контрагент","Наше",Рекв,crdRecordOnly); 
    if Рекв=nil: ^False; fi;
    Отправ=GetCardFieldS("Контрагент",Рекв,"КорИмя"); 
 fi;
 Rec=OpenCardFile("Банк_счета","КОНТРАГЕНТ="+RecordToString(Рекв),Банк,crdRecordOnly);
 if Rec=nil: ^False; fi;
 Банк=Rec;
 ОтправБанк=GetCardFieldS("БАНК_СЧЕТА",Банк,"РПО_ЛСЧЕТ")+" ("+GetCardFieldS("БАНК_СЧЕТА",Банк,"РПО_ОФК_ИМЯ")+")";
 Очистить;
 ^False;   
end;

Proc ОтправБанк_OnExit(FieldName: String; Iter: Integer);
 Банк=nil; ОтправБанк='';
 Очистить;
end;

Proc Д_OnExit(FieldName: String; Iter: Integer);
 Очистить;
end;

Func Д_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var tmp:D;
var Field:S;
 Template.HideEditor(False);
 Field=AsString(Template.Field);
 tmp=Calendar;
 if tmp=1.1.100: ^Cur; fi;
 PutVariableD(Field,tmp);
 Очистить;
 Return Cur;
end;

Func A_onEnter (Field:String; Iter:Integer):Logical;
 InsertFrame(Упр,Iter+1);
 ^false;
end;

Func D_onEnter (Field:String; Iter:Integer):Logical;
 DeleteFrame(Упр,Iter);
 ^false;
end;

Func ИмяРейс_onEnter(FieldName: String; Iter: Integer): logical;
 if FlagПравила: 
    Message("Установлен флаг формирования имени рейса по правилам, ручной ввод имени не возможен!");
    ^False;
 fi;
 ^True;
end;

Func ИмяРейс_OnVerify(FieldName: String; Iter: Integer; Value: String): Logical;
  ИмяРейс_=Value;
  Return True;
end;

Func Док_onEnter(FieldName: String; Iter: Integer): logical;
var Rec:Record;
var tmp:D;
 if UKey[Iter]="": Rec=Nil; else Rec=StringToRecord(UKey[Iter]); fi;
 if FieldName="НомДок_": 
    Rec=Раб.Документы.ВыборСФильтром(SelfCrd,"НомерБум","Учитывать");
   |FieldName="ДатаДок_":
    tmp=Calendar;
    if tmp=1.1.100: ^False; fi;
    Rec=OpenCardFile(SelfCrd,"ДатаДок=1.1.100 and ДатаДок="+DateToString(tmp),Rec);
   |True: 
    Rec=OpenCardFile(SelfCrd,"Учитывать",Rec);
 fi;
 if Rec=nil: ^False; fi;
 НомДок[Iter]=GetCardFieldS(SelfCrd,Rec,"НОМЕРДОК");
 ДатаДок[Iter]=GetCardFieldD(SelfCrd,Rec,"ДАТАДОК");
 АнДок[Iter]=ТипДок(GetCardFieldS(SelfCrd,Rec,"АННУЛТИПДОК"))+" №"+GetCardFieldS(SelfCrd,Rec,"АННУЛНОМДОК");
 UKey[Iter]=RecordToString(Rec);
 Проверить(Iter,False);
 Return False;
end;

Proc Док_onExit(FieldName: String; Iter: Integer);
 НомДок[Iter]="";
 ДатаДок[Iter]=1.1.100;
 АнДок[Iter]="";
 Msg[Iter]="";
 Wrng[Iter]=0;
 Err[Iter]=0;
 UKey[Iter]="";
end;

Func НомДок_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
 Template.HideEditor(False);
 Док_onEnter(AsString(Template.Field),AsInteger(Template.Frame));
 Return Cur;
end;

Func ДатаДок_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
 Template.HideEditor(False);
 Док_onEnter(AsString(Template.Field),AsInteger(Template.Frame));
 Return Cur;
end;

Func Msg_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var Iter:I;
 Template.HideEditor(False);
 Iter=AsInteger(Template.Frame);
 if Match(Msg[Iter],"Заявка успешно выгружена в файл:*"): ExecuteProgram("NotePad '"+FName[Iter]+"'");
   |not Err[Iter]=0 or not Wrng[Iter]=0: OpenBlank("ДОКУМЕНТЫ.БАНК.ЗАПРОС_АННУЛ",True,StringToRecord(UKey[Iter])); Проверить(Iter,False);
 fi;
 Return Cur;
end;
--Обработчики событий полей шаблона-----
--
--Обработчики событий объектов шаблона-----
Proc btnРейс_onClick (Obj:S);
 if not Проверить(0,True): Exit; fi;
 if not SumOfArray(Err,Упр)=0: Message("В результате проверки обнаружено ошибок: "+Str(SumOfArray(Err,Упр))+Chr(13)+"Формирование рейса отменено",mtError); НаОшибку; Exit; fi;
 if not SumOfArray(Wrng,Упр)=0:
    if EnqOkCancel("В результате проверки обнаружено предупреждений :"+Str(SumOfArray(Wrng,Упр))+" Игнорировать предупреждения ?",mtWarning)=cmCancel:  НаПредупр; Exit; fi;
 fi;
 if Путь='' then 
    if ChooseFolder(Folder,"Сохранить как")=cmCancel: Message("Отказ от формирования рейса"); Exit; fi;
   else
    Folder=Путь;
 fi;
 ВыгрузитьРейс;
end;

Proc BtnСЭД_OnClick(Sender: String);
var tmp:S;
var hПуть:S;
 Try
  hПуть=Путь;
  tmp=Раб.вспом.СЭД.ПолучитьПапку("ZA","exp");
  if (tmp="") or (Not(ExistsFolder(tmp))) then
    if (tmp="") then 
      Message("Отказ от формирования рейса, каталог не задан");
     else 
      Message("Отказ от формирования рейса, каталог не найден");
    fi;
    exit;
   else 
    Путь=tmp;
    btnРейс_onClick(Sender);
  fi;
 Finally
  Путь=hПуть;
 end;
end;

Proc btnСледНом_onClick (Obj:S);
 if ДатаРейс=1.1.100: Message("Введите дату формирования документов (рейса) !"); Template.Field="ДатаРейс"; Exit; fi;
 НомРейсСлед;
end;

Proc cbИсклВыгруж_OnChange(Sender: String);
 Очистить;
end;

Proc Очистить_OnClick(Row: Integer; Col: Integer; Double: Logical);
 if EnqOkCancel("Список будет очищен, продолжить ?",mtWarning)=cmCancel: Exit; fi;
 Очистить;
end;

Proc Загрузить_OnClick(Row: Integer; Col: Integer; Double: Logical);
var OWA,n,nr:i;
var Rec:Record;
var F:S;
 if ДК<ДН: Message("Начальная дата превышает конечную",mtError); Template.Field="ДН"; Exit; fi;
 if ИсклВыгруж: F="ДатаРейс=1.1.100 and НомРейс=0"; else F=""; fi;
 if ДН>1.1.100 and ДК>1.1.100: F=Раб.Бюджет2005.Объединить(F,"ДатаДок>="+DateToString(ДН)+" and ДатаДок<="+DateToString(ДК)," and ");
   |ДН=1.1.100 and ДК>1.1.100: F=Раб.Бюджет2005.Объединить(F,"ДатаДок<="+DateToString(ДК)," and ");
   |ДН>1.1.100 and ДК=1.1.100: F=Раб.Бюджет2005.Объединить(F,"ДатаДок>="+DateToString(ДН)," and ");
 fi;
 F=Раб.Бюджет2005.Объединить(F,"Учитывать"," and ");
 Очистить;
 OWA=OpenWorkArea(SelfCrd,"",F);
 Try
  Nr=Records(OWA);
  ShowProgress(Nr,"Загрузка....");
  for n=1..Nr do
   ProgressPos(n);
   InsertFrame(Упр,Упр+1);
   НомДок[Упр]=GetFieldS(OWA,n,"НОМЕРДОК");
   ДатаДок[Упр]=GetFieldD(OWA,n,"ДАТАДОК");
   АнДок[Упр]=ТипДок(GetFieldS(OWA,n,"АННУЛТИПДОК"))+" №"+GetFieldS(OWA,n,"АННУЛНОМДОК");
   UKey[Упр]=RecordToString(GetRecordKey(OWA,n));
  od;
 Finally
  CloseWorkArea(OWA);
  CloseProgress;
 end;
 if Ukey[1]="": 
    Message("По условию документов не найдено",mtWarning);
   else 
    Проверить(0,False);
 fi;
 if not ДатаРейс=1.1.100: НомРейсСлед; fi;
end;

Proc Проверить_OnClick(Row: Integer; Col: Integer; Double: Logical);
var mt:I;
 Проверить(0,False);
 if Упр<1: InsertFrame(Упр,1); fi;
 if not SumOfArray(Err,Упр)=0: mt=mtError;
   |not SumOfArray(Wrng,Упр)=0: mt=mtWarning;
   |True: mt=mtInformation;
 fi;
 Message("Проверка завершена"+Chr(13)+"Ошибок: "+Str(SumOfArray(Err,Упр))+Chr(13)+"Предупреждений: "+Str(SumOfArray(Wrng,Упр)),mt);
end;
--Обработчики событий объектов шаблона-----
--
--Обработчики событий шаблона -----
Proc Template_onOpen(Create:L);
var Rec: Record;
var i:I;
 ДатаРейс=ToDay;
 НомРейсСлед;
 if XXXXX="":
    Rec=Раб.Бюджет2005.НашРекв;
    if not Rec=nil: 
       XXXXX=GetCardFieldS("Контрагент",Rec,"РПО_КБП"); 
       if not Length(XXXXX)=5: XXXXX=""; fi;
       ЗаполнитьРекв(Rec);
    fi;
 fi;
 Инициализация;
end;

Proc Template_onClose(Destroy:L);
end;
--Обработчики событий шаблона -----
--


Конец