БЛАНКСШАБЛОНОМ "Акт о списании материальных запасов", РЕДАКТОР РПО_Акты_УНФА;
-- Редакция ЗАО "Агентство 'Русспромоценка'"
2-- Переменные
var SelfCRD       :S='РПО_АКТЫ_УНФА';
СекСписМатер      :Section;
СекстрЗАК         :Section;
var NewREC        :L=(CurrentState=crdusInserted);
var FieldSender   :S;
var Buf[]         :S;
--var МаскаСчОС     :S="*.?.101.??!";
var МаскаСчМат    :S="*.?.105.??!";
var A1            :S="+";
var A2            :S="+";
var A3            :S="+";
var D1            :S="-";
var D2            :S="-";
var D3            :S="-";
var СуммаТ []     :N=Round(СписМатер[$].ФИзр_Колво*СписМатер[$].ФИзр_Цена, 2);
var Итог7Т        :N=SumOfArray(СуммаТ, СписМатер);
var СтрСумПроп    :S=if(Итог7Т>0, Slo(Итог7Т), "");
2var БланкИмя:S;
2var КлассФормыДок :S;
2var КодФормыДок   :S0="0504230";
var КодФормы0     :String;
var ВИД_МО:l=КодФормы0='0504230_МО';

--var КлассФормыДок :S="ОКУД_";
--var КодФормыДок   :S="0504230";
var recCurrent:record;
NewRECbln         :String;
var ВниманиеСТР   :String;
ВниманиеОбъект    :Object;
ВниманиеНапоминать:Logical;
КнРасчет          :Object;
СекСТРДРХАР_0504230_МО:Object;
Proc ВнешнийВид_редактирование;
  var ll:l;
  var i,j,z,x:i;
  var СЕКЦ_СПИСОК:S;
  var объект_СЕКЦ_СПИСОК:объект;
  var объект_Шапка,объект_строки_редактирование,объект_строки_рисованные,объект_итоги:объект;
  ClearVariable(buf);
  buf[1]='0504230';
  buf[2]='0504230_МО';
  j=LengthOfArray(buf);
  СЕКЦ_СПИСОК='СекСТРДРХАР_ ';

  z=КоличествоСлов(СЕКЦ_СПИСОК,' ');
  for i=1..j do
     for x=1..z do
         ll=findobject(ВыделитьСлово(x,СЕКЦ_СПИСОК,' ')+buf[i],объект_СЕКЦ_СПИСОК);
         if ll:
            ll=кодформы0=buf[i];
            объект_СЕКЦ_СПИСОК.visible=ll;
         fi;
     od;
  od;
--  СЕКЦ_СПИСОК='СЕКЦТАБЛИТОГ_';
--  z=КоличествоСлов(СЕКЦ_СПИСОК,' ');
--  for i=1..j do
--     for x=1..z do
--         ll=findobject(ВыделитьСлово(x,СЕКЦ_СПИСОК,' ')+buf[i],объект_СЕКЦ_СПИСОК);
--         if ll:
--            ll=false;
--            объект_СЕКЦ_СПИСОК.visible=ll;
--            объект_СЕКЦ_СПИСОК.canprint=ll;
--         fi;
--     od;
--  od;
--         ll=findobject('СЕКЦТАБЛШАПКА_'+buf[i],объект_Шапка);
--         ll=findobject('СЕКЦТАБЛ_'+buf[i],объект_строки_редактирование);
--         ll=findobject('СЕКЦТАБЛИТОГ_'+buf[i],объект_строки_рисованные);
--         ll=findobject('СЕКЦТАБЛИТОГ1_'+buf[i],объект_итоги);
--         ll=кодформы=buf[i];
--         объект_Шапка.visible=ll;
--         объект_строки_редактирование.visible=ll;
--         объект_строки_рисованные.visible=false;
--         объект_строки_рисованные.canprint=false;
--         объект_итоги.visible=ll;

--  итоги_редактирование=1;
end;

func кодформы_имя(кодформы_код:s):s;
  if кодформы_код='0504230_МО':^'0504230 - Мин обороны';
   | кодформы_код='0504230'   :^'0504230 - минфин';
  fi;
  ^'0306033 - минфин';
end;
var кодформы_:s=кодформы_имя(кодформы0);
func кодформы_Выбор:s;
 var curentкодформы,i:i;
    if кодформы0='0504230_МО':curentкодформы=1;
     | кодформы0='0504230'   :curentкодформы=2;
    fi;
    ClearVariable(Buf);
    Buf[1]='0504230_МО - Мин обороны';
    Buf[2]='0504230 - минфин';
    i=alternate('Внешний вид инв.ведомости',Buf,-1,curentкодформы);
    if i<1 or curentкодформы=i:^кодформы0;fi;
    ^trim(ВыделитьСлово(1,Buf[i],' '));
