





-- Шаблон создан мастером бланков
-- 08.12.2008 12:21:28
--
БланкСШаблоном "Настройки отчетов - строки - редактор", Редактор РПО_ОТЧЕТЫ_СТРОКИ;
FlagEdit:L=[False];
var asGROUP:L=GROUPDOC<>nil;--GroupAttr
var recrootrgoup:record;
var go_by_groupdoc:s='=>';
var GROUPDOC_ИМЯ[]:s;
var GROUPDOC_REC[]:record;
var GroupAttr_:l=GroupAttr=-1;
var РПО_ОТЧЕТ_ИМЯ:s;
var РПО_ОТЧЕТ_REC:record;
var ADD:s='+';
var AD:s='+';
var DL:s='-';
var Раскрыть:s='=>';
var РаскрытьВсе:s='=>все условия';
var СписокПризн[]:s;
var СписокПризнВсе[]:s;
var СписокПризн_было_карт_дубль[]:s;
var СписокПризн_было_карт_лишн[]:s;
var st[]:s;
var дополе1ст[]:s;
var дополе2ст[]:s;
--var Поле1[]:s;
--var Поле2[]:s;

ФильрАвтогруппы:i=[1];-- 0- и автогруппы и константы;1-автогруппы;2-константы
func ВзятьФильрАвтогруппы:s;

 if ФильрАвтогруппы=1:^'РПО_ОТЧЕТЫ_СТРОКА='+recordtostring(current)+' and АВТОГРУППА';
  | ФильрАвтогруппы=2:^'РПО_ОТЧЕТЫ_СТРОКА='+recordtostring(current)+' and not АВТОГРУППА';
 fi;
 ^'РПО_ОТЧЕТЫ_СТРОКА='+recordtostring(current);
end;
 Иерархия0:section;
 Иерархия1:section;
 Иерархия2:section;
func getrootrgoup:s;
  var ss,s0:s;
  var rec,r0:record;
  var wa,ii,j,i0:i;
  rec=GROUPDOC;
  recrootrgoup=nil;
  clearvariable(GROUPDOC_ИМЯ);
  clearvariable(GROUPDOC_REC);
  if rec=nil:^'';fi;-- если корень
  wa=openworkarea('РПО_ОТЧЕТЫ_СТРОКИ','','ukey='+recordtostring(GROUPDOC));
    if records(wa)=1:
       --rec=getfieldr(wa,1,ss+'GROUPDOC');
       ii=0;
       while length(ss)<246 and rec<>nil do
         ii=ii+1;
         GROUPDOC_REC[ii]=rec;
         recrootrgoup=rec;
         rec=getfieldr(wa,1,ss+'GROUPDOC');
         GROUPDOC_ИМЯ[ii]=getfields(wa,1,ss+'ИМЯ');
         РПО_ОТЧЕТ_REC=getfieldr(wa,1,ss+'РПО_ОТЧЕТ');
         if РПО_ОТЧЕТ_REC<>nil:
           s0=getfields(wa,1,ss+'РПО_ОТЧЕТ.ИМЯ');
           if s0='':s0='Отчет без имени';fi;
           РПО_ОТЧЕТ_ИМЯ=s0;
          | true:РПО_ОТЧЕТ_ИМЯ='Нет привязки к отчету';
         fi;
         ss=ss+'GROUPDOC.';
--         rec=getfieldr(wa,1,ss+'GROUPDOC');
       od;
     | true:closeworkarea(wa);^'';--потерянная ссылка
    fi;
  closeworkarea(wa);
  -- обратная сортировка --
  i0=lengthofarray(GROUPDOC_REC);
  ii=int(trunc(i0/2));
  for j=1..ii do
   s0=GROUPDOC_ИМЯ[j];GROUPDOC_ИМЯ[j]=GROUPDOC_ИМЯ[i0-j+1];GROUPDOC_ИМЯ[i0-j+1]=s0;
   r0=GROUPDOC_REC[j];GROUPDOC_REC[j]=GROUPDOC_REC[i0-j+1];GROUPDOC_REC[i0-j+1]=r0;
  od;
  if rec<>nil:message('Превышение вложенности!');fi;
--     --ss=ss+'GROUPDOC.';
--   | true:message('Превышение вложенности!');
--  fi;

  ^ss;
end;
var patchrootrgoup:s;
var rootlevel:i=wordscount(patchrootrgoup,'.');
все_группы:l;
var Позиции_все_группы:i=if(все_группы,rootlevel,0);
var НеВсеГруппы:l=asGROUP and not все_группы;
var wa_РПО_ОТЧЕТЫ_ГРУППЫ:i;
var wa_РПО_ОТЧЕТЫ_ГРУППЫ_open:l;
var wa_РПО_ОТЧЕТЫ_ГРУППЫ_changing:l;
var rs_wa_РПО_ОТЧЕТЫ_ГРУППЫ:i=if(wa_РПО_ОТЧЕТЫ_ГРУППЫ_open,records(wa_РПО_ОТЧЕТЫ_ГРУППЫ),0);
var rs_wa_РПО_ОТЧЕТЫ_ГРУППЫ_0:i=if(УчитыватьУслКарт,rs_wa_РПО_ОТЧЕТЫ_ГРУППЫ,0);
var rs_wa_РПО_ОТЧЕТЫ_ГРУППЫ_1:i=if(УчитыватьУслКарт,0,rs_wa_РПО_ОТЧЕТЫ_ГРУППЫ);
var wa_РПО_ОТЧЕТЫ_ГРУППЫ_open_0:l=УчитыватьУслКарт and wa_РПО_ОТЧЕТЫ_ГРУППЫ_open;
var wa_РПО_ОТЧЕТЫ_ГРУППЫ_open_1:l=not УчитыватьУслКарт and wa_РПО_ОТЧЕТЫ_ГРУППЫ_open;

