-- Шаблон создан мастером бланков
-- 10.12.2005 11:39:35
--
БланкСШаблоном "Предмет договора, контракта...";

var Режим:I;
var FlagEdit:L;
var FlagModify:L;

--Глобальные переменные
var ФЗ:I;
var ДатаРег:D;
var ДатаДок:D;
var Контр_Призн:S;
var Общ_Призн1:S;
var Общ_Призн2:S;
var Договор:Record;
var Договор_GUID:S;
var РПО_Ключ:S;
var Секрет:I;
var verОКДП_Гр:I;
var blnДоговор:S;
---
var ЗаполКВОЗ:S="Заполнить";
var ЗаполОКСМ:S="Заполнить";

var verОКДП_Гр_:S="в ред. прик. № "+if(verОКДП_Гр=273,"273","601");

var заглОКП:S=if(ФЗ>=1:"Код ОКПД"|ДатаДок>=01.01.100 and Секрет<2:"Код ОКДП"|True:"Код ОКП*");

var РежимОКП:I=1;

var ЗаполФакт:S="Заполнить";
---
var A:S="+";
var AA:S="++";
var D:S="-";

var Упр:I;
var пп[]:I=$;
var КВОЗ[]:S;
var КВОЗ_[]:S=КВОЗ[$]+" "+if(КВОЗ[$]="1":"поставка товара"|КВОЗ[$]="2":"выполнение работ"|КВОЗ[$]="3":"оказание услуг"|КВОЗ[$]="4":"приобретение объектов недвижемого имущества"|КВОЗ[$]="5":"аренда имущества"|true:"");
var ТМЦ[]:Record;
var НаимТМЦ[]:S;
var ОКСМ[]:S;
var ОКДП_Гр[]:S;
var ОКДП[]:S;
var ПоЦене[]:L;
var ПоЦене_[]:s=if(ПоЦене[$],"цена за единицу","количество");
var Точн[]:S;
var ЕдИзм[]:S;
var Цена[]:N;
var Кол[]:N;
var Сум[]:N;
var ФактКол[]:N;
var ФактСум[]:N;
var ВсегоСум:N=SumOfArray(Сум,Упр);
var ВсегоФактСум:N=SumOfArray(ФактСум,Упр);

var Компенсатор:I=25-Упр;
--
var OWA:I;
var State:I;
var eNoSave:I=1;
var eNoError:I=0;
var eReadCrd:I=-1;
var eLock:I=-2;
var eLockCrd:I=-2;
var eWriteCrd:I=-4;
var eReadParam:I=-5;

var Run:L;
var Загл:S=if(Режим=1:"Изменение предмета договора"|true:"Предмет договора, контракта...");
var ЗаглСум:S=if(Режим=1:"Сумма изменения (+/-)"|true:"Сумма");

var tplFieldName:S;
var tplFrame:I;

S1: Section;
S2: Section;
S3: Section;

Timer1: Object;

var ID:S;

var SelfCrd:S;
var SelfBln:S;

var Buf[]:S;

var fОКЕИ:I;
var fОКДП:I;
var fОКСМ:I;
var fОКПД:I;

var prefixОКДП:S;

var тчнКол:I=[3];
--
--Процедуры и функции -------------
Proc Оформление;
var s:i;
var Flag:L;
var Obj: Object;
 Flag=not GetVariableI(blnДоговор+".ФЗ")=0 and (GetVariableL(blnДоговор+".Исполнен") or GetVariableI(blnДоговор+".ТипИзм")=99);
 for s=1..3 do
  if FindObject("s"+Str(s),Obj):
     Obj.Column(7,ColVisible,Flag); --Код страны происхождения (производитель товара)
     Obj.Column(8,ColVisible,ДатаДок>=1.1.100 and Секрет<2 and ФЗ<1); --Номенклату- рная группа
     Obj.Column(9,ColVisible,ДатаДок>=1.1.100 and Секрет<2 and ФЗ<1); --Номенклату- рная группа (?)
     Obj.Column(11,ColVisible,ДатаДок>=1.1.100 and Секрет<2); --заглОКП (?)
  fi;
 od;
end;

Proc ОчиститьТаб;
 ClearVariable(Упр);
 ClearVariable(КВОЗ);
 ClearVariable(ТМЦ);
 ClearVariable(НаимТМЦ);
 ClearVariable(ОКСМ);
 ClearVariable(ОКДП_Гр);
 ClearVariable(ОКДП);
 ClearVariable(ПоЦене);
 ClearVariable(Точн);
 ClearVariable(ЕдИзм);
 ClearVariable(Цена);
 ClearVariable(Кол);
 ClearVariable(Сум);
 ClearVariable(ФактКол);
 ClearVariable(ФактСум);
end;

Proc Очистить;
 ClearVariable(ДатаРег);
 ClearVariable(Контр_Призн);
 ClearVariable(Общ_Призн1);
 ClearVariable(Общ_Призн2);
 ClearVariable(Договор);
 ClearVariable(Договор_GUID);
 ОчиститьТаб;
