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

var Ver:S="TXIS150505";

var Версия_:S="Версия формата: "+Ver;

var Упр:Handle;

FlagLVS  :L=[False];
var FlagRules: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(FlagLVS,Раб.Бюджет2005.Format36(1007+НомРейс_),Раб.Бюджет2005.Format36(НомРейс_));
ИмяРейс_:S;
var ИмяРейс:S=if(FlagRules,XXXXX+DD+НомРейс+".IS"+M,ИмяРейс_);
Путь:S;

Учр:Record;
УчрНаим:S;
var ДН:D=[ToDay];
var ДК:D=[ToDay];
ИсклВыгруж:L=[True];
Секрет:I;
var Секрет_:S=Раб.Договор.Секретность(Секрет,False);

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 Прил[]:S=if(UKey[$]="","","Открыть");

Folder:S;

var SelfCrd:S="РПО_Договор";

var Buf []:S;
var BufE[]:S;
var BufW[]:S;

var Run:Record;

var Head:S="FK|"+Ver+"|Турбо Бухгалтер 6.9 Бюджет-157н "+SubStr(Str(Версия.Сборка0),1,2)+"|"+SubStr(Str(Версия.Сборка0)+if(Версия.Сборка1<>0,"."+Str(Версия.Сборка1),"")+Версия.Сборка2,3,10)+"||";
--
--Процедуры и функции -------------
Proc Очистить;
 ClearVariable(Упр);
 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,OWA2,n,z,z1,z2,i,ii,OA,hash:i;