var NN_[]:i=$;
var УСЛ_ПРИЗН   []:s=if(wa_РПО_ОТЧЕТЫ_ГРУППЫ_open,getfields(wa_РПО_ОТЧЕТЫ_ГРУППЫ,$,'УСЛ_ПРИЗН'),'');
var КАРТ        []:s=if(wa_РПО_ОТЧЕТЫ_ГРУППЫ_open,getfields(wa_РПО_ОТЧЕТЫ_ГРУППЫ,$,'КАРТ'),'');
var УСЛ_КАРТ    []:s=if(wa_РПО_ОТЧЕТЫ_ГРУППЫ_open,getfields(wa_РПО_ОТЧЕТЫ_ГРУППЫ,$,'УСЛ_КАРТ'),'');
var АВТОГРУППА  []:l=if(wa_РПО_ОТЧЕТЫ_ГРУППЫ_open,getfieldl(wa_РПО_ОТЧЕТЫ_ГРУППЫ,$,'АВТОГРУППА'),false);
var УСЛ_ПРИЗН_  []:s=if(wa_РПО_ОТЧЕТЫ_ГРУППЫ_open,if(not АВТОГРУППА[$],Name_A(УСЛ_ПРИЗН[$]),'АВТОГРУППА'),'');
var СЧИТАТЬАВТОГРУППУ  []:i=if(wa_РПО_ОТЧЕТЫ_ГРУППЫ_open,if(АВТОГРУППА[$],getfieldi(wa_РПО_ОТЧЕТЫ_ГРУППЫ,$,'СЧИТАТЬАВТОГРУППУ'),4),4);
-- 0-расчет автогруппы+константы по автогруппе;1-считать только автогруппу без констант;2-автогруппа закрыта, считать только константы;3-не считать автогруппу и ее константы
var УСЛ_ПРИЗН_ГР[]:s=if(wa_РПО_ОТЧЕТЫ_ГРУППЫ_open,getfields(wa_РПО_ОТЧЕТЫ_ГРУППЫ,$,'УСЛ_ПРИЗН_ГР'),'');
var ОТ_КАРТ       []:l=if(wa_РПО_ОТЧЕТЫ_ГРУППЫ_open,getfieldl(wa_РПО_ОТЧЕТЫ_ГРУППЫ,$,'ОТ_КАРТ'),false);
var Поле1         []:s=if(wa_РПО_ОТЧЕТЫ_ГРУППЫ_open,getfields(wa_РПО_ОТЧЕТЫ_ГРУППЫ,$,'Поле1'),'');
var УСЛ_Поле1соотв[]:l=if(wa_РПО_ОТЧЕТЫ_ГРУППЫ_open,getfieldl(wa_РПО_ОТЧЕТЫ_ГРУППЫ,$,'УСЛ_Поле1соотв'),false);
var УСЛ_Поле1     []:s=if(wa_РПО_ОТЧЕТЫ_ГРУППЫ_open,getfields(wa_РПО_ОТЧЕТЫ_ГРУППЫ,$,'УСЛ_Поле1'),'');
var Усл1_2        []:l=if(wa_РПО_ОТЧЕТЫ_ГРУППЫ_open,getfieldl(wa_РПО_ОТЧЕТЫ_ГРУППЫ,$,'Усл1_2'),false);
var Поле2         []:s=if(wa_РПО_ОТЧЕТЫ_ГРУППЫ_open,getfields(wa_РПО_ОТЧЕТЫ_ГРУППЫ,$,'Поле2'),'');
var УСЛ_Поле2соотв[]:l=if(wa_РПО_ОТЧЕТЫ_ГРУППЫ_open,getfieldl(wa_РПО_ОТЧЕТЫ_ГРУППЫ,$,'УСЛ_Поле2соотв'),false);
var УСЛ_Поле2     []:s=if(wa_РПО_ОТЧЕТЫ_ГРУППЫ_open,getfields(wa_РПО_ОТЧЕТЫ_ГРУППЫ,$,'УСЛ_Поле2'),'');

var curren_Record:record;
--var Код_:S=Код;

--var НоваяЗапись:L=(CurrentState=crdusInserted);
--var ЭтоГруппа:L;
--var Заголовок:S=if(ЭтоГруппа, 'Группа местонахождений', 'Местонахождение НФА');
--var МасНачЗнач[]:S;    -- Dynamic
--var МасИзменений[]:I; -- Dynamic
--var СписокПолей:S;
----
----Процедуры и функции -------------
--Proc ПоУмолчанию;
--var Родитель:I;
-- if Код='' : -- иначе это дубль записи
--    Подразделение=true;
--    if RecordExists('РПО_МЕСТОНФА', GroupDoc) :
--       Родитель=OpenWorkArea('РПО_МЕСТОНФА','','Ukey='+RecordToString(GroupDoc));
--       try
--        if Records(Родитель)>0:
--           --Отв=GetFieldR(Родитель,1,'Отв');
--           Телефон=GetFieldS(Родитель,1,'Телефон');
--           Адрес=GetFieldS(Родитель,1,'Адрес');
--           Склад=GetFieldL(Родитель,1,'Склад');
--           Подразделение=GetFieldL(Родитель,1,'Подразделение');
--        fi;
--       finally
--        CloseWorkArea(Родитель);
--       end;
--    fi;
-- fi;
-- Код=Раб.Предм.PtrStr(Current,5);
--end;

