БЛАНКСШАБЛОНОМ[20.04.2006] "Инвентаризационная опись ИНВ-1";
-- Редакция ЗАО "Агентство 'Русспромоценка'"
2-- Переменные
--BTNNAME_MENU:s='Замена НФА'; #Инвен

СекцТабл_итоги:Object;-- вывод данных с итогами
НФА_имя[]     :String;
МЕСТО         :String;
ВИДОПЕР:s;
СекцПояс     :Object;   СтрокиПояс :Integer;
СекцЗакл     :Object;   СтрокиЗакл :Integer;
СекцКомиссия :Object;   Комиссия   :Integer;
СекцТабл     :Object;   Позиции    :Integer;
СекцШапка    :Object;
СекцДопУсл   :Object;
СекцТаблШапка :Object;
СекцИтогоПоОписи:Object;
СекцТаблДно     :Object;
Кнопка1:Object;
Bln01:Object;
Bln02:Object;
Bln03:Object;
btnClose:Object; btnРасчет:Object;
cbБух:Object; cbБал:Object; cbЗаб:Object; cbФакт:Object; cbUseМХЭ:Object; cbРазбСч:Object; cbнетПО:Object;
Бал              :Logical=[True];
Заб              :Logical=[False];
РазбСч           :Logical=[False];
Факт             :Logical=[True];
Бух              :Logical=[True];
UseМХЭ           :Logical=[False];
нетПО            :Logical=[False];
неРез            :Logical=[False];
неКолНоль        :Logical=[False];
Прим             :Logical=[False];
var OldDate      :Date;
var StoreANA     :String;
var Пользов      :String;
var A            :String="+";
var D            :String="-";
var I1           :String="все";
var I2           :String="все";
var I3           :String="все";
var ИмяОтчета    :String="Отчет (бланки, не менять!!!)"; --Имя отчета для инвентаризации
var Buf[]        :String;
var Фокус        :String;
-- Заголовок
Numer            :String;
НаДату           :Date;
УЧРЕЖ_КОД        :String;
УЧРЕЖ_ИМЯ        :String;
ОКПО             :String;
КОД_ПО           :String=["П.*"];
var ИМЯ_ПО       :String=if(Name_A(КОД_ПО) <>"" and Name_A(КОД_ПО) <>" ", Name_A(КОД_ПО) , if(КОД_ПО="П.*", "Все подразделения", КОД_ПО));
КОД_МОЛ  :String=["МОЛ.*"];
var ИМЯ_МОЛ      :String=if(Name_A(КОД_МОЛ)<>"" and Name_A(КОД_МОЛ)<>" ", Name_A(КОД_МОЛ), if(КОД_МОЛ="МОЛ.*", "Все материально ответственные лица", КОД_МОЛ));
КОД_МХЭ  :String=["М.*"];
var ИМЯ_МХЭ      :String=if(Name_A(КОД_МХЭ)<>"" and Name_A(КОД_МХЭ)<>" ", Name_A(КОД_МХЭ), if(КОД_МХЭ="М.*", "Все местонахождения", КОД_МХЭ));
--
sort2:s='2';
sort3:s='3';
sort4:s='4';
sort5:s='5';
sort6:s='6';
sort7:s='7';
sort8:s='8';
sort9:s='9';
sort10:s='10';
sort11:s='11';
sort12:s='12';
sort13:s='13';
sort14:s='14';
sort15:s='15';

СтрокиДопУсл :Integer;
ДОПСПР[]    :String;
ДОППРИЗН[]  :String;
ДОППРИЗНН[] :String=Name_A(ДОППРИЗН[$]);
--
МОЛДОЛЖ      :String;
НОМСЧ        :String;
НомПриИнв    :String;
ДатПриИнв    :Date; -- дата выхода приказа об инвентаризации
МЕСТОИНВ     :String;
ДатНачИнв    :Date; -- дата начала инвентаризации
ДатКонИнв    :Date; -- дата конца инвентаризации
ДатРасИнв    :Date; -- дата расписки МОЛа
nn1          :String;
nn9          :String;
Поясн[]      :String;
ДатПояИнв    :Date; -- дата объяснения МОЛа
Закл[]       :String;
ДолПредКом   :String;
ФИОПредКом   :String;
ДолЧленКом[] :String;
ФИОЧленКом[] :String;
ДатКомИнв    :Date; -- дата комиссии
--
var УслДЕБ[] :String;
var УслКРЕ[] :String;
var УслАНА[] :String;

var aAna[]   :String;
var НФА_ИНВ[]:String;

-- Таблица
var NN[]      :String=Str($);
НФА_код[]     :String;

Инвен[]       :String;
var Вид_П1    :Integer=[0];
var НомерИНВ[]:String=РАБ.НФА.FUNC_LIB.FormatInvAna(НФА_код[$], Инвен[$], Вид_П1, "б/н", Chr(13));

ЕдИзм[]       :String;
Цена[]        :Numeric;
колФакт[]     :Numeric;
сумФакт[]     :Numeric;
var итогоФакт :Numeric=SumOfArray(сумФакт, Позиции);
колУчет[]     :Numeric;
сумУчет[]     :Numeric;
var итогоУчет :Numeric=SumOfArray(сумУчет, Позиции);
var колMin[]  :Numeric=if(неРез,0,Deb(колУчет[$]-колФакт[$]));
var сумMin[]  :Numeric=if(неРез,0,Deb(сумУчет[$]-сумФакт[$]));
-- неРез
var итогоMin  :Numeric=SumOfArray(сумMin, Позиции);
var колMax[]  :Numeric=if(неРез,0,Deb(колФакт[$]-колУчет[$]));
var сумMax[]  :Numeric=if(неРез,0,Deb(сумФакт[$]-сумУчет[$]));
var итогоMax  :Numeric=SumOfArray(сумMax, Позиции);
var Примеч[]      :String;
var НомерЗав[]    :String;
var НомерПасп[]   :String;
var док_имя[]   :String;
var док_дата[]   :Date;
var док_ном[]   :String;
var дата_изг[]   :Date;

var НеПовтор[]:String;
var Альбом:l=true;
var Масштаб:i=92;
var PageFieldUp:i=90;
var PageFieldDn:i=150;
var PageFieldL:i=250;
var PageFieldR:i=50;
var PageHeight:i=if(Альбом,int((2000-PageFieldL-PageFieldR)),int((2970-PageFieldUp-PageFieldDn)));
var номерстр2[]:s='2-я страница формы № ИНВ-1';
--var номерстр3[]:s='Форма 0504 087  с.'+str(int($/2)+3);
var лист:i;
var листномн[]:i; --первый номер на листе
var листномк[]:i; --последний номер на листе
func расчет_итогоСтрФактКол(j1:i;j2:i):n; var ii:i; var nn:n; nn=0;for ii=j1..j2-1 do nn=nn+колФакт[ii]; od;^nn;end;
func расчет_итогоСтрФактСум(j1:i;j2:i):n; var ii:i; var nn:n; nn=0;for ii=j1..j2-1 do nn=nn+сумФакт[ii]; od;^nn;end;
func расчет_итогоСтрБухКол (j1:i;j2:i):n; var ii:i; var nn:n; nn=0;for ii=j1..j2-1 do nn=nn+колУчет[ii]; od;^nn;end;
func расчет_итогоСтрБухСум (j1:i;j2:i):n; var ii:i; var nn:n; nn=0;for ii=j1..j2-1 do nn=nn+сумУчет[ii]; od;^nn;end;
func расчет_итогоСтрНедКол (j1:i;j2:i):n; var ii:i; var nn:n; nn=0;for ii=j1..j2-1 do nn=nn+колMin [ii]; od;^nn;end;
func расчет_итогоСтрНедСум (j1:i;j2:i):n; var ii:i; var nn:n; nn=0;for ii=j1..j2-1 do nn=nn+сумMin [ii]; od;^nn;end;
func расчет_итогоСтрИзлКол (j1:i;j2:i):n; var ii:i; var nn:n; nn=0;for ii=j1..j2-1 do nn=nn+колMax [ii]; od;^nn;end;
func расчет_итогоСтрИзлСум (j1:i;j2:i):n; var ii:i; var nn:n; nn=0;for ii=j1..j2-1 do nn=nn+сумMax [ii]; od;^nn;end;
var итогоСтрФактКол[]:n=расчет_итогоСтрФактКол(листномн[$],листномк[$]);
var итогоСтрФактСум[]:n=расчет_итогоСтрФактСум(листномн[$],листномк[$]);
var итогоСтрБухКол []:n=расчет_итогоСтрБухКол (листномн[$],листномк[$]);
var итогоСтрБухСум []:n=расчет_итогоСтрБухСум (листномн[$],листномк[$]);
var итогоСтрНедКол []:n=расчет_итогоСтрНедКол (листномн[$],листномк[$]);
var итогоСтрНедСум []:n=расчет_итогоСтрНедСум (листномн[$],листномк[$]);
var итогоСтрИзлКол []:n=расчет_итогоСтрИзлКол (листномн[$],листномк[$]);
var итогоСтрИзлСум []:n=расчет_итогоСтрИзлСум (листномн[$],листномк[$]);
var ПрописьНомеров []:s=format('(%d) %s',листномк[$]-листномн[$],Сло_(листномк[$]-листномн[$],'NAT'));
var ПрописьФактКол []:s=if(факт,format('(%.3f) %s',итогоСтрФактКол[$],Сло_(итогоСтрФактКол[$],'ЕДЦ3')),'');
var ПрописьФактСум []:s=if(факт,format('(%n) %s',итогоСтрФактСум[$],Сло_(итогоСтрФактСум[$],'')),'');