var tmp,Key:S;
 if Iter=0: УдалитьПустыеСтроки; fi;
 if Full:
    if ДатаРейс=1.1.100: Message("Введите дату формирования документов (рейса)",mtError); Template.Field="ДатаРейс"; ^False; fi;
    if НомРейс_=0: Message("Введите порядковый номер рейса",mtError);  Template.Field="НомРейс_"; ^False; fi;
    if FlagLVS:
       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 FlagRules:
       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;
    if Учр=nil or УчрНаим="": Message("Выберите заказчика",mtError); Template.Field="УчрНаим"; ^False; fi;
    if Ukey[1]="": Message("Заполните список выгружаемых контрактов",mtError); ^False; 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:
      OA=OpenArray(OWA,1,"Инфо_ИА","");
      ClearVariable(BufE);
      ClearVariable(BufW);
      --Проверка регистрации
      if GetFieldL(OWA,1,"Рег")=False:
         Err[n]=Err[n]+1;
         BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Контракт не принят к учету";
      fi;
      --Проверка учета в реестре ОФК
      if GetFieldL(OWA,1,"УЧЕТ_РЕЕСТР_ОФК")=False:
         Err[n]=Err[n]+1;
         BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"В карточке контракта не установлен флаг 'Подлежит учету в реестре ГК'";
      fi;
      --Проверка аннулирования или исполнения
      if GetFieldL(OWA,1,"АННУЛИРОВАН")=False and GetFieldL(OWA,1,"ИСПОЛНЕН")=False:
         Err[n]=Err[n]+1;
         BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"В карточке контракт не установлен флаг 'Исполнен' или 'Расторгнут'";
      fi;
      --Проверка выгрузки
      if not GetFieldI(OWA,1,"НОМРЕЙС2")=0 and not GetFieldD(OWA,1,"ДАТАРЕЙС2")=1.1.100:
         Wrng[n]=Wrng[n]+1;
         BufW[Wrng[n]]=BufW[Wrng[n]]+Chr(13)+"Контракт уже выгружался рейсом №"+Str(GetFieldI(OWA,1,"НОМРЕЙС2"))+" от "+DateToString(GetFieldD(OWA,1,"ДАТАРЕЙС2"));
      fi;
      --Страница0 Заказчик
      if GetFieldR(OWA,1,"Учр")=nil:
         Err[n]=Err[n]+1;
         BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Не выбран заказчик";
        else
         --IS.NAME_GZ Полное Наименование государственного заказчика
         if TrimLeft(GetFieldS(OWA,1,"Учр.ПолнИмя"))="" and TrimRight(GetFieldS(OWA,1,"Учр.РПО_ПолнИмя2"))="":
            Err[n]=Err[n]+1;
            BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Заполните полное наименование заказчика";
         fi;
         --IS.SHORTNAME_GZ Сокращенное наименование государственного заказчика
         if Trim(GetFieldS(OWA,1,"Учр.КорИмя"))="":
            Err[n]=Err[n]+1;
            BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Заполните краткое наименование заказчика";
         fi;
         --IS.IKU_GZ Идентификационный код заказчика
         tmp=Trim(GetFieldS(OWA,1,"Учр.РПО_ИКЗ"));
         if tmp="":
            if GetFieldD(OWA,1,"ДатаДок")>=1.1.2015:
               Err[n]=Err[n]+1;
               BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Заполните идентификационного кода заказчика";
            fi;
           else
            if not Length(tmp)=20:
               Err[n]=Err[n]+1;
               BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Длина идентификационного кода заказчика должна быть 20 знаков";
            fi;
         fi;
         --IS.INN_GZ ИНН государственного заказчика
         tmp=Trim(GetFieldS(OWA,1,"Учр.ИНН"));
         if tmp="":
            Err[n]=Err[n]+1;
            BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Заполните ИНН заказчика";
           else
            if not Length(tmp)<=12:
               Err[n]=Err[n]+1;
               BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Длина ИНН заказчика должна быть <=12 знаков";
            fi;
         fi;
         --IS.KPP_GZ КПП государственного заказчика
         tmp=Trim(GetFieldS(OWA,1,"Учр.КПП"));
         if tmp="":
            Wrng[n]=Wrng[n]+1;
            BufW[Wrng[n]]=BufW[Wrng[n]]+Chr(13)+"Заполните КПП заказчика";
           else
            if not Length(tmp)=9:
               Err[n]=Err[n]+1;
               BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Длина КПП заказчика должна быть 9 знаков";
            fi;
         fi;
         --IS.KOD_GZ Код государтсвенного заказчика СРГРР ПБС
         tmp=Trim(GetFieldS(OWA,1,"Учр.РПО_КБП"));
         if tmp="":
            Err[n]=Err[n]+1;
            BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Заполните КБП заказчика";
           else
            if not Length(tmp)=5:
               Err[n]=Err[n]+1;
               BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Длина КБП заказчика должна 5 знаков";
            fi;
         fi;
      fi; --if GetFieldR(OWA,1,"Учр")=nil:
      --IS.NAME_RUK Руководитель
      tmp=Trim(GetFieldS(OWA,1,"ФИОРук2"));
      if tmp="":
         if GetFieldD(OWA,1,"ДатаСвед2")<1.10.2015:
            Err[n]=Err[n]+1;
            BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Заполните ФИО руководителя заказчика";
         fi;
        else
         if not Length(tmp)<=50:
            Err[n]=Err[n]+1;
            BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Длина ФИО руководителя заказчика должна быть <=50 знаков";
         fi;
      fi;
      --IS.DATE_DOC Дата документа
      if GetFieldD(OWA,1,"ДатаСвед2")=1.1.100:
         Err[n]=Err[n]+1;
         BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Заполните дату формирования сведений";
      fi;
      --
      if GetFieldR(OWA,1,"Учр_Банк")=nil:
         Err[n]=Err[n]+1;
         BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Не выбран банковский реквизит заказчика";
        else
         --IS.NAME_TOFK Наименование ТОФК
         tmp=Trim(GetFieldS(OWA,1,"Учр_Банк.РПО_ОФК_Имя"));
         if tmp="":
            Err[n]=Err[n]+1;
            BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Заполните наименование органа ФК заказчика";
           else
            if not Length(tmp)<=250:
               Err[n]=Err[n]+1;
               BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Длина наименования органа ФК заказчика должна быть <=250 знаков";
            fi;
         fi;
         --IS.KOD_TOFK Код ТОФК
         tmp=Trim(GetFieldS(OWA,1,"Учр_Банк.РПО_ОФК_Код"));
         if tmp="":
            Err[n]=Err[n]+1;
            BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Заполните код органа ФК заказчика";
           else
            if not Length(tmp)=4:
               Err[n]=Err[n]+1;
               BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Длина кода органа ФК заказчика должна быть 4 знака";
            fi;
         fi;
      fi; --if GetFieldR(OWA,1,"Учр_Банк")=nil:
      --Страница 3 Доп сведения
      --IS.NUM_BX Номер реестровой записи
      tmp=SubStr(Trim(GetFieldS(OWA,1,"Ном_Реестр_ОФК")),1,27);
      if tmp="":
         Err[n]=Err[n]+1;
         BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Заполните номер реестровой записи";
        else
         if not Length(tmp)<=27:
            Err[n]=Err[n]+1;
            BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Длина номера реестровой записи должна быть <=27 знаков";
         fi;
      fi;
      --IS1 Исполнен
      if GetFieldL(OWA,1,"Исполнен"):
         ii=Records(OA);
         if ii=0:
            Err[n]=Err[n]+1;
            BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Заполните исполнение контракта";
           else
            for i=1..ii do
             if not GetFieldS(OA,i,"НаимДок")="" or not GetFieldD(OA,i,"ДатДок")=1.1.100 or not GetFieldS(OA,i,"НомДок")="" or not Round(GetFieldN(OA,i,"КолДок"),3)=0 or not Round(GetFieldN(OA,i,"СумДок"),2)=0 or i=1:
                --IS1.NAME_ISP Наименовение документа о приемке поставленого товара..
                tmp=GetFieldS(OA,i,"НаимДок");
                tmp=Trim(tmp);
                if tmp="":
                   Err[n]=Err[n]+1;
                   BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Исполнение контракта стр.№"+Str(i)+" Заполните наименовение документа о приемке поставленого товара...";
                fi;
                --IS1.DATE_ISP Дата документа о приемке поставленого товара..
                if GetFieldD(OA,i,"ДатДок")=1.1.100:
                   Err[n]=Err[n]+1;
                   BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Исполнение контракта стр.№"+Str(i)+" Заполните дату документа о приемке поставленого товара...";
                fi;
                --IS1.NUM_ISP Номер документа о приемке поставленого товара..
                tmp=GetFieldS(OA,i,"НомДок");
                tmp=Trim(tmp);
                if tmp="":
                   Err[n]=Err[n]+1;
                   BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Исполнение контракта стр.№"+Str(i)+" Заполните номер документа о приемке поставленого товара...";
                  else
                   if not Length(tmp)<=100:
                      Err[n]=Err[n]+1;
                      BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Исполнение контракта стр.№"+Str(i)+" Длина номера документа о приемке поставленого товара...должна быть <=100 знаков";
                   fi;
                fi;
                --IS1.KOL Количество объем
                if Round(GetFieldN(OA,i,"КолДок"),3)=0 and Round(GetFieldN(OA,i,"СумДок"),2)=0:
                   Err[n]=Err[n]+1;
                   BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Исполнение контракта стр.№"+Str(i)+" Заполнит  е количество (объем)";
                fi;
             fi; --if not GetFieldS(OA,i,"НаимДок")="":
             --PD Подраздел Оплата контракта»
             if not GetFieldD(OA,i,"ДатОпл")=1.1.100 or not GetFieldS(OA,i,"НомОпл")="" or not GetFieldS(OA,i,"Осн")="" or not Round(GetFieldN(OA,i,"СумОпл"),2)=0 or not Round(GetFieldN(OA,i,"КурсОпл"),4)=0:
                if i=1 and GetFieldS(OA,i,"НаимДок")="":
                   Err[n]=Err[n]+1;
                   BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Исполнение контракта Строка оплаты не может идти первой в таблице";
                  else
                   --PD.DATE_PD Дата платежного документа
                   if GetFieldD(OA,i,"ДатОпл")=1.1.100:
                      Err[n]=Err[n]+1;
                      BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Исполнение контракта стр.№"+Str(i)+" Заполните дату платежного документа";
                   fi;
                   --PD.NUM_PD Номер платежного документа
                   tmp=GetFieldS(OA,i,"НомОпл");
                   tmp=Trim(tmp);
                   if tmp="":
                      Err[n]=Err[n]+1;
                      BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Исполнение контракта стр.№"+Str(i)+" Заполните номер платежного документа";
                     else
                      if not Length(tmp)<=50:
                         Err[n]=Err[n]+1;
                         BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Исполнение контракта стр.№"+Str(i)+" Длина номер платежного документа <=50 знаков";
                      fi;
                   fi;
                   --PD.INFO Иная информация
                   --PD.VAL Код валюты по ОКВ
                   if i=1:
                      tmp=GetFieldS(OWA,1,"ОКВ");
                      tmp=Trim(tmp);
                      if tmp="":
                         Err[n]=Err[n]+1;
                         BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Заполните код валюты";
                        else
                         if not Length(tmp)=3:
                            Err[n]=Err[n]+1;
                            BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Длина кода валюты должна быть 3 знака";
                         fi;
                      fi;
                   fi;
                   --IS1.SUM_VAL Сумма в валюте контракта
                   if Round(GetFieldN(OA,i,"СумОпл"),2)=0:
                      Err[n]=Err[n]+1;
                      BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Исполнение контракта стр.№"+Str(i)+" Заполните сумму оплаты";
                   fi;
                   --PD.CHANG Курс валюты
                   if not GetFieldS(OWA,1,"ОКВ")="643":
                      if Round(GetFieldN(OA,i,"КурсОпл"),4)=0:
                         Err[n]=Err[n]+1;
                         BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Исполнение контракта стр.№"+Str(i)+" Заполните курс валюты";
                      fi;
                   fi;
                   --PD.SUM Сумма в рублях
                fi;
             fi; --if not GetFieldD(OA,i,"ДатОпл")=1.1.100:
            od;
         fi; --if ii=0:
         --GOODS_INFO
         OWA2=OpenWorkArea("РПО_ДОГОВОР_ПОЗИЦИИ_ТМЦ","НАИМТМЦ;НАИМТМЦ2;ОКП;ОКСМ","Договор="+RecordToString(GetRecordKey(OWA,1))+" and КВОЗ='1'");
         Try
          ClearVariable(Buf);
          ii=Records(OWA2);
          for i=1..ii do
           hash=Раб.crc16.crc30_(Раб.crc16.Init30,GetFieldS(OWA2,i,"НаимТМЦ"));
           hash=Раб.crc16.crc30_(hash,GetFieldS(OWA2,i,"НаимТМЦ2"));
           hash=Раб.crc16.crc30_(hash,GetFieldS(OWA2,i,"НаимТМЦ3"));
           hash=Раб.crc16.crc30_(hash,GetFieldS(OWA2,i,"НаимТМЦ4"));
           Key=Str16(hash)+"#"+GetFieldS(OWA2,i,"ОКП")+"#"+GetFieldS(OWA2,i,"ОКСМ");
           z=SearchInArray(Buf,Key,True);
           if z=-1:
              z=InsertInArraySort(Buf,Key);
              --GOODS_INFO.NAME Наименование товара
              if GetFieldS(OWA2,i,"НаимТМЦ")="" and GetFieldS(OWA2,i,"НаимТМЦ2")="" and GetFieldS(OWA2,i,"НаимТМЦ3")="" and GetFieldS(OWA2,i,"НаимТМЦ4")="":
                 Err[n]=Err[n]+1;
                 BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Наименование страны происхождения или информация о производителе товара стр.№"+Str(i)+" Заполните наименование товара";
              fi;
              --GOODS_INFO.OKPD Код товара по ОКПД
              tmp=GetFieldS(OWA2,i,"ОКП");
              tmp=Trim(tmp);
              if tmp="":
                 Err[n]=Err[n]+1;
                 BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Наименование страны происхождения или информация о производителе товара стр.№"+Str(i)+" Заполните код товара по ОКПД";
                else
                 if not Length(tmp)<=12:
                    Err[n]=Err[n]+1;
                    BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Наименование страны происхождения или информация о производителе товара стр.№"+Str(i)+" Длина кода товара по ОКПД должна быть <=12 знаков";
                 fi;
              fi;
              --GOODS_INFO.COUNTRY_NAME Страна происхождения
              tmp=Раб.Договор.ИмяСтраныПоКоду(GetFieldS(OWA2,i,"ОКСМ"),True);
              tmp=Trim(tmp);
              if tmp="":
                 Err[n]=Err[n]+1;
                 BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Наименование страны происхождения или информация о производителе товара стр.№"+Str(i)+" Заполните страну происхождения товара";
                else
                 if not Length(tmp)<=80:
                    Err[n]=Err[n]+1;
                    BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Наименование страны происхождения или информация о производителе товара стр.№"+Str(i)+" Длина наименования страны происхождения товара должна быть <=80 знаков";
                 fi;
              fi;
              --GOODS_INFO.COUNTRY_CODE Код страны происхождения
              tmp=GetFieldS(OWA2,i,"ОКСМ");
              tmp=Trim(tmp);
              if tmp="":
                 Err[n]=Err[n]+1;
                 BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Наименование страны происхождения или информация о производителе товара стр.№"+Str(i)+" Заполните код страны происхождения товара";
                else
                 if not Length(tmp)=3:
                    Err[n]=Err[n]+1;
                    BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Наименование страны происхождения или информация о производителе товара стр.№"+Str(i)+" Длина кода страны происхождения товара должна быть равна 3 знакам";
                 fi;
              fi;
           fi; --if z=-1:
          od; --for i=1..ii do
         Finally
          CloseWorkArea(OWA2);
         end;
         --PENALTIES
         OA=OpenArray(OWA,1,"Штраф","");
         ii=Records(OA);
         for i=1..ii do
          --PENALTIES.PENALTY_CODE Код причины начисления неустоек (штрафов, пеней)
          tmp=GetFieldS(OA,i,"Код");
          tmp=Trim(tmp);
          if tmp="": --???