--Func ПризнакИспользуется(Voc:S):L;
--var n,ns,z:i;
--var tmp:S;
--var OWA,Nr:I;
--var Rec:Record;
-- RefreshAna;
-- if ЭтоГруппа:
--    OWA=OpenWorkArea("РПО_МЕСТОНФА","","GROUPDOC="+RecordToString(Current));
--    Try
--     Nr=Records(OWA);
--     for z=1..Nr do
--      tmp=GetFieldS(OWA,z,"КОД");
--      Hint("Проверка группы '"+Код+"', "+tmp);
--      Rec=GetRecordKey(OWA,z);
--      ns=RecSignsCount("РПО_МЕСТОНФА",Rec);
--      for n=1..ns do
--       tmp=RecSign("РПО_МЕСТОНФА",Rec,n);
--       if SignUsed(tmp): ^True; fi;
--      od;
--     od;
--    Finally
--     CloseWorkArea(OWA);
--    end;
--   else
--    ns=RecSignsCount("РПО_МЕСТОНФА",Current);
--    for n=1..ns do
--     tmp=RecSign("РПО_МЕСТОНФА",Current,n);
--     if Match(tmp,Voc):
--        if SignUsed(tmp): ^True; fi;
--     fi;
--    od;
-- fi;
-- ^False;
--end;

--func НайтиИзменения: Integer;
-- СписокПолей = '';
-- ClearVariable(МасИзменений);
-- if ЭтоГруппа:
----    if МасНачЗнач[1]<>RecordToString(Отв): СписокПолей=СписокПолей+if(СписокПолей<>'',',','')+'Ответственный'; МасИзменений[1] = 1; fi;
--    if МасНачЗнач[1]<>Телефон: СписокПолей=СписокПолей+if(СписокПолей<>'',',','')+'Телефон'; МасИзменений[1]=1; fi;
--    if МасНачЗнач[2]<>Адрес: СписокПолей=СписокПолей+if(СписокПолей<>'',',','')+'Адрес'; МасИзменений[2]=1; fi;
--    if МасНачЗнач[3]<>if(Склад,'1','0'): СписокПолей=СписокПолей+if(СписокПолей<>'',',','')+'флаг Склад'; МасИзменений[3]=1; fi;
--    if МасНачЗнач[4]<>if(Подразделение,'1','0'): СписокПолей=СписокПолей+if(СписокПолей<>'',',','')+'флаг Подразделение'; МасИзменений[4]=1; fi;
-- fi;
-- ^SumOfArray(МасИзменений,4);
--end;  --  func НайтиИзменения: Integer;

--proc ПрисвоениеЗначенийВнутриПодгруппы(DG: String);
--var Родитель, РабОбл, КолЗаписей, j, n: Integer;
--  Родитель=OpenWorkArea('РПО_МЕСТОНФА','','UKey='+DG);
--  РабОбл=OpenWorkArea('РПО_МЕСТОНФА','','GroupDoc='+DG);
--  try
--   КолЗаписей=Records(РабОбл);
--   for j = 1 .. КолЗаписей do
--    Hint('Изменяется местонахождение нфа:'+GetFieldS(РабОбл,j,'ПОДРАЗ'));
--    try
--     BeginChanging(РабОбл);
----      if МасИзменений[1]=1: n=PutFieldR(РабОбл,j,'Отв',Отв); fi;
--      if МасИзменений[1]=1: n=PutFieldS(РабОбл,j,'Телефон',Телефон); fi;
--      if МасИзменений[2]=1: n=PutFieldS(РабОбл,j,'Адрес',Адрес); fi;
--      if МасИзменений[3]=1: n=PutFieldL(РабОбл,j,'Склад',Склад); fi;
--      if МасИзменений[4]=1: n=PutFieldL(РабОбл,j,'Подразделение',Подразделение); fi;
--      EndChanging(РабОбл);
--      if GetIsGroup(Родитель,1) : -- если подгруппа - провести рекурсивные присвоения
--         ПрисвоениеЗначенийВнутриПодгруппы(RecordToString(GetRecordKey(РабОбл,j)));
--      fi;
--     except
--      CancelChanging(РабОбл);
--      Raise;
--     end;
--    od;
--  finally
--    CloseWorkArea(Родитель);
--    CloseWorkArea(РабОбл);
--  end;
--  Hint('');
--end;  -- PROC ПрисвоениеЗначенийВнутриПодгруппы(DG: String);

--proc СохранитьДанные;
--  if НайтиИзменения>0:
--    if EnqOkCancel('В карточку были внесены изменения в поля: ^M'+СписокПолей+'. ^M'+'Изменить соответствующие значения у записей внутри группы?')=cmOk :
--       ПрисвоениеЗначенийВнутриПодгруппы(RecordToString(Current));
--    fi;
--  fi;
--end;
----Процедуры и функции -------------
----
----
----Обработчики событий полей шаблона-----
--func Код_OnEnter(FieldName: String; Iter: Integer): logical;
-- if Код<>"":
--    if ПризнакИспользуется("*"): Message("Код '"+Код+"' используется в проводках."+Chr(13)+"Изменение невозможно!"); ^False; fi;
-- fi;
-- FlagEdit=True;
-- ^True;
--end;

