БланкСШаблоном "РПО_МЕСТОНФА", Редактор РПО_МЕСТОНФА;
FlagEdit:L=[False];

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

var НоваяЗапись:L=(CurrentState=crdusInserted);
var ЭтоГруппа:L;
var Заголовок:S=if(ЭтоГруппа, 'Группа местонахождений', 'Местонахождение НФА');
var МасНачЗнач[]:S;    -- Dynamic
var МасИзменений[]:I; -- Dynamic
var СписокПолей: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):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 НайтиИзменения: Integer;
 СписокПолей = '';
 ClearVariable(МасИзменений);
 if ЭтоГруппа:
--    if МасНачЗнач[1]<>RecordToString(Отв): СписокПолей=СписокПолей+if(СписокПолей<>'',',','')+'Ответственный'; МасИзменений[1] = 1; fi;
    if МасНачЗнач[1]<>Телефон: СписокПолей=СписокПолей+if(СписокПолей<>'',',','')+'Телефон'; МасИзменений[1]=1; fi;
    if МасНачЗнач[2]<>Адрес: СписокПолей=СписокПолей+if(СписокПолей<>'',',','')+'Адрес'; МасИзменений[2]=1; fi;
    if МасНачЗнач[3]<>if(Склад,'1','0'): СписокПолей=СписокПолей+if(СписокПолей<>'',',','')+'флаг Склад'; МасИзменений[3]=1; fi;
    if МасНачЗнач[4]<>if(Подразделение,'1','0'): СписокПолей=СписокПолей+if(СписокПолей<>'',',','')+'флаг Подразделение'; МасИзменений[4]=1; fi;
 fi;
 ^SumOfArray(МасИзменений,4);
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 МасИзменений[1]=1: n=PutFieldS(РабОбл,j,'Телефон',Телефон); fi;
      if МасИзменений[2]=1: n=PutFieldS(РабОбл,j,'Адрес',Адрес); fi;
      if МасИзменений[3]=1: n=PutFieldL(РабОбл,j,'Склад',Склад); fi;
      if МасИзменений[4]=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;
 if Код<>"":
    if ПризнакИспользуется("*"): Message("Код '"+Код+"' используется в проводках."+Chr(13)+"Изменение невозможно!"); ^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);
 if FlagEdit: FlagEdit=False; Exit; fi;
 if Код<>"":
    if ПризнакИспользуется("*"): Message("Код '"+Код+"' используется в проводках."+Chr(13)+"Удаление невозможно!"); 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(Отв);
    МасНачЗнач[1]=Телефон;
    МасНачЗнач[2]=Адрес;
    МасНачЗнач[3]=Str(if(Склад,1,0));
    МасНачЗнач[4]=Str(if(Подразделение,1,0));
 fi;
 Template.Field="ПОДРАЗ";
end;

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



Конец