end;

Proc НеПустаяТаблица(nn:i);
var n:i;
 if Упр=0: 
    for n=1..nn do
     InsertFrame(Упр,Упр+1);
    od;
 fi;
end;

Proc УдалитьПустыеСтроки;
var Iter:I;
 Iter=1;
 While Iter<=Упр do
  if not ФЗ=0: ОКДП_Гр[Iter]=""; fi;
  if КВОЗ[Iter]="" and
     НаимТМЦ[Iter]="" and
     ОКСМ[Iter]="" and
     ОКДП_Гр[Iter]="" and
     ОКДП[Iter]="" and
     ЕдИзм[Iter]="" and
     Цена[Iter]=0 and
     Кол[Iter]=0 and
     Сум[Iter]=0: DeleteFrame(Упр,Iter);
    else
     Iter=Iter+1;
  fi;
 od;
end;

Proc MyClose;
 Timer1.Active=True;
end;

Proc LockCrd;
var Nr,n:I;
 Try
  Nr=Records(OWA);
  for n=1..nr do
   if not LockRecord(OWA,n,0) and State=eNoError: State=eLock; Message("Редактирование данных невозможно. Недостаточно прав или данные изменяется другим пользователем",mtError); MyClose; fi;
  od;
 Except
  State=eLockCrd;
  MyClose;
  Raise;
 end;
end;

Proc ReadCrd (OWA_:I);
var n,nr:i;
 ОчиститьТаб;
 ShowProgress(0,"Чтение данных.....");
 Try
  Try
   Nr=Records(OWA_);
   ShowProgress(Nr,"Чтение данных.....");
   for n=1..Nr do
    ProgressPos(n);
    InsertFrame(Упр,Упр+1);
    КВОЗ[Упр]=GetFieldS(OWA_,n,"КВОЗ");
    ТМЦ[Упр]=GetFieldR(OWA_,n,"ТМЦ");
    НаимТМЦ[Упр]=GetFieldS(OWA_,n,"НаимТМЦ");
    ОКСМ[Упр]=GetFieldS(OWA_,n,"ОКСМ");
    ОКДП_Гр[Упр]=GetFieldS(OWA_,n,"ОКДП_Гр");
    ОКДП[Упр]=GetFieldS(OWA_,n,"ОКП");
    ПоЦене[Упр]=GetFieldL(OWA_,n,"ПоЦене");
    ЕдИзм[Упр]=GetFieldS(OWA_,n,"ЕдИзм");
    Цена[Упр]=GetFieldN(OWA_,n,"Цена");
    Кол[Упр]=GetFieldN(OWA_,n,"Кол");
    Сум[Упр]=GetFieldN(OWA_,n,"Сум");
    ФактКол[Упр]=GetFieldN(OWA_,n,"ФактКол");
    ФактСум[Упр]=GetFieldN(OWA_,n,"ФактСум");
   od;
  Except
   State=eReadCrd;
   MyClose;
   Raise;
  end;
 Finally
  CloseProgress;
 end;
 НеПустаяТаблица(15);
end;