--Func Код_onValidate (Field:S; Iter:I; Value:S):L;
--var R:L;
-- FlagEdit=True;
-- R=ValidSign(Value);
-- if R=False: Раб.Бюджет.ПроверитьПризнак(Value);
--   else
--    Код=Value;
-- fi;
-- ^R;
--end;

--Proc Код_onExit (Field:S; Iter:I);
-- if FlagEdit: FlagEdit=False; Exit; fi;
-- if Код<>"":
--    if ПризнакИспользуется("*"): Message("Код '"+Код+"' используется в проводках."+Chr(13)+"Удаление невозможно!"); Exit; fi;
-- fi;
-- Код="";
--end;
----Обработчики событий полей шаблона-----
----
----
----Обработчики событий объектов шаблона-----
--proc кнOK_ПриНажатии(Кнопка:String);
--  EditorApply;
--  Close;
--end;

--proc кнОтмена_ПриНажатии(Кнопка:String);
--  EditorCancel;
--  Close;
--end;
----Обработчики событий объектов шаблона-----
----
----
Func УдалитьСимволыИзСтроки(ст:s;Символы:s):s; --замена в 1 проход
  var p,lст:i;
  var ss,schr:s;
  lст=Length(ст);
  ss='';
  for p=1..lст do
    schr=SubStr(ст,p,1);
    if pos(schr,Символы)<1:ss=ss+schr;fi;
  od;
  ^ss;
end;

Proc cancelchanging_wa_РПО_ОТЧЕТЫ_ГРУППЫ;
     if wa_РПО_ОТЧЕТЫ_ГРУППЫ_changing:if 1=0:beginchanging(wa_РПО_ОТЧЕТЫ_ГРУППЫ);fi;
        cancelchanging(wa_РПО_ОТЧЕТЫ_ГРУППЫ);wa_РПО_ОТЧЕТЫ_ГРУППЫ_changing=false;
     fi;
end;

Proc endchanging_wa_РПО_ОТЧЕТЫ_ГРУППЫ;
     if wa_РПО_ОТЧЕТЫ_ГРУППЫ_changing:if 1=0:beginchanging(wa_РПО_ОТЧЕТЫ_ГРУППЫ);fi;
        endchanging(wa_РПО_ОТЧЕТЫ_ГРУППЫ);wa_РПО_ОТЧЕТЫ_ГРУППЫ_changing=false;
     fi;
end;

Proc Close_wa_РПО_ОТЧЕТЫ_ГРУППЫ(endchanging_wa:l;q:l);
  if wa_РПО_ОТЧЕТЫ_ГРУППЫ_open:
     if q и wa_РПО_ОТЧЕТЫ_ГРУППЫ_changing:endchanging_wa=ВопрДаОтказ('Сохранить изменения?',mtConfirmation)=кмдВерно;fi;
     if endchanging_wa:endchanging_wa_РПО_ОТЧЕТЫ_ГРУППЫ;
      | true:cancelchanging_wa_РПО_ОТЧЕТЫ_ГРУППЫ;
     fi;
     CloseWorkArea(wa_РПО_ОТЧЕТЫ_ГРУППЫ);wa_РПО_ОТЧЕТЫ_ГРУППЫ_open=false;
  fi;
end;
Proc Open_wa_РПО_ОТЧЕТЫ_ГРУППЫ;
  Close_wa_РПО_ОТЧЕТЫ_ГРУППЫ(false,true);
  wa_РПО_ОТЧЕТЫ_ГРУППЫ=OpenWorkArea('РПО_ОТЧЕТЫ_ГРУППЫ','',ВзятьФильрАвтогруппы);
  wa_РПО_ОТЧЕТЫ_ГРУППЫ_open=true;
end;
Proc beginchanging_wa_РПО_ОТЧЕТЫ_ГРУППЫ;
     if wa_РПО_ОТЧЕТЫ_ГРУППЫ_open and not wa_РПО_ОТЧЕТЫ_ГРУППЫ_changing:beginchanging(wa_РПО_ОТЧЕТЫ_ГРУППЫ,false);
        if 1=0:endchanging(wa_РПО_ОТЧЕТЫ_ГРУППЫ);fi;
        wa_РПО_ОТЧЕТЫ_ГРУППЫ_changing=true;
     fi;
end;

----Обработчики событий шаблона -----
Proc Template_onRead;
 patchrootrgoup=getrootrgoup;
 if curren_Record<>current:
    if GroupAttr<>-1:-- не группа, надо открыть рабочую область
       Open_wa_РПО_ОТЧЕТЫ_ГРУППЫ;
     | true:Close_wa_РПО_ОТЧЕТЫ_ГРУППЫ(false,true);
    fi;
 fi;

--var wa_РПО_ОТЧЕТЫ_ГРУППЫ:i;
--var wa_РПО_ОТЧЕТЫ_ГРУППЫ_open:l;
--var rs_wa_РПО_ОТЧЕТЫ_ГРУППЫ:i=if(wa_РПО_ОТЧЕТЫ_ГРУППЫ_open,records(wa_РПО_ОТЧЕТЫ_ГРУППЫ),0);


-- message(recordtostring(current));


-- ЭтоГруппа=IsCardGroup('РПО_МЕСТОНФА',Current);
-- if НоваяЗапись: ПоУмолчанию; fi;
-- if ЭтоГруппа and НоваяЗапись=False:
--    ClearVariable(МасНачЗнач);
----    МасНачЗнач[1]=RecordToString(Отв);
--    МасНачЗнач[1]=Телефон;
--    МасНачЗнач[2]=Адрес;
--    МасНачЗнач[3]=Str(if(Склад,1,0));
--    МасНачЗнач[4]=Str(if(Подразделение,1,0));
-- fi;
-- Template.Field="ПОДРАЗ";
end;

