БланкСШаблоном "Карточка ТМЦ", Редактор ТМЦ;

var FlagEdit:L=[False];

Признак_:S=Признак;

var НоваяЗапись:L=(CurrentState=crdusInserted);
var ЭтоГруппа  :L;
var Заголовок  :S=if(ЭтоГруппа,'Группа','Карточка')+' ТМЦ';
var ВидТМЦ_:S=if(ВидТМЦ=1,"Товар",if(ВидТМЦ=2,"Материал",if(ВидТМЦ=3,"Изделие",if(ВидТМЦ=4,"Услуга",if(ВидТМЦ=5,"Оборудование",if(ВидТМЦ=15,"Тара",Str(ВидТМЦ)))))));
var МасНачЗнач[]:S;
var МасИзменений[]:I;
var СписокПолей: S;
var НДССтр:String=if(НДС=-1,'Без',Str(НДС));
var Buf[]:S;

var SelfCrd:S="ТМЦ";
var FieldSign:S="ПРИЗНАК";
--
--Процедуры и функции -------------   
Proc ПоУмолчанию;
var Родитель:Integer;
 if ПРИЗНАК='' : -- иначе это дубль записи
    if RecordExists('Тмц', GroupDoc) : -- считываем значения из записи группы, в которой создали новую запись
       Родитель=OpenWorkArea('ТМЦ','','Ukey='+RecordToString(GroupDoc));
       try
	if Records(Родитель)>0:
	   ВидТМЦ=GetFieldI(Родитель,1,'ВидТМЦ');
	   ЕдИзм=GetFieldS(Родитель,1,'ЕдИзм');
	   ОКЕИ=GetFieldS(Родитель,1,'ОКЕИ');
	   ОКДП=GetFieldS(Родитель,1,'ОКДП');
	   Страна=GetFieldS(Родитель,1,'Страна');
	   ГТД=GetFieldS(Родитель,1,'ГТД');
	   Артикул=GetFieldS(Родитель, 1, 'Артикул');
	   Точ=GetFieldI(Родитель, 1, 'Точ');
	fi; -- if Records(Родитель) > 0
       finally
	CloseWorkArea(Родитель);
       end;
    fi;
 fi;
 ВидТМЦ=if(ВидТМЦ<1,2,ВидТМЦ);
 ПРИЗНАК=Раб.Предм.PtrStr(Current,5);
end;

func НайтиИзменения: Integer;
  СписокПолей='';
  ClearVariable(МасИзменений);
  if ЭтоГруппа:
    if МасНачЗнач[1]<>Str(ВидТМЦ): СписокПолей='ВидТМЦ'; МасИзменений[1]=1; fi;
    if МасНачЗнач[2]<>Страна: СписокПолей=СписокПолей+if(СписокПолей<>'',', Страна','Страна'); МасИзменений[2]=1; fi;
    if МасНачЗнач[3]<>ГТД: СписокПолей=СписокПолей+if(СписокПолей<>'',', ГТД','ГТД'); МасИзменений[3]=1; fi;
    if МасНачЗнач[4]<>ЕдИзм: СписокПолей=СписокПолей+if(СписокПолей<>'',', ЕдИзм','ЕдИзм'); МасИзменений[4]=1; fi;
    if МасНачЗнач[5]<>Океи: СписокПолей=СписокПолей+if(СписокПолей<>'',', код Океи','код Океи'); МасИзменений[5]=1; fi;
    if МасНачЗнач[6]<>Str(Точ): СписокПолей=СписокПолей+if(СписокПолей<>'',', Точность изм.','Точность изм.'); МасИзменений[6]=1; fi;
    if МасНачЗнач[7]<>Артикул: СписокПолей=СписокПолей+if(СписокПолей<>'', ', Артикул','Артикул'); МасИзменений[7]=1; fi;
    if МасНачЗнач[8]<>ОКДП: СписокПолей=СписокПолей+if(СписокПолей<>'', ', ОКДП','ОКДП'); МасИзменений[8]=1; fi;
  fi;
  ^SumOfArray(МасИзменений,8);
end;  --  func НайтиИзменения: Integer;