Func WriteCrd:L;
var Nr,Iter,n,v16:I;
 ShowProgress(Упр,"Запись данных....");
 УдалитьПустыеСтроки;
 Try
  if 1=0: BeginChanging(OWA); fi;  --Обман синтаксиса компилятора (Изменения начались еще ранее)
  Try
   Nr=Records(OWA);
   if (Nr>Упр and not canDelete(SelfCrd)) or (Упр>Nr and not canInsert(SelfCrd)): Message("Недостаточно прав для выполнения данной операции"); ^False; fi;
   if Nr>Упр: 
      for n=Упр+1..nr do 
       DeleteRecord(OWA,Упр+1); 
      od; 
      Nr=Records(OWA);
   fi;
   for Iter=1..Упр do
    ProgressPos(Iter);
    if Iter>Nr: n=InsertRecord(OWA); else n=Iter; fi;
    if not GetFieldI(OWA,n,"НП")=пп[Iter]: n=PutFieldI(OWA,n,"НП",пп[Iter]); fi;
    if not GetFieldD(OWA,n,"ДатаРег")=ДатаРег: n=PutFieldD(OWA,n,"ДатаРег",ДатаРег); fi;
    if not GetFieldS(OWA,n,"Контр_Призн")=Контр_Призн: n=PutFieldS(OWA,n,"Контр_Призн",Контр_Призн); fi;
    if not GetFieldS(OWA,n,"Общ_Призн1")=Общ_Призн1: n=PutFieldS(OWA,n,"Общ_Призн1",Общ_Призн1); fi;
    if not GetFieldS(OWA,n,"Общ_Призн2")=Общ_Призн2: n=PutFieldS(OWA,n,"Общ_Призн2",Общ_Призн2); fi;
    if not GetFieldS(OWA,n,"КВОЗ")=КВОЗ[Iter]: n=PutFieldS(OWA,n,"КВОЗ",КВОЗ[Iter]); fi;
    if not GetFieldR(OWA,n,"ТМЦ")=ТМЦ[Iter]: n=PutFieldR(OWA,n,"ТМЦ",ТМЦ[Iter]); fi;
    if not GetFieldS(OWA,n,"НаимТМЦ")=НаимТМЦ[Iter]: n=PutFieldS(OWA,n,"НаимТМЦ",НаимТМЦ[Iter]); fi;
    if not GetFieldS(OWA,n,"ОКСМ")=ОКСМ[Iter]: n=PutFieldS(OWA,n,"ОКСМ",ОКСМ[Iter]); fi;
    v16=Раб.Crc16.Crc16_(0,НаимТМЦ[Iter]);
    if not GetFieldI(OWA,n,"ТМЦ16")=v16: n=PutFieldI(OWA,n,"ТМЦ16",v16); fi;
    if not GetFieldS(OWA,n,"ОКДП_Гр")=ОКДП_Гр[Iter]: n=PutFieldS(OWA,n,"ОКДП_Гр",ОКДП_Гр[Iter]); fi;
    if not GetFieldS(OWA,n,"ОКП")=ОКДП[Iter]: n=PutFieldS(OWA,n,"ОКП",ОКДП[Iter]); fi;
    if not GetFieldL(OWA,n,"ПоЦене")=ПоЦене[Iter]: n=PutFieldL(OWA,n,"ПоЦене",ПоЦене[Iter]); fi;
    if Точн[Iter]="": Точн[Iter]=Str(тчнКол); fi;
    if not GetFieldS(OWA,n,"Точн")=Точн[Iter]: n=PutFieldS(OWA,n,"Точн",Точн[Iter]); fi;
    if not GetFieldS(OWA,n,"ЕдИзм")=ЕдИзм[Iter]: n=PutFieldS(OWA,n,"ЕдИзм",ЕдИзм[Iter]); fi;
    if not GetFieldN(OWA,n,"Цена")=Цена[Iter]: n=PutFieldN(OWA,n,"Цена",Цена[Iter]); fi;
    if not GetFieldN(OWA,n,"Кол")=Кол[Iter]: n=PutFieldN(OWA,n,"Кол",Кол[Iter]); fi;
    if not GetFieldN(OWA,n,"Сум")=Сум[Iter]: n=PutFieldN(OWA,n,"Сум",Сум[Iter]); fi;
    if not GetFieldN(OWA,n,"ФактКол")=ФактКол[Iter]: n=PutFieldN(OWA,n,"ФактКол",ФактКол[Iter]); fi;
    if not GetFieldN(OWA,n,"ФактСум")=ФактСум[Iter]: n=PutFieldN(OWA,n,"ФактСум",ФактСум[Iter]); fi;
    if not GetFieldR(OWA,n,"Договор")=Договор: n=PutFieldR(OWA,n,"Договор",Договор); fi;
    if not GetFieldS(OWA,n,"Договор_GUID")=Договор_GUID: n=PutFieldS(OWA,n,"Договор_GUID",Договор_GUID); fi;
    if not GetFieldS(OWA,n,"РПО_Ключ")=РПО_Ключ: n=PutFieldS(OWA,n,"РПО_Ключ",РПО_Ключ); fi;
   od;
   EndChanging(OWA);
   BeginChanging(OWA);
   LockCrd;
   if 1=0: EndChanging(OWA); fi; ----Обман компилятора (Изменения пока не закроется бланк)
  Except
   State=eWriteCrd;
   MyClose;
   Raise;
  end;
 Finally
  CloseProgress;
 end;
 НеПустаяТаблица(1);
 ^True;
end;

Proc Пересчет (FieldName:S; Iter:I);
 if FieldName="Цена": Сум[Iter]=Round(Цена[Iter]*Кол[Iter],2); ФактСум[Iter]=Round(Цена[Iter]*ФактКол[Iter],2);
   |FieldName="Кол":  Сум[Iter]=Round(Цена[Iter]*Кол[Iter],2);
   |FieldName="Сум": Цена[Iter]=Round(Сум[Iter]/Кол[Iter],2);
   |FieldName="ФактКол": ФактСум[Iter]=Round(Цена[Iter]*ФактКол[Iter],2);
   |FieldName="ФактСум": ФактКол[Iter]=Round(ФактСум[Iter]/Цена[Iter],тчнКол);
 fi;
end;

Proc КонвОКДП_Гр(flГр:S);
var Iter:I;
var tmp:S;
var Flag:L;
 for Iter=1..Упр do
  tmp=Раб.Договор.ВзятьЗначОКДП(ОКДП[Iter],flГр);
  if not ОКДП_Гр[Iter]=tmp: ОКДП_Гр[Iter]=tmp; Flag=True; fi;
 od;
 if Flag: Message("Внимание! Значения номенклатурных групп ОКДП приведены в соотвествие с прик. МЭР РФ от "+if(flГр="ГР273","07.06.2011 г. N 273","01.12.2010 г. N 601"),mtWarning); fi;