var ПрописьНомеровИтого :s=format('(%d) %s',Позиции,Сло_(Позиции,'NAT'));
var ПрописьФактКолИтого :s=if(факт,format('(%.3f) %s',СуммаМассива(колФакт,Позиции),Сло_(СуммаМассива(колФакт,Позиции),'ЕДЦ3')),'');
var ПрописьФактСумИтого :s=if(факт,format('(%n) %s',итогоФакт,Сло_(итогоФакт,'')),'');
--var ПрописьФактСум []:s=format('%s %.2d коп.',Сло_(trunc(итогоСтрФактСум[$]),'РУБ1'),FracToInteger(итогоСтрФактСум[$],2));
var СЧСУБ[]:s=substr(НФА_код[$],5,6);
2-- Общие процедуры и функции
Proc Очистить;
 ClearVariable(колMin); ClearVariable(колMax); ClearVariable(сумMin); ClearVariable(сумMax);
 ClearVariable(УслДЕБ); ClearVariable(УслКРЕ); ClearVariable(УслАНА);
 ClearVariable(aAna); ClearVariable(НФА_ИНВ);
 ClearVariable(Buf); ClearVariable(NN); ClearVariable(НеПовтор);
end;

Proc ОчиститьТаблицу;
 Очистить;
 ClearVariable(Позиции);
 ClearVariable(НФА_имя); ClearVariable(Инвен);
 ClearVariable(НФА_код); ClearVariable(ЕдИзм);
 ClearVariable(колФакт); ClearVariable(колУчет);
 ClearVariable(сумФакт); ClearVariable(сумУчет);
 ClearVariable(Цена); ClearVariable(Примеч);
 ClearVariable(НомерЗав); ClearVariable(НомерПасп);
 ClearVariable(док_имя); ClearVariable(док_дата);ClearVariable(док_ном);
 ClearVariable(дата_изг);
end;

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

Func GetDate :Date;  -- считываем в заданном поле дату
var name :String;
 name=AsString(Template.Field);
 if name="НаДату":    ^НаДату;
 |  name="ДатПриИнв": ^ДатПриИнв;
 |  name="ДатНачИнв": ^ДатНачИнв;
 |  name="ДатКонИнв": ^ДатКонИнв;
 |  name="ДатРасИнв": ^ДатРасИнв;
 |  name="ДатПояИнв": ^ДатПояИнв;
 |  name="ДатКомИнв": ^ДатКомИнв;
 fi;
end;

Proc SetDate(Value:Date); -- устанавливаем в заданном поле дату; Value - значение даты, которое необходимо присвоить
var name :String;
 name=AsString(Template.Field);
 if name="НаДату":    НаДату=Value;
 |  name="ДатПриИнв": ДатПриИнв=Value;
 |  name="ДатНачИнв": ДатНачИнв=Value;
 |  name="ДатКонИнв": ДатКонИнв=Value;
 |  name="ДатРасИнв": ДатРасИнв=Value;
 |  name="ДатПояИнв": ДатПояИнв=Value;
 |  name="ДатКомИнв": ДатКомИнв=Value;
 fi;
end; 

Func Объединить(Value1:String; Value2:String; Separator:String) :String;
var Ret :String;
 if Value1<>"" and Value2<>"": Ret=Value1+Separator+Value2;
 |  Value1= "" and Value2<>"": Ret=Value2;
 |  Value1<>"" and Value2="" : Ret=Value1;
 |  True: Ret="";
 fi;
 ^Ret;
end;

Proc УдалитьПустыеСтроки;
var nn :Integer;
 nn=1;
 while nn<=Позиции do 
 if колУчет[nn]=0 and сумУчет[nn]=0: 
   Try DeleteFrame(Позиции, nn); Except end;
  | true:if не Бух: колУчет[nn]=0; сумУчет[nn]=0;fi;nn=nn+1;
 fi; 
 od;
end;

Proc НачальнаяИтерация;
 if   СтрокиПояс<1: Try InsertFrame(СтрокиПояс,   1); Except end; fi;
 if   СтрокиЗакл<1: Try InsertFrame(СтрокиЗакл,   1); Except end; fi;
 if      Позиции<1: Try InsertFrame(Позиции,      1); Except end; fi;
 if СтрокиДопУсл<1: Try InsertFrame(СтрокиДопУсл, 1); Except end; fi;
end;

Proc ДобавитьСтроку(ИмяСекц:String; Iter:Integer);
 if ИмяСекц="СекцПояс":   Try InsertFrame(СтрокиПояс,   Iter+1); Except end;
 |  ИмяСекц="СекцЗакл":   Try InsertFrame(СтрокиЗакл,   Iter+1); Except end;
 |  ИмяСекц="СекцТабл":   Try InsertFrame(Позиции,      Iter+1); Except end;
 |  ИмяСекц="СекцДопУсл": Try InsertFrame(СтрокиДопУсл, Iter+1); Except end;
 fi;
end;

Proc УдалитьСтроку(ИмяСекц:String; Iter:Integer);
 if ИмяСекц="СекцПояс": 
   if СтрокиПояс>1: 
     Try DeleteFrame(СтрокиПояс, Iter); Except end; 
   else 
     Try DeleteFrame(СтрокиПояс, Iter); Except end; Try InsertFrame(СтрокиПояс, Iter); Except end;
   fi;
 |  ИмяСекц="СекцЗакл": 
   if СтрокиЗакл>1: 
     Try DeleteFrame(СтрокиЗакл, Iter); Except end; 
   else
     Try DeleteFrame(СтрокиЗакл, Iter); Except end; Try InsertFrame(СтрокиЗакл, Iter); Except end; 
   fi;
 |  ИмяСекц="СекцТабл": 
   if Позиции>1: 
     Try DeleteFrame(Позиции,    Iter); Except end;
   else
     Try DeleteFrame(Позиции,    Iter); Except end; Try InsertFrame(Позиции,    Iter); Except end;
   fi;
 |  ИмяСекц="СекцДопУсл":
   if СтрокиДопУсл>1:
     Try DeleteFrame(СтрокиДопУсл, Iter); Except end;
   else
     Try DeleteFrame(СтрокиДопУсл, Iter); Except end; Try InsertFrame(СтрокиДопУсл, Iter); Except end;
   fi;
 fi;
end;


Func ОтменитьИзмененияУсловийОтчета :Logical;
var FF :Logical;
var qq :Integer;
 FF=False;
 УдалитьПустыеСтроки;
 if Позиции>0:
   qq=EnqOkCancel("Условия отбора данных для формирования описи"+Chr(13)+
                  "инвентарных карточек по учету основных средств изменились!"+Chr(13)+
                  "Очистить отчет?", mtConfirmation);
   if qq=cmOk    : Очистить; ОчиститьТаблицу;
   |  qq=cmCancel: FF=True;
   fi;
 fi;
 НачальнаяИтерация;
 ^FF;
end;