end;

2-- Общие процедуры и функции
Proc ДобавитьУдалитьСтроки(Field:S; Iter:I; fADD:L);
var nSec :I;
 nSec=Int(SubStr(Field, 2, 1));
 if fADD:
   if nSec=1: InsertFrame(СписМатер, Iter+1);
   |  nSec=2: InsertFrame(стрЗАК   , Iter+1);
   |  nSec=3: InsertFrame(СТРДРХАР  , Iter+1);
   fi;
 else
   if nSec=1: if СписМатер>1: DeleteFrame(СписМатер, Iter); else DeleteFrame(СписМатер, Iter); InsertFrame(СписМатер, Iter); fi;
   |  nSec=2: if стрЗАК   >1: DeleteFrame(стрЗАК   , Iter); else DeleteFrame(стрЗАК   , Iter); InsertFrame(стрЗАК   , Iter); fi;
   |  nSec=3: if СТРДРХАР  >1: DeleteFrame(СТРДРХАР  , Iter); else DeleteFrame(СТРДРХАР  , Iter); InsertFrame(СТРДРХАР  , Iter); fi;
   fi;
 fi;
end;

Proc НачальнаяИтерация;
 if СписМатер<1: InsertFrame(СписМатер, 1); fi;
 if стрЗАК   <1: InsertFrame(стрЗАК   , 1); fi;
 if стрДРХАР  <1: InsertFrame(стрДРХАР  , 1); fi;
end;

Func НомерТекущейСекции :I;
var Name :S;
 Name=asString(Template.Name);
 if Name="СекСписМатер"    : ^1;
 |  Name="СекстрЗАК"       : ^2;
 |  Name="СекСТРДРХАР_0504230_МО"      : ^3;
 else ^0;
 fi;
end;

Proc УдалитьПустыеСтроки(НТС:I);
var n :I;
 n=1;
 if НТС=1:
   while n<=СписМатер do if СписМатер[n].НаименМат="" : Try DeleteFrame(СписМатер,  n); Except end; else n=n+1; fi; od;
 |  НТС=2:
   while n<=стрЗАК    do if стрЗАК[n].Заключение=""   : Try DeleteFrame(стрЗАК   ,  n); Except end; else n=n+1; fi; od;
 |  НТС=3:
   while n<=стрДРХАР   do if стрДРХАР[n].ДРУГХАР=""  : Try DeleteFrame(стрДРХАР  ,  n); Except end; else n=n+1; fi; od;
 fi;
 Template.Frame=1;
end;

Func ВыборДаты(srcDate:D) :D;
var dd :D;
 if srcDate>1.1.100: dd=Calendar(srcDate); else dd=Calendar(ToDay); fi;
 if not(dd<=1.1.100): ^dd; else ^srcDate; fi;
end;

Proc ВыборКонтрагента(ПЕРВ:L; МЫ:L; РО:L; REC:Record);
-- ПЕРВ - первая организация в "шапке" (учреждение, организации-заказчика, организации-получателя)
--   МЫ - собственные реквизиты
--   РО - выбор контрагента через рабочую область
--  REC - если РО=True, то в REC ссылка на контрагента, иначе REC=NIL
var ОРГАН, ОКПО :S;
var RO :I;
 ОРГАН=""; ОКПО="";
 if not(РО):
   REC=NIL;
   if МЫ:
     REC=OpenCardFile("Контрагент", "Наше=True and GroupAttr=0", NIL, crdRecordOnly);
   else
     REC=OpenCardFile("Контрагент", "Наше=False", NIL, crdRecordOnly);
   fi;
 fi;
 if REC<>NIL:
   -- Реквизиты контрагента
   RO=OpenWorkArea("Контрагент", "", "UKey="+RecordToString(REC));
   Try
     if Records(RO)=1: ОРГАН=GetFieldS(RO, 1, "КОРИМЯ"); ОКПО=GetFieldS(RO, 1, "ОКПО"); fi;
   Finally
     CloseWorkArea(RO);
   end;
 fi;
 if ПЕРВ:
   Учреждение =ОРГАН; ОКПОучреж=ОКПО;
 else
   Исполнитель=ОРГАН; ОКПОИспол=ОКПО;
 fi;
end;