end;

Func ПроверитьКлассификатор (vCrd:S; vField:S; Val:S):L;
var OWA:I;
 OWA=OpenWorkArea(vCrd,"",vField+"='"+Val+"'");
 Try
  if Records(OWA)=0: ^False; fi;
 Finally
  CloseWorkArea(OWA);
 end;
 ^True;
end;
--Процедуры и функции -------------                           
--
--
--Обработчики событий полей шаблона-----
Func verОКДП_Гр_OnEnter(FieldName: String; Iter: Integer): logical;
var i,v:i;
 ClearVariable(Buf);
 Buf[1]="Приказ Минэкономразвития РФ от 1 декабря 2010 г. N 601";
 Buf[2]="Приказ Минэкономразвития РФ от 7 июня 2011 г. N 273";
 i=Alternate("Выберите редакцию номеклатуры",Buf,-1,if(verОКДП_Гр=273,2,1),12);
 if i=1: v=601;
   |i=2: v=273;
   |true: ^False;
 fi;
 if not v=verОКДП_Гр:
    if (v=273 and ДатаРег<9.8.2011) or (v=601 and ДатаРег>8.8.2011):
       if EnqOkCancel("Внимание! На дату регистрации документа "+DateToString(ДатаДок)+" выбранная редакция ("+Str(v)+") не действует^MИгнорировать ?",mtWarning)=cmCancel: ^False; fi;
    fi;
    КонвОКДП_Гр(if(v=273,"ГР273","ГР"));
    verОКДП_Гр=if(v=601,0,v);
    FlagModify=True;
 fi;
 Return False;
end;

Func ЗаполФакт_OnEnter(FieldName: String; Iter: Integer): logical;
 for Iter=1..Упр do
  ФактКол[Iter]=Кол[Iter];
  ФактСум[Iter]=Сум[Iter];
 od;
 FlagModify=True;
 Return False;
end;

Proc ЗаполФакт_OnExit(FieldName: String; Iter: Integer);
 ClearVariable(ФактКол);
 ClearVariable(ФактСум);
 FlagModify=True;
end;

Func A_OnEnter(FieldName: String; Iter: Integer): logical;
 InsertFrame(Упр,Iter+1);
 if FieldName="AA":
    КВОЗ[Iter+1]=КВОЗ[Iter];
    ТМЦ[Iter+1]=ТМЦ[Iter];
    НаимТМЦ[Iter+1]=НаимТМЦ[Iter];
    ОКСМ[Iter+1]=ОКСМ[Iter];
    ОКДП_Гр[Iter+1]=ОКДП_Гр[Iter];
    ОКДП[Iter+1]=ОКДП[Iter];
    ЕдИзм[Iter+1]=ЕдИзм[Iter];
    Цена[Iter+1]=Цена[Iter];
    Кол[Iter+1]=Кол[Iter];
    Сум[Iter+1]=Сум[Iter];
    ФактКол[Iter+1]=ФактКол[Iter];
    ФактСум[Iter+1]=ФактСум[Iter];
   else
    ОКДП[Iter+1]="00.00.00.000";
 fi;
 FlagModify=True;
 Return False;
end;

Func D_OnEnter(FieldName: String; Iter: Integer): logical;
 DeleteFrame(Упр,Iter);
 НеПустаяТаблица(1);
 FlagModify=True;
 Return False;
end;

Func КВОЗ_OnEnter(FieldName: String; Iter: Integer): logical;
var n,i1,i2:i;
 ClearVariable(Buf);
 Buf[1]="1 поставка товара";
 Buf[2]="2 выполнение работ";
 Buf[3]="3 оказание услуг";
 Buf[4]="4 приобретение объектов недвижемого имущества";
 Buf[5]="5 аренда имущества";
 n=Alternate("Код вида объекта закупки",Buf,-1,Int(КВОЗ[Iter]),12);
 if not n=0:
    НеПустаяТаблица(1);
    if FieldName="ЗаполКВОЗ":
       i1=1;
       i2=Упр;
      else
       i1=Iter;
       i2=Iter;
    fi;
    for Iter=i1..i2 do
     КВОЗ[Iter]=Str(n);
    od;
 fi;
 FlagModify=True;
 Return False;
end;

Proc НаимТМЦ_OnExit(FieldName: String; Iter: Integer);
 ТМЦ[Iter]=nil;
 FlagModify=True;
end;