Proc Реквизиты;
var REC :Record;
var RO :Integer;
 REC=SignToRecord("К."+УЧРЕЖ_КОД);
 REC=OpenCardFile("КОНТРАГЕНТ", "НАШЕ", REC, crdRecordOnly);
 if REC=NIL: Exit; fi;
 RO=OpenWorkArea("КОНТРАГЕНТ", "", "Ukey="+RecordToString(REC));
 Try
   if Records(RO)=1:
     УЧРЕЖ_КОД = GetFieldS(RO, 1, "ПРИЗНАК");
     УЧРЕЖ_ИМЯ = GetFieldS(RO, 1, "КОРИМЯ");
     ОКПО      = GetFieldS(RO, 1, "ОКПО");
   fi;
 Finally
   CloseWorkArea(RO);
 end;
end;

Proc ВыборКомиссии;
var REC :Record;
var RO, OA, num, i :Integer;
 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 to 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;

Proc ЗаполнитьСубСчета(СЧ:String);
 ClearVariable(Buf);
 if СЧ="НФА":
   Buf[1]="101 - Основные средства";
--   Buf[2]="102 - Нематериальные активы";
--   Buf[3]="103 - Непроизведенные активы";
--   Buf[4]="105 - Материальные запасы";
 |  СЧ="101":
   Buf[1]="...";
   Buf[2]="101.01 - Жилые помещения";
   Buf[3]="101.02 - Нежилые помещения";
   Buf[4]="101.03 - Сооружения";
   Buf[5]="101.04 - Машины и оборудование";
   Buf[6]="101.05 - Транспортные средства";
   Buf[7]="101.06 - Производственный и хозяйственный инвентарь";
   Buf[8]="101.07 - Библиотечный фонд";
--   Buf[9]="101.08 - Драгоценности и ювелирные изделия";
   Buf[9]="101.08 - Прочие основные средства";
-- |  СЧ="102":
--   Buf[1]="...";
--   Buf[2]="102.01 - Нематериальные активы";
-- |  СЧ="103":
--   Buf[1]="...";
--   Buf[2]="103.01 - Земля";
--   Buf[3]="103.02 - Ресурсы недр";
--   Buf[4]="103.03 - Прочие непроизведенные активы";
-- |  СЧ="105":
--   Buf[1]="...";
--   Buf[2]="105.01 - Медикаменты и перевязочные средства";
--   Buf[3]="105.02 - Продукты питания";
--   Buf[4]="105.03 - Горюче-смазочные материалы";
--   Buf[5]="105.04 - Строительные материалы";
--   Buf[6]="105.05 - Мягкий инвентарь";
--   Buf[7]="105.06 - Прочие материальные запасы";
--   Buf[8]="105.07 - Готовая продукция";
 fi;
end;

Proc ВыборСчетаУчетаНФА;
var nn, k, kk, mm :Integer;
var tmp :String;
var OK, Edit :Logical;
 OK=True; nn=0; ClearVariable(Buf);
 if НомСч<>"":
   Edit=True;
   tmp=SubStr(НомСч, 1, 6);
   if Match(tmp, "101.??"): k=1;
--   |  Match(tmp, "102.??"): k=2;
--   |  Match(tmp, "103.??"): k=3;
--   |  Match(tmp, "105.??"): k=4;
   else k=0;
   fi;
   if tmp<>"": kk=Int(SubStr(tmp, 5, 2))+1; else kk=1; fi;
 else
   Edit=False; k=1; kk=1;
 fi;
 while OK do
   ЗаполнитьСубСчета("НФА");
   if not(Edit):
     nn=Alternate("Выберите счет учета НФА", Buf, -1, k, 12);
   else
     nn=k;
   fi;
   if nn<>0: tmp=Buf[nn]; k=nn; fi;
   if nn=0: OK=False;
   |  nn=1: ЗаполнитьСубСчета("101");
--   |  nn=2: ЗаполнитьСубСчета("102");
--   |  nn=3: ЗаполнитьСубСчета("103");
--   |  nn=4: ЗаполнитьСубСчета("105");
   fi;
   while OK do
     if Edit:
       mm=Alternate("Выберите субсчет счета '"+tmp+"'", Buf, -1, kk, 12);
       Edit=False;
     else
       mm=Alternate("Выберите субсчет счета '"+tmp+"'", Buf, -1, 1, 12);
     fi;
     if mm=0: OK=False;
     |  mm=1: kk=1; Break;
     else НомСч=Buf[mm]; OK=False;
     fi;
   od;
 od;
end;

Proc ИнициализироватьУсловияИнвентарныхНомеров;
 ClearVariable(УслКРЕ); ClearVariable(УслДЕБ); ClearVariable(УслАНА);
 УслДЕБ[1] ="???.????.???????.???.?.101.??.310&~(*.101.37.310)";
 УслКРЕ[1] ="(???.????.???????.???.?.???.??.???&(*.106.?1.310|*.304.04.310))|(???.?.??.?????.??.????.?.401.1?.1??&(*.1?.14?|*.1?.15?|*.1?.180))|00";
 УслАНА[1] ="";

 УслДЕБ[2] ="???.????.???????.???.?.102.??.320";
 УслКРЕ[2] ="(???.????.???????.???.?.???.??.???&(*.106.32.?20|*.304.04.320))|(???.?.??.?????.??.????.?.401.1?.1??&(*.1?.14?|*.1?.15?|*.1?.180))|00";
 УслАНА[2] ="";

 УслДЕБ[3]="((*.?.101.??.310&~(*.?.101.37.310))|*.?.102.??.320)&???.????.???????.???.?.???.??.???";
 УслКРЕ[3]="((*.?.101.??.310&~(*.?.101.37.310))|*.?.102.??.320)&???.????.???????.???.?.???.??.???";
 УслАНА[3]="";

 УслДЕБ[4] ="???.??.??.??.??.??.????.?.103.1?.330";
 УслКРЕ[4] ="???.??.??.??.??.??.????.?.103.1?.330|???.??.??.??.??.??.????.?.106.13.?30|00";
 УслАНА[4] ="";

 УслДЕБ[5] ="(ЗАБ.??.101.??&~(ЗАБ.??.101.37))|ЗАБ.??.102.??|ЗАБ.??.103.??";
 УслКРЕ[5] ="(ЗАБ.??.101.??&~(ЗАБ.??.101.37))|ЗАБ.??.102.??|ЗАБ.??.103.??|ЗАБАЛАНС";
 УслАНА[5] ="";
end;

Func СчетСоотвМаске(СЧ:String; УСЛсч:String) :Logical;
-- СЧ должно являтся полным значением, а не маской!
var Acc :String;
 if УСЛсч="": ^False; fi;
 if Name_S(СЧ)=" ": ^False; fi;
 УСЛсч="("+УСЛсч+")";
 for Account Acc=УСЛсч, Sort do if СЧ=Acc: ^True; fi; od;
 ^False;
end;

Func ПризнакСоотвМаске(Призн:String; УСЛан:String) :Logical;
-- Призн должно являтся полным значением, а не маской!
var Ana :String;
 if УСЛан="": ^False; fi;
 if Name_A(Призн)=" ": ^False; fi;
 if УСЛан="*": ^True; fi;
 for Sign Ana=УСЛан, Sort do if Призн=Ana: ^True; fi; od;
 ^False;
end;

Func ПризнакИзСтрокиАналитикиПроводки(x:Integer; VOC:String; ДебПров:Logical) :String;
-- x - номер проводки
var p :Integer;
var sep, ANA :String;
 sep=""; ANA="";
 p=TransNumSign(x, sep+VOC+".");
 if p>0: ANA=TransSignName(x, p); ^ANA; fi;
 if ДебПров: sep="+"; else sep="-"; fi;
 p=TransNumSign(x, sep+VOC+".");
 if p>0: ANA=TransSignName(x, p); ^SubStr(ANA, 2, 255); fi;
 ^ANA;
end;

