БланкСШаблоном "Подразделение", Редактор ПОДРАЗДЕЛЕНИЯ;
FlagEdit:L=[False];

var Код_:S=Код;

var НоваяЗапись:L=(CurrentState=crdusInserted);
var ЭтоГруппа:L;
var Заголовок:S=if(ЭтоГруппа, 'Группа подразделений', 'Подразделение');
var МасНачЗнач[]:S;    -- Dynamic
var МасИзменений[]:I; -- Dynamic
var СписокПолей:S;

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

Func ПризнакИспользуется(Voc:S):S;
var tmp:S;
var OWA,Nr,n:I;
 RefreshAna;
 if ЭтоГруппа:
    OWA=OpenWorkArea(SelfCrd,"","GROUPDOC="+RecordToString(Current));
    Try
     Nr=Records(OWA);
     for n=1..Nr do
      tmp=GetFieldS(OWA,n,FieldSign);
      Hint("Проверка группы '"+КОД+"', "+tmp);
      tmp=Раб.Бюджет2005.КартПризнакИспользуется(SelfCrd,FieldSign,GetRecordKey(OWA,n),Voc);
      if not tmp="": ^tmp; fi;
     od;
    Finally
     CloseWorkArea(OWA);
    end;
   else
    tmp=Раб.Бюджет2005.КартПризнакИспользуется(SelfCrd,FieldSign,Current,Voc);
    if not tmp="": ^tmp; fi;
 fi;
 ^"";
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 НайтиИзменения: Integer;
 СписокПолей = '';
 ClearVariable(МасИзменений);
 if ЭтоГруппа:
    if МасНачЗнач[1]<>RecordToString(Отв): СписокПолей=СписокПолей+if(СписокПолей<>'',',','')+'Ответственный'; МасИзменений[1] = 1; fi;
    if МасНачЗнач[2]<>Телефон: СписокПолей=СписокПолей+if(СписокПолей<>'',',','')+'Телефон'; МасИзменений[2]=1; fi;
    if МасНачЗнач[3]<>Адрес: СписокПолей=СписокПолей+if(СписокПолей<>'',',','')+'Адрес'; МасИзменений[3]=1; fi;
    if МасНачЗнач[4]<>if(Склад,'1','0'): СписокПолей=СписокПолей+if(СписокПолей<>'',',','')+'флаг Склад'; МасИзменений[4]=1; fi;
    if МасНачЗнач[5]<>if(Подразделение,'1','0'): СписокПолей=СписокПолей+if(СписокПолей<>'',',','')+'флаг Подразделение'; МасИзменений[5]=1; fi;
 fi;
 ^SumOfArray(МасИзменений,5);
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=PutFieldR(РабОбл,j,'Отв',Отв); fi;
      if МасИзменений[2]=1: n=PutFieldS(РабОбл,j,'Телефон',Телефон); fi;
      if МасИзменений[3]=1: n=PutFieldS(РабОбл,j,'Адрес',Адрес); fi;
      if МасИзменений[4]=1: n=PutFieldL(РабОбл,j,'Склад',Склад); fi;
      if МасИзменений[5]=1: n=PutFieldL(РабОбл,j,'Подразделение',Подразделение); fi;
      EndChanging(РабОбл);
      if GetIsGroup(Родитель,1) : -- если подгруппа - провести рекурсивные присвоения
	 ПрисвоениеЗначенийВнутриПодгруппы(RecordToString(GetRecordKey(РабОбл,j)));
      fi;
     except
      CancelChanging(РабОбл);
      Raise;
     end;
    od;
  finally
    CloseWorkArea(Родитель);
    CloseWorkArea(РабОбл);
  end;
  Hint('');
end;  -- PROC ПрисвоениеЗначенийВнутриПодгруппы(DG: String);

proc СохранитьДанные;
  if НайтиИзменения>0:
    if EnqOkCancel('В карточку были внесены изменения в поля: ^M'+СписокПолей+'. ^M'+'Изменить соответствующие значения у записей внутри группы?')=cmOk :
       ПрисвоениеЗначенийВнутриПодгруппы(RecordToString(Current));
    fi;
  fi;
end;
--Процедуры и функции -------------			      
--
--
--Обработчики событий полей шаблона-----
func Код_OnEnter(FieldName: String; Iter: Integer): logical;
var tmp:S;
 if not Код="":
    tmp=ПризнакИспользуется("*");
    if not tmp="": Message("Признак '"+tmp+"' используется в проводках."+Chr(13)+"Изменение невозможно!",mtError); ^False; fi;
 fi;
 FlagEdit=True;
 ^True;
end;

Func Код_onValidate (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);
var tmp:s;
 if FlagEdit: FlagEdit=False; Exit; fi;
 if not Код="":
    tmp=ПризнакИспользуется("*");
    if not tmp="": Message("Код '"+tmp+"' используется в проводках."+Chr(13)+"Удаление невозможно!",mtError); Exit; fi;
 fi;
 Код="";
end;
--Обработчики событий полей шаблона-----
--
--
--Обработчики событий объектов шаблона-----
proc кнOK_ПриНажатии(Кнопка:String);
  EditorApply; 
  Close;
end;

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

func Template_onValidate:L;
 if Код="": Message('Заполните поле "Код"!'); Template.Field="Код_"; ^False; fi;
 if ПризнакСуществует("П"): ^False; fi;
 Код=Up(Код);
 if ЭтоГруппа and НоваяЗапись=False: СохранитьДанные; fi;
 ^True;
end;
--Обработчики событий шаблона -----
--



Конец