Func НаимТМЦ_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var Rec: Record;
var Iter: I;
 Template.HideEditor(False);
 Iter=AsInteger(Template.Frame);
 if not ТМЦ[Iter]=nil:
    rec=OpenCardFile("ТМЦ","",ТМЦ[Iter],crdRecordOnly);
   else
    rec=Раб.Документы.ВыборСФильтром("ТМЦ","КОММЕНТ","");
 fi;
 if Rec=nil: ^Cur; fi;
 ТМЦ[Iter]=Rec;
 НаимТМЦ[Iter]=GetCardFieldS("ТМЦ",Rec,"КОММЕНТ");
 ОКДП[Iter]=GetCardFieldS("ТМЦ",Rec,"ОКДП");
 ЕдИзм[Iter]=GetCardFieldS("ТМЦ",Rec,"ОКЕИ");
 if ЕдИзм[Iter]="": ЕдИзм[Iter]=GetCardFieldS("ТМЦ",Rec,"ЕдИзм"); fi;
 FlagModify=True;
 Return Cur;
end;

Func ОКСМ_OnVerify(FieldName: String; Iter: Integer; Value: String): Logical;
var OWA:I;
 if fОКСМ=0:
    fОКСМ=Раб.Договор.ЗагрузСправ("РПО_ОКСМ",PlanVar("Std_Rpo")+"\DBF\РПО_ОКСМ",ieCRD,"Загрузить Общероссийский классификатор стран мира ?");
 fi;
 if not Value="000":
    Value=Str(Int(Value));
    OWA=OpenWorkArea("РПО_ОКСМ","","Код='"+Value+"'");
    Try
     if Records(OWA)=0:
        Message("Код страны '"+Value+"' в справочнике ОКСМ не найден",mtError);
        ^False;
     fi;
    Finally
     CloseWorkArea(OWA);
    end;
 fi;
 Return True;
end;

Proc ОКСМ_OnExit(FieldName: String; Iter: Integer);
 if not ОКСМ[Iter]="":
    ОКСМ[Iter]=RepStr("0",3-Length(ОКСМ[Iter]))+ОКСМ[Iter];
 fi;
 FlagModify=True;
end;

Func ОКСМ_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var Iter:I;
var Rec: Record;
 Template.HideEditor(False);
 if fОКСМ=0:
    fОКСМ=Раб.Договор.ЗагрузСправ("РПО_ОКСМ",PlanVar("Std_Rpo")+"\DBF\РПО_ОКСМ",ieCRD,"Загрузить Общероссийский классификатор стран мира ?");
 fi;
 if fОКСМ=1:
    Iter=AsInteger(Template.Frame);
    Rec=Раб.Поиск.ВыборИзКартотеки("Выбор страны","РПО_ОКСМ","КОРИМЯ|ПОЛНИМЯ|АЛЬФА2|АЛЬФА3","Краткое наименование|Полное наименование|Код альфа 2|Код альфа 2","");
    if not Rec=nil:
       ОКСМ[Iter]=GetCardFieldS("РПО_ОКСМ",Rec,"КОД");
       ОКСМ[Iter]=RepStr("0",3-Length(ОКСМ[Iter]))+ОКСМ[Iter];
       FlagModify=True;
    fi;
 fi;
 Return Cur;
end;

Func ЗаполОКСМ_OnEnter(FieldName: String; Iter: Integer): logical;
var val:S;
 Template.Field="ОКСМ";
 Template.Frame=1;
 val=ОКСМ[1];
 ОКСМ_OnLookup("",1,1,"");
 for Iter=2..Упр do
  if КВОЗ[Iter]="1":
     ОКСМ[Iter]=ОКСМ[1];
  fi;
 od;
 if not КВОЗ[1]="1":
    КВОЗ[1]=val;
 fi;
 Return False;
end;

Func ОКДП_Гр_OnEnter(FieldName: String; Iter: Integer): logical;
 Return ДатаДок>=1.1.100 and Секрет<2;
end;

Func ОКДП_Гр_OnVerify(FieldName: String; Iter: Integer; Value: String): logical;
 Return Раб.Договор.ОКДП_Гр_Verify(selfbln+".ОКДП["+Str(Iter)+"]",Value,verОКДП_Гр);
end;

Proc ОКДП_Гр_OnExit(FieldName: String; Iter: Integer);
 Раб.Договор.ОКДП_Гр_Exit(selfbln+".ОКДП_Гр["+Str(Iter)+"]");
 FlagModify=True;
end;

Func ОКДП_Гр_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var Iter:I;
 Template.HideEditor(False);
 Iter=AsInteger(Template.Frame);
 FlagModify=not Раб.Договор.ОКДП_Гр_Lookup(selfbln+".ОКДП_Гр["+Str(Iter)+"]",selfbln+".ОКДП["+Str(Iter)+"]",verОКДП_Гр)=nil;
 Return Cur;
end;