Proc РасчетВыполнить1;
var Путь, УслСч, УслОтб1, УслОтб2, ANA, MaskНФА, КОД, tmp, inv, УСЛt, ANAкод, СЧД, msk :String;
var Rep :Report;
var RO, len, i, j, k, y, x, z :Integer;
var OK, Flag : Logical;
var dd :Date;
--
 ОчиститьТаблицу;
 if Заб and Бал      : УслСч="";
 |  Заб and Бал=False: УслСч="забаланс";
 |  Заб=False and Бал: УслСч="баланс";
 fi;
 Путь=PlanVar("НФА")+"\Отчеты\НФАОТЧ.lst";
 УслОтб1=""; УслОтб2="";
 if РазбСч:
   УслОтб1="*.?."+SubStr(НомСч,1,6)+".???";
   УслОтб2=УслОтб1;
   if Заб:
     УслОтб1=Объединить(УслОтб1, "ЗАБ.??."+SubStr(НомСч,1,6), "|");
     УслОтб2=УслОтб1;
   fi;
 else
   УслОтб1="((*.?.101.??.???)&???.????.???????.???.?.???.??.???)";
   УслОтб2="((*.?.101.??.???)&???.????.???????.???.?.???.??.???)";
   if Заб:
     УслОтб1=Объединить(УслОтб1, "ЗАБ.??.101.??", "|");
     УслОтб2=Объединить(УслОтб2, "(ЗАБ.??.101.??)", "|");
   fi;
 fi;
 ANA="";
 if нетПО=False: ANA=Объединить(ANA, КОД_ПО, "&"); fi;
 ANA=Объединить(ANA, КОД_МОЛ, "&");
 if UseМХЭ: ANA=Объединить(ANA, КОД_МХЭ, "&"); fi;



 z=0;
 Rep=RepOpen(Путь+"|"+ИмяОтчета+УслСч, УслОтб1, Объединить(ANA, "НФА.*&~УЧН.*", "&"), НаДату, НаДату+1, "", "НФА");
 ShowProgress(0, "Поиск НФА без инвентарных номеров...");
 Try
   ShowProgress(RepRowsCount(Rep), "Поиск НФА без инвентарных номеров...");
   RepReset(Rep);
   i=1;
   while RepNext(Rep) do
     ProgressPos(i);
     i=i+1;
     КОД=RepIdent(Rep);
     if RepSaldoF(Rep, отчСверн, "КОЛ")<>0 or RepSaldoF(Rep, отчСверн, "РУБ")<>0:
       z=z+1;
       НФА_код[z]=КОД;
       tmp=Name_A(КОД);
       if Length(tmp)>0: НФА_имя[z]=tmp; else НФА_имя[z]=КОД; fi;
       Инвен[z]="";
       ЕдИзм[z]=Unit(КОД);
       колУчет[z]=RepSaldoF(Rep, отчСверн, "КОЛ");
       сумУчет[z]=RepSaldoF(Rep, отчСверн, "РУБ");
       if Факт: колФакт[z]=колУчет[z]; сумФакт[z]=сумУчет[z]; else колФакт[z]=0; сумФакт[z]=0; fi;
--       if не Бух: колУчет[z]=0; сумУчет[z]=0;fi;
       Цена[z]=if(колУчет[z]<>0: сумУчет[z]/колУчет[z], 0);
     fi;
   end;
 Finally
   CloseProgress;
   Rep=RepClose(Rep);
 end;
 Flag=True;
 if РазбСч and Match(УслОтб2, "105.??"): Flag=False; fi;
 if Flag:
   MaskНФА="(НФА.101.??.*)";
   MaskНФА=Объединить(MaskНФА, "УЧН.*", "&");
   ИнициализироватьУсловияИнвентарныхНомеров;
   RO=OpenWorkArea("РПО_ИНВКАРТ_ОС", "", "1=0");
   Rep=RepOpen(Путь+"|"+ИмяОтчета+УслСч, УслОтб2, Объединить(ANA, MaskНФА, "&"), НаДату, НаДату+1, "", "НФА");
   ShowProgress(0, "Поиск НФА с инвентарными номерами...");
   Try
     ShowProgress(RepRowsCount(Rep), "Поиск НФА с инвентарными номерами...");
     RepReset(Rep);
     i=1;
     while RepNext(Rep) do
       ProgressPos(i);
       i=i+1;
       КОД=RepIdent(Rep);
       if RepSaldoF(Rep, отчСверн, "КОЛ")<>0 or RepSaldoF(Rep, отчСверн, "РУБ")<>0:
         ANAкод='*.'+SubStr(КОД,5,6);
         dd=НаДату+1;
         len=LengthOfArray(УслАНА);
         if Заб=False: len=len-1; fi;
         tmp=Объединить(ANA, КОД, "&");
         tmp=Объединить(tmp, "УЧН.*", "&");
         УСЛt=ANAкод+".???|"+ANAкод+"{"+tmp+"}";
         ClearVariable(НеПовтор);
         for Transaction k=УСЛt, 1.1.100, dd, Reverse do
           j=TransSignCount(k);
           for y=1 to len do
             OK=True;
             if УслАНА[y]<>"":
               OK=False;
               for x=1 to j do
                 OK=ПризнакСоотвМаске(TransSignName(k, x), УслАНА[y]);
                 if OK: Break; fi;
               od;
             fi;
             OK=(OK and СчетСоотвМаске(TransDeb(k), УслДЕБ[y]));
             OK=(OK and СчетСоотвМаске(TransCre(k), УслКРЕ[y]));
             if OK:
               if y=1 or y=2 or y=3: СЧД=SubStr(TransDeb(k), 1, 30)+"???";
               |  y=4              : СЧД=SubStr(TransDeb(k), 1, 33)+"???";
               |  y=5              : СЧД=TransDeb(k);
               else СЧД="";
               fi;
               Break;
             fi;
           od;
           if OK and СЧД<>"":
             inv=ПризнакИзСтрокиАналитикиПроводки(k, "ИНВ", True);
             if SearchInArray(НеПовтор, inv, True)<0:
               z=z+1;
               InsertInArraySort(НеПовтор, inv);
               НФА_код[z]=КОД;
               Инвен[z]=inv;
               tmp=Name_A(КОД);
               if Length(tmp)>0: НФА_имя[z]=tmp; else НФА_имя[z]=КОД; fi;
--               if Name_A("ИНВВЕД.")=" ":
--                 msk="НФА='"+КОД+"' and ИНВ='"+SubStr(inv, 5, Length(inv))+"'";
--                 SetFilter(RO, msk);
--                 if Records(RO)=1: tmp=GetFieldS(RO, 1, "ИНВ_ВЕД"); else tmp=""; fi;
--               else
--                 tmp=Name_A(КОД+'.'+inv);
--               fi;
--               if tmp<>" " and tmp<>"": Инвен[z]=tmp; else Инвен[z]=SubStr(inv, 5, Length(inv)); fi;
               ЕдИзм[z]=Unit(КОД);
               tmp=Объединить(ANA, КОД, "&");
               tmp=Объединить(tmp, inv, "&");
               колУчет[z]=Saldo(СЧД+"{"+tmp+"}", НаДату, "КОЛ");
               сумУчет[z]=Saldo(СЧД+"{"+tmp+"}", НаДату, "РУБ");
               if Факт: колФакт[z]=колУчет[z]; сумФакт[z]=сумУчет[z]; else колФакт[z]=0; сумФакт[z]=0; fi;
--               if не Бух: колУчет[z]=0; сумУчет[z]=0;fi;
               Цена[z]=if(колУчет[z]<>0: сумУчет[z]/колУчет[z], 0);
             fi;
           fi;
         end; --Transaction
       fi;
     end; -- while
   Finally
     CloseProgress;
     Rep=RepClose(Rep);
     CloseWorkArea(RO);
   end;
 fi;
 Позиции=z;
 УдалитьПустыеСтроки;
   ShowProgress(0, "Идет сортировка...");
     SortSection(Позиции, "НФА_КОД");
--     SortSection(Позиции, Столб);
   CloseProgress;

 Очистить;
 ClearVariable(NN);
end;