--             Err[n]=Err[n]+1;
--             BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Сведения о начислении неустоек (штрафов, пеней) стр.№"+Str(i)+" Заполните код причины начисления";
            else
             if not Length(tmp)=2:
                Err[n]=Err[n]+1;
                BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Сведения о начислении неустоек (штрафов, пеней) стр.№"+Str(i)+" Длина кода причины начисления должна быть равна 2 знакам";
             fi;
          fi;
          --PENALTIES.PENALTY_SIDE Сторона
          if GetFieldS(OA,i,"Сторона")="" and GetFieldS(OA,i,"Сторона2")="" and GetFieldS(OA,i,"Сторона3")="" and GetFieldS(OA,i,"Сторона4")="":
             Err[n]=Err[n]+1;
             BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Сведения о начислении неустоек (штрафов, пеней) стр.№"+Str(i)+" Заполните сторону контракта, в отношении которой принято решение о начислении";
          fi;
          --PENALTIES.PENALTY_FOUNDATION Основание начисления
          if GetFieldS(OA,i,"Начисл_Осн")="" and GetFieldS(OA,i,"Начисл_Осн2")="" and GetFieldS(OA,i,"Начисл_Осн3")="" and GetFieldS(OA,i,"Начисл_Осн4")="":
             Err[n]=Err[n]+1;
             BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Сведения о начислении неустоек (штрафов, пеней) стр.№"+Str(i)+" Заполните основание начисления";
          fi;
          --PENALTIES.PENALTY_SIZE размер начисления
          if Round(GetFieldN(OA,i,"Начисл_Сум"),2)=0:
             Err[n]=Err[n]+1;
             BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Сведения о начислении неустоек (штрафов, пеней) стр.№"+Str(i)+" Заполните размер начисления";
          fi;
          --PENALTIES.PENALTY_DOCINFO
          if GetFieldD(OA,i,"Опл_Дат")=1.1.100 and GetFieldS(OA,i,"Опл_Ном")="" and GetFieldS(OA,i,"Опл_Наим")="":
             Err[n]=Err[n]+1;
             BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Сведения о начислении неустоек (штрафов, пеней) стр.№"+Str(i)+" Заполните реквизиты документа, подтверждающего факт уплаты";
          fi;
          --PENALTIES.PENALTY_SIZE2 размер взысканой нейустойки
          --PENALTIES.PENALTY_FOUNDATION2 Основание возврата
          --PENALTIES.PENALTY_SIZE3 размер возврата
         od; --for i=1..ii do
         CloseWorkArea(OA);
      fi; --if GetFieldL(OWA,1,"Исполнен"):
      --IS2 Рассторгрнут
      if GetFieldL(OWA,1,"Аннулирован"):
         --IS2.TERMINATION_CODE Код основания расторжения
         tmp=GetFieldS(OWA,1,"АннулКодОсн");
         tmp=Trim(tmp);
         if tmp="":
            Err[n]=Err[n]+1;
            BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Заполните код основания расторжения";
           else
            if not Length(tmp)=1:
               Err[n]=Err[n]+1;
               BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Длина кода основания расторжения должна быть равна 1 знаку";
            fi;
         fi;
         --IS2.TERMINATION_DOC Код документа основания расторжения
         tmp=GetFieldS(OWA,1,"АннулКодДок");
         tmp=Trim(tmp);
         if tmp="":
            Err[n]=Err[n]+1;
            BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Заполните код документа основания расторжения";
           else
            if not Length(tmp)=2:
               Err[n]=Err[n]+1;
               BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Длина кода документа основания расторжения должна быть равна 2 знакам";
            fi;
         fi;
         --IS2.SUMM Цена контракта в рублях
         if Round(GetFieldN(OWA,1,"СумДок"),2)=0:
            Err[n]=Err[n]+1;
            BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Заполните цену контракта в рублях";
         fi;
         --IS2.FAKT_OP Фактически оплачено заказчиком
         --IS2.DATE_RAST Дата расторжения контракта
         if GetFieldD(OWA,1,"АННУЛДАТА")=1.1.100:
            Err[n]=Err[n]+1;
            BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Заполните дату расторжения контракта";
         fi;
         --IS2.PRIM_RAST Основание и причина рассторжения контракта
         if GetFieldS(OWA,1,"АННУЛКМНТ")="" and GetFieldS(OWA,1,"АННУЛКМНТ2")="" and GetFieldS(OWA,1,"АННУЛКМНТ3")="" and GetFieldS(OWA,1,"АННУЛКМНТ4")="":
            Err[n]=Err[n]+1;
            BufE[Err[n]]=BufE[Err[n]]+Chr(13)+"Заполните основание и причину рассторжения контракта";
         fi;
      fi;
     else
      Err[n]=Err[n]+1;
      BufE[Err[n]]="Контракт не найден";
   fi; --if Records(OWA)>0:
   if Err[n]=0 and Wrng[n]=0:
      Msg[n]="Проверка пройдена";
     else
      if not Err[n]=0:
         Msg[n]="Ошибка!";
         for i=1..Err[n] do
          Msg[n]=Msg[n]+BufE[i];
         od;
      fi;
      if not Wrng[n]=0:
         Msg[n]=Раб.Бюджет2005.Объединить(Msg[n],"Предупреждение!",Chr(13));
         for i=1..Wrng[n] do
          Msg[n]=Msg[n]+BufW[i];
         od;
      fi;
   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,"НомРейс2","ДатаРейс2>="+DateToString(ДатаРейс)+" and ДатаРейс2<="+DateToString(ДатаРейс));
 Try
  Nr=Records(OWA);
  if Nr=0: 
     НомРейс_=1;
    else
     НомРейс_=Abs(GetFieldI(OWA,Nr,"НомРейс2"))+1;
     if FlagLVS:
        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:I;
 OWA=OpenWorkArea(SelfCrd,"","НомРейс2="+Str(НР)+" and ДатаРейс2>="+DateToString(ДР)+" and ДатаРейс2<="+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,"","НомРейс2="+Str(НР)+" and ДатаРейс2>="+DateToString(ДР)+" and ДатаРейс2<="+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,OWA2,OA,i,ii,n,z,State,Iter,hash,F,hНомРейс_:I;
var Buf,Cache,Key:S;
 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
        Msg[Iter]="ОШИБКА ВЫГРУЗКИ";
        TextFileWriteLn(F,Head);
        --FROM Почтовая информация от отправителе файла
        TextFileAppendLn(F,"FROM|");
        --FROM.BUDG_LEVEL Уровень бюджета заказчика
        Buf=GetFieldS(OWA,1,"УЧР_БАНК.РПО_КодБюдж");
        Buf=Trim(Buf);
        TextFileAppendLn(F,Buf);
        TextFileAppendLn(F,"|");
        --FROM.KOD_BPR Код заказчика
        Buf=GetFieldS(OWA,1,"УЧР.РПО_КБП");
        Buf=Trim(Buf);
        TextFileAppendLn(F,Buf);
        TextFileAppendLn(F,"|");
        --FROM.NAME_BPR Полное наименование заказчика
        Buf=GetFieldS(OWA,1,"УЧР.ПОЛНИМЯ");
        Buf=TrimLeft(Buf);
        TextFileAppendLn(F,Buf);
        Buf=GetFieldS(OWA,1,"УЧР.РПО_ПОЛНИМЯ2");
        Buf=TrimRight(Buf);
        TextFileAppendLn(F,Buf);
        TextFileAppendLn(F,"|");
        --FROM.KOD_TOFK Код ОрФК
        TextFileAppendLn(F,"|");
        --FROM.NAME_TOFK Наименование ОрФК
        TextFileWriteLn(F,"|");
        --ТО Почтовая информация о получателе файла
        TextFileAppendLn(F,"TO|");
        --ТО.KOD_TOFK Код ОрФК
        Buf=GetFieldS(OWA,1,"УЧР_БАНК.РПО_ОФК_КОД");
        Buf=Trim(Buf);
        TextFileAppendLn(F,Buf);
        TextFileAppendLn(F,"|");
        --ТО.NAME_TOFK Наименование ОрФК
        Buf=GetFieldS(OWA,1,"УЧР_БАНК.РПО_ОФК_ИМЯ");
        Buf=Trim(Buf);
        TextFileAppendLn(F,Buf);
        TextFileWriteLn(F,"|");
        --IS Общая информация
        TextFileAppendLn(F,"IS|");
        --IS.GUID_FK Глобальный уникальный идентификатор
        TextFileAppendLn(F,"|");
        --IS.DATE_DOC Дата документа
        Buf=DateToString(GetFieldD(OWA,1,"ДАТАСВЕД2"));
        Buf=Trim(Buf);
        TextFileAppendLn(F,Buf);
        TextFileAppendLn(F,"|");
        --IS.NAME_GZ Полное наименование заказчика
        Buf=GetFieldS(OWA,1,"УЧР.ПОЛНИМЯ");
        Buf=TrimLeft(Buf);
        TextFileAppendLn(F,Buf);
        Buf=GetFieldS(OWA,1,"УЧР.РПО_ПОЛНИМЯ2");
        Buf=TrimRight(Buf);
        TextFileAppendLn(F,Buf);
        TextFileAppendLn(F,"|");
        --IS.SHORTNAME_GZ Краткое наименование заказчика
        Buf=GetFieldS(OWA,1,"УЧР.КорИмя");
        Buf=Trim(Buf);
        TextFileAppendLn(F,Buf);
        TextFileAppendLn(F,"|");
        --IS.IKU_GZ Индетификационный код заказчика
        Buf=GetFieldS(OWA,1,"УЧР.РПО_ИКЗ");
        Buf=Trim(Buf);
        TextFileAppendLn(F,Buf);
        TextFileAppendLn(F,"|");
        --IS.KOD_GZ Код заказчика
        Buf=GetFieldS(OWA,1,"УЧР.РПО_КБП");
        Buf=Trim(Buf);
        TextFileAppendLn(F,Buf);
        TextFileAppendLn(F,"|");
        --IS.INN_GZ ИНН заказчика
        Buf=GetFieldS(OWA,1,"УЧР.ИНН");
        Buf=Trim(Buf);
        TextFileAppendLn(F,Buf);
        TextFileAppendLn(F,"|");
        --IS.KPP_GZ КПП государственного заказчика
        Buf=GetFieldS(OWA,1,"УЧР.КПП");
        Buf=Trim(Buf);
        TextFileAppendLn(F,Buf);
        TextFileAppendLn(F,"|");
        --IS.KOD_TOFK Код ТОФК
        Buf=GetFieldS(OWA,1,"УЧР_БАНК.РПО_ОФК_КОД");
        Buf=Trim(Buf);
        TextFileAppendLn(F,Buf);
        TextFileAppendLn(F,"|");
        --IS.NAME_TOFK Наименование органа ТОФК
        Buf=GetFieldS(OWA,1,"УЧР_БАНК.РПО_ОФК_ИМЯ");
        Buf=Trim(Buf);
        TextFileAppendLn(F,Buf);
        TextFileAppendLn(F,"|");
        --IS.NUM_BX Номер реестровой записи
        Buf=GetFieldS(OWA,1,"НОМ_РЕЕСТР_ОФК");
        Buf=Trim(Buf);
        Buf=SubStr(Buf,1,27);
        TextFileAppendLn(F,Buf);
        TextFileAppendLn(F,"|");
        --IS.SOST Текущие состояние
        if GetFieldL(OWA,1,"АННУЛИРОВАН"):
           Buf=Trim(GetFieldS(OWA,1,"АННУЛПРИЗНАК"));
          |GetFieldL(OWA,1,"ИСПОЛНЕН"):
           Buf=Trim(GetFieldS(OWA,1,"ИСПОЛПРИЗНАК"));
          |True:
           Buf=""; --на исполнение (исполнен этап)
        fi;
        TextFileAppendLn(F,Buf);
        TextFileAppendLn(F,"|");
        --IS.NAME_RUK Руководитель
        Buf=GetFieldS(OWA,1,"ФИОРук2");
        Buf=Trim(Buf);
        TextFileAppendLn(F,Buf);
        TextFileAppendLn(F,"|");
        --IS.DOL_ISP Должность отвественного исполнителя
        TextFileAppendLn(F,"|");
        --IS.NAME_ISP ФИО отвественного исполнителя
        TextFileAppendLn(F,"|");
        --IS.DATE_ISPL Дата подписи отвественного исполнителя
        TextFileAppendLn(F,"|");
        --IS.PRIZ_SEK Признак секретности
        Buf=Str(GetFieldI(OWA,1,"СЕКРЕТ"));
        TextFileAppendLn(F,Buf);
        TextFileWriteLn(F,"|");
        --IS1
        if GetFieldL(OWA,1,"ИСПОЛНЕН"):
           OA=OpenArray(OWA,1,"Инфо_ИА","");
           ii=Records(OA);
           for i=1..ii do
            --Раздел 1 Исполнение контракта»
            if not GetFieldS(OA,i,"НаимДок")="":
               TextFileAppendLn(F,"IS1|");
               --IS1.NAME_ISP Наименовение документа о приемке поставленого товара..
               Buf=GetFieldS(OA,i,"НаимДок");
               Buf=Trim(Buf);
               TextFileAppendLn(F,Buf);
               TextFileAppendLn(F,"|");
               --IS1.DATE_ISP Дата документа о приемке поставленого товара..
               Buf=DateToString(GetFieldD(OA,i,"ДатДок"));
               Buf=Trim(Buf);
               TextFileAppendLn(F,Buf);
               TextFileAppendLn(F,"|");
               --IS1.NUM_ISP Номер документа о приемке поставленого товара..
               Buf=GetFieldS(OA,i,"НомДок");
               Buf=Trim(Buf);
               TextFileAppendLn(F,Buf);
               TextFileAppendLn(F,"|");
               --IS1.KOL Количество объем
               if Round(GetFieldN(OA,i,"КолДок"),3)=0:
                  Buf=Str(GetFieldN(OA,i,"СумДок"),2);
                 else
                  Buf=Str(GetFieldN(OA,i,"КолДок"),3);
               fi;
               TextFileAppendLn(F,Buf);
               TextFileWriteLn(F,"|");
            fi; --if not GetFieldS(OA,i,"НаимДок")="":
            --PD Подраздел Оплата контракта»
            if not GetFieldD(OA,i,"ДатОпл")=1.1.100:
               TextFileAppendLn(F,"PD|");
               --PD.DATE_PD Дата платежного документа
               Buf=DateToString(GetFieldD(OA,i,"ДатОпл"));
               Buf=Trim(Buf);
               TextFileAppendLn(F,Buf);
               TextFileAppendLn(F,"|");
               --PD.NUM_PD Номер платежного документа
               Buf=GetFieldS(OA,i,"НомОпл");
               Buf=Trim(Buf);
               TextFileAppendLn(F,Buf);
               TextFileAppendLn(F,"|");
               --PD.INFO Иная информация
               Buf=GetFieldS(OA,i,"Осн");
               Buf=TrimLeft(Buf);
               TextFileAppendLn(F,Buf);
               Buf=GetFieldS(OA,i,"Осн2");
               TextFileAppendLn(F,Buf);
               Buf=GetFieldS(OA,i,"Осн3");
               TextFileAppendLn(F,Buf);
               Buf=GetFieldS(OA,i,"Осн4");
               Buf=TrimRight(Buf);
               TextFileAppendLn(F,Buf);
               TextFileAppendLn(F,"|");
               --PD.VAL Код валюты по ОКВ
               Buf=GetFieldS(OWA,1,"ОКВ");
               Buf=Trim(Buf);
               TextFileAppendLn(F,Buf);
               TextFileAppendLn(F,"|");
               --IS1.SUM_VAL Сумма в валюте контракта
               Buf=Str(GetFieldN(OA,i,"СумОпл"),2);
               TextFileAppendLn(F,Buf);
               TextFileAppendLn(F,"|");
               --PD.CHANG Курс валюты
               if GetFieldS(OWA,1,"ОКВ")="643":
                  Buf="";
                 else
                  Buf=Str(GetFieldN(OA,i,"КурсОпл"),4);
               fi;
               TextFileAppendLn(F,Buf);
               TextFileAppendLn(F,"|");
               --PD.SUM Сумма в рублях
               if GetFieldS(OWA,1,"ОКВ")="643":
                  Buf=Str(GetFieldN(OA,i,"СумОпл"),2);
                 else
                  Buf=Str(Round(GetFieldN(OA,i,"СумОпл"),2)*Round(GetFieldN(OA,i,"КурсОпл"),4),2);
               fi;
               TextFileAppendLn(F,Buf);
               TextFileWriteLn(F,"|");
            fi; --if not GetFieldD(OA,i,"ДатОпл")=1.1.100:
           od;
           CloseWorkArea(OA);
           --GOODS_INFO
           OWA2=OpenWorkArea("РПО_ДОГОВОР_ПОЗИЦИИ_ТМЦ","НАИМТМЦ;НАИМТМЦ2;ОКП;ОКСМ","Договор="+RecordToString(GetRecordKey(OWA,1))+" and КВОЗ='1'");
           Try
            ClearVariable(Buf);
            ii=Records(OWA2);
            for i=1..ii do
             hash=Раб.crc16.crc30_(Раб.crc16.Init30,GetFieldS(OWA2,i,"НаимТМЦ"));
             hash=Раб.crc16.crc30_(hash,GetFieldS(OWA2,i,"НаимТМЦ2"));
             hash=Раб.crc16.crc30_(hash,GetFieldS(OWA2,i,"НаимТМЦ3"));
             hash=Раб.crc16.crc30_(hash,GetFieldS(OWA2,i,"НаимТМЦ4"));
             Key=Str16(hash)+"#"+GetFieldS(OWA2,i,"ОКП")+"#"+GetFieldS(OWA2,i,"ОКСМ");
             z=SearchInArray(Buf,Key,True);
             if z=-1:
                z=InsertInArraySort(Buf,Key);
                TextFileAppendLn(F,"GOODS_INFO|");
                --GOODS_INFO.NAME Наименование товара
                Buf=GetFieldS(OWA2,i,"НаимТМЦ");
                Buf=TrimLeft(Buf);
                TextFileAppendLn(F,Buf);
                Buf=GetFieldS(OWA2,i,"НаимТМЦ2");
                TextFileAppendLn(F,Buf);
                Buf=GetFieldS(OWA2,i,"НаимТМЦ3");
                TextFileAppendLn(F,Buf);
                Buf=GetFieldS(OWA2,i,"НаимТМЦ4");
                Buf=TrimRight(Buf);
                TextFileAppendLn(F,Buf);
                TextFileAppendLn(F,"|");
                --GOODS_INFO.OKPD Код товара по ОКПД
                Buf=GetFieldS(OWA2,i,"ОКП");
                Buf=Trim(Buf);
                TextFileAppendLn(F,Buf);
                TextFileAppendLn(F,"|");
                --GOODS_INFO.COUNTRY_NAME Страна происхождения
                Buf=Раб.Договор.ИмяСтраныПоКоду(GetFieldS(OWA2,i,"ОКСМ"),True);
                Buf=Trim(Buf);
                TextFileAppendLn(F,Buf);
                TextFileAppendLn(F,"|");
                --GOODS_INFO.COUNTRY_CODE Код страны происхождения
                Buf=GetFieldS(OWA2,i,"ОКСМ");
                Buf=Trim(Buf);
                TextFileAppendLn(F,Buf);
                TextFileWriteLn(F,"|");
             fi; --if z=-1:
            od; --for i=1..ii do
           Finally
            CloseWorkArea(OWA2);
           end;
           --PENALTIES
           OA=OpenArray(OWA,1,"Штраф","");
           ii=Records(OA);
           for i=1..ii do
            TextFileAppendLn(F,"PENALTIES|");
            --PENALTIES.PENALTY_CODE Код причины начисления
            Buf=GetFieldS(OA,i,"Код");
            Buf=Trim(Buf);
            TextFileAppendLn(F,Buf);
            TextFileAppendLn(F,"|");
            --PENALTIES.PENALTY_SIDE Сторона
            Buf=GetFieldS(OA,i,"Сторона");
            Buf=TrimLeft(Buf);
            TextFileAppendLn(F,Buf);
            Buf=GetFieldS(OA,i,"Сторона2");
            TextFileAppendLn(F,Buf);
            Buf=GetFieldS(OA,i,"Сторона3");
            TextFileAppendLn(F,Buf);
            Buf=GetFieldS(OA,i,"Сторона4");
            Buf=TrimRight(Buf);
            TextFileAppendLn(F,Buf);
            TextFileAppendLn(F,"|");
            --PENALTIES.PENALTY_FOUNDATION Основание начисления
            Buf=GetFieldS(OA,i,"Начисл_Осн");
            Buf=TrimLeft(Buf);
            TextFileAppendLn(F,Buf);
            Buf=GetFieldS(OA,i,"Начисл_Осн2");
            TextFileAppendLn(F,Buf);
            Buf=GetFieldS(OA,i,"Начисл_Осн3");
            TextFileAppendLn(F,Buf);
            Buf=GetFieldS(OA,i,"Начисл_Осн4");
            Buf=TrimRight(Buf);
            TextFileAppendLn(F,Buf);
            TextFileAppendLn(F,"|");
            --PENALTIES.PENALTY_SIZE размер начисления
            Buf=Str(GetFieldN(OA,i,"Начисл_Сум"),2);
            TextFileAppendLn(F,Buf);
            TextFileAppendLn(F,"|");
            --PENALTIES.PENALTY_DOCINFO
            if GetFieldD(OA,i,"Опл_Дат")=1.1.100 and GetFieldS(OA,i,"Опл_Ном")="" and GetFieldS(OA,i,"Опл_Наим")="":
               Buf="";
              else
               Buf=DateToString(GetFieldD(OA,i,"Опл_Дат"));
               Buf=Trim(Buf)+", "+GetFieldS(OA,i,"Опл_Ном");
               Buf=Trim(Buf)+"  "+GetFieldS(OA,i,"Опл_Наим");
            fi;
            TextFileAppendLn(F,Buf);
            TextFileAppendLn(F,"|");
            --PENALTIES.PENALTY_SIZE2 размер взысканой нейустойки
            Buf=Str(GetFieldN(OA,i,"Опл_Сум"),2);
            if Buf="0.00": Buf=""; fi;
            TextFileAppendLn(F,Buf);
            TextFileAppendLn(F,"|");
            --PENALTIES.PENALTY_FOUNDATION2 Основание возврата
            Buf=GetFieldS(OA,i,"Возвр_Осн");
            Buf=TrimLeft(Buf);
            TextFileAppendLn(F,Buf);
            Buf=GetFieldS(OA,i,"Возвр_Осн2");
            TextFileAppendLn(F,Buf);
            Buf=GetFieldS(OA,i,"Возвр_Осн3");
            TextFileAppendLn(F,Buf);
            Buf=GetFieldS(OA,i,"Возвр_Осн4");
            Buf=TrimRight(Buf);
            TextFileAppendLn(F,Buf);
            TextFileAppendLn(F,"|");
            --PENALTIES.PENALTY_SIZE3 размер возврата
            Buf=Str(GetFieldN(OA,i,"Возвр_Сум"),2);
            if Buf="0.00": Buf=""; fi;
            TextFileAppendLn(F,Buf);
            TextFileWriteLn(F,"|");
           od; --for i=1..ii do
           CloseWorkArea(OA);
        fi; --if GetFieldL(OWA,1,"ИСПОЛНЕН"):
        --IS2
        if GetFieldL(OWA,1,"АННУЛИРОВАН"):
           TextFileAppendLn(F,"IS2|");
           --IS2.TERMINATION_CODE Код основания расторжения
           Buf=GetFieldS(OWA,1,"АннулКодОсн");
           Buf=Trim(Buf);
           TextFileAppendLn(F,Buf);
           TextFileAppendLn(F,"|");
           --IS2.TERMINATION_DOC Код документа основания расторжения
           Buf=GetFieldS(OWA,1,"АннулКодДок");
           Buf=Trim(Buf);
           TextFileAppendLn(F,Buf);
           TextFileAppendLn(F,"|");
           --IS2.SUMM Цена контракта в рублях --????
           Buf=Str(GetFieldN(OWA,1,"СумДок"),2);
           TextFileAppendLn(F,Buf);
           TextFileAppendLn(F,"|");
           --IS2.FAKT_OP Фактически оплачено заказчиком
           Buf=Str(GetFieldN(OWA,1,"АННУЛФАКТОПЛ"),2);
           TextFileAppendLn(F,Buf);
           TextFileAppendLn(F,"|");
           --IS2.DATE_RAST Дата расторжения контракта
           Buf=DateToString(GetFieldD(OWA,1,"АННУЛДАТА"));
           Buf=Trim(Buf);
           TextFileAppendLn(F,Buf);
           TextFileAppendLn(F,"|");
           --IS2.PRIM_RAST Основание и причина рассторжения контракта
           Buf=GetFieldS(OWA,1,"АННУЛКМНТ");
           Buf=TrimLeft(Buf);
           TextFileAppendLn(F,Buf);
           Buf=GetFieldS(OWA,1,"АННУЛКМНТ2");
           TextFileAppendLn(F,Buf);
           Buf=GetFieldS(OWA,1,"АННУЛКМНТ3");
           TextFileAppendLn(F,Buf);
           Buf=GetFieldS(OWA,1,"АННУЛКМНТ4");
           Buf=TrimRight(Buf);
           TextFileAppendLn(F,Buf);
           TextFileWriteLn(F,"|");
        fi; --if GetFieldL(OWA,1,"АННУЛИРОВАН"):
       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,"НомРейс2",НомРейс_);
           n=PutFieldD(OWA,1,"ДатаРейс2",ДатаРейс);
           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(FName[1],"A:\*") or Match(FName[1],"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;
 Учр=Rec;
 УчрНаим=GetCardFieldS("Контрагент",Rec,"КорИмя");
 tmp=GetCardFieldS("Контрагент",Rec,"РПО_КБП");
 if not Length(tmp)=5: Message("Длина кода должна быть 5 символов",mtError); ^Cur; fi;
 XXXXX=tmp;
 Return Cur;
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 FlagLVS:
    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,"НОМЕРДОК")+" от "+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 i:I;
 Template.HideEditor(False);
 i=ChooseFolder(Путь,"Выберите путь выгрузки");
 Return Cur;