proc ПрисвоениеЗначенийВнутриПодгруппы(DG: String);
var Родитель, РабОбл, КолЗаписей, j,  n: Integer;
 Родитель=OpenWorkArea('ТМЦ','','UKey='+DG);
 РабОбл=OpenWorkArea('ТМЦ','','GroupDoc='+DG);
 try
  КолЗаписей=Records(РабОбл);
  for j=1..КолЗаписей do
   Hint('Изменяется ТМЦ: '+GetFieldS(РабОбл,j,'КОММЕНТ'));
   try
    BeginChanging(РабОбл);
     if МасИзменений[1]=1: n=PutFieldI(РабОбл,j,'ВидТМЦ',ВидТМЦ); fi;
     if МасИзменений[2]=1: n=PutFieldS(РабОбл,j,'Страна',Страна); fi;
     if МасИзменений[3]=1: n=PutFieldS(РабОбл,j,'ГТД',ГТД); fi;
     if МасИзменений[4]=1: n=PutFieldS(РабОбл,j,'ЕдИзм',ЕдИзм); fi;
     if МасИзменений[5]=1: n=PutFieldS(РабОбл,j,'Океи',Океи); fi;
     if МасИзменений[6]=1: n=PutFieldI(РабОбл,j,'Точ', Точ); fi;
     if МасИзменений[7]=1: n=PutFieldS(РабОбл,j,'Артикул',Артикул); fi;
     if МасИзменений[8]=1: n=PutFieldS(РабОбл,j,'ОКДП',ОКДП); fi;
     Hint('Подождите, идет запись измененых карточек ТМЦ на диск ...');
     EndChanging(РабОбл);
     if GetIsGroup(РабОбл,j) : -- если подгруппа - провести рекурсивные присвоения
	ПрисвоениеЗначенийВнутриПодгруппы(RecordToString(GetRecordKey(РабОбл, j)));
     fi;
   except
    CancelChanging(РабОбл);
    Raise;
   end;
  od;
 finally
  CloseWorkArea(Родитель);
  CloseWorkArea(РабОбл);
 end;
 Hint('');
end;

proc СохранитьДанные;
  if НайтиИзменения>0 :
    if EnqOkCancel('В карточку были внесены изменения в поля: ^M' + СписокПолей + '. ^M' +
		   'Изменить соответствующие значения у записей внутри группы?')=cmOk:
       ПрисвоениеЗначенийВнутриПодгруппы(RecordToString(Current));
    fi;
  fi;
end;

Func ПризнакИспользуется(Voc:S):L;
var n,ns,z:i;
var tmp:S;
var OWA,Nr:I;
var Rec:Record;
 RefreshAna;
 if ЭтоГруппа:
    OWA=OpenWorkArea("ТМЦ","","GROUPDOC="+RecordToString(Current));
    Try
     Nr=Records(OWA);
     for z=1..Nr do
      tmp=GetFieldS(OWA,z,"Признак");
      Hint("Проверка группы '"+Признак+"', "+tmp);
      Rec=GetRecordKey(OWA,z);
      ns=RecSignsCount("ТМЦ",Rec);
      for n=1..ns do
       tmp=RecSign("ТМЦ",Rec,n);
       if SignUsed(tmp): ^True; fi;
      od;
     od;
    Finally
     CloseWorkArea(OWA);
    end;
   else
    ns=RecSignsCount("ТМЦ",Current);
    for n=1..ns do
     tmp=RecSign("ТМЦ",Current,n);
     if Match(tmp,Voc):
	if SignUsed(tmp): ^True; fi;
     fi;
    od;
 fi;
 ^False;
end;

Func ПризнакСуществует(Voc:S):L;
var w,ww:i;
var Призн_,tmp,GFN:S;
var Flag:L;
var Rec:Record;
 Призн_=GetVariableS(FieldSign);
 if IsHierArchical(SelfCrd):
    GFN=GetGroupFieldName(SelfCrd);
    Rec=GetVariableR(GFN);
    Flag=Rec=nil;
   else
    Flag=True;
 fi;
 ww=WordsCount(Voc,"|");
 for w=1..ww do
  if Flag:
     tmp=ExtractWord(w,Voc,"|")+"."+Призн_;
    else
     tmp=CardFileRecSign(SelfCrd,FieldSign,ExtractWord(w,Voc,"|"),Rec);
     tmp=tmp+"."+Призн_;
  fi;
  if not Name_A(tmp)=" " and not SignToRecord(tmp)=Current: Message("Признак '"+tmp+"' уже существует !",mtError); ^True; fi;
 od;
 ^False;
end;
--Процедуры и функции -------------			      
--
--
--Обработчики событий полей шаблона-----
func ПРИЗНАК_OnEnter(FieldName: String; Iter: Integer): logical;
 if Признак<>"":
    if ПризнакИспользуется("*"): Message("Код '"+Признак+"' используется в проводках."+Chr(13)+"Изменение невозможно!"); ^False; fi;
 fi;
 FlagEdit=True;
 ^True;
end;