Proc РасчетВыполнить2;
var Путь, УслСч, УслОтб, ANA, КОДНФА, tmp, ИНВНОМ, СЧД :String;
var ВременныйФайл, aVal1, aVal2, aDeb, aCre, aComment,ss: String;
var aSum1, aSum2: Numeric;
var aDate: Date;
var Rep :Report;
var len, i, j, k, y, x, z :Integer;
var Flag : Logical;
var REC  : Record;
 ОчиститьТаблицу;
 if Заб and Бал      : УслСч="";
 |  Заб and Бал=False: УслСч="забаланс";
 |  Заб=False and Бал: УслСч="баланс";
 fi;
 Путь=PlanVar("НФА")+"\Отчеты\НФАОТЧ.lst";
 УслОтб="";
 if РазбСч:
   УслОтб="*.?."+SubStr(НомСч,1,6)+".???";
   if Заб: УслОтб=Объединить(УслОтб, "ЗАБ.??."+SubStr(НомСч,1,6), "|"); fi;
 else
   if Заб and Бал      : УслОтб="((*.?.101.??.???)&???.????.???????.???.*)|ЗАБ.??.101.??";
   |  Заб and Бал=False: УслОтб="ЗАБ.??.101.??";
   |  Заб=False and Бал: УслОтб="((*.?.101.??.???)&???.????.???????.???.*)";
   fi;
--   УслОтб="((*.?.101.0?.???|*.?.102.01.???|*.?.105.0?.???)&???.????.???????.???.?.???.??.???)|???.??.??.??.??.??.????.?.103.0?.???|ЗАБ.??.???.??";
--   if Заб: УслОтб=Объединить(УслОтб, "ЗАБ.??.???.??", "|"); fi;
 fi;
 ANA="";
 if нетПО=False: ANA=Объединить(ANA, КОД_ПО, "&"); fi;
 ANA=Объединить(ANA, КОД_МОЛ, "&");
 if UseМХЭ: ANA=Объединить(ANA, КОД_МХЭ, "&"); fi;
 --
 for z=1 to СтрокиДопУсл do ANA=Объединить(ANA, ДОППРИЗН[z], "&"); od;
 --
 z=0;
 Rep=RepOpen(Путь+"|"+ИмяОтчета+УслСч, УслОтб, Объединить(ANA, "НФА.*&~УЧН.*", "&"), НаДату, НаДату+1, "", "НФА");
 ShowProgress(0, "Поиск НФА без инвентарных номеров...");
 Try
   ShowProgress(RepRowsCount(Rep), "Поиск НФА без инвентарных номеров...");
   RepReset(Rep);
   i=1;
   while RepNext(Rep) do
     ProgressPos(i);
     i=i+1;
     КОДНФА=RepIdent(Rep);
     if RepSaldoF(Rep, отчСверн, "КОЛ")<>0 or RepSaldoF(Rep, отчСверн, "РУБ")<>0:
       z=z+1;
       НФА_код[z]=КОДНФА;
       tmp=Name_A(КОДНФА);
       if Length(tmp)>0: НФА_имя[z]=tmp; else НФА_имя[z]=КОДНФА; fi;
       Инвен[z]="";
       ЕдИзм[z]=Unit(КОДНФА);
       колУчет[z]=RepSaldoF(Rep, отчСверн, "КОЛ");
       сумУчет[z]=RepSaldoF(Rep, отчСверн, "РУБ");
       if Факт: колФакт[z]=колУчет[z]; сумФакт[z]=сумУчет[z]; else колФакт[z]=0; сумФакт[z]=0; fi;
--       if не Бух: колУчет[z]=0; сумУчет[z]=0;fi;
       Цена[z]=if(колУчет[z]<>0: сумУчет[z]/колУчет[z], 0);
     fi;
   end;
 Finally
   CloseProgress;
   Rep=RepClose(Rep);
 end;
 Flag=True;
 if РазбСч and SubStr(НОМСЧ, 1, 3)="105": Flag=False; fi;
 if Flag:
   ВременныйФайл=PlanVar('CACHE')+'\ВременныйФайлОстатков.jur';
   if ExistFile(ВременныйФайл): DeleteFile(ВременныйФайл); fi;
   if Заб and Бал      : x=TujRepBalAccount+TujRepNoNullBal+TujRepZabalance+TujRepCombinedAna;ss="*.?.101.??.???|(ЗАБ.??.101.??)";
   |  Заб and Бал=False: x=                 TujRepNoNullBal+TujRepZabalance+TujRepCombinedAna;ss="ЗАБ.??.101.??";
   |  Заб=False and Бал: x=TujRepBalAccount+TujRepNoNullBal+                TujRepCombinedAna;ss="*.?.101.??.???";
   fi;
--   if Заб: x=TujRepBalAccount+TujRepNoNullBal+TujRepZabalance+TujRepCombinedAna; else x=TujRepBalAccount+TujRepNoNullBal+TujRepCombinedAna; fi;
   tmp=if(РазбСч, УслОтб, ss);
   len=TujReport(ВременныйФайл, 1.1.100, НаДату+1, tmp, Объединить(ANA, "НФА.*&УЧН.*", "&"), "ДНФА", "", "", x, False);
   if len>0:
     OpenTextJur(ВременныйФайл);
     ShowProgress(len, "Поиск НФА с инвентарными номерами...");
     Try
       j=1; y=1; ClearVariable(НФА_ИНВ);
       while not GetTransFromTextJur(aDate, aSum1, aVal1, aSum2, aVal2, aDeb, aCre, aAna, aComment) do
         ProgressPos(y);
         y=y+1;
         k=LengthOfArray(aAna);
         if k>0:
           КОДНФА=""; ИНВНОМ="";
           for i=1 to k do 
             if Match(aAna[i], "НФА.*"):
               x=Pos(":", aAna[i]);
               if x>0: aAna[i]=SubStr(aAna[i], 1, x-1); fi;
               КОДНФА=aAna[i];
             |  Match(aAna[i], "УЧН.*") or Match(aAna[i], "+УЧН.*"):
               x=Pos(":", aAna[i]);
               if x>0: aAna[i]=SubStr(aAna[i], 1, x-1); fi;
               if SubStr(aAna[i], 1, 1)="+": ИНВНОМ=SubStr(aAna[i], 2, 255); else ИНВНОМ=aAna[i]; fi;
             fi;
           od;
           if КОДНФА<>"" and ИНВНОМ<>"":
             tmp="";
             if aDeb="00" or aDeb="00Z": tmp=aCre; fi;
             if aCre="00" or aCre="00Z": tmp=aDeb; fi;
             if Match(tmp, "???.????.???????.???.?.101.??.???")   : tmp=SubStr(tmp, 1, 30)+"???";
             |  Match(tmp, "???.??.??.??.??.??.????.?.101.??.???"): tmp=SubStr(tmp, 1, 33)+"???";
             |  Match(tmp, "ЗАБ.??.101.??")                       : tmp=tmp;
             else tmp="";
             fi;
             if tmp<>"": AddInArray(НФА_ИНВ, True, False, КОДНФА+"|"+ИНВНОМ+"|"+tmp); j=j+1; fi;
           fi;
         fi;
       end; -- while
     Finally
       CloseProgress;
       CloseTextJur;
       if ExistFile(ВременныйФайл): DeleteFile(ВременныйФайл); fi;
     end;
   fi;
   len=LengthOfArray(НФА_ИНВ);
   if len>0:
     ShowProgress(len, "Обработка НФА с инвентарными номерами...");
     Try
       for i=1 to len do
         ProgressPos(i);
         КОДНФА=ExtractWord(1, НФА_ИНВ[i], "|");
         ИНВНОМ=ExtractWord(2, НФА_ИНВ[i], "|");
            СЧД=ExtractWord(3, НФА_ИНВ[i], "|");
         z=z+1;
         НФА_код[z]=КОДНФА;
         Инвен[z]=ИНВНОМ;
         tmp=Name_A(КОДНФА);
         if Length(tmp)>0: НФА_имя[z]=tmp; else НФА_имя[z]=КОДНФА; fi;
         tmp=Name_A("ИНВВЕД."+КОДНФА+'.'+ИНВНОМ);
         if tmp=" ":
           --Примеч[z]="Инв. карточка не создана";
           Примеч[z]="";
           НомерЗав [z]="";
           НомерПасп[z]="";
           дата_изг [z]=1.1.100;
         else
           if Прим:
             REC=SignToRecord("ИНВВЕД."+КОДНФА+'.'+ИНВНОМ, False);
             if REC<>NIL:
               НомерЗав [z]=GetCardFieldS("РПО_ИНВКАРТ_ОС", REC, "ЗАВОД_НОМ");
               НомерПасп[z]=GetCardFieldS("РПО_ИНВКАРТ_ОС", REC, "ПАСПОРТ");
               дата_изг[z]=GetCardFieldd("РПО_ИНВКАРТ_ОС", REC, "дата_изг");