Func ОКДП_OnVerify(FieldName: String; Iter: Integer; Value: String): logical;
var Flag:L;
 if ФЗ>=1:
    if Секрет>0 and (Match(Value,"000000??????") or Match(Value,"??????")) and Pos(".",Value)=0:
       if Match(Value,"??????"):
          prefixОКДП="000000";
       fi;
       Flag=True;
      else
       Flag=Раб.Договор.ОКПД_Verify(Value,"");
       if Flag and Match(ОКДП[Iter],"??.??.??.??0") and not Match(ОКДП[Iter],"??.??.??.000"):
          OWA=OpenWorkArea("РПО_ОКПД","","not Код='"+ОКДП[Iter]+"' and Match(Код,'"+SubStr(ОКДП[Iter],1,11)+"?')");
          Try
           if Records(OWA)>0:
              Message("Введенное значение '"+Value+"' не является подкатегорией",mtError);
              Flag=False;
           fi;
          Finally
           CloseWorkArea(OWA);
          end;
       fi;
     fi;
   |ДатаДок>=1.1.100 and Секрет<2:
    Flag=Раб.Договор.ОКДП_Verify(selfbln+".ОКДП_Гр["+Str(Iter)+"]",Value,verОКДП_Гр);
   |True:
    Flag=True;
    if not Length(Value)=6: Flag=False; Message("Длина кода ОКП должна быть 6 знаков",mtError); fi;
 fi;
 Return Flag;
end;

Proc ОКДП_OnExit(FieldName: String; Iter: Integer);
 if not prefixОКДП="":
    ОКДП[Iter]=prefixОКДП+ОКДП[Iter];
    prefixОКДП="";
 fi;
 FlagModify=True;
end;

Func ОКДП_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var Iter,OWA:I;
var Rec,Rec2: Record;
var tmp:S;
var Crd,txt:S;
var hОКДП:S;
var Flag:L;
 Template.HideEditor(False);
 Iter=AsInteger(Template.Frame);
 hОКДП=ОКДП[Iter];
 if ФЗ>=1:
    rec=Раб.Договор.ОКПД_Lookup(selfbln+".ОКДП["+Str(Iter)+"]",selfbln+".fОКДП","");
    if not rec=nil:
       if not Length(ОКДП[Iter])=12:
          ОКДП[Iter]=hОКДП;
          Message("Уточните значение категории и подкатегории");
          rec=OpenCardFile("РПО_ОКПД","(Length(Код)=12 and Match(Код,'"+tmp+"*')) or Код='"+tmp+"'",Rec);
          if not Rec=nil:
             tmp=GetCardFieldS("РПО_ОКПД",Rec,"Код");
             if not Length(tmp)=12:
                Message("Допустимо выбирать код XX.XX.XX.XXX");
                ^Cur;
             fi;
             ОКДП[Iter]=tmp;
            else
             if Секрет>0:
--                В соотвествии с письмом МФ РФ от 3.02.2014 №02-02-04/4181. В случае отсутствия наименования продукции в ОКПД использовать классификатор ОКП в части кодов закрытого класса продукции
--                письмо ФК от 07.02.2014 №42-7.4-18/5.2-107
             fi;
          fi;
       fi;
       if Match(ОКДП[Iter],"??.??.??.??0") and not Match(ОКДП[Iter],"??.??.??.000"):
          OWA=OpenWorkArea("РПО_ОКПД","","not Код='"+ОКДП[Iter]+"' and Match(Код,'"+SubStr(ОКДП[Iter],1,11)+"?')");
          Try
           Flag=Records(OWA)>0;
          Finally
           CloseWorkArea(OWA);
          end;
          if Flag:
             Message("Уточните значение подкатегории");
             rec=OpenCardFile("РПО_ОКПД","Match(Код,'"+SubStr(ОКДП[Iter],1,11)+"?') or Код='"+ОКДП[Iter]+"'",Rec);
             ОКДП[Iter]=hОКДП;
             if Rec=nil:
                ^Cur;
               else
                tmp=GetCardFieldS("РПО_ОКПД",Rec,"Код");
                if Match(tmp,"??.??.??.??0"):
                   Message("Допустимо выбирать только подкатегорию");
                   ^Cur;
                fi;
                ОКДП[Iter]=tmp;
             fi;
          fi;
       fi;
       FlagModify=True;
    fi;
   else
    crd=if(ДатаДок>=1.1.100 and Секрет<2,"РПО_ОКДП","РПО_ОКП");
    txt=if(ДатаДок>=1.1.100 and Секрет<2,"Общероссийский классификатор видов экономической деятельности, продукции и услуг (ОКДП)","Загрузить общероссийский классификатор продукции (ОКП) ?");
    if fОКДП=0:
       fОКДП=Раб.Договор.ЗагрузСправ(crd,PlanVar("Std_Rpo")+"\DBF\"+crd,ieCRD,txt+Chr(13)+"Внимание! Процес загрузки займет значительное время");
    fi;
    if fОКДП=1:
       if ДатаДок>=1.1.100 and Секрет<2:
          rec=Раб.Договор.ОКДП_Lookup(selfbln+".ОКДП_Гр["+Str(Iter)+"]",selfbln+".ОКДП["+Str(Iter)+"]",selfbln+".fОКДП",verОКДП_Гр);
          if not rec=nil and РежимОКП=0:
             tmp=GetCardFieldS("РПО_ОКДП",Rec,"НАИМ");
             if not hОКДП=ОКДП[Iter] and not hОКДП="" and not НаимТМЦ[Iter]=tmp and not НаимТМЦ[Iter]="":
                Flag=EnqOkCancel("Изменить наименование товара, работ, услуг на^M'"+tmp+"' ?",mtWarning)=cmOk;
             fi;
             if НаимТМЦ[Iter]="" or Flag: НаимТМЦ[Iter]=tmp; fi;
          fi;
         else
          Rec=Раб.Поиск.ВыборИзКартотеки("Выбор из классификатора ОКП","РПО_ОКП","КОД|НАИМ","Код продукции|Наименование продукции","");
          if Rec=nil: ^Cur; fi;
          ОКДП[Iter]=GetCardFieldS("РПО_ОКП",Rec,"КОД");
          tmp=GetCardFieldS("РПО_ОКП",Rec,"НАИМ");
          if (not Pos("/",tmp)=0 and SubStr(ОКДП[Iter],6,1)="0") or Раб.Договор.ОКП_ЕстьВидПрод(ОКДП[Iter]):
             if EnqOkCancel("Детализировать для выбранной подгруппы виды продукции ?",mtWarning)=cmOk:
                tmp=SubStr(ОКДП[Iter],1,5)+"?";
                Rec2=OpenCardFile("РПО_ОКП","Match(КОД,'"+tmp+"')");
                if not Rec2=nil:
                   Rec=Rec2;
                   ОКДП[Iter]=GetCardFieldS("РПО_ОКП",Rec,"КОД");
                   tmp=GetCardFieldS("РПО_ОКП",Rec,"НАИМ");
                fi;
             fi;
          fi;
          if РежимОКП=0:
             tmp=Раб.Договор.ОКП_ВзятьНаим(Rec);
             if not hОКДП=ОКДП[Iter] and not hОКДП="" and not НаимТМЦ[Iter]="":
                Flag=EnqOkCancel("Изменить наименование товара, работ, услуг на^M'"+tmp+"' ?",mtWarning)=cmOk;
             fi;
             if НаимТМЦ[Iter]="" or Flag: НаимТМЦ[Iter]=tmp; fi;
          fi;
       fi;
       FlagModify=True;
    fi;
 fi;
 Return Cur;
end;

Proc ОКДП_OnClick(Row: Integer; Col: Integer; Double: Logical);
var Field,Name,tmp:s;
var Iter:I;
var Obj: Object;
 Iter=AsInteger(Template.Frame);
 Name=AsString(Template.Name);
 if FindObject(Name,Obj):
    Field=AsString(Obj.Cell(Row,Col-1,CellContents,"",False));
    tmp=GetVariableS(Field+"["+Str(Iter)+"]");
    if tmp="": Message("Введите код "+if(ФЗ>=1:"ОКПД"|Field="ОКДП":"ОКДП"|true:"номенклатурной группы"),mtError); Template.Field=Field; Template.Frame=Iter; Exit; fi;
    if Field="ОКДП":  
       if ФЗ>=1:
          tmp=Раб.Договор.ВзятьЗначОКПД(tmp,"Наим");
         else
          tmp=Раб.Договор.ВзятьЗначОКДП(tmp,"Наим");
       fi;
      |Field="ОКДП_Гр": tmp=Раб.Бюджет.НаимКБК("ОКДП_ГР",tmp);
      |true: tmp="";
    fi;
    if not tmp="":
       Message(tmp);
    fi;
 fi;
end;

Func ПоЦене_OnEnter(FieldName: String; Iter: Integer): logical;
var n:i;
 ClearVariable(Buf);
 Buf[1]="Количество";
 Buf[2]="Цена за единицу";
 n=Alternate("Выберите измеритель объекта закупки",Buf,-1,if(ПоЦене[Iter],2,1),12);
 if not n=0:
    НеПустаяТаблица(1);
    ПоЦене[Iter]=(n=2);
    if ПоЦене[Iter]:
       Точн[Iter]=Str(тчнКол);
       Кол[Iter]=0;
    fi;
    FlagModify=True;
 fi;
 Return False;
end;

Func ЕдИзм_OnVerify(FieldName: String; Iter: Integer; Value: String): Logical;
 if not ПроверитьКлассификатор("РПО_ОКЕИ","НКБО",Value):
    if EnqOkCancel("Единица измерения "+Value+" не найдена в классификаторе ОКЕИ^MИгнорировать предупреждение ?",mtWarning)=cmCancel:
       Template.Field="ЕдИзм";
       Template.Frame=Iter;
    fi;
 fi;
 Return True;
end;

Func ЕдИзм_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var Rec: Record;
var Iter:I;
var Field:S;
 Template.HideEditor(False);
 if fОКЕИ=0: fОКЕИ=Раб.Договор.ЗагрузСправ("РПО_ОКЕИ",PlanVar("Std_Rpo")+"\DBF\РПО_ОКЕИ",ieCRD,"Загрузить справочник единиц измерений ОКЕИ ?"); fi;
 if fОКЕИ=1:
    Iter=AsInteger(Template.Frame);
    Rec=Раб.Поиск.ВыборИзКартотеки("Выбор из классификатора ОКЕИ","РПО_ОКЕИ","ВИД|КОД|НАИМЕНОВАНИЕ|НУО|МУО|НКБО|МКБО","Группа (длина,площадь,объем,масса,техн,время,экон)|Код|Наименование|Нацинальное условное обозначение|Международное условное обозначение|Национальное кодовое буквенное обозначение|Международное кодовое буквенное обозначение","");
    if Rec=nil: ^Cur; fi;
    Field="НКБО";
    ЕдИзм[Iter]=GetCardFieldS("РПО_ОКЕИ",Rec,Field);
    if Field="КОД":
       if Length(ЕдИзм[Iter])=1: ЕдИзм[Iter]="00"+ЕдИзм[Iter];
         |Length(ЕдИзм[Iter])=2: ЕдИзм[Iter]="0"+ЕдИзм[Iter];
         |True: ЕдИзм[Iter]=SubStr(ЕдИзм[Iter],1,3);
       fi;
    fi;
    FlagModify=True;
 fi;
 Return Cur;
end;

Func Сум_OnEnter(FieldName: String; Iter: Integer): logical;
 if ПоЦене[Iter]: Message(if(FieldName="Кол","Количество","Сумма")+" не заполняется, в случае измерителя объекта закупки 'по цене за единицу'",mtError); Template.Field="ПоЦене_"; Template.Frame=Iter; ^False; fi;
 Return True;
end;

Proc Сум_OnExit(FieldName: String; Iter: Integer);
var pr:i;
 if FieldName="Кол" or FieldName="ФактКол": pr=тчнКол; else pr=2; fi;
 PutVariableN(FieldName+"["+Str(Iter)+"]",Round(GetVariableN(FieldName+"["+Str(Iter)+"]"),pr));
 Пересчет(FieldName,Iter);
 FlagModify=True;
end;

Proc Field_OnExit(FieldName: String; Iter: Integer);
 FlagModify=True;
end;
--Обработчики событий полей шаблона-----
--
--
--Обработчики событий объектов шаблона-----
Proc OnTimer(Sender: String);
 Timer1.Active=False;
 Close;
end;

Proc btnСохранить_OnClick(Sender: String);
 if not canUpdate(SelfCrd): Message("Недостаточно прав для выполнения данной операции"); Exit; fi;
 FlagModify=not WriteCrd;
end;

Proc btnОтменить_OnClick(Sender: String);
 ReadCrd(OWA);
 FlagModify=False;
end;

Proc btnЗакрыть_OnClick(Sender: String);
 Close;
end;

Proc btnОчистить_OnClick(Sender: String);
 if EnqOkCancel("Таблица будет очищена, продолжить ?",mtWarning)=cmCancel: Exit; fi;
 ОчиститьТаб;
 НеПустаяТаблица(15);
 FlagModify=True;
end;

Proc btnЗагрузПре_OnClick(Sender: String);
var OWA:I;
var crdДоговор:S;
var Договор_Пре:Record;
 Договор_Пре=GetVariableR(blnДоговор+".Договор_Пре");
 crdДоговор=GetVariableS(blnДоговор+".crdДоговор");
 if RecordExists(crdДоговор,Договор_Пре):
    if EnqOkCancel("Таблица будет очищена, продолжить ?",mtWarning)=cmCancel: Exit; fi;
    OWA=OpenWorkArea(SelfCrd,"","Договор="+RecordToString(Договор_Пре));
    Try
     ReadCrd(OWA);
    Finally
     CloseWorkArea(OWA);
    end;
    FlagModify=True;
    Message("Данные успешно загружены");
   else
    Message("Предыдущая копия документа не найдена",mtError);
 fi;
end;
--Обработчики событий объектов шаблона-----
--
--
--Обработчики событий шаблона -----
Proc OnOpen(Create: Logical);
 if SelfCrd="": SelfCrd=Раб.Договор.crdДоговор_ТМЦ; fi;
 if SelfBln="": SelfBln=Раб.Договор.blnДоговор_ТМЦ; fi;
 fОКДП=0;
 fОКЕИ=0;
 FlagModify=False;
 State=eNoError;
 if Run=True: LockCrd; ReadCrd(OWA); fi;
 Run=False;
 ID="*";
end;

Proc AfterOpen(Destroy: Logical);
 Оформление;
 if not tplFieldName="" and not tplFrame=0:
    Template.Field=tplFieldName;
    Template.Frame=tplFrame;
 fi;

end;

Proc OnClose(Destroy: Logical);
 if FlagModify and State=eNoError:
    if EnqOkCancel("Сохранить изменения ?")=cmOk: WriteCrd; else State=eNoSave; fi;
 fi;
end;
--Обработчики событий шаблона -----


Конец