--func Template_onValidate:L;
-- if Код="": Message('Заполните поле "Код"!'); Template.Field="Код_"; ^False; fi;
---- if Name_A("П."+Код)<>" " and SignToRecord("П."+Код)<>Current: Message("Признак 'П."+Код+"' уже существует !"); ^false; fi;
-- Код=Up(Код);
-- if ЭтоГруппа and НоваяЗапись=False: СохранитьДанные; fi;
-- ^True;
--end;
----Обработчики событий шаблона -----
----





func go_by_groupdoc_ПриВходе(Поле: Строка; Итер: Целое): Логич;
  var sect:s;
  sect=asstring(шаблон.Name);  

  if sect='Иерархия2':if РПО_ОТЧЕТ_REC<>nil:message('РПО_ОТЧЕТ_REC');fi;
   | sect='Иерархия1':openblank('ИНФО.НФА.ОТЧЕТЫ_СТРОКИ_ГРУППЫ',true,GROUPDOC_REC[Итер]);
--   | sect='Иерархия1':openblank(Раб.НФА.B01.БланкИмя,true,GROUPDOC_REC[Итер]);
   | sect='Иерархия0':openblank('ИНФО.НФА.ОТЧЕТЫ_СТРОКИ_ГРУППЫ',true,GROUPDOC);
  fi;
  ^false  ;
end;
--ФайлЗагружаемойНастройки:s;
--ИмяНовогоОтчета:s;
--Функ ФайлЗагружаемойНастройки_ПриОбзоре(Сек: Строка; Стр: Целое; Столб: Целое; Тек: Строка): Строка;
--  var ss:s;
--  var ii:i;
--  Шаблон.Hideeditor(false);
--  ss=ФайлЗагружаемойНастройки;
--  ii=ВыборФайла(ss,'');
--  if ss<>'':ФайлЗагружаемойНастройки=ss;fi;
--  Возврат '' ;
--end;
--var  UKEY         []:integer;
--var  ИМЯ          []:STRING; -- наименование для картотеки (имя группы)
--var  КОД          []:STRING; -- наименование для отчета
--var  КОД1         []:STRING; -- наименование для отчета
--var  КОД2         []:STRING; -- наименование для отчета
--var  КОД3         []:STRING; -- наименование для отчета
--var  NN           []:INTEGER; --номер группы, порядок вывода в отчете
--var  ТАБЛИЦА      []:L;
--var  ВЫВОД        []:L;
--var  ВЫВОД_ВИД    []:INTEGER;--0=строка с рачетом;1=строка заголовок(перед группой);2=строка заголовок(в конце группы)
--var  ИТОГИ        []:L;
--var  ИТОГИ_ИМЯ    []:STRING;
--var  ИТОГИ_ВИД    []:INTEGER;--0=строка с рачетом итогов после заголовка ;1=итоги(перед группой);2=итоги(в конце группы)
--var  GROUPDOC     []:integer;

----  СТИЛЬ        []:INTEGER;
----  СТИЛЬ_ИТОГИ  []:INTEGER;
----  РАЗРАБОТЧИК  []:STRING; --код разработчика для справочника (ТББ=ТБ-Бюджет)
----  CREATEDUSER  :STRING;
----  MODIFIEDUSER :STRING;
----  CLOSEDMODFOB :BOOLEAN;
----  РПО_ОТЧЕТ    :РПО_ОТЧЕТЫ;

--proc Добавитьнастройку_ПриНажатии(Стр: Целое; Кол: Целое; Двойной: Логич);
-- var ss:s;
-- var ii:i;
-- ClearVariable(UKEY       );
-- ClearVariable(ИМЯ        );
-- ClearVariable(КОД        );
-- ClearVariable(КОД1       );
-- ClearVariable(КОД2       );
-- ClearVariable(КОД3       );
-- ClearVariable(NN         );
-- ClearVariable(ТАБЛИЦА    );
-- ClearVariable(ВЫВОД      );
-- ClearVariable(ВЫВОД_ВИД  );
-- ClearVariable(ИТОГИ      );
-- ClearVariable(ИТОГИ_ИМЯ  );
-- ClearVariable(ИТОГИ_ВИД  );
-- ClearVariable(РАЗРАБОТЧИК);
-- ClearVariable(GROUPDOC   );
--end;

Проц ПриЗакрытии(Уничтожить: Логич);
 Close_wa_РПО_ОТЧЕТЫ_ГРУППЫ(false,true);
end;
func Раскрыть_условие(ii:i;новая:l):i;-- количество признаков
  var КРТ,УСЛ_КРТ,ss:s;
  var wa,rs,nr,ni:i;
  var допполе1,допполе2:l;
  if  новая:
     ClearVariable(СписокПризн);
  fi;
     ClearVariable(дополе1ст);
     ClearVariable(дополе2ст);
  rs=-1;
  -- проверка на УСЛ_ПРИЗН
     КРТ=trim(КАРТ[ii]);УСЛ_КРТ=trim(УСЛ_КАРТ[ii]);
     if КРТ<>'':-- есть картотека
        if ЕстьКартотека(КРТ):
           допполе1=Поле1[ii]<>'';
           допполе2=Поле2[ii]<>'';
           wa=openworkarea(КРТ,'',УСЛ_КРТ);
           rs=records(wa);
           if rs=0:
              CloseWorkArea(wa);
             ^0;
           fi;
        fi;
     fi;
     for sign ss=УСЛ_ПРИЗН[ii] do
       if rs>0:
          if КартотекаПризнака(ss,false)=КРТ:
             nr=ВзятьНомерЗаписи(wa,ПризнакВЗапись(ss,false));
             if nr>0:
                rs=rs-1;
                ni=searchinarray(СписокПризн,ss,true);
                if ni<1:
                   ni=insertinarraysort(СписокПризн,ss);
                   if допполе1:дополе1ст[ni]=getfields(wa,ni,Поле1[ii]);fi;
                   if допполе2:дополе2ст[ni]=getfields(wa,ni,Поле2[ii]);fi;
                fi;