--               Примеч[z]="зав/н:"+GetCardFieldS("РПО_ИНВКАРТ_ОС", REC, "ЗАВОД_НОМ")+Chr(13)+"иной/н:"+GetCardFieldS("РПО_ИНВКАРТ_ОС", REC, "ИНОЙ_НОМ")+
--                         '  '+str(Раб.НФА.B01.ПОЛЕПОПРИЗНАКУЧ(КОДНФА,'СРОКАМ'),2)+' лет';

             fi;
           fi;
         fi;
         ЕдИзм[z]=Unit(КОДНФА);
         tmp=Объединить(ANA, КОДНФА, "&");
         tmp=Объединить(tmp, ИНВНОМ, "&");
         колУчет[z]=Saldo(СЧД+"{"+tmp+"}", НаДату, "КОЛ");
         сумУчет[z]=Saldo(СЧД+"{"+tmp+"}", НаДату, "РУБ");
         if Факт: колФакт[z]=колУчет[z]; сумФакт[z]=сумУчет[z]; else колФакт[z]=0; сумФакт[z]=0; fi;
         Цена[z]=if(колУчет[z]<>0: сумУчет[z]/колУчет[z], 0);
       od;
     Finally
       CloseProgress;
     end;
   fi;
 fi;
 Позиции=z;
 УдалитьПустыеСтроки;
   ShowProgress(0, "Идет сортировка...");
     SortSection(Позиции, "НФА_ИМЯ");
   CloseProgress;
 Очистить;
 ClearVariable(NN);
end;

Proc Расчет;
var msg, fld, tmp, Acc, Voc ,ss:String;
var tb :Numeric;
var Err, OK :Logical;
var nn, i, num, j, k :Integer;
 Err=False; msg=""; fld="";
 if НАДАТУ=1.1.100: Err=True; fld="НАДАТУ" ; msg="Не указана дата формирования данных инвентаризационной описи!"; fi;
 if КОД_ПО=""     : Err=True; fld="ИМЯ_ПО" ; msg="Не указано структурное подразделение для^Mформирования данных инвентаризационной описи!"; fi;
 if КОД_МОЛ=""    : Err=True; fld="ИМЯ_МОЛ"; msg="Не указано материально ответственное лицо для^Mформирования данных инвентаризационной описи!"; fi;
 if РАЗБСЧ and НОМСЧ="": 
                    Err=True; fld="НОМСЧ";   msg="Указан флаг 'Составить отчет только для выбранного субсчета' и^Mне указан номер счета для формирования данных инвентаризационной описи!";
 fi;
 if Err: Message(msg, mtWarning); Template.Field=fld; Exit; fi;
 if Бал=False and Заб=False: 
   Message("Для расчета необходимо включить флажок^Mбалансовых и (или) забалансовых счетов!", mtWarning);
   Template.Object="cbБал";
   Exit;
 fi;
 ClearVariable(Buf);
 ClearVariable(НеПовтор);
 if Бал and Заб:ss="*.101.??.???|ЗАБ.??.101.??";
  | Бал:ss="*.101.??.???";
  | Заб:ss="ЗАБ.??.101.??";
 fi;
 for Account Acc=ss do
   tmp=Объединить(SignsMask(Acc, True), SignsMask(Acc,False), "|");
   if SearchInArray(Buf, tmp, True)=-1: nn=InsertInArraySort(Buf, tmp); fi;
 od;
 nn=LengthOfArray(Buf);
 for i=1 to nn do
   tmp=Buf[i];
   num=WordsCount(tmp, "|");
   for j=1 to num do
     Voc=ExtractWord(j, tmp, "|");
     if Voc<>"":
       if SearchInArray(НеПовтор, Voc, True)=-1:
         k=InsertInArraySort(НеПовтор, Voc);
       fi;
     fi;
   od;
 od;
 OK=True;
 if нетПО=False: if SearchInArray(НеПовтор, "П.*", True)>0: OK=True; else OK=False; fi; fi;
 if OK: if UseМХЭ: if SearchInArray(НеПовтор, "М.*", True)>0: OK=True; else OK=False; fi; fi; fi;
 if OK: if SearchInArray(НеПовтор, "МОЛ.*", True)>0: OK=True; else OK=False; fi; fi;
 if OK: if SearchInArray(НеПовтор, "НФА.*", True)>0: OK=True; else OK=False; fi; fi;
 if OK: if SearchInArray(НеПовтор, "УЧН.*", True)>0: OK=True; else OK=False; fi; fi;
 tb=Time;
 if OK: РасчетВыполнить2; else РасчетВыполнить1; fi;
 if неКолНоль:
    for j=1..позиции do
      if колУчет[j]=0:
         deleteframe(позиции,j);
         j=j-1;
      fi;
    od;
 fi;
 Message("Расчет завершен.^MВремя работы "+Str(Time-tb)+"с.", mtInformation);
end;

2-- События клеток
Func Field_onEnter(Field:String; Iter:Integer) :Logical; -- на входе в клетку
var tmp :String;
var REC :Record;
 if Field="УЧРЕЖ_ИМЯ" or Field="ОКПО": Реквизиты; ^False;
 |  Field="ИМЯ_ПО"  : StoreANA=КОД_ПО;
                      tmp=AnaElection("П.*", False, False, КОД_ПО);
                      if tmp="": ^False; fi;
                      КОД_ПО=tmp;
                      if КОД_ПО<>StoreANA: if ОтменитьИзмененияУсловийОтчета: КОД_ПО=StoreANA; fi; fi;
                      ^False;
 |  Field="ИМЯ_МОЛ" : StoreANA=КОД_МОЛ;
                      tmp=AnaElection("МОЛ.*", False, False, КОД_МОЛ);
                      if tmp="": ^False; fi;
                      КОД_МОЛ=tmp;
                      if КОД_МОЛ<>StoreANA: if ОтменитьИзмененияУсловийОтчета: КОД_МОЛ=StoreANA; fi; fi;
                      REC=SignToRecord(КОД_МОЛ);
                      if REC=NIL: МОЛДОЛЖ=""; else МОЛДОЛЖ=GetCardFieldS("СОТРУДНИКИ", REC, "ДОЛЖНОСТЬ.ДОЛЖ"); fi;
                      ^False;
 |  Field="ИМЯ_МХЭ" : StoreANA=КОД_МХЭ;
                      tmp=AnaElection("М.*", False, False, КОД_МХЭ);
                      if tmp="": ^False; fi;
                      КОД_МХЭ=tmp;
                      if КОД_МХЭ<>StoreANA: if ОтменитьИзмененияУсловийОтчета: КОД_МХЭ=StoreANA; fi; fi;
                      МЕСТОИНВ="["+КОД_МХЭ+"] - "+ИМЯ_МХЭ;
                      ^False;
 |  Field="НаДату"  : OldDate=НаДату;
 |  Field="I1"      : StoreANA=КОД_ПО; КОД_ПО="П.*";
                      if КОД_ПО <>StoreANA: if ОтменитьИзмененияУсловийОтчета: КОД_ПО =StoreANA; fi; fi;
                      ^False;
 |  Field="I2"      : StoreANA=КОД_МОЛ; КОД_МОЛ="МОЛ.*";
                      if КОД_МОЛ<>StoreANA: if ОтменитьИзмененияУсловийОтчета: КОД_МОЛ=StoreANA; fi; fi;
                      ^False;
 |  Field="I3"      : StoreANA=КОД_МХЭ; КОД_МХЭ="М.*";
                      if КОД_МХЭ<>StoreANA: if ОтменитьИзмененияУсловийОтчета: КОД_МХЭ=StoreANA; else МЕСТОИНВ=""; fi; fi;
                      ^False;
 |  Field="ДОЛПРЕДКОМ" or Field="ФИОПРЕДКОМ": ВыборКомиссии; ^False;
 |  Field="НОМСЧ"   : ВыборСчетаУчетаНФА; ^False;
 |  Field="A"       : tmp=asString(Template.Name); ДобавитьСтроку(tmp, Iter); ^False;
 |  Field="D"       : tmp=asString(Template.Name);  УдалитьСтроку(tmp, Iter); ^False;
 fi;
 ^True;
end; 