end;

Func УчрНаим_OnEnter(FieldName: String; Iter: Integer): logical;
var Rec: Record;
 Rec=OpenCardFile("Контрагент","--Наше",Учр,crdRecordOnly);
 if Rec=nil: ^False; fi;
 Учр=Rec;
 УчрНаим=GetCardFieldS("Контрагент",Rec,"КорИмя");
 XXXXX=GetCardFieldS("Контрагент",Rec,"РПО_КБП");
 Очистить;
 Return False;
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 Секрет_OnEnter(FieldName: String; Iter: Integer): logical;
 ClearVariable(Buf);
 Секрет=Int(Раб.Договор.Секретность(Секрет,True));
 Очистить;
 if Упр<1: InsertFrame(Упр,1); fi;
 Return False;
end;

Proc Секрет_OnExit(FieldName: String; Iter: Integer);
 Очистить;
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;
var Rec:Record;
var tmp:D;
 if Учр=nil or УчрНаим="": Message("Выберите заказчика",mtError); Template.Field="УчрНаим"; ^False; fi;
 if UKey[Iter]="": Rec=Nil; else Rec=StringToRecord(UKey[Iter]); fi;
 if FieldName="НомДок_": 
    Rec=Раб.Документы.ВыборСФильтром(SelfCrd,"НомерДок","РЕГ and УЧЕТ_РЕЕСТР_ОФК and (АННУЛИРОВАН or ИСПОЛНЕН) and УЧР="+RecordToString(Учр)+" and Секрет="+Str(Секрет)+" and not Недейств");
   |FieldName="ДатаДок_":
    tmp=Calendar;
    if tmp=1.1.100: ^False; fi;
    Rec=OpenCardFile(SelfCrd,"--РЕГ and УЧЕТ_РЕЕСТР_ОФК and ((ИСПОЛНЕН and ИсполДата="+DateToString(tmp)+") or (АННУЛИРОВАН and АннулДата="+DateToString(tmp)+")) and УЧР="+RecordToString(Учр)+" and Секрет="+Str(Секрет)+" and not Недейств",Rec);
   |True: 
    Rec=OpenCardFile(SelfCrd,"--РЕГ and УЧЕТ_РЕЕСТР_ОФК and (АННУЛИРОВАН or ИСПОЛНЕН) and УЧР="+RecordToString(Учр)+" and Секрет="+Str(Секрет)+" and not Недейств",Rec);
 fi;
 if Rec=nil: ^False; fi;
 НомДок[Iter]=GetCardFieldS(SelfCrd,Rec,"НОМЕРДОК");
 ДатаДок[Iter]=GetCardFieldD(SelfCrd,Rec,"ДАТАДОК");
 Контр[Iter]=GetCardFieldS(SelfCrd,Rec,"КОНТР.КОРИМЯ");
 НомРеестр[Iter]=GetCardFieldS(SelfCrd,Rec,"Ном_Реестр_ОФК");
 UKey[Iter]=RecordToString(Rec);
 Проверить(Iter,False);
 Return False;
