-- Шаблон создан мастером бланков
-- 30.03.2015 18:41:32
--
BlankWithTemplate "Балансовая отчетность";

2--
2-- Переменные и массивы бланка

  var ИНСТР_СПРАВ: String = 'ИНСТР_БАЛ';
  fПокИнфо:L;
  Инстр: String;
  НаДату: Date = [РАБ.ПАРАМ_ОТЧ.ДК];

  var Инстр_Код: String;
  var Инстр_Имя: String;
  var Ред_Код: String;
  var Ред_Имя: String;
  var Инстр_Имя_: String = if(Инстр_Код = '', 'любая', Инстр_Имя);
  var Ред_Имя_: String = if(Ред_Код = '', '', '(в ред. ' + Ред_Имя + ')');
  var НаДату_: String = if(НаДату = 1.1.100, 'любая', DateToString(НаДату));

  var Ф: Integer;
  var Ф_БЛАНК_[]: String;
  var Ф_ОКУД_[]: String;
  var Ф_НАИМ_[]: String;
  var Ф_РЕД_[]: String;
  var Ф_ДЕЙСТВ_С_[]: Date;
  var Ф_ДЕЙСТВ_ПО_[]: Date;
  var Ф_ДОП_ОПИС_[]: String;

  var ИменаБланков[]: String;

2--
2-- Объекты бланка
  секцФормы: Section;

2--
2-- Процедуры и функции

func УслВыбИнстр(код: String; ред: String): String;
  var res: String;
  res = ИНСТР_СПРАВ + '.';
  if код = '':
    res = res + '*';
  else
    res = res + код + '.';
    if ред = '':
      res = res + '*';
    else
      res = res + код;
    fi;
  fi;
  return res;
end;

func ИнстрУм: String;
  var учПБ: String;
  var код: String;
  учПБ = PlanVar('УЧЕТ');
  if учПБ = '162н': код = '191н';
  elsif учПБ = '174н' or учПБ = '183н': код = '33н';
  fi;
  return 'ИНСТР_БАЛ.' + if(код = '', '*', код);
end;

proc УстановитьИнстр;
  if Инстр = '':
    Инстр_Код = '';
    Инстр_Имя = '';
    Ред_Код = '';
    Ред_Имя = '';
  else
    if Наим_П(Инстр) <> ' ':
      Инстр_Код = ExtractWord(2, Инстр, '.');
      Инстр_Имя = Наим_П(ExtractWords(1, 2, Инстр, '.'));
      Ред_Код = ExtractWord(3, Инстр, '.');
      Ред_Имя = Наим_П(ExtractWords(1, 3, Инстр, '.'));
    else
      Инстр = '';
      УстановитьИнстр;
    fi;
  fi;
end;

proc Заморозка;
  --Template.Freeze(1, AsInteger(секцФормы.Row(1, RowTop, '')));
end;

proc ОчисткаСписка;
  while Ф > 0 do
    DeleteFrame(Ф, Ф);
  od;
end;

proc ОбновитьСписок;
  var i, ii: Integer;
  var okud, blankName, descName, instr, redact: String;
  var fromDate, tillDate: Date;

  ОчисткаСписка;

  ii = GetBlankNames('ОТЧЕТЫ.БАЛАНС.*', ИменаБланков, false, true, false);
  for i = 1 .. ii do
    blankName = TrimRight(ExtractWord(1, ИменаБланков[i], '--'));
    descName = TrimLeft(ExtractWord(2, ИменаБланков[i], '--'));
    if VariableExists(blankName + '.Ф_ОКУД') and
       VariableExists(blankName + '.Ф_ИНСТР_КОД'):

      instr = GetVariableS(blankName + '.Ф_ИНСТР_КОД');
      if VariableExists(blankName + '.Ф_РЕД_КОД'):
        redact = GetVariableS(blankName + '.Ф_РЕД_КОД');
      else
        redact = '';
      fi;
      okud = GetVariableS(blankName + '.Ф_ОКУД');
      fromDate = GetVariableD(blankName + '.Ф_ДЕЙСТВ_С');
      tillDate = GetVariableD(blankName + '.Ф_ДЕЙСТВ_ПО');

      if (Инстр_Код = '' or instr = Инстр_Код) and
         (Ред_Код = '' or redact = Ред_Код) and
         (НаДату = 1.1.100 or (НаДату >= fromDate and (tillDate = 1.1.100 or НаДату <= tillDate))):

        Ф = Ф + 1;
        Ф_БЛАНК_[Ф] = blankName;
        Ф_ОКУД_[Ф] = 'ф.' + okud;
        if Substr(descName,1,2)='ф.' and Pos(okud,descName)>0:
           descName=trim(Substr(descName,Pos(okud,descName)+Length(okud),255));
        fi;
        Ф_НАИМ_[Ф] = descName;
        Ф_РЕД_[Ф] = if(redact = '': instr, instr + '/' + redact);
        Ф_ДЕЙСТВ_С_[Ф] = fromDate;
        Ф_ДЕЙСТВ_ПО_[Ф] = tillDate;
        Ф_ДОП_ОПИС_[Ф] = 'ред. ' + Ф_РЕД_[Ф] + ', действ. с ' + DateToString(Ф_ДЕЙСТВ_С_[Ф])  + if(Ф_ДЕЙСТВ_ПО_[Ф] = 1.1.100,'',', действ. по ' + DateToString(Ф_ДЕЙСТВ_ПО_[Ф]));
      fi;
    fi;
  od;
  --SortSection(Ф, 'Ф_ОКУД_');
