----- Описание бланка -------------
-- Библиотека для работы с картотеками отчетных форм
-- Для записи отчетности использовать процедуры "ЗаписатьВКартотеку" и "СчитатьИзКартотеки" и ЗаписатьВКартотекуСНомеромНалоговой;
-- Остальные процедуры вспомогательные.
-----------------------------------

БланкСШаблоном "Библиотека для работы с картотеками отчетов";


ВходныеПоля:Logical=true; -- Записывать только входные поля


var мНачДата[]:Date;
var мКонДата[]:Date;
var мНомерКорректировки[]:Integer;

proc ДобавитьОтчет(НачДата:Date;КонДата:Date;НомерКорректировки:Integer);
var i,дл:Integer;
var Добавить:Logical;
  Добавить=true;
  дл=LengthOfArray(мНачДата);
  if дл=0: -- Если нет записей в массиве
    мНачДата[дл+1]=НачДата;
    мКонДата[дл+1]=КонДата;
    мНомерКорректировки[дл+1]=НомерКорректировки;
  else --
    for i=1..дл do -- Ищем похожую запись
      if мНачДата[i]=НачДата and мКонДата[i]=КонДата and мНомерКорректировки[i]=НомерКорректировки:
	Добавить=false;
	break;
      fi;
    end;
    if Добавить:
      мНачДата[дл+1]=НачДата;
      мКонДата[дл+1]=КонДата;
      мНомерКорректировки[дл+1]=НомерКорректировки;
    fi;
  end;
end;

func НайтиОтчеты(ИмяКартотеки:String;Имябланка:String;ВерсияБланка:Integer):Logical;
var РОбл,i, Кол:Integer;
  hint("Поиск отчетов в картотеке");
  ClearVariable(Раб.Отчетность.мНачДата);
  ClearVariable(Раб.Отчетность.мКонДата);
  ClearVariable(Раб.Отчетность.мНомерКорректировки);
  РОбл=OpenWorkArea(ИмяКартотеки,'Blank;BeginDate;EndDate;VarVersion',format("Blank='%s' and BlankVersion=%d",ИмяБланка,ВерсияБланка));
  Try
    Кол := records(Робл);
    for i=1..Кол do
      ДобавитьОтчет(GetFieldD(Робл,i,"BeginDate"),
		    GetFieldD(Робл,i,"EndDate"),
		    GetFieldI(Робл,i,"VarVersion")
		    );
      if int(i / 1000) = (i / 1000) then
	Hint("Поиск отчетов в картотеке. Обработано " + Str(i/кол*100)+"%");
      end;

    end;
  Finally
    CloseWorkArea(РОбл);
  End;
  ^if(LengthOfArray(мНачДата)>0,true,false);
end;

func НайтиОтчетыSQL(ИмяКартотеки:String;Имябланка:String;ВерсияБланка:Integer):Logical;
-- для MSSQL сервера
var РОбл,Кол:Integer;
var запрос:String;
  hint("Поиск отчетов в картотеке");
  ClearVariable(Раб.Отчетность.мНачДата);
  ClearVariable(Раб.Отчетность.мКонДата);
  ClearVariable(Раб.Отчетность.мНомерКорректировки);
  запрос=format("SELECT DISTINCT BEGINDATE,ENDDATE,VARVERSION "+
		"FROM %s WITH (NOLOCK) "+
		"WHERE BLANK='%s' AND BLANKVERSION=%d "+
		"ORDER BY BEGINDATE,ENDDATE,VARVERSION ",
		 GetRealCardFileName(ИмяКартотеки),ИмяБланка,ВерсияБланка);
  РОбл=OpenWorkAreaSQL("",Запрос,ИмяКартотеки);
  Try
    кол=GetAsArraySQL (РОбл,'Раб.Отчетность', 'мНачДата=BeginDate|мКонДата=EndDate|мНомерКорректировки=VarVersion');
  Finally
    CloseWorkArea(РОбл);
  End;
  ^if(LengthOfArray(мНачДата)>0,true,false);
end;

var МассивСтрок[]:String;

func ВыбратьОтчет:Integer;
var выбор,i, ширина:Integer;
var текст, номер :String;
var номерКорр,НомерНалоговой:String;
  ClearVariable(Раб.Отчетность.МассивСтрок);
  ширина = 0;
  for i=1..LengthOfArray(мНачДата) do
    номер = str(мНомерКорректировки[i]);
    if мНомерКорректировки[i]=0:
	текст="с %s по %s ";
	МассивСтрок[i]=format(Текст,DateToString(мНачДата[i]),DateToString(мКонДата[i]));
	ширина = max(ширина,28);

      |length(номер)>=5:
	НомерНалоговой = substr(номер,1,4);
	НомерКорр = substr(номер,5,length(Номер)-4);
	if НомерКорр = "0":
	  текст="с %s по %s, номер налоговой %s";
	  МассивСтрок[i]=format(Текст,DateToString(мНачДата[i]),DateToString(мКонДата[i]), НомерНалоговой);
	  ширина = max(ширина,37);
	else
	  текст="с %s по %s, номер налоговой %s, номер корректировки %s";
	  МассивСтрок[i]=format(Текст,DateToString(мНачДата[i]),DateToString(мКонДата[i]), НомерНалоговой, НомерКорр);
	  ширина = max(ширина,52);
	end;
    else
	текст="с %s по %s, номер корректировки %d";
	МассивСтрок[i]=format(Текст,DateToString(мНачДата[i]),DateToString(мКонДата[i]),мНомерКорректировки[i]);
	ширина = max(ширина,37);
    fi;

  end;
  Выбор=Alternate("Отчетные периоды",МассивСтрок, Ширина);

  ^выбор;