--                addinarray(СписокПризн,true,false,ss);
             fi;
          fi;
        | rs<0:addinarray(СписокПризн,true,false,ss);
        | rs=0:CloseWorkArea(wa);^lengthofarray(СписокПризн);
       fi;
     od;
     if rs>-1:CloseWorkArea(wa);fi;
     ^lengthofarray(СписокПризн);

end;

func Раскрыть_ПриВходе(Поле: Строка; ii: Целое): Логич;
  var j,wa,rs,z,лишн,дубль:i;
  var f0,f,ss:s;
  var допполе1:l;
  var допполе2:l;
  ОкноВыполненияПоказать(1,'Раскрытие...');
  j=Раскрыть_условие(ii,true);
  ОкноВыполненияПоказать(1,'Построение списка...'); -- синхронизация с уже раскрытой группой
    f0='РПО_ОТЧЕТЫ_СТРОКА='+recordtostring(current);
    f0=f0+" and КАРТ='"+КАРТ[ii]+"' and УСЛ_КАРТ='"+УСЛ_КАРТ[ii]+"' and УСЛ_ПРИЗН_ГР='"+УСЛ_ПРИЗН_ГР[ii]+"' and not автогруппа";
    wa=OpenWorkArea('РПО_ОТЧЕТЫ_ГРУППЫ','',f0);
    rs=records(wa);
    clearvariable(СписокПризн_было_карт_дубль);
    clearvariable(СписокПризн_было_карт_лишн);
--  РАБ.НФА.ОТЧЕТЫ.current_РПО_ОТЧЕТЫ_СТРОКА=curent;
--  РАБ.НФА.ОТЧЕТЫ.wa_РПО_ОТЧЕТЫ_ГРУППЫ=wa;
--  z=Раскрыть_условие_по_аналитике('',ii,true,true,true);
    ОкноВыполненияПоказать(rs,'Построение списка...'); -- синхронизация с уже раскрытой группой
    for z=1..rs do
        ОкноВыполненияПоложение(z);
        ss=getfields(wa,z,'УСЛ_ПРИЗН');
        if trim(ss)<>'':
           if поисквмассиве(СписокПризн,ss,true)<1:addinarray(СписокПризн_было_карт_лишн,true,false,ss);
--            | true:addinarray(СписокПризн_было_карт_дубль,true,false,ss);
           fi;
        fi;
    od;
    CloseWorkArea(wa);
    лишн=lengthofarray(СписокПризн_было_карт_лишн);
    дубль=lengthofarray(СписокПризн_было_карт_дубль);
    ------------- выгрузка данных в бланк выбора --------------
    РАБ.ВСПОМ.ОТЧЕТЫ.CLEARARRAY;
    РАБ.ВСПОМ.ОТЧЕТЫ.ЗАГ[1]='Признак';
    РАБ.ВСПОМ.ОТЧЕТЫ.ЗАГ[2]='Наименование признака';
    РАБ.ВСПОМ.ОТЧЕТЫ.ЗАГ[3]=Поле1[ii];
    РАБ.ВСПОМ.ОТЧЕТЫ.ЗАГ[4]=Поле2[ii];
    РАБ.ВСПОМ.ОТЧЕТЫ.Заг_ДА ='Текущее раскрытие (будет сохранено)';
    РАБ.ВСПОМ.ОТЧЕТЫ.Заг_НЕТ='осталось от старого раскрытия или не будет сохранено';
    if j>0 or лишн>0:
      допполе1=Поле1[ii]<>'';
      допполе2=Поле2[ii]<>'';
      if j>0:
        copyarray(СписокПризн,РАБ.ВСПОМ.ОТЧЕТЫ.НФАКОД);
        if допполе1:copyarray(дополе1ст,РАБ.ВСПОМ.ОТЧЕТЫ.ДОППОЛЕ1);fi;
        if допполе2:copyarray(дополе2ст,РАБ.ВСПОМ.ОТЧЕТЫ.ДОППОЛЕ2);fi;
      fi;
      if лишн>0:
         copyarray(СписокПризн_было_карт_лишн,РАБ.ВСПОМ.ОТЧЕТЫ.НФАКОД,1,j+1);
         for z=j+1..j+лишн do
           РАБ.ВСПОМ.ОТЧЕТЫ.Выбор[z]=true;
         od;
      fi;
      OpenBlank('РАБ.ВСПОМ.ОТЧЕТЫ');
    fi;
-- ClearVariable(РАБ.ВСПОМ.ОТЧЕТЫ.Выбор  );
-- ClearVariable(РАБ.ВСПОМ.ОТЧЕТЫ.НФАКОД );
-- ClearVariable(РАБ.ВСПОМ.ОТЧЕТЫ.НФАИмя );
-- ClearVariable(РАБ.ВСПОМ.ОТЧЕТЫ.ДОППОЛЕ1);
-- ClearVariable(РАБ.ВСПОМ.ОТЧЕТЫ.ДОППОЛЕ2);

  ОкноВыполнениязакрыть;
  ^false;