Func Признак_onVerify (Field:S; Iter:I; Value:S):L;
var R:L;
 FlagEdit=True;
 R=ValidSign(Value);
 if R=False: Раб.Бюджет.ПроверитьПризнак(Value); 
   else
    Признак=Value;
 fi;
 ^R;
end;

Proc Признак_onExit (Field:S; Iter:I);
 if FlagEdit: FlagEdit=False; Exit; fi;
 if Признак<>"":
    if ПризнакИспользуется("*"): Message("Код '"+Признак+"' используется в проводках."+Chr(13)+"Удаление невозможно!"); Exit; fi;
 fi;
 Признак="";
end;

func ВидТМЦ_OnEnter(FieldName: String; Iter: Integer): logical;
var n:i;
 ClearVariable(Buf);
 Buf[1]="Товар";
 Buf[2]="Материал";
 Buf[3]="Изделие";
 Buf[4]="Услуга";
 Buf[5]="Оборудование";
 Buf[6]="Тара";
 n=Alternate("Вид ТМЦ",Buf,20);
 if n=0: ^False; fi;
 if n=6: n=15; fi;
 ВидТМЦ=n;
 ^False;
end;

func Точ_OnVerify(FieldName: String; Iter: Integer; Value: Integer): Logical;
 if Value<0: Message('Нельзя указывать отрицательные числа.'); ^false; fi;
 ^True;
end;

Func НДС_OnVerify (Field:string; Iter:integer; Value: String): logical;
var Value2:Numeric;
  FlagEdit=True;
  Value2=Round(Value);
  if Value2 < 0 :
    Message('Нельзя указывать отрицательные числа.');
    return false;
  else
    if (Value<>'') And (Field='НДССтр'):
      НДС[Сегодня]=Round(Value);
    Else
      НДС[Сегодня]=-1;
    end;
    return true;
  end;
end;

Proc НДССтр_OnExit (Field:string; Iter:integer);
 if FlagEdit=True: FlagEdit=False; Exit; fi;
 НДС=-1;
end;

Func НДССтр_OnLookup (Sect:S; Row:I; Col:I; Cur:S) :S;
var i: Integer;
 if CurrentState = crdusModified or CurrentState = crdusInserted:
    if EnqOkCancel('Для выполнения этой операции необходимо сохранить изменения.' + '^M' + 'Сохранить ?')<>cmOk: ^Cur; fi;
    EditorApply;
 fi;
 ClearBlank('РАБ.РЕДПЕРИОДПОЛЯ', True);
 РАБ.РЕДПЕРИОДПОЛЯ.РедактированиеEx(Current, 'ТМЦ', 'НДС', КОММЕНТ, 'НДС', 0, '100');
 if РАБ.РЕДПЕРИОДПОЛЯ.CloseResult :
    ClearVariable(НДС);
    for i = 1 .. РАБ.РЕДПЕРИОДПОЛЯ.ПозПериодПоля do
     НДС[РАБ.РЕДПЕРИОДПОЛЯ.Даты[i]] = РАБ.РЕДПЕРИОДПОЛЯ.Значения[i];
    od;
    EditorApply;
 fi;
^Cur;
end;
--Обработчики событий полей шаблона-----
--
--
--Обработчики событий объектов шаблона-----
proc КнСохранить(Sender: String);
  EditorApply;
  Close;
end;

proc КнОтменить(Sender: String);
  EditorCancel;
  Close;
end;
--Обработчики событий объектов шаблона-----
--
--
--Обработчики событий шаблона -----
proc Template_onRead;
 ЭтоГруппа=IsCardGroup('ТМЦ',Current);
 if НоваяЗапись: ПоУмолчанию; fi;
 if ЭтоГруппа and НоваяЗапись=False:
    ClearVariable(МасНачЗнач);
    МасНачЗнач[1]=Str(ВидТМЦ);
    МасНачЗнач[2]=Страна;
    МасНачЗнач[3]=ГТД;
    МасНачЗнач[4]=ЕдИзм;
    МасНачЗнач[5]=Океи;
    МасНачЗнач[6]=Str(Точ);
    МасНачЗнач[7]=Артикул;
    МасНачЗнач[8]=ОКДП;
 fi;
 Template.Field="Признак";
end;

func Template_onValidate: Logical;
 if Признак="": Message('Заполните поле "Код"!'); Template.Field="Признак"; ^False; fi;
 if ПризнакСуществует("ТМЦ"): ^False; fi;
 if ЭтоГруппа and НоваяЗапись=False: СохранитьДанные; fi;
 ^True;
end;

--Обработчики событий шаблона -----
--


Конец