Proc Field_onExit(Field:String; Iter:Integer); -- на выходе из клетки
 if Field="УЧРЕЖ_ИМЯ" or
    Field="ОКПО"      : if УЧРЕЖ_ИМЯ="": УЧРЕЖ_КОД=""; ОКПО=""; fi;
 |  Field="НаДату"    : if НаДату<>OldDate: if ОтменитьИзмененияУсловийОтчета: НаДату=OldDate; fi; fi;
 |  Field="ДОЛПРЕДКОМ": if ДолПредКом="": ФИОПредКом=""; ClearVariable(Комиссия); fi;
 |  Field="ФИОПРЕДКОМ": if ФИОПредКом="": ДолПредКом=""; ClearVariable(Комиссия); fi;
 fi;
end;

Func ПО_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
var КОД, ИМЯ, tmp, name, in :String;
var p1, p2 :Integer;
 Template.HideEditor(False);
 name=AsString(Template.Field);
 tmp="";
 if name="МЕСТОИНВ": tmp=МЕСТОИНВ; fi;
 p1=Pos("[", tmp);
 p2=Pos("]", tmp);
 if p1>0 and p2>0 then
   in=SubStr(tmp, p1+1, p2-p1-1);
   if ValidSign(in)=False or Name_A(in)=" " then in=""; fi;
 fi;
 tmp="";
 tmp=AnaElection("М.*", False, False, in);
 if tmp="": ^Cur; fi;
 КОД=tmp; ИМЯ=if(Name_A(КОД)<>"" and Name_A(КОД)<>" ", Name_A(КОД), КОД);
 if name="МЕСТОИНВ": МЕСТОИНВ="["+КОД+"] - "+ИМЯ; fi;
 ^"";
end;

Func Дата_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
var dd, ddSave : Date;
var name :String;
 Template.HideEditor(False);
 name=asString(Template.Field);
 ddSave=GetDate;
 dd=ВыборДаты(ddSave);
 if name="НаДату":
   if dd<>ddSave:
     if ОтменитьИзмененияУсловийОтчета: dd=ddSave; fi;
   fi;
 fi;
 SetDate(dd);
 ^"";
end;

Func МОЛ_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
var tmp, СТРДОЛ :String;
var REC :Record;
 Template.HideEditor(False);
 StoreANA=КОД_МОЛ;
 tmp=AnaElection("МОЛ.*", False, False, КОД_МОЛ);
 if tmp="": ^Cur; fi;
 if tmp<>StoreANA: if ОтменитьИзмененияУсловийОтчета: tmp=StoreANA; fi; fi;
 REC=SignToRecord(tmp);
 if REC=NIL: СТРДОЛ=""; else СТРДОЛ=GetCardFieldS("СОТРУДНИКИ", REC, "ДОЛЖНОСТЬ.ДОЛЖ"); fi;
 МОЛДОЛЖ=СТРДОЛ; КОД_МОЛ=tmp;
 ^"";
end;

Func СУМФАКТ_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
var Iter  :Integer;
var name :String;
 Template.HideEditor(False);
 name=asString(Template.Field);
 Iter=asInteger(Template.Frame);
 if колФакт[Iter]=0: 
   Message("Для пересчета суммы фактического наличия^Mнеобходимо ввести количество фактического наличия!", mtWarning); 
   Template.Field="колФакт";
   Template.Frame=Iter;
   ^Cur;
 fi;
 сумФакт[Iter]=Round(Цена[Iter]*колФакт[Iter], 2);
 ^"";
end;

Func ДОПСПР_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
var Iter  :Integer;
var name :String;
 Template.HideEditor(False);
 name=asString(Template.Field);
 Iter=asInteger(Template.Frame);
 ДОПСПР[Iter]=AnaElection("*&~(ДНФА.*|ДНФАid.*|КОМИССИЯ.*|МОЛ.*|М.*|ТМЦ.*)", True);
 ^"";
end;


Func ДОППРИЗН_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String) :String;
var Iter  :Integer;
var name, tmp :String;
 Template.HideEditor(False);
 name=asString(Template.Field);
 Iter=asInteger(Template.Frame);
 if ДОПСПР[Iter]<>"": tmp=GetAnaGlossary(ДОПСПР[Iter]); else tmp=""; fi;
 if tmp="" or tmp=" ": Message("Не выбран справочник!", mtWarning); Template.Field="ДОПСПР"; Template.Frame=Iter; ^Cur; fi;
 ДОППРИЗН[Iter]=AnaElection(ДОПСПР[Iter]);
 ^"";
end;

2-- События объектов
Proc ПЕЧАТЬ="ПЕЧАТЬ";
Print("", "RPO_0317004_000.cfg", "", False, 0, 0, false);
end;

Proc btnOnClick(Sender:String); -- объекты при нажатии
 if Sender="btnClose" : Close;
 |  Sender="btnРасчет": 
    Кнопка1.надпись='на страницы с итогами';
    СекцТабл_итоги.ColsCount=1;
    СекцТабл_итоги.RowsCount=1;
    СекцТаблШапка.Visible=true;
    СекцТабл.Visible=true;
    СекцТабл_итоги.Visible=false;
 Расчет;
 fi;
end;

Proc cbUseМХЭ_onChange(Sender:String);
-- СекцШапка.CanPrint=UseМХЭ;
end;

2-- События шаблона
Proc Template_OnOpen(Create:Logical); -- при открытии шаблона
var tmp :String;
 Очистить;