Proc ВыборКомиссии;
var REC :Record;
var RO, OA, Num, i  :I;
 REC=OpenCardFile("Комиссия", "", NIL, crdRecordOnly);
 if REC<>NIL:
   ClearVariable(Комиссия);
   RO=OpenWorkArea("Комиссия", "", "UKey="+RecordToString(REC));
   Try
     if Records(RO)=1:
       ДолПредКом=GetFieldS(RO, 1, "ПРЕДСД"); 
       ФИОПредКом=GetFieldS(RO, 1, "ПРЕДСФ");
       OA=OpenArray(RO, 1, "ЧЛЕНКОМ","");
       Num=Records(OA);
       if Num>0:
         Try
           for i=1..Num do
             Try InsertFrame(Комиссия, i); Except end;
             Комиссия[i].ДолЧленКом=GetFieldS(OA, i, "ЧЛЕНД");
             Комиссия[i].ФИОЧленКом=GetFieldS(OA, i, "ЧЛЕНФ");
           od;
         Finally
           CloseWorkArea(OA);
         end;
       fi;
     fi;
   Finally
     CloseWorkArea(RO);
   end;
 fi;
end;

2-- Обработчики событий полей, объектов и шаблона
2-- События полей
Func Field_onEnter(Field:S; Iter:I) :L;
var n   :I;
var tmp :S;
 FieldSender=Field;
 if Match(Field, 'A?'): ДобавитьУдалитьСтроки(Field, Iter, True) ; ^False;
 |  Match(Field, 'D?'): ДобавитьУдалитьСтроки(Field, Iter, False); ^False;
 fi;
 if Field="Учреждение"  or Field="ОКПОучреж"
                         : n=0; ClearVariable(Buf);
                           Buf[1]='"Собственные" реквизиты'; 
                           Buf[2]='Сторонние организации';
                           n=Alternate("Выберите тип контрагента", Buf, -1);
                           if n<>0: ВыборКонтрагента(True , if(n=1, True, False), False, NIL); fi;
                           ^False;
 |  Field="ДолПредКом" or Field="ФИОПредКом"
                         : ВыборКомиссии; ^False;
 |  Field="СчДебета"
                         : if СписМатер[Iter].СчКредита="" :
                             tmp=AccountElection(МаскаСчМат);
                           else
                             tmp=PickCorrAccount(СписМатер[Iter].СчКредита, True);
                           fi;
                           if tmp="": ^False; fi;
                           СписМатер[Iter].СчДебета=tmp;
                           ^False;
 |  Field="СчКредита"
                         : if СписМатер[Iter].СчДебета="" :
                             tmp=AccountElection(МаскаСчМат);
                           else
                             tmp=PickCorrAccount(СписМатер[Iter].СчДебета, False);
                           fi;
                           if tmp="": ^False; fi;
                           СписМатер[Iter].СчКредита=tmp;
                           ^False;
 |  Field="кодформы_":tmp=кодформы_Выбор;if кодформы0<>tmp:кодформы0=tmp;ВнешнийВид_редактирование;fi; ^False;
 fi;
 ^True;
end;

Proc Field_onExit(Field:S; Iter:I);
 if Field="Учреждение"  or Field="ОКПОучреж" :
   if Учреждение="" : ОКПОучреж=""; fi;
 |  Field="ДолПредКом"                                                                  :
   if ДолПредКом="" : ФИОПредКом=""; ClearVariable(Комиссия); fi;
 |  Field="ФИОПредКом"                                                                  :
   if ФИОПредКом="" : ДолПредКом=""; ClearVariable(Комиссия); fi;
 fi;
end;

Func Field_OnValidateN(Field:S; Iter:I; Value:N): L;
 if Value<0 : Message('Нельзя вводить отрицательное число.'); ^False; fi;
 ^True;
end; 

Func Сотрудники_onLookup(Sect:S; Row:I; Col:I; Cur:S): S;
var REC :Record;
var стрФИО, стрДОЛ, стрТАБ:S;
 Template.HideEditor(False);
 REC=OpenCardFile("Сотрудники");
 if REC=NIL: ^Cur; fi;
 стрФИО=GetCardFieldS("Сотрудники", REC, "ФАМИЛИЯ")+" "+GetCardFieldS("Сотрудники", REC, "ИНИЦИАЛЫ");
 стрТАБ=GetCardFieldS("Сотрудники", REC, "ПРИЗНАК");
 REC=GetCardFieldR("Сотрудники", REC, "ДОЛЖНОСТЬ");
 if REC<>NIL: стрДОЛ=GetCardFieldS("Должности", REC, "ДОЛЖ"); else  стрДОЛ=""; fi;
 if FieldSender="ФИОРУКучреж"  : ФИОРУКучреж =стрФИО; ДолжнРУКучреж=стрДОЛ;
 |  FieldSender="ДолжнРУКучреж": ФИОРУКучреж =стрФИО; ДолжнРУКучреж=стрДОЛ;
 |  FieldSender="МОЛ"          :         МОЛ =стрФИО;                       ТабНомМОЛ=стрТАБ;
 |  FieldSender="ТабНомМОЛ"    :         МОЛ =стрФИО;                       ТабНомМОЛ=стрТАБ;
 fi;
 ^"";