end;

Proc Док_onExit(FieldName: String; Iter: Integer);
 НомДок[Iter]="";
 ДатаДок[Iter]=1.1.100;
 Контр[Iter]="";
 НомРеестр[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]));
 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 Путь="":
    if ChooseFolder(Folder,"Сохранить как")=cmCancel: Message("Отказ от формирования рейса"); Exit; fi;
   else
    Folder=Путь;
 fi;
 ВыгрузитьРейс;
end;

Proc btnОпись_OnClick(Sender: String);
var Iter,n:I;
 ExecuteProc("ДОКУМЕНТЫ.ДОГОВОРПОСТ.ОПИСЬ_ВЫГРУЗКИ_ИСПОЛ.ОчиститьBuf");
 PutVariableR("ДОКУМЕНТЫ.ДОГОВОРПОСТ.ОПИСЬ_ВЫГРУЗКИ_ИСПОЛ.ОРГ",Учр);
 PutVariableR("ДОКУМЕНТЫ.ДОГОВОРПОСТ.ОПИСЬ_ВЫГРУЗКИ_ИСПОЛ.БАНК",Раб.Бюджет2005.БанкСчет(Учр,False));
 PutVariableD("ДОКУМЕНТЫ.ДОГОВОРПОСТ.ОПИСЬ_ВЫГРУЗКИ_ИСПОЛ.ДатаОпись",ДатаРейс);
 for Iter=1..Упр do
  if not UKey[Iter]="":
     n=n+1;
     PutVariableR("ДОКУМЕНТЫ.ДОГОВОРПОСТ.ОПИСЬ_ВЫГРУЗКИ_ИСПОЛ.BufДок["+Str(n)+"]",StringToRecord(UKey[Iter]));
  fi;
 od;
 PutVariableS("ДОКУМЕНТЫ.ДОГОВОРПОСТ.ОПИСЬ_ВЫГРУЗКИ_ИСПОЛ.GUID",GetGUID);
 OpenBlank("ДОКУМЕНТЫ.ДОГОВОРПОСТ.ОПИСЬ_ВЫГРУЗКИ_ИСПОЛ",True);