end;
func РаскрытьВсе_ПриВходе(Поле: Строка; ii: Целое): Логич;

  message(str(Раскрыть_условие(ii,true)));
  ^false;
end;
proc savefields(iter:i;field:s;v:s);
  var ii:i;
  beginchanging_wa_РПО_ОТЧЕТЫ_ГРУППЫ;
  ii=putfields(wa_РПО_ОТЧЕТЫ_ГРУППЫ,iter,field,v);

end;
proc savefieldl(iter:i;field:s;v:l);
  var ii:i;
  beginchanging_wa_РПО_ОТЧЕТЫ_ГРУППЫ;
  ii=putfieldl(wa_РПО_ОТЧЕТЫ_ГРУППЫ,iter,field,v);

end;
proc savefieldi(iter:i;field:s;v:i);
  var ii:i;
  beginchanging_wa_РПО_ОТЧЕТЫ_ГРУППЫ;
  ii=putfieldi(wa_РПО_ОТЧЕТЫ_ГРУППЫ,iter,field,v);

end;
proc additer_wa_РПО_ОТЧЕТЫ_ГРУППЫ;
  var ii:i;
  beginchanging_wa_РПО_ОТЧЕТЫ_ГРУППЫ;
  ii=insertrecord(wa_РПО_ОТЧЕТЫ_ГРУППЫ);
  ii=putfieldr(wa_РПО_ОТЧЕТЫ_ГРУППЫ,ii,'РПО_ОТЧЕТЫ_СТРОКА',current);
  ii=putfieldl(wa_РПО_ОТЧЕТЫ_ГРУППЫ,ii,'АВТОГРУППА',true);

end;
proc deliter_wa_РПО_ОТЧЕТЫ_ГРУППЫ(ii:i);
  beginchanging_wa_РПО_ОТЧЕТЫ_ГРУППЫ;
  deleterecord(wa_РПО_ОТЧЕТЫ_ГРУППЫ,ii);