end;
--------------------------------------

-- Процедура записи отчета в картотеку с номером налогового органа
-- Номер налоговой пакуется в номер корректировки.
proc ЗаписатьВКартотекуСНомеромНалоговой(ИмяКартотеки:String;
					 ИмяБланка:String; -- Что записывает
					 ИмяБланкаДляЗаписи:String; -- Под каким именем записываем
					 НачДата:Date;
					 КонДата:Date;
					 ВерсияБланка:Integer;
					 НомерКорректировки:Integer; -- Номер корректировки (0-значит первичный)
					 НомерНалоговой:Integer -- Номер налоговой -- (0 - значит без номера налоговой)
				   );
var Номер,КолСимв:Integer;
  if НачДата=1.1.100 or КонДата=1.1.100:
      SetError(ErrUserBasis,"Неправильно задан период отчета!");
    | ИмяБланка="":
      SetError(ErrUserBasis,"Отсутствует имя бланка!");
    | ИмяКартотеки="":
      SetError(ErrUserBasis,"Отсутствует имя картотеки!");
    | ВерсияБланка<1:
      SetError(ErrUserBasis,"Версия бланка должна быть больше нуля!");
  fi;
  if EnqOkCancel("Записать в картотеку?")=cmOk:
    Номер = НомерКорректировки;
    if НомерНалоговой>0:
      КолСимв = length(str(НомерНалоговой));
      if КолСимв<4: НомерНалоговой = НомерНалоговой * (1 + if(КолСимв=1:999|КолСимв=2:99|КолСимв=3:9)); end;
      Номер = int(str(НомерНалоговой) + str(НомерКорректировки));
    end;
    WriteVarToCardFile(ИмяКартотеки,ВходныеПоля,ИмяБланка,ИмяБланкаДляЗаписи,НачДата,КонДата,ВерсияБланка,Номер);
  fi;
end;

-- Процедура записи отчета в картотеку
proc ЗаписатьВКартотеку(ИмяКартотеки:String;
			ИмяБланка:String; -- Что записывает
			ИмяБланкаДляЗаписи:String; -- Под каким именем записываем
			НачДата:Date;
			КонДата:Date;
			ВерсияБланка:Integer;
			НомерКорректировки:Integer -- Номер корректировки (0-значит первичный)
		       );
  ЗаписатьВКартотекуСНомеромНалоговой(ИмяКартотеки,ИмяБланка,ИмяБланкаДляЗаписи,НачДата,КонДата,ВерсияБланка,НомерКорректировки,0);
end;


-- Процедура считывания отчета из картотеки
proc СчитатьИзКартотеки(ИмяКартотеки:String;
			ИмяБланка:String; -- Что считать
			ИмяБланкаДляЧтения:String; -- из какого имени считать
			ВерсияБланка:Integer
		       );
var Выбор:Integer;
var НашлиОтч:Logical;
  НашлиОтч=false;
  if ИмяБланка="":
      SetError(ErrUserBasis,"Отсутствует имя бланка!");
    | ИмяКартотеки="":
      SetError(ErrUserBasis,"Отсутствует имя картотеки!");
    | ВерсияБланка<1:
      SetError(ErrUserBasis,"Версия бланка должна быть больше нуля!");
  fi;

  if ИмяБланкаДляЧтения="":ИмяБланкаДляЧтения=ИмяБланка;fi;
  if UP(GetCardDBType(ИмяКартотеки))="MS SQL" and SQLQueryEnabled:
     НашлиОтч=НайтиОтчетыSQL(ИмяКартотеки,ИмяБланкаДляЧтения,ВерсияБланка);
  else
     НашлиОтч=НайтиОтчеты(ИмяКартотеки,ИмяБланкаДляЧтения,ВерсияБланка);
  fi;
  if НашлиОтч:
      Выбор=ВыбратьОтчет;
      if Выбор>0:
	ReadVarFromCardFile(ИмяКартотеки,ВходныеПоля,ИмяБланка,ИмяБланкаДляЧтения,
			    мНачДата[Выбор],мКонДата[Выбор],ВерсияБланка,мНомерКорректировки[Выбор]);
      fi;
  else
    Message("Записи в картотеке для данной формы отсутствуют.");
  fi;
end;

end
