-- Шаблон создан мастером бланков
-- 04.03.2008 11:55:33
--
БланкСШаблоном "...";

var Режим:I;
var Карт:S;
var ДопФ:S;
var ТекЗап:Record;

var Загл:S;

var Упр:I;

var Наим   []:S;
var Знач   []:S;
var Поле   []:S;
var Тип    []:S;
var defЗнач[]:S;

var hKey []:S;
var hЗнач[]:S;

var isФильтр:L;
var RetS    :S;
var RetR    :Record;

Timer1: Object;
--
--Процедуры и функции -------------   
Proc Очистить;
 ClearVariable(Раб.Поиск.Режим);
 ClearVariable(Раб.Поиск.Карт);
 ClearVariable(Раб.Поиск.ДопФ);
 ClearVariable(Раб.Поиск.Загл);
 ClearVariable(Раб.Поиск.Упр);
 ClearVariable(Раб.Поиск.Наим);
 ClearVariable(Раб.Поиск.Знач);
 ClearVariable(Раб.Поиск.Поле);
 ClearVariable(Раб.Поиск.Тип);
 ClearVariable(Раб.Поиск.defЗнач);
 ClearVariable(Раб.Поиск.isФильтр);
 Раб.Поиск.RetS="-1";
 Раб.Поиск.RetR=nil;
end;

Proc Инит(aЗагл:S; aКарт:S; aПоляСравн:S; aНаимСравн:S; aЗнач:S; aДопФ:S);
var w,ww:I;
 Раб.Поиск.Загл=aЗагл;
 Раб.Поиск.Карт=aКарт;
 Раб.Поиск.ДопФ=aДопФ;
 ww=WordsCount(aПоляСравн,"|");
 Раб.Поиск.Упр=ww;
 for w=1..ww do
  Раб.Поиск.Поле[w]=Trim(ExtractWord(w,aПоляСравн,"|"));
  Раб.Поиск.Тип [w]=Trim(ExtractWord(2,Раб.Поиск.Поле[w],":"));
  if Раб.Поиск.Тип[w]="": Раб.Поиск.Тип[w]="S"; fi;
  Раб.Поиск.Поле[w]=Trim(ExtractWord(1,Раб.Поиск.Поле[w],":"));
  Раб.Поиск.Наим[w]=Trim(ExtractWord(w,aНаимСравн,"|"));
  Раб.Поиск.defЗнач[w]=Trim(ExtractWord(w,aЗнач,"|"));
 od;
end;

Func ВыборИзКартотеки(vЗагл:S; vКарт:String; vПоляСравн:String; vНаимСравн:String; vДопФ:String):Record;
--vЗагл      Заголовок окна
--vКарт      Картотека
--vПоляСравн Список полей сравнения. Разделитель списка |
--vНаимСравн Список наименования полей сравнения. Разделитель списка |
--vДопФ      Дополнительный фильтр
 if vКарт="" or vПоляСравн="": ^nil; fi;
 Очистить;
 Раб.Поиск.Режим=0;
 Раб.Поиск.isФильтр=True;
 Инит(vЗагл,vКарт,vПоляСравн,vНаимСравн,"",vДопФ);
 OpenBlank("Раб.Поиск",True);
 if Раб.Поиск.RetS="-1": ^nil; fi;
 ^Раб.Поиск.RetR;
end;

Func ВыборИзКартотеки2(vЗагл:S; vКарт:String; vПоляСравн:String; vНаимСравн:String; vЗнач:String; vДопФ:String):Record;
--vЗагл      Заголовок окна
--vКарт      Картотека
--vПоляСравн Список полей сравнения. Разделитель списка |
--vНаимСравн Список наименования полей сравнения. Разделитель списка |
--vДопФ      Дополнительный фильтр
 if vКарт="" or vПоляСравн="": ^nil; fi;
 Очистить;
 Раб.Поиск.Режим=0;
 Раб.Поиск.isФильтр=True;
 Инит(vЗагл,vКарт,vПоляСравн,vНаимСравн,vЗнач,vДопФ);
 OpenBlank("Раб.Поиск",True);
 if Раб.Поиск.RetS="-1": ^nil; fi;
 ^Раб.Поиск.RetR;
end;

Func ВыборЗнач(vЗагл:S; vПоляСравн:String; vНаимСравн:String; vФильтр:L; vДопФ:String):String;
--vЗагл      Заголовок окна
--vПоляСравн Список полей сравнения. Разделитель списка |
--vНаимСравн Список наименования полей сравнения. Разделитель списка |
--vДопФ      Дополнительный фильтр
--vФильтр   Формат возвращаемого результата True ввиде фильтра False в виде значения через разделитель |
 if vПоляСравн="": ^""; fi;
 Очистить;
 Раб.Поиск.Режим=1;
 Раб.Поиск.isФильтр=vФильтр;
 Инит(vЗагл,"",vПоляСравн,vНаимСравн,"",vДопФ);
 OpenBlank("Раб.Поиск",True);
 if Раб.Поиск.RetS="-1": ^""; fi;
 ^Раб.Поиск.RetS;
