БланкСШаблоном "Библиотека процедур с РО";
-- Описание общих процедур и функций для доступа к РО
-- Поставляется в закодированном виде (в целях использования в младшей версии)
				 -- Многие М.М. 	01.01.100- 07.09.98
				 -- Егоров М.О. 	08.09.98 - 08.09.98


--*********** функции работы с РО **********************************
  func След (name :String; index :String) :Integer;
	-- определение	номера следующей записи в картотеке
  var N, к, cnt :Integer;

    if GetCardDBType(name) = 'MS SQL' and SQLQueryEnabled : -- sql версия
-- Сенков Илья
      к = OpenWorkAreaSql('', 'select max(' + index + ') as result from ' + GetRealCardFileName(name) + ' with (nolock)', name);
      try
	return GetFieldI(к, 1, 'result') + 1;
      finally
	CloseWorkArea(к);
      end;
    else
      к=ОткрытьРабочуюОбласть(name, index);
      try
	cnt=ЗАПИСЕЙ(к);
	N=ЕСЛИ(cnt>0,ВзятьПолеЦ(к,cnt,index),0)+1;
	^N;
      finally
	ЗакрытьРабочуюОбласть(к);
      end;
    end;
  end; -- След --

  func СледФ (name :String; index:String; filter :String) :Integer;
	-- определение	номера следующей записи в картотеке (с фильтром)
  var N :Integer;
  var к :Integer;
  var cnt :Integer;
  var sqlVer: Logical;
  var пустышка, sql: LongString;
-- Сенков Илья
    if GetCardDBType(name) = 'MS SQL' and SQLQueryEnabled : -- sql версия
      sqlVer = CardFilterToSql(name, 't.', filter, sql);
    end;
    if sqlVer :
      пустышка = '';
      sql = 'select  max(t.[' + index + ']) as result from ' + GetRealCardFileName(name) + ' t with (nolock)' + if(filter = '', пустышка, ' where ' + sql);-- + ' order by t.[' + index + '] desc';
      к=OpenWorkAreaSql('', sql, name);
      try
	return GetFieldI(к, 1, 'result') + 1;
      finally
	CloseWorkArea(к);
      end;
    else
      к=ОткрытьРабочуюОбласть(name,index,filter);
      try
	cnt=ЗАПИСЕЙ(к);
	N=ЕСЛИ(cnt>0,ВзятьПолеЦ(к,cnt,index),0)+1;
	^N;
      finally
	ЗакрытьРабочуюОбласть(к);
      end;
    end;
  end; -- СледФ --

  func ПризнакИмеется (name :String; index :String; SignName :String) :Logical;
	-- проверка наличия введенного признака
  var Result :Logical;
  var к      :Integer;
	к=ОткрытьРабочуюОбласть(name, index);
	try
	  If Search(к,1,SignName) > 0 :
	     Message("Данный признак уже существует!");
	     Result = False;
	  else
	     Result = True;
	  Fi;
	finally
	  ЗакрытьРабочуюОбласть(к);
	end;
	Return Result;
  end; -- ПризнакИмеется --

  func ПризнакИмеетсяФ (name :String; index :String; filter :String; SignName :String) :Logical;
	-- проверка наличия введенного признака
  var Result :Logical;
  var к      :Integer;
	к=ОткрытьРабочуюОбласть(name, index, filter);
	try
	  If Search(к,1,SignName) > 0 :
	     Message("Данный признак уже существует!");
	     Result = False;
	  else
	     Result = True;
	  Fi;
	finally
	  ЗакрытьРабочуюОбласть(к);
	end;
	Return Result;
  end; -- ПризнакИмеетсяФ --

  func НашеПредпрАвтомат(RO:Integer):Record;
   Var NewRec : Integer;
   Var Result : Record;
   var wk:Integer;
   message("Данных с собственными реквизитами не найдено."+chr(13)+"Введите собственные реквизиты.");
   BeginChanging(RO);
   Try
     NewRec = InsertRecord(RO);
     Result = GetRecordKey(RO,NewRec);
     NewRec = PutFieldS(RO,NewRec,'Признак',SubStr(RecordToString(Result), 2, Length(RecordToString(Result))-2));
     NewRec = PutFieldL(RO,NewRec,'Наше',True);
     OpenBlankEditor("ИНФО.КОНТРАГЕНТ",RO,NewRec);
     EndChanging(RO);
     wk=OpenWorkArea('Контрагент', '', 'UKey='+RecordToString(Result));
     try
       if Records(wk)=0:
	 result=Nil;
       end;
     finally
       CloseWorkArea(wk);
     end;
   Except
     CancelChanging(RO);
     raise;
   End;
   ^result;
  end;

  func CheckIt (crd :Integer) :Logical;
	-- проверка наличия записей в картотеке
	^(records(crd)>0);
  end; -- CheckIt --

  func ПервЗапись(name:s;index:s;filter:s):Record;
  -- Выдает первый указатель в произвольной отфильтрованной картотеке
  var ro, i:Integer;
  var r :RECORD;
	r = nil;
	i = 0;
	ro = OpenWorkArea(name, index, filter);
	try
	  if Records(ro) = 0:
	     If (name = 'КонтрАгент') and (filter = 'Наше') :
		r = НашеПредпрАвтомат(ro);
	     else
		r = NIL;
	     fi;
	  | true:
	     r = GetRecordKey(ro,1);
	  fi;
	finally
	  CloseWorkArea(ro);
	end;
	^ r;
  end; -- ПервЗапись