-- СекцШапка.CanPrint=UseМХЭ;
 tmp=UserName(AliasName("РПО_ИНВКАРТ_ОС"));
 Пользов=if(tmp<>"", "Пользователь - "+tmp, "Пользователь локальной версии");
 РАБ.НАСТР_ПЕЧАТЬ.Cfg(PlanVar('НФА')+'\Настройки\',"RPO_0317004_000.cfg"); -- стандартная настройка
 НачальнаяИтерация;
 if НаДату=1.1.100 then НаДату=ToDay; fi;
end;

Proc Template_AfterOpen(Create:Logical); -- после открытия шаблона
-- Template.Object="btnClose";
  Template.Field="Фокус";
end;

Proc Template_OnClose(Destroy:Logical); -- при закрытии шаблона
 Очистить;
end;



Функ sort_ПриОбзоре(Сек: Строка; Стр: Целое; Столб: Целое; Тек: Строка): Строка;
  Шаблон.СкрытьРедактор(false);
  if (ВопрДаОтказ("Сортировать по данному столбцу?") = кмдВерно) :
   ShowProgress(0, "Идет сортировка...");
     SortSection(Позиции, Столб);
   CloseProgress;
  fi;
  Возврат '' ;
end;

--СекцТабл_итоги
var test=[125];
Proc SetCellLinksValue_Шапка;
  ClearVariable(Раб.НФА.B02.CellLinksValue1);
  Раб.НФА.B02.CellLinksValue1[01]='1,1,13,1';
  Раб.НФА.B02.CellLinksValue1[02]='1,2,1,3';
  Раб.НФА.B02.CellLinksValue1[03]='2,2,2,3';
  Раб.НФА.B02.CellLinksValue1[04]='3,2,5,2';
  Раб.НФА.B02.CellLinksValue1[05]='6,2,6,3';
  Раб.НФА.B02.CellLinksValue1[06]='7,2,9,2';
  Раб.НФА.B02.CellLinksValue1[07]='10,2,11,2';
  Раб.НФА.B02.CellLinksValue1[08]='12,2,13,2';

--  Раб.НФА.B02.CellLinksValue1[09]='7,2,8,2';
--  Раб.НФА.B02.CellLinksValue1[10]='9,2,10,2';
--  Раб.НФА.B02.CellLinksValue1[11]='11,2,12,2';
--  Раб.НФА.B02.CellLinksValue1[12]='7,3,7,4';
--  Раб.НФА.B02.CellLinksValue1[13]='8,3,8,4';
--  Раб.НФА.B02.CellLinksValue1[14]='9,3,9,4';
--  Раб.НФА.B02.CellLinksValue1[15]='10,3,10,4';
--  Раб.НФА.B02.CellLinksValue1[16]='11,3,11,4';
--  Раб.НФА.B02.CellLinksValue1[17]='12,3,12,4';
end;
Proc SetCellLinksValue_Дно;
  ClearVariable(Раб.НФА.B02.CellLinksValue2);
  Раб.НФА.B02.CellLinksValue2[01]='1,1,2,1';
  Раб.НФА.B02.CellLinksValue2[02]='1,2,2,2';
  Раб.НФА.B02.CellLinksValue2[03]='1,3,2,3';
  Раб.НФА.B02.CellLinksValue2[04]='1,4,2,4';
  Раб.НФА.B02.CellLinksValue2[05]='3,2,13,2';
  Раб.НФА.B02.CellLinksValue2[06]='3,3,13,3';
  Раб.НФА.B02.CellLinksValue2[07]='3,4,13,4';
end;

Проц Кнопка1_ПриНажатии(Отправитель: Строка);
 var PageHeightCurrent,PageHeightDown,Ybegin,Yend,x,t,t1,t2,time0:i;
 var ss:s;
 time0=time;
 if AsLogical(СекцТабл.Visible):Кнопка1.надпись='без итогов';
  | true:Кнопка1.надпись='на страницы с итогами';
    СекцТабл_итоги.ColsCount=1;
    СекцТабл_итоги.RowsCount=1;
    СекцТаблШапка.Visible=true;
    СекцТабл.Visible=true;
    СекцТабл_итоги.Visible=false;
    exit;
 fi;
-- СекцТабл_итоги.ColsCount=1;
-- СекцТабл_итоги.RowsCount=1;
-- СекцТабл.Visible=true;
-- СекцТабл_итоги.Visible=false;
-- Шаблон.поле='ПрописьНомеровИтого';
-- ОкноВыполненияПоказать(Позиции,'Расчет страниц...');
-- ОкноВыполненияЗакрыть;
 СекцДопУсл.Visible=false;
 Bln01.Visible=false;
 Bln02.Visible=false;
 Bln03.Visible=false;
 СекцТаблДно.Visible=true;
 СекцТабл_итоги.CanPrint=true;
 СекцТабл_итоги.Visible=true;


 PageHeightDown=AsInteger(СекцТабл_итоги.Row(1,RowTop,''))-AsInteger(СекцТаблДно.Row(1,RowTop,'')); -- дно и шапка по высоте
 СекцТаблДно.Visible=false;
 СекцТаблШапка.Visible=false;
 СекцТабл_итоги.CanPrint=true;
 СекцТабл_итоги.Visible=true;

 лист=0;
 SetCellLinksValue_Шапка;
 SetCellLinksValue_Дно;
 ClearVariable(Раб.НФА.B02.CellLinksValue);

 ОкноВыполненияПоказать(Позиции,'Расчет страниц...');
 t=1;
 PageHeightCurrent=int((PageHeight-PageHeightDown)*(1+(100-Масштаб)/Масштаб));
 while t<=Позиции do
   лист=лист+1;
   листномн[лист]=t;
   Ybegin=AsInteger(СекцТабл.Row(t,RowTop,''));
   Yend=Ybegin+PageHeightCurrent;
   while Ybegin<Yend and t<=Позиции do
     ОкноВыполненияПоложение(t);
     t=t+1;
     if t>Позиции:Ybegin=AsInteger(СекцИтогоПоОписи.Row(1,RowTop,''));
      | true     :Ybegin=AsInteger(СекцТабл.Row(t,RowTop,''));
     fi;
   od;
   листномк[лист]=t;
 od;
 ОкноВыполненияЗакрыть;
 СекцТабл.CanPrint=False;
 СекцТабл.Visible=False;

 ОкноВыполненияПоказать(лист,'Формирование страниц...');
 СекцТабл_итоги.CanPrint=false;
 СекцТабл_итоги.Visible=false;
-- for t=1..3 do
 for t=1..лист do
   ОкноВыполненияПоложение(t);
   Раб.НФА.B02.AddSection1('СекцТаблШапка','СекцТабл_итоги',1,1,true,true,0,'');
   Раб.НФА.B02.AddSection('СекцТабл','СекцТабл_итоги',листномн[t],листномк[t],false,false,0,'');
   Раб.НФА.B02.AddSection2('СекцТаблДно','СекцТабл_итоги',t,t,true,true,0,'');
 od;
 ОкноВыполненияЗакрыть;
 СекцТабл_итоги.CanPrint=true;
 СекцТабл_итоги.Visible=true;

if 1=2:
 Ybegin=AsInteger(СекцТабл_итоги.Row(1,RowTop,''));
-- Ybegin=int(Ybegin*(1+(100-Масштаб)/Масштаб));


 t1=1;t2=Позиции;t=1;

 while t>0 do
   лист=лист+1;
   Раб.НФА.B02.AddSection1('СекцТаблШапка','СекцТабл_итоги',1,1,true,true,0,'Формируется страница:'+str(лист));
--   t=AddSection('СекцТабл','СекцТабл_итоги',t1,t2,false,false,Ybegin+PageHeight-PageHeightDown,'Формируется страница:'+str(лист));

   t=Раб.НФА.B02.AddSection('СекцТабл','СекцТабл_итоги',t1,t2,false,false,Ybegin+int((PageHeight-PageHeightDown)*(1+(100-Масштаб)/Масштаб)),'Формируется страница:'+str(лист));
   листномн[лист]=t1;
   листномк[лист]=t2-t-2;
   t1=листномк[лист]+1;
--   t1=t2-t;
   Раб.НФА.B02.AddSection2('СекцТаблДно','СекцТабл_итоги',лист,лист,true,true,0,'Формируется страница:'+str(лист));
--   message('');
--   if лист=8:t=-1;fi;
--   trace(str(Ybegin+PageHeight));
   Ybegin=AsInteger(СекцИтогоПоОписи.Row(1,RowTop,''));
--   trace(str(Ybegin));
--   Ybegin=int(Ybegin*(1+(100-Масштаб)/Масштаб));
 od;

-- SetCellLinksValue;
fi;
 СекцДопУсл.Visible=True;
 Bln01.Visible=True;
 Bln02.Visible=True;
 Bln03.Visible=True;
 Раб.НФА.B01.РасчетЗавершен('',time-time0);

-- СекцТабл_итоги.Column(1,ColVisible,false);
-- СекцТабл_итоги.Column(2,ColVisible,false);
-- СекцТабл_итоги.Column(3,ColVisible,false);
-- СекцТабл_итоги.Column(4,ColVisible,false);
-- СекцТабл_итоги.Column(22,ColVisible,false);
end;


Проц Кнопка2_ПриНажатии(Отправитель: Строка);
trace(str(AsInteger(СекцИтогоПоОписи.Row(1,RowTop,''))));
end;
Проц Кнопка3_ПриНажатии(Отправитель: Строка);
СекцТабл_итоги.Cell(1, 1, CellContents, '', true);
end;
Проц Кнопка4_ПриНажатии(Отправитель: Строка);
СекцТабл_итоги.Cell(1, 1, CellFieldType, 2 );
end;
Проц Кнопка5_ПриНажатии(Отправитель: Строка);
--trace(str(AsReal(СекцТаблШапка.Column(6,ColLeft,''))));
--trace(str(AsReal(СекцТаблШапка.Column(7,ColLeft,''))));
trace(AsString(СекцТаблШапка.Cell(2,6,CellContents,'')));
trace(AsString(СекцТаблШапка.Cell(2,7,CellContents,'')));
trace(AsString(СекцТаблШапка.Cell(2,6,CellText,'')));
trace(AsString(СекцТаблШапка.Cell(2,7,CellText,'')));
trace(AsString(СекцТаблШапка.Cell(2,6,CellBorder,'')));
trace(AsString(СекцТаблШапка.Cell(2,7,CellBorder,'')));

--Template.Column=6;
--trace(str(AsInteger(Template.Column)));
--Template.Column=7;
--trace(str(AsInteger(Template.Column)));
end;
Функ НомерИНВ_ПриОбзоре(Сек: Строка; Стр: Целое; Столб: Целое; Тек: Строка): Строка;
Шаблон.Hideeditor(false);
  if Инвен[Стр]<>'':
     If Name_A('ИНВВЕД.'+НФА_код[Стр]+'.'+Инвен[Стр])<>' ':
       РАБ.НФА.B01.2ОткрытьБланкПоПризнаку0('ИНВВЕД.'+НФА_код[Стр]+'.'+Инвен[Стр],true);
     fi;
  fi;
  Возврат '' ;
end;


КОНЕЦ -- конец бланка