end;

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

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

Proc btnОчистить_onClick (Obj:S);
 if EnqOkCancel("Список будет очищен, продолжить ?",mtWarning)=cmCancel: Exit; fi;
 Очистить;
end;

Proc btnЗагрузить_onClick(Sender: String);
var OWA,n,nr:i;
var F:S;
 if Учр=nil or УчрНаим="": Message("Выберите заказчика",mtError); Template.Field="УчрНаим"; Exit; fi;
 if ДК<ДН and not ДК=1.1.100: Message("Начальная дата превышает конечную",mtError); Template.Field="ДН"; Exit; fi;
 F="РЕГ and УЧЕТ_РЕЕСТР_ОФК and Учр="+RecordToString(Учр);
 if ИсклВыгруж: F=F+" and ДатаРейс2=1.1.100 and НомРейс2=0"; fi;
-- if ДН>1.1.100 and ДК>1.1.100: F=F+" and ((ИСПОЛНЕН and ИсполДата>="+DateToString(ДН)+" and ИсполДата<="+DateToString(ДК)+") or (АННУЛИРОВАН and АннулДата>="+DateToString(ДН)+" and АннулДата<="+DateToString(ДК)+"))";
--   |ДН=1.1.100 and ДК>1.1.100: F=F+" and ((ИСПОЛНЕН and ИсполДата<="+DateToString(ДК)+") or (АННУЛИРОВАН and АннулДата<="+DateToString(ДК)+"))";
--   |ДН>1.1.100 and ДК=1.1.100: F=F+" and ((ИСПОЛНЕН and ИсполДата>="+DateToString(ДН)+") or (АННУЛИРОВАН and АннулДата>="+DateToString(ДН)+"))";
--   |True:  F=F+" and (АННУЛИРОВАН or ИСПОЛНЕН)";
-- fi;
 if ДН>1.1.100 and ДК>1.1.100: F=F+" and ((ИСПОЛНЕН and ДатаСвед2>="+DateToString(ДН)+" and ДатаСвед2<="+DateToString(ДК)+") or (АННУЛИРОВАН and ДатаСвед2>="+DateToString(ДН)+" and ДатаСвед2<="+DateToString(ДК)+"))";
   |ДН=1.1.100 and ДК>1.1.100: F=F+" and ((ИСПОЛНЕН and ДатаСвед2<="+DateToString(ДК)+") or (АННУЛИРОВАН and ДатаСвед2<="+DateToString(ДК)+"))";
   |ДН>1.1.100 and ДК=1.1.100: F=F+" and ((ИСПОЛНЕН and ДатаСвед2>="+DateToString(ДН)+") or (АННУЛИРОВАН and ДатаСвед2>="+DateToString(ДН)+"))";
   |True:  F=F+" and (АННУЛИРОВАН or ИСПОЛНЕН)";
 fi;
 F=F+" and Секрет="+Str(Секрет);
 F=F+" and not Недейств";
 Очистить;
 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;
 Проверить(0,False);