end;
--Процедуры и функции -------------                           
--
--
--Обработчики событий полей шаблона-----
Func Знач_OnVerify(FieldName: String; Iter: Integer; Value: String): Logical;
var p:i;
var dd:d;
 if Тип[Iter]="N": p=Pos(".",Value); p=Length(Value)-p; if not Value=Str(Round(Value,p),p): Message("Введенное значение не является числом",mtError); ^False; fi;
   |Тип[Iter]="I": if not Value=Str(Int(Value)): Message("Введенное значение не является числом",mtError); ^False; fi;
   |Тип[Iter]="D": Try dd=StringToDate(Value); Except Message("Введенное значение не является датой",mtError);^False; end;
 fi;
 Return True;
end;

Proc Знач_OnExit(FieldName: String; Iter: Integer);
var Key:S;
var z:i;
 if Trim(Знач[Iter])="": Exit; fi;
 z=SearchInArray(Раб.Поиск.hЗнач,Знач[Iter]);
 if not z=-1:
    DeleteFromArray(Раб.Поиск.hKey,z);
    DeleteFromArray(Раб.Поиск.hЗнач,z);
 fi;
 Key=Str16(86400-Time)+"#"+Знач[Iter];
 z=InsertInArraySort(Раб.Поиск.hKey,Key);
 InsertInArray(Раб.Поиск.hЗнач,z,Знач[Iter]);
end;

Func Знач_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var n,Iter:i;
 Iter=AsInteger(Template.Frame);
 if not Раб.Поиск.defЗнач[Iter]="":
    Cur=Раб.Поиск.defЗнач[Iter];
   else
    n=SearchInArray(Раб.Поиск.hЗнач,"",False);
    While not n=-1 do
     DeleteFromArray(Раб.Поиск.hKey,n);
     DeleteFromArray(Раб.Поиск.hЗнач,n);
     n=SearchInArray(Раб.Поиск.hЗнач,"",False);
    od;
    n=Alternate("История значений",Раб.Поиск.hЗнач,-1,SearchInArray(Раб.Поиск.hЗнач,Знач[Iter]),12);
    if n=0: Template.HideEditor(False); fi;
    Cur=Раб.Поиск.hЗнач[n];
 fi;
 Return Cur;
end;

--Обработчики событий полей шаблона-----
--
--
--Обработчики событий объектов шаблона-----
Proc btnВыбрать_OnClick(Sender: String);
var Iter,OWA:I;
var Msg:Longstring;
var sp:S;
 RetS="";
 RetR=nil;
 if isФильтр: sp=" and "; else sp="|"; fi;
 for Iter=1..Упр do
  if isФильтр:
     if not Знач[Iter]="": 
        if Тип[Iter]="S" or Тип[Iter]="":
           RetS=RetS+sp+"Match("+Поле[Iter]+",'*"+Знач[Iter]+"*')";
          else
           RetS=RetS+sp+Поле[Iter]+"="+Знач[Iter];
        fi;
     fi;
    else
     if Знач[Iter]="": RetS=RetS+sp+" "; else RetS=RetS+sp+Знач[Iter]; fi;
  fi;
 od;
 RetS=SubStr(RetS,Length(sp)+1,255);
 if isФильтр:
    if not ДопФ="" and not RetS="": RetS=ДопФ+" and ("+RetS+")";
      |not ДопФ="" and     RetS="": RetS=ДопФ;
    fi;
 fi;
 if Length(RetS)>255:
    Msg="Слишком длинное условие отбора ("+RetS+")"+Chr(13)+"Сократите длину условия";
    Message(Msg,mtError); 
    RetS="-1";  
    RetR=nil;
    Exit;
 fi;
 if Режим=0 and isФильтр:
    if IsHierArchical(Карт):  --для иерахической картотеку нуно указать фокус, иначе она указывает погоду на луне
       OWA=OpenWorkArea(Карт,"",RetS);
       Try
        if not Records(OWA)=0: RetR=GetRecordKey(OWA,1); fi;
       Finally
        CloseWorkArea(OWA);
       end;
    fi;
    RetR=OpenCardFile(Карт,RetS,ТекЗап,crdAnyRecord);
    ТекЗап=nil;
    if not RetR=nil: Close; fi;
   else
    Close;
 fi;
end;

Proc btnОтмена_OnClick(Sender: String);
 RetS="-1";
 RetR=nil;
 Close;
end;

Proc OnTimer(Sender: String);
 Timer1.Active=False;
 Template.Object="btnВыбрать";
end;

Func Знач_OnType(Sect: String; Row: Integer; Col: Integer; Code: Integer; Cur: String): String;
var Iter:I;
var FieldName:S;
 if Code=13: 
    Iter=AsInteger(Template.Frame);
    FieldName=AsString(Template.Field);
    if Знач_OnVerify(FieldName,Iter,Cur):
       Template.HideEditor(False);
       Знач[Iter]=Cur;
       Template.Object="btnВыбрать";
       Знач_OnExit(FieldName,Iter);
       btnВыбрать_OnClick(FieldName);
    fi;
 fi;
 Return Cur;
end;
--Обработчики событий объектов шаблона-----
--
--
--Обработчики событий шаблона -----
Proc AfterOpen(Destroy: Logical);
 Timer1.Interval=100;
 Timer1.Active=True;
end;
--Обработчики событий шаблона -----
--

Конец