func OPEN(name:s;Index:s;filter:s):i; -- открытие рабочей области
  ПЕРЕМ crd:ц;
	   crd=OpenWorkArea(name,index,filter);
	   ^crd;
end; -- OPEN

proc CLOSE(crd:i);	 -- закрытие рабочей области
	 CloseWorkArea(crd);
end; -- CLOSE

proc SetFil(crd:I;Filter:S);   -- Установка фильтра
	 SetFilter(crd,Filter);
end; -- CLOSE

func УстановитьСсылку(RO:I;Rec:I;Field:S):Запись;
--	 RO:I;	-- Номер РО
--	 Rec:I; -- Номер записи
--	 Field	-- Имя ссылочног поля
   ^ВзятьПолеЗ(RO,Rec,Field);
end; -- УстановитьСсылку

-- Функции записи полей бланка в картотеку
func PutI(SubTabl:I;Iter:I;Поле:С;Поле1:I):Ц;
   Var Nr:i;
	 Nr=PutFieldI(SubTabl,Iter,Поле,Поле1);
	   ^Nr;
end; -- PutI

func PutS(SubTabl:I;Iter:I;Поле:С;Поле1:S):Ц;
   Var Nr:i;
	 Nr=PutFieldS(SubTabl,Iter,Поле,Поле1);
	   ^Nr;
end; -- PutS

func PutL(SubTabl:I;Iter:I;Поле:С;Поле1:L):Ц;
   Var Nr:i;
	 Nr=PutFieldL(SubTabl,Iter,Поле,Поле1);
	   ^Nr;
end; -- PutL

func PutR(SubTabl:I;Iter:I;Поле:С;Поле1:Record):Ц;
   Var Nr:i;
	 Nr=PutFieldR(SubTabl,Iter,Поле,Поле1);
	   ^Nr;
end; -- PutR

func PutD(SubTabl:I;Iter:I;Поле:С;Поле1:D):Ц;
   Var Nr:i;
	 Nr=PutFieldD(SubTabl,Iter,Поле,Поле1);
	   ^Nr;
end; -- PutD

func PutN(SubTabl:I;Iter:I;Поле:С;Поле1:Ч):Ц;
   Var Nr:i;
	 Nr=PutFieldN(SubTabl,Iter,Поле,Поле1);
	   ^Nr;
end; -- PutN

func GETI(ROBL:I;Nr:I;Поле:С):Ц;
	 ^GETFieldI(ROBL,Nr,Поле);
end; -- GETI

func GETS(ROBL:I;Nr:I;Поле:С):S;
	 ^GETFieldS(ROBL,Nr,Поле);
end; -- GETS

func GETL(ROBL:I;Nr:I;Поле:С):L;
	 ^GETFieldL(ROBL,Nr,Поле);
end; -- GETL

func GETR(ROBL:I;Nr:I;Поле:С):RECORD;
	 ^GETFieldR(ROBL,Nr,Поле);
end; -- GETR

func GETD(ROBL:I;Nr:I;Поле:С):D;
	 ^GETFieldD(ROBL,Nr,Поле);
end; -- GETD

func GETN(ROBL:I;Nr:I;Поле:С):N;
	 ^GETFieldN(ROBL,Nr,Поле);
end; -- GETN

func GETCardS(Name:S;Numer:Запись;Поле:С):S;
	 ^ВзятьКартПолеС(Name,Numer,Поле);
end; -- GETN

func GETCardL(Name:S;Numer:Запись;Поле:С):L;
	 ^ВзятьКартПолеЛ(Name,Numer,Поле);
end; -- GETN

func InsRec(Ном:Ц):Ц;
   Var Nr:i;
   Nr=ВставитьЗапись(Ном);
	   ^Nr;
end; -- InsRec

func InsRecNumber(Ном:Ц;НСтр:Ц):Ц;
   Var Nr:i;
   Nr=ВставитьЗапись(Ном,НСтр);
	   ^Nr;
end; -- InsRec