end;

Func ПО_onLookup(Sect:S; Row:I; Col:I; Cur:S): S;
var кодПО, наимПО, tmp :S;
 Template.HideEditor(False);
 tmp=AnaElection("М.*"); if tmp="": ^Cur; fi;
 кодПО=tmp; НаимПО=if(Name_A(кодПО)<>"" and Name_A(кодПО)<>" ", Name_A(кодПО), кодПО);
 if FieldSender="ПОучреж"     :  ПОучреж=наимПО; КодПОучреж=кодПО;
 |  FieldSender="КодПОучреж"  :  ПОучреж=наимПО; КодПОучреж=кодПО;
 fi;
 ^"";
end;
Proc КнРасчет_ПриНажатии(s:s);
 var d1,d2:d;
 var t,nsig1,nsig2,nsig3:i;
 var ll:l;
 var signs,УслМол1,УслМол2,УслМ:s;

 var Приход,ВнПер,Расход,услсч,АН_ДНФА:s;
 Приход='+(*.?.101.??.???|*.?.105.??.???|ЗАБ.??.*)/*&~(*.?.101.??.???|*.?.105.??.???|ЗАБ.??.*)';
 ВнПер ='(*.?.101.??.???|*.?.105.??.???|ЗАБ.??.*)/(*.?.101.??.???|*.?.105.??.???|ЗАБ.??.*)';
-- Расход='-(*.?.101.??.???|*.?.105.??.???|ЗАБ.??.*)/*&~(*.?.101.??.???|*.?.105.??.???|ЗАБ.??.*)';
 Расход='-(*.?.105.??.???|ЗАБ.??.105.*)/*&~(*.?.101.??.???|*.?.105.??.???|ЗАБ.??.*)';
 d1=ВзятьКартПолеД('РПО_ОПЕРАЦИИДНФА',ЧислоВзапись(ДНФАID),'ДатОпер');
 d2=d1+1;
 ДатаАкта=d1;
 --ЗАКДАТА=d1;
 АН_ДНФА=ВзятьКартПолеС('РПО_ОПЕРАЦИИДНФА',ЧислоВзапись(ДНФАID),'АН_ДНФА');
 if pos('ПРИХ.',АН_ДНФА)=1:услсч=Приход;УслМол1='+МОЛ.';УслМ='+М.';УслМол2='';
  | pos('ВНПР.',АН_ДНФА)=1:услсч=ВнПер; УслМол1='+МОЛ.';УслМ='+М.';УслМол2='-МОЛ.';
  | pos('РАСХ.',АН_ДНФА)=1:услсч=Расход;УслМол1=''     ;УслМ='-М.';УслМол2='-МОЛ.';
  | true:message(АН_ДНФА);услсч='*';
 fi;
 ClearVariable(СписМатер);
-- if ФИОК<>'':ФИОК='';fi;
-- if Мол<>'' :Мол ='';fi;
-- if ПОСТ<>'':ПОСТ='';fi;
 ll=false;
 nsig1=0;
 nsig2=0;
 nsig3=0;
 for transaction t=услсч+'{НФА.*&ДНФАID.'+стр16(ДНФАID)+'&ДНФА.'+АН_ДНФА+'}',d1,d2 do
-- for transaction t=услсч+'{ДНФАID.00000001 }',1.1.100,сегодня do
  InsertFrame(СписМатер,СписМатер+1);
  СписМатер[СписМатер].КодМат     =ПроводКоличПризнак(t);
  СписМатер[СписМатер].НаименМат  =Name_A(СписМатер[СписМатер].КодМат);
  СписМатер[СписМатер].ЕдИзм      =Unit(СписМатер[СписМатер].КодМат);
  СписМатер[СписМатер].СчДебета   =ПроводДеб(t);
  СписМатер[СписМатер].СчКредита  =ПроводКре(t);
  СписМатер[СписМатер].ФИзр_Колво =ПроводСумма(t,'КОЛ');
  СписМатер[СписМатер].ФИзр_Цена  =ПроводСумма(t)/СписМатер[СписМатер].ФИзр_Колво;
  if not ll:
    --signs=ПроводАналитика(t);