end;
func ПроверкаАВТОГРУППА(УСЛПРИЗН:s;какАВТОГРУППА:l;Предупреждать:l):l;
  var ss,s0:s;
     s0=trim(UP(УСЛПРИЗН));
     if s0='':^true;fi;
     if not какАВТОГРУППА:-- попытка выставить на константу
        if ПравильныйПризнак(s0):
           if количествослов(s0,'.')>1:-- проверяем на присутствие в структуре учета справочника или обособленного признака
              if name_A(выделитьслово(1,s0,'.')+'.')=' ':if Предупреждать:message('Справочник '+выделитьслово(1,s0,'.')+'^Mотсутствует в структуре учета!',mtwarning);fi;^false;fi;
            | true:if name_A(s0)=' ':if Предупреждать:message('Условие на признаки не является константой!',mtwarning);fi;^false;fi;
           fi;
           ^true;
         | true:if Предупреждать:message('Условие на признаки не является константой^Mили содержит посторенние символы!',mtwarning);fi;^false;
        fi;
      | true:-- попытка выставить на автогруппу
        ss=УдалитьСимволыИзСтроки(s0,'*&|+-~?!/\');
        if s0=ss:if Предупреждать:message('Условие на признаки не может отобрать группу признаков!',mtwarning);fi;^false;fi;

        try
          for sign ss=s0 do
           break;
          od;
        except
          if Предупреждать:message('Условие на признаки не является корректным!',mtwarning);fi;^false;
        end;
        ^true;
     fi;
     ^false;
end;

func РПО_ОТЧЕТЫ_ГРУППЫ_ПриПроверкеС(field: Строка; iter: Целое; v: Строка): Логич;
  var УСЛ_ПРИЗН_:s;
  if field='УСЛ_ПРИЗН':УСЛ_ПРИЗН_=v;
   | true:УСЛ_ПРИЗН_=УСЛ_ПРИЗН[iter];
  fi;
  if not ПроверкаАВТОГРУППА(УСЛ_ПРИЗН_,АВТОГРУППА[iter],true):
     if ПроверкаАВТОГРУППА(УСЛ_ПРИЗН_,not АВТОГРУППА[iter],false):-- подойдет ли при смене автогруппы?
        if вопрдаотказ('Для сохранения текущего значения необходимо поменять^Mзначение автогруппы на противоположное.^MПоменять значение?',mtConfirmation)=кмдВерно:
           savefieldl(iter,'АВТОГРУППА',not АВТОГРУППА[iter]);
           savefields(iter,field,v);
           ^true;
        fi;
     fi;
    ^false;
  fi;
  savefields(iter,field,v);
  ^true;
end;
func РПО_ОТЧЕТЫ_ГРУППЫ_ПриПроверкеЛ(field: Строка; iter: Целое; v: l): Логич;
  var ss,s0:s;
  if field='АВТОГРУППА': 
     if not ПроверкаАВТОГРУППА(УСЛ_ПРИЗН[iter],v,true):^false;fi;
--     s0=trim(UP(УСЛ_ПРИЗН[iter]));
--     if not v:-- попытка выставить на константу
--        if ПравильныйПризнак(s0):
--           if количествослов(s0,'.')>1:-- проверяем на присутствие в структуре учета справочника или обособленного признака
--              if name_A(выделитьслово(1,s0,'.')+'.')=' ':message('Справочник '+выделитьслово(1,s0,'.')+'^Mотсутствует в структуре учета!',mtwarning);^false;fi;
--            | true:if name_A(s0)=' ':message('Условие на признаки не является константой!',mtwarning);^false;fi;
--           fi;
--        fi;
--      | true:-- попытка выставить на автогруппу
--        ss=УдалитьСимволыИзСтроки(s0,'*&|+-~?!/\');
--        if s0=ss:message('Условие на признаки не может отобрать группу признаков!',mtwarning);^false;fi;

--        try
--          for sign ss=s0 do
--           break;
--          od;
--        except
--          message('Условие на признаки не является корректным!',mtwarning);^false;
--        end;
--     fi;
  fi;
  savefieldl(iter,field,v);
  ^true;
end;
func РПО_ОТЧЕТЫ_ГРУППЫ_ПриПроверкеЦ(field: Строка; iter: Целое; v: i): Логич;
  var ss,s0:s;
  if field='СЧИТАТЬАВТОГРУППУ':
     if v>3:^false;fi;
  fi;
  savefieldi(iter,field,v);
  ^true;
end;


func ШаблонПриПроверке: Логич;
 Close_wa_РПО_ОТЧЕТЫ_ГРУППЫ(true,false);
 Open_wa_РПО_ОТЧЕТЫ_ГРУППЫ;
  Возврат true ;
end;


proc ШаблонПриОтмене;
 Close_wa_РПО_ОТЧЕТЫ_ГРУППЫ(false,false);
 Open_wa_РПО_ОТЧЕТЫ_ГРУППЫ;
end;


Функ ADD_ПриВходе(Поле: Строка; Итер: Целое): Логич;
if Поле='ADD':additer_wa_РПО_ОТЧЕТЫ_ГРУППЫ;
 | Поле='DL' :deliter_wa_РПО_ОТЧЕТЫ_ГРУППЫ(Итер);
fi;
  ^false;
end;


Функ УСЛ_ПРИЗН_ПриОбзоре(Сек: Строка; Стр: Целое; Столб: Целое; Тек: Строка): Строка;
  var ss:s;
  ss=ВыборПризнака('',false,true,Тек);
  if ss='':шаблон.скрытьредактор(false); 
   | true:^ss;
  fi;

  ^Тек;
end;


Функ УСЛ_Поле_ПриОбзоре(Сек: Строка; ii: Целое; Столб: Целое; Тек: Строка): Строка;
   var ss:s;
   var j:i;
   j=ВзятьПоляКартотеки(КАРТ[ii],st,mtlSTRING );
   j=alternate('',st);
   if j>0:^st[j];fi;
  ^Тек  ;
end;
Функ СобратьФильтр(ii:i;q:l):s;
  var s1,s2,ss:s;
  if КАРТ[ii]='':^'';fi;
  if (Поле1[ii]='' or УСЛ_Поле1[ii]='') and (Поле2[ii]='' or УСЛ_Поле2[ii]=''):^'';fi;

  if Поле1[ii]<>'' and УСЛ_Поле1[ii]<>'':
     if pos('*',УСЛ_Поле1[ii])<1 and pos('?',УСЛ_Поле1[ii])<1:ss='*'+УСЛ_Поле1[ii]+'*';
      | true:ss=УСЛ_Поле1[ii];
     fi;
     ss='"'+ss+'"';
     s1='соотв('+Поле1[ii]+','+ss+')';
     if УСЛ_Поле1соотв[ii]:s1='not '+s1;fi;
  fi;
  if Поле2[ii]<>'' and УСЛ_Поле2[ii]<>'':
     if pos('*',УСЛ_Поле2[ii])<2 and pos('?',УСЛ_Поле2[ii])<2:ss='*'+УСЛ_Поле2[ii]+'*';
      | true:ss=УСЛ_Поле2[ii];
     fi;
     ss='"'+ss+'"';
     s2='соотв('+Поле2[ii]+','+ss+')';
     if УСЛ_Поле2соотв[ii]:s2='not '+s2;fi;
  fi;

  if not Усл1_2[ii]:^Раб.НФА.B01.abl(s1,' or ',s2);
   | true:      ^Раб.НФА.B01.abl(s1,' and ',s2);
  fi;
end;
Функ УСЛ_КАРТ_ПриОбзоре(Сек: Строка; ii: Целое; Столб: Целое; Тек: Строка): Строка;
   var ss:s;
   ss=СобратьФильтр(ii,true);
   if ss='':^Тек;
    | ss<>Тек:^ss;
   fi;
  ^Тек  ;
end;


Функ КАРТ_ПриОбзоре(Сек: Строка; Стр: Целое; Столб: Целое; Тек: Строка): Строка;
  var ii:i;
  ii=ВыборКартотеки(Тек);
  ^Тек  ;
end;


Функ фильравтогруппы_ПриПроверке(Поле:s; ii: Целое; v: Целое): Логич;
  if v<>фильравтогруппы:
     Open_wa_РПО_ОТЧЕТЫ_ГРУППЫ;
  fi;
  ^true;
end;


Проц фильравтогруппы_ПриВыходе(Поле: Строка; Итер: Целое);
   if ВзятьФильтр(wa_РПО_ОТЧЕТЫ_ГРУППЫ)<>ВзятьФильрАвтогруппы:
      Open_wa_РПО_ОТЧЕТЫ_ГРУППЫ;
   fi;
end;


Функ СЧИТАТЬАВТОГРУППУ_ПриВходе(Поле: Строка; ii: Целое): Логич;
  ^АВТОГРУППА[ii];
end;


Конец