func Srch ( НомерРО : Целое; НачЗап : Целое; Эталон : Строка) : Целое;
     Return Поиск (НомерРО,НачЗап,Эталон);
end; -- Поиск

proc ОткрБлРед(bln:s;RBCRD:Ц;Rc:Ц);
	 ОткрытьБланкРедактор(bln,RBCRD,Rc);
end; -- ОткрБлРед

func Rec(Ном:Ц):Ц;
   Var Nr:i;
   Nr=Записей(Ном);
	   ^Nr;
end; -- Rec

func Масс(Ном:Ц;НомЗ:Ц;Поля:С;Уп:С):Ц;
   Var Nr:i;
   Nr=ОткрытьМассив(Ном,НомЗ,Поля,Уп);
	   ^Nr;
end; -- Масс

proc DelRec(RBCRD:Ц;НомЗ:Ц);
  УдалитьЗапись(RBCRD,НомЗ);
end; -- DelRec

func Key(RBCRD:Ц;Iter:Ц): Запись;
   ^GetRecordKey(RBCRD,Iter);
end; -- Key

func GetNum(RBCRD:Ц;Iter:Запись): Ц;
   ^GetRecordNumber(RBCRD,Iter);
end; -- GetNum

proc ChekKodL(KodPr: integer);
  if (Поз('Демо', Version) = 0) :
	if LicenseCheck(KodPr) = 0 and LicenseCheck(4) = 0 and LicenseCheck(5) = 0:  --ProgramVersion <> verDemo :
	   message('Недопустимый код лицензии. Программа будет закрыта.');
	   CloseApp;
	fi;
  fi;
end; -- ChekKodL --


Func SignToFieldS(Ident:string;Field:string):string;
-- Возвращает значение заданного поля, по аналитическому признаку
-- Ident - Аналитический признак
-- Field - Поле в картотеке
var Ro:integer;
var НаимКарт:string;
var Запись:record;
var Rezult:string;
  Запись=SignToRecord(Ident);
  If Запись<>nil:
    НаимКарт=SignCardFile(Ident);
    Ro=OpenWorkArea(НаимКарт,"","Ukey="+RecordToString(Запись));
    Try
      Try
	Rezult=GetFieldS(Ro,1,Field);
      Except
	--Raise;
      End;
    Finally
      CloseWorkArea(Ro);
    End;
  Fi;
  return Rezult;
End;


func СледСУчетомГода(Карт:String;Номер:String;Поле:String):Integer;
 -- Определения следущего номера с учетом перехода между годами
var Общ:Integer;
  Общ=Год(Сегодня);
  ^СледФ(Карт,Номер,"("+Поле+">="+DateToString(Дат(1,1,Общ))+")And("+Поле+"<"+DateToString(Дат(1,1,Общ+1))+")");
end;

func СледСУчетомГодаФ(Карт:String;Номер:String;Поле:String;ДопФ:String):Integer;
 -- Определения следущего номера с учетом перехода между годами с учетом фильтра
var Общ:Integer;
  Общ=Год(Сегодня);
  ^СледФ(Карт,Номер,"("+ДопФ+") and"+"("+Поле+">="+DateToString(Дат(1,1,Общ))+")And("+Поле+"<"+DateToString(Дат(1,1,Общ+1))+")");
end;


func СледСУчетомДаты(Карт:String;Номер:String;Поле:String;ТекДата:Date):Integer;
 -- Определения следущего номера с учетом перехода между годами, с учетом фильтра и заданной даты
var Общ:Integer;
  Общ=Год(ТекДата);
  ^СледФ(Карт,Номер,"("+Поле+">="+DateToString(Дат(1,1,Общ))+")And("+Поле+"<"+DateToString(Дат(1,1,Общ+1))+")");
end;

func СледСУчетомДатыФ(Карт:String;Номер:String;Поле:String;ТекДата:Date;ДопФ:String):Integer;
 -- Определения следущего номера с учетом перехода между годами, с учетом фильтра и заданной даты
var Общ:Integer;
  Общ=Год(ТекДата);
  ^СледФ(Карт,Номер,"("+ДопФ+") and"+"("+Поле+">="+DateToString(Дат(1,1,Общ))+")And("+Поле+"<"+DateToString(Дат(1,1,Общ+1))+")");
end;

func НоваяЗапись(Карт:String;Ключ:Record):Logical;
-- Определяет новая ли запись в картотеке
-- Карт - Имя картотеки
-- Ключ - уникальный код записи по которому идет проверка
var Robl:Integer;
var Col:Integer;
  Robl=OpenWorkArea(Карт,'','UKEY='+RecordToString(Ключ));
  Try
    Col=Records(Robl);
  Finally
    CloseWorkArea(Robl);
  End;
  ^Col=0;
End;

end