--    if УслМол1<>'':nsig1=ПроводНомерПризнака(t,УслМол1);
--    if nsig1=0:signs='';
--     | true:   signs=ПроводИмяПризн(t,nsig1);
--    fi;
--    Мол =if(pos('-',signs)+pos('+',signs)>0,SubStr(signs,2,length(signs)-1),signs);fi;
    if УслМол2<>'':nsig2=ПроводНомерПризнака(t,УслМол2);
    if nsig2=0:signs='';
      | true  :signs=ПроводИмяПризн(t,nsig2);
    fi;
    Мол=Name_A(if(pos('-',signs)+pos('+',signs)>0,SubStr(signs,2,length(signs)-1),signs));fi;

    if УслМ<>''   :nsig3=ПроводНомерПризнака(t,УслМ);
    if nsig3=0:signs='';
      | true  :signs=ПроводИмяПризн(t,nsig3);
    fi;
    ПОучреж=Name_A(if(pos('-',signs)+pos('+',signs)>0,SubStr(signs,2,length(signs)-1),signs));fi;
    ll=(ПОучреж<>'' or Мол<>'');
  fi;
 od;
end;
Proc ПриНажатии(s:s);
 if s='ВниманиеОбъект':
  ВниманиеНапоминать=(Вопрос('Предупреждение',ВниманиеСТР,'Ok;Напомнить',тсПредупреждение)=2);
 fi;
end;

2-- События шаблона
Proc Template_OnOpen(Create:L); -- _При открытии шаблона
 if ТекущееСостояние=КартСостВставлена or ДНФАID=0:
    ВниманиеСТР='Данный документ сформирован не из журнала операций с НФА!'+chr(13)+
                '[Расчет] будет производится неверно';
    if ВниманиеНапоминать:
       ВниманиеНапоминать=not (Вопрос('Предупреждение',ВниманиеСТР,'Ok;Не напоминать',тсПредупреждение)=2);
    fi;
  | true:ВниманиеСТР='';
 fi;
 if ВниманиеСТР<>'':
     ВниманиеОбъект.Виден=true;
     ВниманиеОбъект.Подсказка=ВниманиеСТР;
  | true:ВниманиеОбъект.Виден=false;
 fi;
Раб.НФА.АКТЫ.Template_OnOpen(Create);
end;
--
Proc Template_onClose(Destroy:L); -- _При закытии бланка
 NewRECbln='';
end;
--
Proc Template_onRead; -- _При считывании шаблона
 if recCurrent<>nil:
    if recCurrent<>Current:
       recCurrent=Current(recCurrent);
    fi;
    recCurrent=nil;
 fi;
Раб.НФА.АКТЫ.Template_onRead;
if pos('#'+кодформы0+'#','#0504230#0504230_МО#')<1:кодформы0='0504230';fi;
ВнешнийВид_редактирование;
end;

Func Номер_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
 Template.HideEditor(False);
 НОМЕРАКТА=РАБ.НФА.FUNC_LIB.NextNumToDateInF(SelfCRD, "НОМЕРАКТА", "ДАТААКТА", "Ukey<>"+RecordToString(Current), 1.1.100);
 БУМНОМЕР=Str(НОМЕРАКТА);
 ^"";
end;


Func НаименМат_OnLookup(Sect: String; Row: Integer; Col: Integer; Cur: String): String;
var OldValue, NewValue, MaskNFA :String;
var num :Integer;
 Template.HideEditor(False);
 OldValue=СписМатер[Row].КодМат;
 ClearVariable(Buf);
 Buf[1]="Продукты (105.02)";      MaskNFA="НФА.105.?2.*";
 Buf[2]="Все материалы (105.??)"; MaskNFA="НФА.105.??.*";
 while not num>0 do
  num=Alternate("Сделайте выбор", Buf, -1, 1, 12);
 od;
 if num=1: MaskNFA="НФА.105.?2.*";
 |  num=2: MaskNFA="НФА.105.??.*";
 else MaskNFA="НФА.101.??.*|НФА.105.??.*";
 fi;
 NewValue=AnaElection(MaskNFA, False, False, OldValue);
 if NewValue<>"" and NewValue<>OldValue:
   СписМатер[Row].КодМат    = NewValue;
   СписМатер[Row].НаименМат = Trim(Name_A(NewValue));
   СписМатер[Row].ЕдИзм     = Trim(Unit(NewValue));
 fi;
 ^"";
end;


КОНЕЦ