end;

2--
2-- События объектов шаблона

proc кнЗакрыть_OnClick(sender: String);
  Close;
end;

proc кнСтарыйЦУП_OnClick(sender: String);
  if BlankExist('УПРАВЛЕНИЕ.БАЛАНС191н'):
    OpenBlank('УПРАВЛЕНИЕ.БАЛАНС191н',false);
  fi;
  if BlankExist('УПРАВЛЕНИЕ.БАЛАНС33н'):
    OpenBlank('УПРАВЛЕНИЕ.БАЛАНС33н',false);
  fi;
end;

proc флагДопИнфо_OnChange(Sender: String);
  секцФормы.Row(2, RowVisible, fПокИнфо);
end;

2--
2-- События полей шаблона

func Инстр_Имя__OnEnter(fieldName: String; iter: Integer): Logical;
  var пр: String;
  пр = AnaElection(УслВыбИнстр('', ''), false, false, if(Инстр = '', ИнстрУм, Инстр));
  if пр <> '':
    Инстр = пр;
    УстановитьИнстр;
    ОбновитьСписок;
    Заморозка;
  fi;
  return false;
end;

func Ред_Имя__OnEnter(fieldName: String; iter: Integer): Logical;
  var услАн, пр, призн: String;
  услАн = УслВыбИнстр(Инстр_Код, '');
  if Инстр_Код <> '' and Ред_Код = '':
    for sign пр = услАн do призн = пр; od; -- поиск последней инструкции
  else
    призн = Инстр;
  fi;
  пр = AnaElection(услАн, false, false, if(призн = '', ИнстрУм, призн));
  if пр <> '':
    Инстр = пр;
    УстановитьИнстр;
    ОбновитьСписок;
  fi;
  return false;
end;

func НаДату__OnEnter(fieldName: String; iter: Integer): Logical;
  РАБ.ПАРАМ_ОТЧ.Взять('ДК_', 0);
  НаДату = РАБ.ПАРАМ_ОТЧ.ДК;
  ОбновитьСписок;
  return false;
end;

Proc НаДату__OnExit(FieldName: String; Iter: Integer);
  НаДату = 1.1.100;
  fПокИнфо = True;
  секцФормы.Row(2, RowVisible, fПокИнфо);
  ОбновитьСписок;
end;

proc ПоВсем_Инстр_OnClick(row: Integer; col: Integer; double: Logical);
  if not double: exit; fi;
  Инстр = '';
  УстановитьИнстр;
  ОбновитьСписок;
end;

proc ПоВсем_Ред_OnClick(row: Integer; col: Integer; double: Logical);
  if not double: exit; fi;
  if Инстр <> '':
    Инстр = ExtractWords(1, 2, Инстр, '.');
    УстановитьИнстр;
    ОбновитьСписок;
  fi;
end;

proc НаДату_OnClick(row: Integer; col: Integer; double: Logical);
  if not double: exit; fi;
  НаДату = 1.1.100;
  ОбновитьСписок;
end;


proc Отчет_OnClick(row: Integer; col: Integer; double: Logical);
  var iter :Integer;
  var bln :String;
  if not double and col>2: exit; fi;
  iter = AsInteger(Template.Frame);
  bln = Ф_БЛАНК_[iter];
  if BlankExist(bln):
    OpenBlank(bln, false);
  fi;
end;


2--
2-- События шаблона

proc OnOpen(create: Logical);
  if Инстр = '': Инстр = ИнстрУм; fi;
  УстановитьИнстр;
  ОбновитьСписок;
  секцФормы.Row(2, RowVisible, fПокИнфо);
  Заморозка;
end;








End