end;

Proc btnПроверить_onClick (Obj:S);
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;

Func Прил_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var Iter:I;
 Template.HideEditor(False);
 Iter=AsInteger(Template.Frame);
 if Ukey[Iter]="": Message("Выберите контракт",mtError); Template.Field="НомДок"; Template.Frame=Iter; ^Cur; fi;
 Раб.Обмен.Очистить;
 Раб.Обмен.Recipient="ДОКУМЕНТЫ.ДОГОВОРПОСТ.ПРИЛ2_ИСПОЛ_18Н";
 Раб.Обмен.BufS1[1]=Ukey[Iter];
 OpenBlank("ДОКУМЕНТЫ.ДОГОВОРПОСТ.ПРИЛ2_ИСПОЛ_18Н",True);
 Раб.Обмен.Очистить;
 Return Cur;
end;
--Обработчики событий объектов шаблона-----
--
--Обработчики событий шаблона -----
Proc Template_onOpen(Create:L);
var Rec: Record;
 ДатаРейс=ToDay;
 НомРейсСлед;
 if XXXXX="":
    Rec=Раб.Бюджет2005.НашРекв;
    Учр=Rec;
    УчрНаим=GetCardFieldS("Контрагент",Rec,"КорИмя");
    if not Rec=nil: 
       XXXXX=GetCardFieldS("Контрагент",Rec,"РПО_КБП"); 
       if not Length(XXXXX)=5: XXXXX=""; fi;
    fi;
 fi;
 if not Run=nil:
    Rec=Run; Run=nil;
    Секрет=GetCardFieldI(SelfCrd,Rec,"Секрет");
    FlagLVS=Секрет>0;
    Очистить;
    InsertFrame(Упр,Упр+1);
    НомДок[Упр]=GetCardFieldS(SelfCrd,Rec,"НомерДок");
    ДатаДок[Упр]=GetCardFieldD(SelfCrd,Rec,"ДатаДок");
    Контр[Упр]=GetCardFieldS(SelfCrd,Rec,"Контр.КорИмя");
    НомРеестр[Упр]=GetCardFieldS(SelfCrd,Rec,"Ном_Реестр_ОФК");
    UKey[Упр]=RecordToString(Rec);
    Проверить(Упр,False);
 fi;
end;

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

Конец
