-- Библиотека РПО
-- 05.05.2006 10:39:26
--


БланкСШаблоном "ИмпортЭкспорт";

2_-- FORWARD!!!
2_----------- Функции и процедуры для работы с текстовыми файлами --------------------
2_--0.  2Func0 _ДобавитьФайл.(ДобавляемыйФайл:s;ФайлДляДобавления:s):l;
-----------------------------------------------------------------------------------------------------------------------------------------
-- добавляет файл в конец другого файла
-----------------------------------------------------------------------------------------------------------------------------------------

2_--0.  2Func0 _Выгрузить_СтрМассив_Вфайл.(ИмяМассива:s;ИмяМассива2:s;нач1:i;нач2:i;Файл:s;Дописывать:l):l;
-----------------------------------------------------------------------------------------------------------------------------------------
-- добавляет массивы ИмяМассива+ИмяМассива2 в конец другого файла
-----------------------------------------------------------------------------------------------------------------------------------------

2_--0.  2Func0 _Загрузить_СтрМассив_ИзФайла.(ИмяМассива:s;ИмяМассива2:s;нач1:i;Файл:s):l;
-----------------------------------------------------------------------------------------------------------------------------------------
2--0загружает массивы содержимым файла(обрезает строки до 512 символов если они превышают 512)
-----------------------------------------------------------------------------------------------------------------------------------------

2_--0.  2Func0 _ЗагрузкаСправочников
-----------------------------------------------------------------------------------------------------------------------------------------
2--0 (CardFileName:s; -- Полное имя  файла CRD (пример= c:\выгрузка\карт_справочники.CRD)
2--0  Обновлять:l;    -- Обновлять=true :если такая запись существует,то Ukey загружаемой записи приравнивается Ukey уже существующей, для обновления уже существующей записи
2--0                  -- Обновлять=false:если такая запись существует,то загружаемая запись удаляется из загружаемого файла,т.е. не загружается
2--0  Ukey:l          -- Ukey=false: значения Ukey из загружаемого файла удаляются,т.е. новые записи просто добавляются без конфликта по Ukey
2--0                  -- кроме записей обработанных по Обновлять=true
2--0                  -- Ukey=true : значения Ukey из загружаемого файла не удаляются,т.е. новые записи заменяют старые
2--0                  -- кроме записей обработанных по Обновлять=true
2--0 ):s;
-----------------------------------------------------------------------------------------------------------------------------------------
2_----------------- Функции и процедуры для работы со структурой картотек ------------
2_--0.  2Func0 _ТипCDF.(ss:s):s;

2_--0.  2Func0 _ЗаполнитьСписокВсехПолейКартотеки.(картимя:s;crTime:l;upTime:l):i;-- возвращает количество строк с данными в массиве СписокПолейКартотеки
    2    0                                                                  -- картимя=cписок картотек через '#'

2_--0.  2Func0 _СоздатьCDF.(файлимя:s;картимя:s;ukey:l;crTime:l;upTime:l;Добавить:l):l; -- картимя=cписок картотек через '#'

2_--0.  2Func0 _ЗаполнитьСписокПолейКартотеки.(картимя:s):s;-- возвращает полный путь к массиву с подготовленными данными (описанием полей подтаблицы)

2_--0.  2proc0 _КопироватьЗаписьПодтаблицыБланкаРедактора.(МассивСписокПолейКартотеки:s;ДлинаСписка:i;Таблица:s;ПодТаблица:s;i0:i;i1:i);

2_--0.  2func0 _ПризнакВЗаписьКартСтр.(АналитПризнак:Строка;ОбработкаАналит:Логич):s;
2_--0.  -- возвращает ИмяКартотеки#{запись}, если признак картотечный или пустую строку, если признак не картотечный

2_--0.  2Func0 _ВыгрузитьКартотеку.(файлимя:s;ukey:l;crTime:l;upTime:l;Добавить:l):l;-- выгружает записи картотек описанных в массиве ВыгрузитьКартотекуФильтр
2_--0.                                                                           -- ВыгрузитьКартотекуФильтр=crd#{ykey} или crd#фильтр

2_--0.  2Func0 _СоздатьCRD.(файлимя:s;ukey:l;crTime:l;upTime:l;Добавить:l):l;

--  Func ВыгрузитьКартВфайлФильтр(Префикс:s;Карт:s;ФильтрКарт:s;ФильтрКартПодтабл:s;ПутьФайл:s;УслНаПроводки:s):L;

2_----------------- в доработке -------------------------------------------------------
2_--0.  2Func0 _ЗаписатьПеременнуюРОвФайл.(НРО:i;ИмяПеременной:s;нф:i;КолУровень:i):L;
2_----------------- Функции и процедуры для работы с табличными журналами ------------



var TempStrArray1[]:s;
var TempStrArray2[]:s;
var TempStrArray3[]:s;
var TempStrArray4[]:s;
var TempIntArray1[]:i;
var zk[]:i;
var zp[]:i;
var zkspr[]:s;

var ВыгрузитьКартотекуФильтр[]:s;--имякарт#{ukey} или имякарт#фильтр
var СписокПолейКартотеки[]:s;

2_----------------- в доработке -------------------------------------------------------
var СоздатьCRDФильтр[]:s;--имякарт#{ukey} или имякарт#фильтр
var МассивРО[]:i;-- Массив рабочих областей
var МассивРОколзп[]:i;-- Массив количество записей в рабочей области


2_----------- Функции и процедуры для работы с текстовыми файлами --------------------

  Func ДобавитьФайл(ДобавляемыйФайл:s;ФайлДляДобавления:s):l;-- добавляет файл в конец другого файла
   var ss1,ss2:s;
   var нф1,нф:i;
    if не ЕстьФайл(ДобавляемыйФайл):^false;fi;
--    if не ЕстьФайл(ФайлДляДобавления):КопироватьФайл(ДобавляемыйФайл,ФайлДляДобавления);^true;fi;
    if не ЕстьФайл(ФайлДляДобавления):СоздатьФайл(ФайлДляДобавления);fi;

--    if не ЕстьФайл(ФайлДляДобавления):нф1=ТекстФайлСоздать(ФайлДляДобавления);
--     | true:  нф1=ТекстФайлОткрытьНаЗапись(ФайлДляДобавления);
--    fi;
     Попытка
      нф =ТекстФайлОткрытьНаЧтение(ДобавляемыйФайл);
      нф1=ТекстФайлОткрытьНаЗапись(ФайлДляДобавления);
      ТекстФайлВКонец(нф1);
      Пока не ТекстФайлКонецФайла(нф) do
        ss1=ТекстФайлПрочитать(нф,255);
        if не ТекстФайлКонецФайла(нф):ss2=ТекстФайлПрочитатьСтроку(нф);fi;
        ТекстФайлДописатьСтроку(нф1,ss1);
        ТекстФайлЗаписатьСтроку(нф1,ss2);
      od;
     Окончание
      ТекстФайлЗакрыть(нф1);
      ТекстФайлЗакрыть(нф);
     Конец;
    ^true;
  end;
  Func Выгрузить_СтрМассив_Вфайл(ИмяМассива:s;ИмяМассива2:s;нач1:i;нач2:i;Файл:s;Дописывать:l):l;
    var нф1,i:i;
    var ss1,ss2:s;
    var ll:l;
    ll=false;
    if не ЕстьФайл(Файл) или не Дописывать:СоздатьФайл(Файл);fi;
     Попытка
      нф1=ТекстФайлОткрытьНаЗапись(Файл);
      ТекстФайлВКонец(нф1);
      if ИмяМассива2='':
         for i=нач1..нач2 do
            ss1=ВзятьПеременнуюС(ИмяМассива +'['+str(i)+']');
           ТекстФайлЗаписатьСтроку(нф1,ss1);
         od;
       | true:
         for i=нач1..нач2 do
            ss1=ВзятьПеременнуюС(ИмяМассива +'['+str(i)+']');
            ss2=ВзятьПеременнуюС(ИмяМассива2+'['+str(i)+']');
           ТекстФайлДописатьСтроку(нф1,ss1);
           ТекстФайлЗаписатьСтроку(нф1,ss2);
         od;
      fi;
      ll=true;
     Окончание
      ТекстФайлЗакрыть(нф1);
     Конец;
    ^ll;
  end;
  Func Загрузить_СтрМассив_ИзФайла(ИмяМассива:s;ИмяМассива2:s;нач1:i;Файл:s):l;
    var нф,i:i;
    var ss1,ss2:s;
    var ll:l;
    ll=false;
    if нач1<1:нач1=1;fi;
    if не ЕстьФайл(Файл):^false;fi;
     Попытка
      нф =ТекстФайлОткрытьНаЧтение(Файл);
      Пока не ТекстФайлКонецФайла(нф) do
        ss1=ТекстФайлПрочитать(нф,255);
        if не ТекстФайлКонецФайла(нф):
         ss2=ТекстФайлПрочитатьСтроку(нф);
        fi;
        if ИмяМассива2='':
           if Длина(ss1)>0:
             ЗаписатьПеременнуюС(ИмяМассива+'['+str(нач1)+']',ss1);
             нач1=нач1+1;
           fi;
         | true:
           if Длина(ss1)>0:
             ЗаписатьПеременнуюС(ИмяМассива +'['+str(нач1)+']',ss1);
             ЗаписатьПеременнуюС(ИмяМассива2+'['+str(нач1)+']',ss2);
             нач1=нач1+1;
           fi;
        fi;
      od;
      ll=true;
     Окончание
      ТекстФайлЗакрыть(нф);
     Конец;
    ^ll;
  end;
  Func СчитатьСтрокуВмассив(нф:i):i;-- возвращает длину массива TempStrArray1 со строками в 255 символов и остатком символов в моследнем элементе массива
   var ss,ss2,ss3:s;
   var j:i;
   ClearVariable(Раб.НФА.B03.TempStrArray1);
      ss=' ';j=0;
      Пока не ТекстФайлКонецФайла(нф) и длина(ss)>0 do
        ss=ТекстФайлПрочитать(нф,255);
        if ss<>'':
        j=j+1;TempStrArray1[j]=ss;
        fi;
      od;
      ^j;
  end;
  Func УдалитьПосторонниеСимволы(ИсхСтр:s):s;
   ^Раб.СТР.ЗаменаПостороннихСимволов(Раб.СТР.буквыцифры+'+-*/\|=_()*&^%$#@!~№;:?[]{},."'+"'",ИсхСтр,' ',false);
  end;

  Func СчитатьСтрокуВмассивПоСловам(нф:i;Разделитель:s):i;-- возвращает длину массива TempStrArray1 со строками в 255 символов и остатком символов в моследнем элементе массива
   var ss,ss2,ss3:s;
   var j,lenRazd,x,y,zz:i;
   lenRazd=длина(Разделитель);
   ClearVariable(Раб.НФА.B03.TempStrArray1);
      ss=' ';j=0;
      Пока не ТекстФайлКонецФайла(нф) и длина(ss)>0 do
        ss=ТекстФайлПрочитать(нф,255);
        if ss='' и ss2<>'':ss=ss2;ss2='';fi;-- список кончился, остался хвост
        if ss<>'':
          if ss2='':
            if Длина(ss)=255 и SubStr(ss,256-lenRazd,lenRazd)<>Разделитель:x=КоличествоСлов(ss,Разделитель)-1;ss2=ВыделитьСлово(x+1,ss,Разделитель);
             | true:x=КоличествоСлов(ss,Разделитель);ss2='';
            fi;
            for y=1..x do
              j=j+1;TempStrArray1[j]=ВыделитьСлово(y,ss,Разделитель);
            od;
           | true:
             zz=длина(ss2)+длина(ss);
             if zz>255:
               zz=zz-255;
               ss3=SubStr(ss,длина(ss)+1-zz,zz);
              | true:ss3='';
             fi;
             ss=SubStr(ss2+ss,1,255);
             if Длина(ss)=255 и SubStr(ss,256-lenRazd,lenRazd)<>Разделитель:x=КоличествоСлов(ss,Разделитель)-1;ss2=ВыделитьСлово(x+1,ss,Разделитель);
              | true:x=КоличествоСлов(ss,Разделитель);ss2='';
             fi;
             for y=1..x do
               j=j+1;TempStrArray1[j]=ВыделитьСлово(y,ss,Разделитель);
             od;
             ss2=ss2+ss3;
          fi;
        fi;
      od;
      if не ТекстФайлКонецФайла(нф):ss=ТекстФайлПрочитатьСтроку(нф);fi;
      ^j;
  end;
  Func формат_файла_только_текст(Файл:s):l;
    var нф,нф1:i;
    var ss,Файл1:s;
    var ll:l;
    ll=false;
    if не ЕстьФайл(Файл):^false;fi;
     Файл1=PlanVar('CACHE')+'\'+GetGUID;
     СоздатьФайл(Файл1);
     Попытка
      ss=' ';
      нф =ТекстФайлОткрытьНаЧтение(Файл);
      Пока не ТекстФайлКонецФайла(нф) do
        Пока не ТекстФайлКонецФайла(нф) и длина(ss)>0 do
          ss=ТекстФайлПрочитать(нф,255);
          ss=УдалитьПосторонниеСимволы(ss);
          Дописать(Файл1,ss);
        od;
        if не ТекстФайлКонецФайла(нф):ss=ТекстФайлПрочитатьСтроку(нф);Записать(Файл1,'');ss=' ';fi;
      od;
      ll=true;
     Окончание
      ТекстФайлЗакрыть(нф);
--      КопироватьФайл(Файл1,Файл);
--      УдалитьФайл(Файл1);
     Конец;
    ^ll;
  end;

  Func Загрузить_СтрМассив_ИзФайла_формат(ИмяМассива:s;нач1:i;Файл:s;ШиринаТекста:i;Разделитель:s):l;
    var нф,i,j,k,z:i;
    var ss1,ss2,ss3:s;
    var ll:l;
    ll=false;
    if нач1<1:нач1=1;fi;
    if не ЕстьФайл(Файл):^false;fi;
     ll=false;
     Попытка
      нф =ТекстФайлОткрытьНаЧтение(Файл);
      j=0;-- строк в итоговом массиве
      Пока не ТекстФайлКонецФайла(нф) do
        k=СчитатьСтрокуВмассивПоСловам(нф,Разделитель);ss2='';ss3='';
        for z=1..k do
          ss2=ss1+Разделитель+TempStrArray1[z];
          if Длина(ss2)>ШиринаТекста:
             j=j+1;ЗаписатьПеременнуюС(ИмяМассива+'['+str(нач1+j)+']',ss1);
             --trace(ss1);
             ss1=TempStrArray1[z];
--             j=j+1;ЗаписатьПеременнуюС(ИмяМассива+'['+str(нач1+j)+']',ss1);ss1=TempStrArray1[z];

           | true:ss1=ss2;
          fi;
        od;
        j=j+1;ЗаписатьПеременнуюС(ИмяМассива+'['+str(нач1+j)+']',ss1);
        --trace(ss1);
        ss1=TempStrArray1[z];
      od;
      ll=true;
     Окончание
      ТекстФайлЗакрыть(нф);
     Конец;
    ^ll;
  end;

  func ВыводФайлфАльтернатива(Файл:s;Заголовок:s;ШиринаСтроки:i):l;
    var ii,j:i;
    var ll:l;
--    ll=формат_файла_только_текст(Файл);
    if Загрузить_СтрМассив_ИзФайла_формат('РАБ.НФА.B03.TempStrArray2',0,Файл,ШиринаСтроки,' '):
--    if Загрузить_СтрМассив_ИзФайла('РАБ.НФА.B03.TempStrArray1','РАБ.НФА.B03.TempStrArray2',0,Файл):
       ii= длинамассива(TempStrArray2);
       ii=Alternate(Заголовок,TempStrArray2,-1,1,12);
       ClearVariable(РАБ.НФА.B03.TempStrArray2);
       ^true;
    fi;
    ^false;
  end;
Func GetGUID0:s;
-- ^РАБ.НФА.B01.ЗаменаПодстроки(SubStr(GetGUID,2,36),'-','');
 ^Раб.СТР.ЗаменаПодстроки(SubStr(GetGUID,2,9),'-','');
end;
Func ExportCardFiltr(ФорматВыгрузки:Целое; КартотекаВыгрузки:Строка; ФайлВыгрузки:Строка; ФильтрВыгрузки:Строка; ВидимПоля:Логич; РазымПоля:Логич; НомЗап:Логич; Заголовок:Логич; Режим:Логич; DOS:Логич; ТаблСсыл:Логич):l;
   var file,file0 :String;
   var num :Integer;
   var ok :l;
    if КартотекаВыгрузки='':^false;fi;
    if ФайлВыгрузки='':^false;fi;
    if not ExistsCardFile(КартотекаВыгрузки):^false;fi;
    ok=false;
 if trim(ФильтрВыгрузки)<>'':
    file=PlanVar('CACHE')+'\'+GetGUID0+'.bro';
    num=TextFileCreate(file,false);
    try
      TextFileWriteLn(num,'[Header]',false);
      TextFileWriteLn(num,'_EnabledFltr=1',false);
      TextFileWriteLn(num,'_Fltr='+ФильтрВыгрузки,false);
      TextFileWriteLn(num,'TableName='+КартотекаВыгрузки,false);
      ok=true;
    finally
      TextFileClose(num);
    end;
    if not ok:^false;fi;
  | true:file=КартотекаВыгрузки;
 fi;
 if pos('.',ФайлВыгрузки)>0:file0=PlanVar('CACHE')+'\'+GetGUID0;
  | true:file0=ФайлВыгрузки;
 fi;
 ExportCard( ФорматВыгрузки,    --  Формат CRD
             file,                                    --  Картотека (браузер)
             file0,                            --  Файл (путь)
             if(trim(ФильтрВыгрузки)<>'',true,false), --  Учитывать фильтр браузера
             ВидимПоля,                               --  Выгружать только видимые поля
             РазымПоля,                               --  Выгружать разыменованные поля
             НомЗап,                                  --  Выгружать c UKEY
             Заголовок,                               --  Указать столбец для EXCEL
             Режим,                                   --  Выгружать служебные поля
             DOS,                                     --  Выгружать в DOS-кодировке
             ТаблСсыл);                               --  Выгружать таблицы по ссылкам
 if ExistFile(file): DeleteFile(file); fi;
 if file0<>ФайлВыгрузки:--Восстанавливаем исходное имя файла
    CopyFile(file0+'.crd',ФайлВыгрузки+'.crd');
    CopyFile(file0+'.cdf',ФайлВыгрузки+'.cdf');
 if ExistFile(file0+'.crd'): DeleteFile(file0+'.crd'); fi;
 if ExistFile(file0+'.cdf'): DeleteFile(file0+'.cdf'); fi;

 fi;
 ^true;
end;
2_------------------------------------------------------------------------------------
2_----------------- Функции и процедуры для работы со структурой картотек ------------
  Func ТипCDF(ss:s):s;
    if ss='[]':^'периодическое';
     | ss='TП':^'SUBTAB';
     | ss='NЧ':^'REAL';
     | ss='IЦ':^'INTEGER';
     | ss='LЛ':^'BOOLEAN';
     | ss='SС':^'STRING';
     | ss='DД':^'DATE';
     | true:^ВыделитьСлово(2,ss,'#');
    fi;
  end;

  Func ЗаполнитьСписокВсехПолейКартотеки(картимя:s):i;-- возвращает количество строк с данными в массиве СписокПолейКартотеки
    var ii,j,k,z,m,n,jj:i;
    var ss,ss1:s;
    ClearVariable(РАБ.НФА.B03.СписокПолейКартотеки);
    ClearVariable(РАБ.НФА.B03.TempStrArray1);
    ClearVariable(РАБ.НФА.B03.TempStrArray2);
    ClearVariable(РАБ.НФА.B03.TempStrArray3);
    ClearVariable(РАБ.НФА.B03.TempStrArray4);
    ii=КоличествоСлов(картимя,'#');
    for j=1..ii do TempStrArray1[j]=ВыделитьСлово(j,картимя,'#');od;
    k=ДлинаМассива(РАБ.НФА.B03.TempStrArray1);
    while k>0 do
      ClearVariable(РАБ.НФА.B03.TempStrArray3);
      for j=1..k do -- цикл по подтаблицам текущего уровня
        ii=ВзятьПоляКартотеки(TempStrArray1[j],РАБ.НФА.B03.TempStrArray2,mtlSUBTAB+mtlTimed);-- получаем список всех подтаблиц следующего уровня в TempStrArray2
        jj=ДлинаМассива(РАБ.НФА.B03.TempStrArray3);for z=1..ii do TempStrArray3[jj+z]=TempStrArray1[j]+'@'+TempStrArray2[z];od;
      od;
      КопироватьМассив(РАБ.НФА.B03.TempStrArray1,РАБ.НФА.B03.TempStrArray4,1,ДлинаМассива(РАБ.НФА.B03.TempStrArray4)+1);
      ClearVariable(РАБ.НФА.B03.TempStrArray1);
      КопироватьМассив(РАБ.НФА.B03.TempStrArray3,РАБ.НФА.B03.TempStrArray1);
      k=ДлинаМассива(РАБ.НФА.B03.TempStrArray1);
    od;
    КопироватьМассив(РАБ.НФА.B03.TempStrArray4,РАБ.НФА.B03.TempStrArray1);
    k=ДлинаМассива(РАБ.НФА.B03.TempStrArray1);
    for j=1..k do -- цикл по таблице и подтаблицам
      ii=ВзятьПоляКартотеки(TempStrArray1[j],РАБ.НФА.B03.TempStrArray2,mtlTimed  );jj=ДлинаМассива(РАБ.НФА.B03.СписокПолейКартотеки);for z=1..ii do СписокПолейКартотеки[jj+z]=TempStrArray1[j]+'@#'+TempStrArray2[z]+'#[]';od;
      ii=ВзятьПоляКартотеки(TempStrArray1[j],РАБ.НФА.B03.TempStrArray2,mtlSUBTAB );jj=ДлинаМассива(РАБ.НФА.B03.СписокПолейКартотеки);for z=1..ii do СписокПолейКартотеки[jj+z]=TempStrArray1[j]+'@#'+TempStrArray2[z]+'#TП';od;
      ii=ВзятьПоляКартотеки(TempStrArray1[j],РАБ.НФА.B03.TempStrArray2,mtlREAL   );jj=ДлинаМассива(РАБ.НФА.B03.СписокПолейКартотеки);for z=1..ii do СписокПолейКартотеки[jj+z]=TempStrArray1[j]+'@#'+TempStrArray2[z]+'#NЧ';od;
      ii=ВзятьПоляКартотеки(TempStrArray1[j],РАБ.НФА.B03.TempStrArray2,mtlINTEGER);jj=ДлинаМассива(РАБ.НФА.B03.СписокПолейКартотеки);for z=1..ii do СписокПолейКартотеки[jj+z]=TempStrArray1[j]+'@#'+TempStrArray2[z]+'#IЦ';od;
      ii=ВзятьПоляКартотеки(TempStrArray1[j],РАБ.НФА.B03.TempStrArray2,mtlBOOLEAN);jj=ДлинаМассива(РАБ.НФА.B03.СписокПолейКартотеки);for z=1..ii do СписокПолейКартотеки[jj+z]=TempStrArray1[j]+'@#'+TempStrArray2[z]+'#LЛ';od;
      ii=ВзятьПоляКартотеки(TempStrArray1[j],РАБ.НФА.B03.TempStrArray2,mtlSTRING );jj=ДлинаМассива(РАБ.НФА.B03.СписокПолейКартотеки);for z=1..ii do СписокПолейКартотеки[jj+z]=TempStrArray1[j]+'@#'+TempStrArray2[z]+'#SС';od;
      ii=ВзятьПоляКартотеки(TempStrArray1[j],РАБ.НФА.B03.TempStrArray2,mtlDATE   );jj=ДлинаМассива(РАБ.НФА.B03.СписокПолейКартотеки);for z=1..ii do СписокПолейКартотеки[jj+z]=TempStrArray1[j]+'@#'+TempStrArray2[z]+'#DД';od;
      ii=ВзятьПоляКартотеки(TempStrArray1[j],РАБ.НФА.B03.TempStrArray2,mtlREF    );jj=ДлинаМассива(РАБ.НФА.B03.СписокПолейКартотеки);for z=1..ii do СписокПолейКартотеки[jj+z]=TempStrArray1[j]+'@#'+TempStrArray2[z]+'#RЗ#'+ВзятьКартотекуПоСсылочномуПолю(TempStrArray1[j],TempStrArray2[z]);od;
      jj=ДлинаМассива(РАБ.НФА.B03.СписокПолейКартотеки);СписокПолейКартотеки[jj+1]=TempStrArray1[j]+'@#';

    od;

    СортироватьМассив(СписокПолейКартотеки,true);
   ^ДлинаМассива(РАБ.НФА.B03.СписокПолейКартотеки);
  end;
  Func СоздатьCDF(файлимя:s;картимя:s;ukey:l;crTime:l;upTime:l;Добавить:l):l;
  var нф,i,j,k,ii,КолУровень,КолУровеньДо:i;
  var ss,ss0,Уровень,УровеньДо:s;
  var rez:l;
    rez=true;
    if pos('\',картимя)>1:-- берем структуру из файла
       ClearVariable(Раб.НФА.B03.СписокПолейКартотеки);
       if ЕстьФайл(картимя):
          if Загрузить_СтрМассив_ИзФайла('Раб.НФА.B03.СписокПолейКартотеки','',1,картимя):ii=ДлинаМассива(Раб.НФА.B03.СписокПолейКартотеки);
           | true:ii=0;
          fi;
        | true:ii=0;
       fi;
     | true:ii=ЗаполнитьСписокВсехПолейКартотеки(картимя);
    fi;
--    ii=ЗаполнитьСписокВсехПолейКартотеки(картимя);
    if ii<1:^false;fi;
    if не Добавить или не ЕстьФайл(файлимя):нф=ТекстФайлСоздать(файлимя);
     | true:нф=ТекстФайлОткрытьНаЗапись(файлимя);
    fi;
   попытка
    ТекстФайлВКонец(нф);
    КолУровеньДо=0;
    УровеньДо='';
    for i=1..ii+1 do
      j=КоличествоСлов(СписокПолейКартотеки[i],'#');
      Уровень   =ВыделитьСлово(1,СписокПолейКартотеки[i],'#');
      КолУровень=КоличествоСлов(Уровень,'@');
      if КолУровень<=КолУровеньДо:-- понизили уровень
         for k=КолУровень+1..КолУровеньДо do -- понизили уровень до существующего уровня
           ТекстФайлЗаписатьСтроку(нф,Повтор('  ',КолУровеньДо-k+КолУровень)+')');
           ТекстФайлЗаписатьСтроку(нф,Повтор('  ',КолУровеньДо-k+КолУровень)+']');
         od;
         k=КолУровень;
         While ВыделитьСлова(1,k,Уровень,'@')<>ВыделитьСлова(1,k,УровеньДо,'@') do -- понизили уровень до реального уровня
           ТекстФайлЗаписатьСтроку(нф,Повтор('  ',k-1)+')');
           ТекстФайлЗаписатьСтроку(нф,Повтор('  ',k-1)+']');
           k=k-1;
         od;
      fi;

      if j=1 : -- Открыт новый уровень
           ТекстФайлЗаписатьСтроку(нф,Повтор('  ',КолУровень-1)+'['+ВыделитьСлова(1,КолУровень,Уровень,'@'));
           ТекстФайлЗаписатьСтроку(нф,Повтор('  ',КолУровень-1)+'(');
           if КолУровень=1:
             if crTime:ТекстФайлЗаписатьСтроку(нф,Повтор('  ',КолУровень-1)+'CreateTime:DATETIME');fi;
             if upTime:ТекстФайлЗаписатьСтроку(нф,Повтор('  ',КолУровень-1)+'UpdateTime:DATETIME');fi;
           fi;
       | j>1: -- Вывод переменной
           ТекстФайлЗаписатьСтроку(нф,Повтор('  ',КолУровень-1)+ВыделитьСлово(2,СписокПолейКартотеки[i],'#')+':'+ТипCDF(ВыделитьСлова(3,2,СписокПолейКартотеки[i],'#')));
      fi;
      КолУровеньДо=КолУровень;
      УровеньДо   =Уровень;
    od;
    ТекстФайлЗакрыть(нф);
   Исключение
    ТекстФайлЗакрыть(нф);
    rez=false;
   Конец;
    ^rez;
  end;
  Func ЗаполнитьСписокПолейКартотеки(картимя:s):s;-- возвращает полный путь к массиву с подготовленными данными (описанием полей подтаблицы)
    var ii,j,k,z,jj:i;
    var ss,ss1:s;
    ClearVariable(РАБ.НФА.B03.СписокПолейКартотеки);
    ClearVariable(РАБ.НФА.B03.TempStrArray1);
    ClearVariable(РАБ.НФА.B03.TempStrArray2);
    TempStrArray1[1]=картимя;
    ii=ВзятьПоляКартотеки(картимя,РАБ.НФА.B03.TempStrArray2,mtlSUBTAB);
    for j=1..ii do TempStrArray1[j+1]=картимя+'@'+TempStrArray2[j];od;
    k=ДлинаМассива(РАБ.НФА.B03.TempStrArray1);
    for j=1..k do -- цикл по таблице и подтаблицам
      ii=ВзятьПоляКартотеки(TempStrArray1[j],РАБ.НФА.B03.TempStrArray2,mtlREAL   );jj=ДлинаМассива(РАБ.НФА.B03.СписокПолейКартотеки);for z=1..ii do СписокПолейКартотеки[jj+z]=TempStrArray1[j]+'|'+TempStrArray2[z]+'|NЧ';od;
      ii=ВзятьПоляКартотеки(TempStrArray1[j],РАБ.НФА.B03.TempStrArray2,mtlINTEGER);jj=ДлинаМассива(РАБ.НФА.B03.СписокПолейКартотеки);for z=1..ii do СписокПолейКартотеки[jj+z]=TempStrArray1[j]+'|'+TempStrArray2[z]+'|IЦ';od;
      ii=ВзятьПоляКартотеки(TempStrArray1[j],РАБ.НФА.B03.TempStrArray2,mtlBOOLEAN);jj=ДлинаМассива(РАБ.НФА.B03.СписокПолейКартотеки);for z=1..ii do СписокПолейКартотеки[jj+z]=TempStrArray1[j]+'|'+TempStrArray2[z]+'|LЛ';od;
      ii=ВзятьПоляКартотеки(TempStrArray1[j],РАБ.НФА.B03.TempStrArray2,mtlSTRING );jj=ДлинаМассива(РАБ.НФА.B03.СписокПолейКартотеки);for z=1..ii do СписокПолейКартотеки[jj+z]=TempStrArray1[j]+'|'+TempStrArray2[z]+'|SС';od;
      ii=ВзятьПоляКартотеки(TempStrArray1[j],РАБ.НФА.B03.TempStrArray2,mtlDATE   );jj=ДлинаМассива(РАБ.НФА.B03.СписокПолейКартотеки);for z=1..ii do СписокПолейКартотеки[jj+z]=TempStrArray1[j]+'|'+TempStrArray2[z]+'|DД';od;
      ii=ВзятьПоляКартотеки(TempStrArray1[j],РАБ.НФА.B03.TempStrArray2,mtlREF    );jj=ДлинаМассива(РАБ.НФА.B03.СписокПолейКартотеки);for z=1..ii do СписокПолейКартотеки[jj+z]=TempStrArray1[j]+'|'+TempStrArray2[z]+'|RЗ|'+ВзятьКартотекуПоСсылочномуПолю(TempStrArray1[j],TempStrArray2[z]);od;
    od;
   ^'РАБ.НФА.B03.СписокПолейКартотеки';
  end;
2proc0 КопироватьЗаписьПодтаблицыБланкаРедактора(МассивСписокПолейКартотеки:s;ДлинаСписка:i;Таблица:s;ПодТаблица:s;i0:i;i1:i);
  var ii:i;
  var ss,ss1,ss2,тип:s;
  Таблица=Up(Таблица);
  ПодТаблица=Up(ПодТаблица);
  for ii=1..ДлинаСписка do
    ss=Up(ВзятьПеременнуюС(МассивСписокПолейКартотеки+'['+str(ii)+']'));
    if pos(Таблица+'@'+ПодТаблица+'|',ss)=1:
       тип=Up(ВыделитьСлово(3,ss,'|'));
       ss1='['+str(i1)+'].'+ВыделитьСлово(2,ss,'|');
       ss2='['+str(i0)+'].'+ВыделитьСлово(2,ss,'|');
       if pos('С',тип)>0:ЗаписатьПеременнуюС(ПодТаблица+ss1,ВзятьПеременнуюС(ПодТаблица+ss2));
        | pos('Ч',тип)>0:ЗаписатьПеременнуюЧ(ПодТаблица+ss1,ВзятьПеременнуюЧ(ПодТаблица+ss2));
        | pos('Ц',тип)>0:ЗаписатьПеременнуюЦ(ПодТаблица+ss1,ВзятьПеременнуюЦ(ПодТаблица+ss2));
        | pos('Л',тип)>0:ЗаписатьПеременнуюЛ(ПодТаблица+ss1,ВзятьПеременнуюЛ(ПодТаблица+ss2));
        | pos('Д',тип)>0:ЗаписатьПеременнуюД(ПодТаблица+ss1,ВзятьПеременнуюД(ПодТаблица+ss2));
        | pos('З',тип)>0:ЗаписатьПеременнуюЗ(ПодТаблица+ss1,ВзятьПеременнуюЗ(ПодТаблица+ss2));
       fi;
    fi;
  od;
2end0;
func ПризнакВЗаписьКартСтр(АналитПризнак:Строка;ОбработкаАналит:Логич):s; 
-- возвращает ИмяКартотеки#{запись}, если признак картотечный или пустую строку, если признак не картотечный
 var recs:s;
 var rec:Запись;
   rec=ПризнакВЗапись(АналитПризнак,ОбработкаАналит);
   if rec=NIL:^'';fi;
   recs=ЗаписьВстроку(rec);
   ^КартотекаПризнака(АналитПризнак,ОбработкаАналит)+'#'+recs;
end;
Func ВыгрузитьКартотеку(МестоВыгрузки:s;файлимя:s;ukey:l;crTime:l;upTime:l;Добавить:l):i;-- выгружает записи картотек описанных в массиве ВыгрузитьКартотекуФильтр
                                                                         -- ВыгрузитьКартотекуФильтр=crd#{ykey} или crd#фильтр
                                                                         -- возвращает время выгрузки в секундах или -1 в случае ошибки
                                                                         -- Все картотеки выгружаются в текст, затем в итоговый файл копируются строки из записей с нужными UKEY
  var i,ii,j,k,l,wa,rs,нф,нф1,карт,колкарт,начномер,tt:i;
  var ФлагКопироватьЗапись:l;
  var ЗнОкноВыполненияПред,ЗнОкноВыполненияТекущ,ЗнОкноВыполненияПриращ:n;
  var ss,crd,файлимя1,Переменная,Значение,ТекущаяКартотека,файлимянов:s;
  файлимянов='000'+файлимя;
  ii=ДлинаМассива(ВыгрузитьКартотекуФильтр);
  if ii<1:^-1;fi;
  ОчиститьПеременную(РАБ.НФА.B03.TempStrArray1);
  ОчиститьПеременную(РАБ.НФА.B03.TempStrArray2);
  for j=1..ii do --заполняем TempStrArray1 значениями crd#{ykey}
    crd=ВыделитьСлово(1,ВыгрузитьКартотекуФильтр[j],'#');
    ДобавитьВмассив(TempStrArray2,true,false,crd);
    if pos('#{',ВыгрузитьКартотекуФильтр[j])>0:--добавляем ykey по данному {ykey}
       ДобавитьВмассив(TempStrArray1,true,false,ВыгрузитьКартотекуФильтр[j]);
     | true:--добавляем ykey по фильтру
       wa=ОткрытьРабочуюОбласть(crd,'',ВыделитьСлово(2,ВыгрузитьКартотекуФильтр[j],'#'));
         rs=Записей(wa);
         for k=1..rs do
           ДобавитьВмассив(TempStrArray1,true,false,crd+'#'+ЗаписьВстроку(ВзятьКлючЗаписи(wa,k)));
         od;
       ЗакрытьРабочуюОбласть(wa);
    fi;
  od;
  колкарт=ДлинаМассива(TempStrArray2);--список картотек
  for карт=1..колкарт do
    ДобавитьВмассив(TempStrArray1,true,false,TempStrArray2[карт]);
  od;
  if не Добавить:
    if ЕстьФайл(МестоВыгрузки+файлимянов+'.CRD'):УдалитьФайл(МестоВыгрузки+файлимянов+'.CRD');fi;
    if ЕстьФайл(МестоВыгрузки+файлимянов+'.CDF'):УдалитьФайл(МестоВыгрузки+файлимянов+'.CDF');fi;
  fi;
  ОкноВыполненияПоказать(колкарт,"Выгрузка картотек...");
  tt=time;
  for карт=1..колкарт do
    ОкноВыполненияПоказать(колкарт*100,'Выгрузка картотеки '+TempStrArray2[карт]+' ['+str(time-tt)+' сек]');
    ЗнОкноВыполненияПред=(карт-1)*100;
    ОкноВыполненияПоложение(int(ЗнОкноВыполненияПред));
    if ЕстьФайл(МестоВыгрузки+файлимя+'.CRD'):УдалитьФайл(МестоВыгрузки+файлимя+'.CRD');fi;
    if ЕстьФайл(МестоВыгрузки+файлимя+'.CDF'):УдалитьФайл(МестоВыгрузки+файлимя+'.CDF');fi;
    ЭкспортКартотеки(ieCRD,TempStrArray2[карт],МестоВыгрузки+файлимя,false,false,false,true,false,true,false,false);
    начномер=ПоискВмассиве(TempStrArray1,TempStrArray2[карт],true)+1;
    ОкноВыполненияПоказать(колкарт*100,"Обработка картотеки "+TempStrArray2[карт]+' ['+str(time-tt)+' сек]');
    ОкноВыполненияПоложение(int(ЗнОкноВыполненияПред));
    wa=ОткрытьРабочуюОбласть(TempStrArray2[карт],'');ЗнОкноВыполненияПриращ=Записей(wa);ЗакрытьРабочуюОбласть(wa);
    ЗнОкноВыполненияПриращ=100/ЗнОкноВыполненияПриращ;
--    ЗнОкноВыполненияПриращ=колкарт/(ЗнОкноВыполненияПриращ);
    ЗнОкноВыполненияТекущ=ЗнОкноВыполненияПред;
      ДобавитьФайл(МестоВыгрузки+файлимя+'.CDF',МестоВыгрузки+файлимянов+'.CDF');
      нф=ТекстФайлОткрытьНаЧтение(МестоВыгрузки+файлимя+'.CRD');
      if не ЕстьФайл(МестоВыгрузки+файлимянов+'.CRD'):нф1=ТекстФайлСоздать(МестоВыгрузки+файлимянов+'.CRD');
       | true: нф1=ТекстФайлОткрытьНаЗапись(МестоВыгрузки+файлимянов+'.CRD');
      fi;
      ФлагКопироватьЗапись=true;
     попытка
      ТекстФайлВКонец(нф1);
      Пока не ТекстФайлКонецФайла(нф) do
        Переменная=ТекстФайлПрочитать(нф,255);
        if pos('[',Переменная)=1 or pos(']',Переменная)=1:
           if pos('[',Переменная)=1:ТекущаяКартотека=Подстр(Переменная,2,255);ТекстФайлЗаписатьСтроку(нф1,Переменная);
           fi;
           if pos(']',Переменная)=1:ТекстФайлЗаписатьСтроку(нф1,Переменная);
           fi;
           if не ТекстФайлКонецФайла(нф):Значение=ТекстФайлПрочитатьСтроку(нф);fi;
         | true:
           if pos('(',Переменная)=1:
              Значение=ТекстФайлПрочитатьСтроку(нф);Переменная=ТекстФайлПрочитать(нф,255);
              if pos('UKEY=',Переменная)=1:-- проверка на копирование данной записи
                 ЗнОкноВыполненияТекущ=ЗнОкноВыполненияТекущ+ЗнОкноВыполненияПриращ;
                 ОкноВыполненияПоложение(int(ЗнОкноВыполненияТекущ));
                 l=ПоискВмассиве(TempStrArray1,ТекущаяКартотека+'#{'+ВыделитьСлово(2,Переменная,'=')+'}',true,начномер);
                 ФлагКопироватьЗапись=l>0;
                 if ФлагКопироватьЗапись:УдалитьИзМассива(TempStrArray1,l);
                    ТекстФайлЗаписатьСтроку(нф1,'(');
                    if ukey:ТекстФайлЗаписатьСтроку(нф1,Переменная);fi;
                    if не ТекстФайлКонецФайла(нф):Значение=ТекстФайлПрочитатьСтроку(нф);fi;
                 fi;
              fi;
            | true:
              if ФлагКопироватьЗапись:
                 if не ТекстФайлКонецФайла(нф):Значение=ТекстФайлПрочитатьСтроку(нф);fi;
                 ss=ОтрезатьСлева(Переменная);
                 if pos('UKEY=',ss)=1:if ukey:ТекстФайлЗаписатьСтроку(нф1,Переменная);fi;
                  | pos('CreateTime=',ss)=1:if crTime:ТекстФайлЗаписатьСтроку(нф1,Переменная);fi;
                  | pos('UpdateTime=',ss)=1:if upTime:ТекстФайлЗаписатьСтроку(нф1,Переменная);fi;
                  | true:
                    ТекстФайлДописатьСтроку(нф1,Переменная);
                    ТекстФайлЗаписатьСтроку(нф1,Значение);
                 fi;
               | true:Значение=ТекстФайлПрочитатьСтроку(нф);
              fi;
           fi;
        fi;
      od;
     ОкноВыполненияПоложение(карт+1);
     ОкноВыполненияЗакрыть;
     Окончание
      ТекстФайлЗакрыть(нф1);
      ТекстФайлЗакрыть(нф);
     Конец;
  od;
--  нф
  if ЕстьФайл(МестоВыгрузки+файлимя+'.CRD'):УдалитьФайл(МестоВыгрузки+файлимя+'.CRD');fi;
  if ЕстьФайл(МестоВыгрузки+файлимя+'.CDF'):УдалитьФайл(МестоВыгрузки+файлимя+'.CDF');fi;
  ДобавитьФайл(МестоВыгрузки+файлимянов+'.CRD',МестоВыгрузки+файлимя+'.CRD');
  ДобавитьФайл(МестоВыгрузки+файлимянов+'.CDF',МестоВыгрузки+файлимя+'.CDF');
  if ЕстьФайл(МестоВыгрузки+файлимянов+'.CRD'):УдалитьФайл(МестоВыгрузки+файлимянов+'.CRD');fi;
  if ЕстьФайл(МестоВыгрузки+файлимянов+'.CDF'):УдалитьФайл(МестоВыгрузки+файлимянов+'.CDF');fi;
  ОчиститьПеременную(РАБ.НФА.B03.TempStrArray2);
  ОчиститьПеременную(РАБ.НФА.B03.TempStrArray1);
^time-tt;
end;


2_     -- в доработке --
  Func ЗаписатьПеременнуюРОвФайл(НРО:i;ИмяПеременной:s;нф:i;КолУровень:i):L;
--    var ss:s;
--    ТекстФайлЗаписатьСтроку(нф,Повтор('  ',КолУровень-1)+ВыделитьСлово(2,СписокПолейКартотеки[i],'#')+':'+ТипCDF(ВыделитьСлова(3,2,СписокПолейКартотеки[i],'#')));

    ^true;
  end;
2_  Func ВыделитьУровень(CRD_VAR:s):s;-- убирает номера и значение0. РПО_ОСТ_НФА@000017]ПОЗИЦИИ@000004]#ИНВ#25
    var ii,j:i;
    var sss,ss,ss1:s;
    ii=КоличествоСлов(CRD_VAR,']');
    sss='';
    for j=1..ii-1 do
      ss=ВыделитьСлово(j,CRD_VAR,']');
      ss1=ВыделитьСлово(1,ss,'@');
      sss=sss+'@'+ss1;
--      if длина(ss1)>0:sss=sss+'@'+ss1;
--       | true:sss=sss+'@'+ss;
--      fi;
    od;
  --^ВыделитьСлова(1,2,sss,'#');
  sss=Удалить(ВыделитьСлово(1,sss,'#'),1,1);
  ^sss;
  end;
2_  Func ВыделитьНомер(CRD_VAR:s;NN:i):s; -- выделяет номер
    var ii,j:i;
    var sss,ss,ss1:s;
      ss=ВыделитьСлово(nn,CRD_VAR,']');
      ^ВыделитьСлово(КоличествоСлов(ss,'@'),ss,'@');
2_  end;

  var СоздатьCRD_VAL[]:s;
  var СоздатьCRD_VAR[]:s; -- РПО_ОСТ_НФА@000017]ПОЗИЦИИ@000004]#ИНВ#25
  -- картотека РПО_ОСТ_НФА с ukey=17, подтаблица ПОЗИЦИИ с ukey=4, поле ИНВ со значением СоздатьCRD_VAL[25]
  2Func0 РазницаУровней(VR_OLD:s;VR_NEW:s):i;-- VR_OLD и VR_NEW до переменной
    var kol1,kol2,i:i;
    var ss1,ss2:s;
    if VR_OLD=VR_NEW:^0;fi;-- если равные последние слова по последнему слову VR_OLD и это же последнее слово VR_NEW
    kol1=КоличествоСлов(VR_OLD,'@');
    kol2=КоличествоСлов(VR_NEW,'@');
    if kol1=0:^kol2;fi;
    if kol2=0:^-(kol1-1);fi;
    while ss1=ss2 и i<kol1 do
      i=i+1;
      ss1=ВыделитьСлово(i,VR_OLD,']');
      ss2=ВыделитьСлово(i,VR_NEW,']');
    od;
    if ss1=ss2:^kol2-kol1;fi;-- если равные последние слова по которым проводилась сверка(это возможно лишь при i=kol1)
    if ss1='':^kol2-kol1;fi;-- если равные последние слова по которым проводилась сверка(это возможно лишь при i=kol1)
    if ss2='':^kol1-kol2;fi;-- если равные последние слова по которым проводилась сверка(это возможно лишь при i=kol1)
    VR_OLD=ВыделитьСлово(i,VR_OLD,']');
    VR_NEW=ВыделитьСлово(i,VR_NEW,']');
    VR_OLD=ВыделитьСлово(1,VR_OLD,'@');
    VR_NEW=ВыделитьСлово(1,VR_NEW,'@');
    if VR_OLD<>VR_NEW:^i-kol1-101;fi;-- не равны совсем (по самой подтаблице или таблице) закрываем запись и подтаблицу
    ^i-kol1;--закрываем запись и подтаблицу, для последнего значения только запись
2  end;

2  Func СоздатьCRD(файлимя:s;картимя:s;ukey:l;crTime:l;upTime:l;Добавить:l):0i2;
  var нф,i,j,k,ii,jj,КолУровень,КолУровеньcur,КолУровеньДо,iiVLcur,iiVL:i;
  var times:i;
  var ss,ss0,Уровеньcur,УровеньcurДо,Уровень,УровеньДо,crTimeS,upTimeS,VL,VR,VR_PRED:s;
  var ll:l;
    times=time;
    crTimeS=ДатуВстроку(сегодня)+' '+Раб.НФА.B01.TimeToString(время);
    upTimeS='UpdateTime='+crTimeS;
    crTimeS='CreateTime='+crTimeS;
--    СортироватьМассив(СоздатьCRD_VAR,false);
    СортироватьМассив(СоздатьCRD_VAR,true);
    iiVL=ДлинаМассива(СоздатьCRD_VAR);
    if iiVL<1:^-1;fi;
    iiVLcur=0;
    ss='';ss0='';
    if pos('\',картимя)>1:-- берем структуру из файла
       ClearVariable(Раб.НФА.B03.СписокПолейКартотеки);
       if ЕстьФайл(картимя):
          if Загрузить_СтрМассив_ИзФайла('Раб.НФА.B03.СписокПолейКартотеки','',1,картимя):ii=ДлинаМассива(Раб.НФА.B03.СписокПолейКартотеки);
           | true:ii=0;
          fi;
        | true:ii=0;
       fi;
     | true:ii=ЗаполнитьСписокВсехПолейКартотеки(картимя);
    fi;

    k=1;
    for j=1..ii do -- оставляем только уровневые таблицы и подтаблицы, отбрасываем переменные!
      if КоличествоСлов(СписокПолейКартотеки[k],'#')>1:
         УдалитьИзМассива(СписокПолейКартотеки,k);
       | true:СписокПолейКартотеки[k]=up(СписокПолейКартотеки[k]);k=k+1;
      fi;
    od;
    ii=ДлинаМассива(СписокПолейКартотеки);
    if ii<1:^-1;fi;
    if не Добавить или не ЕстьФайл(файлимя):нф=ТекстФайлСоздать(файлимя);
     | true:нф=ТекстФайлОткрытьНаЗапись(файлимя);
    fi;

   попытка
    -- РПО_ОСТ_НФА@000017]ПОЗИЦИИ@000004]#ИНВ#25
    ТекстФайлВКонец(нф);
    _Уровень.='';
    i=0;
    КолУровеньДо=0;
    УровеньДо='';
    VR_PRED='';
    ОкноВыполненияПоказать(iiVL,'Выгрузка картотеки '+картимя+' в '+файлимя);
    while iiVLcur<=iiVL do -- пока все данные не записали не успокоимся!
      iiVLcur=iiVLcur+1;
      ОкноВыполненияПоложение(iiVLcur);
      VR=up(СоздатьCRD_VAR[iiVLcur]);                 -- уровень и переменная =РПО_ОСТ_НФА@000017]ПОЗИЦИИ@000004]#ИНВ#25
      if VR<>'' or iiVLcur>iiVL:
        VL=СоздатьCRD_VAL[int(ВыделитьСлово(3,VR,'#'))];-- текущее значение переменной
        jj=РазницаУровней(ВыделитьСлово(1,VR_PRED,'#'),ВыделитьСлово(1,VR,'#'));
        if jj=0:ТекстФайлЗаписатьСтроку(нф,Повтор('  ',КолУровень-1)+ВыделитьСлово(2,VR,'#')+'='+VL);
         | jj>0:--поднимаем уровень
             Уровеньcur   =ВыделитьУровень(VR)+'@#';          -- выделенный уровень с именем переменной =РПО_ОСТ_НФА@ПОЗИЦИИ@#
             КолУровеньcur=КоличествоСлов(VR,'@');
             -- рисуем уровни до нашей переменной
             while Уровеньcur<>Уровень и Уровеньcur<>'#' do --пишем по порядку пока не найдем, что надо писать с данными...
               i=i+1;if i>ii:i=1;fi;-- i текущее значение в СписокПолейКартотеки

               Уровень=СписокПолейКартотеки[i]; --уровень CDF без переменной =РПО_ОСТ_НФА@ПОЗИЦИИ@#
               КолУровень=КоличествоСлов(Уровень,'@')-1;
               if pos(ВыделитьСлово(1,Уровень,'#'),Уровеньcur)=1:--выгружаем только ветки с реальными данными...

                    -- Открыт новый уровень
                   ТекстФайлЗаписатьСтроку(нф,Повтор('  ',КолУровень-1)+'['+ВыделитьСлова(1,КолУровень,Уровень,'@'));
                   ТекстФайлЗаписатьСтроку(нф,Повтор('  ',КолУровень-1)+'(');
                   if ukey:-- ukey уровня данных
                     ТекстФайлЗаписатьСтроку(нф,Повтор('  ',КолУровень-1)+'UKEY='+str(int(ВыделитьНомер(VR,КолУровень))));
                   fi;
                   if КолУровень=1:-- Time пишется только для таблиц
                     if crTime:ТекстФайлЗаписатьСтроку(нф,Повтор('  ',КолУровень-1)+upTimeS);fi;-- upTimeS пишется только для таблиц, т.е. кроме подтаблиц
                     if upTime:ТекстФайлЗаписатьСтроку(нф,Повтор('  ',КолУровень-1)+crTimeS);fi;-- crTimeS пишется только для таблиц т.е. кроме подтаблиц
                   fi;
                 КолУровеньДо=КолУровень;
                 УровеньДо   =Уровень;
               fi;
             od;
             ТекстФайлЗаписатьСтроку(нф,Повтор('  ',КолУровень-1)+ВыделитьСлово(2,VR,'#')+'='+VL);
         |  jj<0:j=1;
            if jj<-100:
               jj=jj+100;ll=true;
             | true:ll=false;
            fi;
            --jj=jj+1;
            КолУровень=КоличествоСлов(VR_PRED,'@')-1;
            if iiVLcur>iiVL:
              for k=jj..-1 do j=j+1;
                ТекстФайлЗаписатьСтроку(нф,Повтор('  ',КолУровень-j+1)+')');
                ТекстФайлЗаписатьСтроку(нф,Повтор('  ',КолУровень-j+1)+']');
              od;
             | true:
              for k=jj..-2 do j=j+1;
                ТекстФайлЗаписатьСтроку(нф,Повтор('  ',КолУровень-j+1)+')');
                ТекстФайлЗаписатьСтроку(нф,Повтор('  ',КолУровень-j+1)+']');
              od;
              if не ll:
                ТекстФайлЗаписатьСтроку(нф,Повтор('  ',КолУровень-j)+')');
              fi;
              if jj=-1:
                ТекстФайлЗаписатьСтроку(нф,Повтор('  ',КолУровень-j)+'(');
                if ukey:-- ukey уровня данных
                  ТекстФайлЗаписатьСтроку(нф,Повтор('  ',КолУровень-1)+'UKEY='+str(int(ВыделитьНомер(VR,КолУровень))));
                fi;
                if КолУровень=1:-- Time пишется только для таблиц
                  if crTime:ТекстФайлЗаписатьСтроку(нф,Повтор('  ',КолУровень-1)+upTimeS);fi;-- upTimeS пишется только для таблиц, т.е. кроме подтаблиц
                  if upTime:ТекстФайлЗаписатьСтроку(нф,Повтор('  ',КолУровень-1)+crTimeS);fi;-- crTimeS пишется только для таблиц т.е. кроме подтаблиц
                fi;

              fi;

              if jj=-1:j=j-1;fi;
              if КолУровень=j и jj=-1:j=j-1;fi;
              if ll:j=j-1;fi;
              Уровень=ВыделитьСлова(1,КолУровень-j,VR_PRED,']');
              Уровень=ВыделитьУровень(Уровень+']#')+'@#';
              i=ПоискВмассиве(СписокПолейКартотеки,Уровень,true);
              Уровеньcur   =ВыделитьУровень(VR)+'@#';          -- выделенный уровень с именем переменной =РПО_ОСТ_НФА@ПОЗИЦИИ@#
              КолУровеньcur=КоличествоСлов(VR,'@');
               -- рисуем уровни до нашей переменной
               while Уровеньcur<>Уровень и Уровеньcur<>'@#' do --пишем по порядку пока не найдем, что надо писать с данными...
                 i=i+1;if i>ii:i=1;fi;-- i текущее значение в СписокПолейКартотеки

                 Уровень=СписокПолейКартотеки[i]; --уровень CDF без переменной =РПО_ОСТ_НФА@ПОЗИЦИИ@#
                 КолУровень=КоличествоСлов(Уровень,'@')-1;
                 if pos(ВыделитьСлово(1,Уровень,'#'),Уровеньcur)=1:--выгружаем только ветки с реальными данными...

                      -- Открыт новый уровень
                     if (КолУровень<>j и jj=-1) или ll или КолУровеньДо<КолУровень:
--                     if (КолУровень<>j и jj<0) или ll:
                     ТекстФайлЗаписатьСтроку(нф,Повтор('  ',КолУровень-1)+'['+ВыделитьСлова(1,КолУровень,Уровень,'@'));
                     fi;
                     ТекстФайлЗаписатьСтроку(нф,Повтор('  ',КолУровень-1)+'(');
                     if ukey:-- ukey уровня данных
                       ТекстФайлЗаписатьСтроку(нф,Повтор('  ',КолУровень-1)+'UKEY='+str(int(ВыделитьНомер(VR,КолУровень))));
                     fi;
                     if КолУровень=1:-- Time пишется только для таблиц
                       if crTime:ТекстФайлЗаписатьСтроку(нф,Повтор('  ',КолУровень-1)+upTimeS);fi;-- upTimeS пишется только для таблиц, т.е. кроме подтаблиц
                       if upTime:ТекстФайлЗаписатьСтроку(нф,Повтор('  ',КолУровень-1)+crTimeS);fi;-- crTimeS пишется только для таблиц т.е. кроме подтаблиц
                     fi;
                   КолУровеньДо=КолУровень;
                   УровеньДо   =Уровень;
                 fi;
               od;
               ТекстФайлЗаписатьСтроку(нф,Повтор('  ',КолУровень-1)+ВыделитьСлово(2,VR,'#')+'='+VL);
            fi;
        fi;
        VR_PRED=VR;
      fi;
    od;
   Окончание
    ТекстФайлЗакрыть(нф);
    ОкноВыполненияЗакрыть;
   Конец;
   ОчиститьПеременную(РАБ.НФА.B03.СписокПолейКартотеки);
   ОчиститьПеременную(РАБ.НФА.B03.СоздатьCRD_VAL);
   ОчиститьПеременную(РАБ.НФА.B03.СоздатьCRD_VAR);
    ^time-times;
2_  end;
Func СписокПолейКартДляФормированияСПР(CardFileName:s):s;-- спр1|спр2|спр3#поле1@ конст1@поле2@поле3@ конст2+спр4|спр5#поле4@ конст3@поле5
if CardFileName='РПО_Рост'          :^'РОСТ.*'            +'#ПРИЗНАК'                               ;
 | CardFileName='РПО_Размер'        :^'РАЗМЕР.*'          +'#ПРИЗНАК'                               ;
 | CardFileName='РПО_ПОСТАВКА'      :^'ПРТ.*'             +'#ПРИЗНАК'                               ;
 | CardFileName='РПО_ВИДДОК'        :^'ВИДДОК.*'          +'#ПРИЗНАК'                               ;
 | CardFileName='РПО_ДОК'           :^'ДОК.*'             +'#ПРИЗНАК'                               ;
 | CardFileName='РПО_ИНВКАРТ_ОС'    :^'ИНВВЕД.*'          +'#НФА@ .УЧН.@УЧН'                        ;
 | CardFileName='РПО_ДНФА'          :^'ДНФА.*'            +'#ДНФА'                                  ;
 | CardFileName='РПО_МЕСТОНФА'      :^'М.*'               +'#КОД'                                   ;
 | CardFileName='ТМЦ'               :^'ТМЦ.*'             +'#ПРИЗНАК'                               ;
 | CardFileName='ПОДРАЗДЕЛЕНИЯ'     :^'П.*'               +'#КОД'                                   ;
 | CardFileName='РПО_ДенДок_Вид'    :^'ДенДок.*'          +'#ПРИЗНАК'                               ;
 | CardFileName='РПО_БО'            :^'БО.*'              +'#ПРИЗНАК'                               ;
 | CardFileName='РПО_ПГР'           :^'ПГР.*'             +'#ПРИЗНАК'                               ;
 | CardFileName='СОТРУДНИКИ'        :^'Ф.*|МОЛ.*'         +'#ПРИЗНАК'                               ;
 | CardFileName='КОНТРАГЕНТ'        :^'К.*|ПБС.*'         +'#ПРИЗНАК'                               ;
 | CardFileName='РПО_ДОГОВОР'       :^'КРЕДИТ.*|ДОГОВОР.*'+'#ПРИЗНАК'                               ;
 | CardFileName='БАНК_СЧЕТА'        :^'ЛС.*'              +'#РПО_ЛСЧЕТ'        +'+ЛС.*'  +'#РСЧЕТ'  ;
 | CardFileName='РПО_НФА'           :^'НФА.*|ГНФА.*'      +'#ГРНФА@ .@ПРИЗНАК' +'+КВ.*'  +'#ПРИЗНАК';
fi;
 ^'';
end;
2Func0 ЗагрузкаСправочников-- перед загрузкой карт справочников требуется обработать аналитику [ОбработатьАналит]
-----------------------------------------------------------------------------------------------------------------------------------------
 (CardFileName:s;         -- Полное имя  файла CRD (пример= c:\выгрузка\карт_справочники.CRD)
  Обновлять:l;            -- Обновлять=true :если такая запись существует,то Ukey загружаемой записи приравнивается Ukey уже существующей, для обновления уже существующей записи
                          -- Обновлять=false:если такая запись существует,то загружаемая запись удаляется из загружаемого файла,т.е. не загружается
  Ukey:l;                 -- Ukey=false: значения Ukey из загружаемого файла удаляются,т.е. новые записи просто добавляются без конфликта по Ukey
                          -- кроме записей обработанных по Обновлять=true
                          -- Ukey=true : значения Ukey из загружаемого файла не удаляются,т.е. новые записи заменяют старые
                          -- кроме записей обработанных по Обновлять=true
  ЗагрузитьБезВопросов:l; --
  ЗаменаЗначения:s;       --
  ПроверятьНаАналитику:l  --
 ):s;
-----------------------------------------------------------------------------------------------------------------------------------------
 var ll,ll1,ИерархическаяКарт,Автообр:l;
 var CardName,ss,ss1,prizn:s;
 var ЗаменаЗначенияfield:s;
 var ii,p,j,j0,i,k,z,kk,kolUkey,UKEYnomRec,wa,kolzk,t:i;
 var rec:запись;
 var ЗаменаЗначенияl :l;
   Автообр=Автообработка;
   ЗадатьАвтообработку(false);
   ОчиститьПеременную(Раб.НФА.B03.TempStrArray1);
   ОчиститьПеременную(Раб.НФА.B03.TempStrArray2);
-- cdf=ПеремПБ('НФА')+'\cdf\';
-- CardName=SubStr(CardFileName,1,Length(CardFileName)-4);
 if not ExistFile(CardFileName):
    ^'Справочники из'+CardFileName+' не загружен - отсутствует файл:'+CardFileName;
 fi;
 ll=Загрузить_СтрМассив_ИзФайла('Раб.НФА.B03.TempStrArray1','Раб.НФА.B03.TempStrArray2',1,CardFileName);
 ii=ДлинаМассива(TempStrArray1);
 if ii=0:^'Справочники из'+CardFileName+' не загружен т.к. файл:'+CardFileName+' пустой!';fi;
 j0=0;
 j=0;
 ЗаменаЗначения=trim(ЗаменаЗначения);
 ЗаменаЗначенияl=ЗаменаЗначения<>'';
 if ЗаменаЗначенияl: 
    ЗаменаЗначенияfield=up(trim(ВыделитьСлово(1,ЗаменаЗначения,'=')));
 fi;
 for i=1..ii do
   j=j+1;
   if pos('(',TempStrArray1[j])=1:j0=j;k=0;-- k не должно превышать zk
      ОчиститьПеременную(Раб.НФА.B03.TempStrArray4);
      ОчиститьПеременную(Раб.НФА.B03.TempIntArray1);-- хранятся номера строк для Ukey подтаблиц
      kolUkey=0;UKEYnomRec=0;
    | pos('[',TempStrArray1[j])=1:CardName=ВыделитьСлово(1,TempStrArray1[j],'[');--новая картотека
      ОчиститьПеременную(Раб.НФА.B03.TempStrArray3);
      if ПроверятьНаАналитику:
         ss=СписокПолейКартДляФормированияСПР(CardName);
         ИерархическаяКарт=Иерархическая(CardName);
         kolzk=КоличествоСлов(ss,'+');
         ОчиститьПеременную(Раб.НФА.B03.zk);
         ОчиститьПеременную(Раб.НФА.B03.zp);
         ОчиститьПеременную(Раб.НФА.B03.zkspr);
         for t=1..kolzk do
           ss1=ВыделитьСлово(t,ss,'+');
           zkspr[t]=ВыделитьСлово(1,ss1,'#');--взяли список справочников
           ss1     =ВыделитьСлово(2,ss1,'#');--взяли список полей
           k=КоличествоСлов(ss1,'@');
           zp[t]=k;--запомнили количество полей для текущего случая
           p=СуммаМассива(zp,t-1);
           for z=1+p..k+p do
             TempStrArray3[z]=ВыделитьСлово(z,ss1,'@');if pos(' ',TempStrArray3[z])<>1:zk[t]=zk[t]+1;fi;
           od;
         od;
      fi;
    | pos(')',TempStrArray1[j])=1:-- закончилась запись, подбиваем итоги
        -- собираем признак и обрабатываем его (либо оставляем после проверки, либо удаляем с позиции j0)
        k=ДлинаМассива(TempStrArray3);
        if k>0: -- если картотека является картотекой аналитики
          -- сборка и поиск признака!
          ll=false;
          for t=1..kolzk do
            prizn='';
            p=СуммаМассива(zp,t-1);
            k=zp[t];

            for z=1+p..k+p do
              if длина(TempStrArray4[z])>0:prizn=prizn+TempStrArray4[z];
               | true:
                 if pos(' ',TempStrArray3[z])=1:prizn=prizn+Удалить(TempStrArray3[z],1,1);fi;
              fi;
            od;

            prizn='('+zkspr[t]+')&*.'+prizn;
            for sign ss=prizn do -- ищем соответствие записи картотеки и записи загружаемой картотеки
              if CardName=КартотекаПризнака(ss,false):
                 rec=ПризнакВЗапись(ss,false);
                 ll1=false;
                 if rec<>nil:
                   wa=OpenWorkArea(CardName,'','UKEY='+ЗаписьВстроку(rec));
                      z=p;
                      if records(wa)>0:
                        ll1=true;
                        while z<k+p и ll1 do
                          z=z+1;
                          if pos(' ',TempStrArray3[z])<>1:--если реальное имя поля
                             ll1=ll1 и TempStrArray4[z]=ВзятьПолеС(wa,1,TempStrArray3[z]);
                          fi;
                        od;
                      fi;
                   CloseWorkArea(wa);
                 fi;
                 if ll1:-- нашли такую же запись
                    ll=true;
                    prizn=ss;
                    break;
                 fi;
              fi;
            od;
          od;
          if не Обновлять и ll:
             for z=j0..j do
               УдалитьИзМассива(TempStrArray1,j0);
               УдалитьИзМассива(TempStrArray2,j0);
             od;
             j=j0-1;
           | true:
              if не ukey:--удаляем ukey подтаблиц
                for z=1..kolUkey do
                 УдалитьИзМассива(TempStrArray1,TempIntArray1[z]+1-z);
                 УдалитьИзМассива(TempStrArray2,TempIntArray1[z]+1-z);
                od;
                j=j-kolUkey;
              fi;

              if ll:--нашли такую же запись
                if  Обновлять:-- устанавливаем соответствие по ukey для обновления
                  --проверка на ключ [ukey]
                  if UKEYnomRec=0:-- добавляем строчку с ukey
                     ВставитьВмассив(TempStrArray1,j0+1,'');
                     ВставитьВмассив(TempStrArray2,j0+1,'');
                     UKEYnomRec=j0+1;
                     j=j+1;
                  fi;
                  TempStrArray1[UKEYnomRec]='UKEY='+str(ЗаписьКчислу(rec));-- установили соответствие по ykey в картотеке и файле загрузки
                fi;
               | true:--не нашли такую же запись
                  if UKEYnomRec>0:-- удаляем UKEY если он есть
                     УдалитьИзМассива(TempStrArray1,TempIntArray1[UKEYnomRec]);
                     УдалитьИзМассива(TempStrArray2,TempIntArray1[UKEYnomRec]);
                     j=j-1;
                  fi;
              fi;
          fi;


         | true: -- картотека не генерирует аналитику
               -- [Обновлять] не нужен, просто загружаем+ проверка на ключ [ukey]
                  if не ukey:--удаляем ukey подтаблиц
                    for z=1..kolUkey do
                     УдалитьИзМассива(TempStrArray1,TempIntArray1[z]+1-z);
                     УдалитьИзМассива(TempStrArray2,TempIntArray1[z]+1-z);
                    od;
                    j=j-kolUkey;
                    if UKEYnomRec>0:-- удаляем UKEY если он есть
                       УдалитьИзМассива(TempStrArray1,TempIntArray1[UKEYnomRec]);
                       УдалитьИзМассива(TempStrArray2,TempIntArray1[UKEYnomRec]);
                       j=j-1;
                    fi;
                  fi;
        fi;
    | pos('UKEY=',TempStrArray1[j])=1:UKEYnomRec=j;
    | pos('  ',TempStrArray1[j])<>1 and pos(']',TempStrArray1[j])<>1:-- наткнулись на поле ищем его в списке
          kk=0;
          ss1=ВыделитьСлово(1,TempStrArray1[j],'=');
          if ЗаменаЗначенияl:
             if ЗаменаЗначенияfield=ss1:TempStrArray1[j]=ЗаменаЗначения;fi;
          fi;

          while kk>=0 do --ищем поле пока все не найдем
            p=ПоискВмассиве(TempStrArray3,ss1,false,kk+1);
            kk=ПоискВмассиве(TempStrArray3,ss1,false,kk+1);
            if kk>0:TempStrArray4[kk]=Удалить(TempStrArray1[j],1,pos('=',TempStrArray1[j]));fi;
          od;
    |   not Ukey:
           p=pos('UKEY=',up(trim(TempStrArray1[j])));
           if p>0: --запоминаем Ukey подтаблицы
             kolUkey=kolUkey+1;
             TempIntArray1[kolUkey]=j;
           fi;
   fi;
 od;
   k=ДлинаМассива(TempStrArray1);
   p=k;
   КопироватьМассив(РАБ.НФА.B03.TempStrArray1,РАБ.НФА.B03.TempStrArray3);
   КопироватьМассив(РАБ.НФА.B03.TempStrArray2,РАБ.НФА.B03.TempStrArray4);
   for z=2..k do
     if pos('[',TempStrArray3[z-1])=1 и TempStrArray3[z]=']':
        УдалитьИзМассива(TempStrArray3,z);
        УдалитьИзМассива(TempStrArray3,z-1);
        УдалитьИзМассива(TempStrArray4,z);
        УдалитьИзМассива(TempStrArray4,z-1);
        k=k-2;z=z-1;
     fi;
   od;
   k=ДлинаМассива(TempStrArray3);
   if k=0 и p>0:
    ^'Данные по загружаемым картотекам с аналитикой^Mуже присутствуют в текущей базе данных^Mзагрузка картотек не требуется!';
   fi;

   ss=ПеремПБ('cache');
   if SubStr(ss,длина(ss),1)<>'\':ss=ss+'\';fi;
   ss1=CardFileName;
   CardFileName=ВыделитьСлова(КоличествоСлов(CardFileName,'\'),1,CardFileName,'\');
   CardFileName=ВыделитьСлова(1,КоличествоСлов(CardFileName,'.')-1,CardFileName,'.');
   ДобавитьФайл(ВыделитьСлова(1,КоличествоСлов(ss1,'.')-1,ss1,'.')+'.CDF',ss+CardFileName+'.CDF');
   ll=Выгрузить_СтрМассив_Вфайл('Раб.НФА.B03.TempStrArray1','Раб.НФА.B03.TempStrArray2',1,ДлинаМассива(TempStrArray1),ss+CardFileName+'.CRD',false);

--   ll=Выгрузить_СтрМассив_Вфайл('Раб.НФА.B03.TempStrArray1','Раб.НФА.B03.TempStrArray2',1,ДлинаМассива(TempStrArray1),CardFileName,false);
   if ll:
--    try

--     ИмпортБазы(ieCRD,CardFileName,Ложь,Ложь,Ложь,дублЗаменить,Ложь,Ложь);
-- CardFileName=ВыделитьСлова(1,КоличествоСлов(CardFileName,'.')-1,CardFileName,'.');

     ImportCard(ieCRD,CardName,ss+CardFileName+'.CDF',Ложь,Ложь,Ложь,Ложь,дублЗаменить,Ложь);
--     ImportCard(ieCRD,CardName,CardFileName,Ложь,Ложь,Ложь,Ложь,дублЗаменить,Ложь);

     ll=true;
--    except
 --    ll=false;
--    end;
   fi;
    if ЕстьФайл(ss+CardFileName+'.CDF'):УдалитьФайл(ss+CardFileName+'.CDF');fi;
    if ЕстьФайл(ss+CardFileName+'.CRD'):УдалитьФайл(ss+CardFileName+'.CRD');fi;

   ЗадатьАвтообработку(Автообр);
   if ll:^'';
    | true:^'Ошибка при загрузке!';
   fi;
2end0;
  Func ВыгрузитьКартВфайлФильтр(Префикс:s;Карт:s;ФильтрКарт:s;ФильтрКартПодтабл:s;ПутьФайл:s;УслНаПроводки:s):L;
  var ss,ss0,ss1,типполя,имяполя,sstab,ssstab,фильтр1,Карт1:s;
  var ii,j,j1,k,z,zz,zz1,p:i;
  var lll,ТолькоСучетомПодтаблиц,LREC,LREC1:l;
  var wa,war,rs,rs1,r1,r,rrs,iiCRD,iiCRD_Откат,wac,rt,tt:i;
  var curN:N;
  var curI:I;
  var curL:L;
  var curS:S;
  var curD:D;
  var curR:Record;
     if Длина(Карт)>1:
       ОчиститьПеременную(РАБ.НФА.B03.СписокПолейКартотеки);
       ОчиститьПеременную(РАБ.НФА.B03.СоздатьCRD_VAL);
       ОчиститьПеременную(РАБ.НФА.B03.СоздатьCRD_VAR);
       ОчиститьПеременную(РАБ.НФА.B03.TempIntArray1);-- заполняем список ukey
       if Длина(УслНаПроводки)>3:
         for transaction tt=УслНаПроводки,1.1.100,1.1.3010 do
           if ПроводКартотека(tt)=Карт:
              ДобавитьВмассив(TempIntArray1,true,false,ЗаписьКчислу(ПроводЗапись(tt)));
           fi;
         od;
       fi;
       iiCRD=1;
       z=ЗаполнитьСписокВсехПолейКартотеки(Карт);
       wa=OpenWorkArea(Карт,'',фильтркарт);
         rs=Records(wa);
         ОчиститьПеременную(РАБ.НФА.B03.TempStrArray1);
         for zz=1..z do
           if pos(Карт+'@#',СписокПолейКартотеки[zz])=1:--поле картотеки
              типполя=ВыделитьСлово(3,СписокПолейКартотеки[zz],'#');
              if типполя<>'[]' и типполя<>'TП':-- не подтаблица
                 ДобавитьВмассив(TempStrArray1,true,false,СписокПолейКартотеки[zz]);
              fi;
           fi;
         od;
         ОчиститьПеременную(РАБ.НФА.B03.TempStrArray2);-- заполняем список подтаблиц
         for zz=1..z do
           if pos(Карт+'@#',СписокПолейКартотеки[zz])=1:--поле картотеки
              типполя=ВыделитьСлово(3,СписокПолейКартотеки[zz],'#');
              if (типполя='[]' или типполя='TП') и типполя<>'':-- подтаблица
                 ДобавитьВмассив(TempStrArray2,true,false,СписокПолейКартотеки[zz]);
              fi;
           fi;
         od;
         rrs=ДлинаМассива(TempStrArray2);
         j=ДлинаМассива(TempStrArray1);
         ОкноВыполненияПоказать(rs,'Выгрузка '+Карт+Префикс+' '+ФильтрКарт+' '+ФильтрКартПодтабл);
         LREC=Длина(УслНаПроводки)>3;
         for r=1..rs do
           ОкноВыполненияПоложение(r);
           if LREC:
              zz=ПоискВмассиве(TempIntArray1,ЗаписьКчислу(ВзятьКлючЗаписи(wa,r)),true);
              LREC1=zz>0;
              if LREC1:УдалитьИзМассива(TempIntArray1,zz);fi;
            | true:LREC1=true;
           fi;
           if LREC1:
             sstab=Карт+'@'+format('%.6d',r)+']'; --'РПО_ОСТ_НФА@000017]
             -- пишем поля картотеки
             wac=wa;rt=r;

             -- пишем поля подтаблиц
             ТолькоСучетомПодтаблиц=длина(ФильтрКартПодтабл)<3;
             -- если фильтра на подтабл нет то выгружаем запись всегда
             iiCRD_Откат=iiCRD;
             for k=1..rrs do --пробегаем список подтаблиц
               фильтр1='';
               карт1=ВыделитьСлово(2,TempStrArray2[k],'@');
               карт1=ВыделитьСлово(1,карт1,'#');
               p=pos('#'+карт1+'@','#'+ФильтрКартПодтабл);
               if p>0:-- есть фильтр
                 ss=Удалить(ФильтрКартПодтабл,1,p);
                 ss=Удалить(ss,1,длина(карт1));
                 p=pos('#',ss);
                 if p>0:ss=Удалить(ss,p,256);fi;
                 фильтр1=ss;
               fi;
               ОчиститьПеременную(РАБ.НФА.B03.TempStrArray3);
               for zz1=1..z do
                 if pos(Карт+'@'+Карт1+'@#',СписокПолейКартотеки[zz1])=1:--поле картотеки
                    типполя=ВыделитьСлово(3,СписокПолейКартотеки[zz1],'#');
                    if типполя<>'[]' и типполя<>'TП':-- не подтаблица
                       ДобавитьВмассив(TempStrArray3,true,false,СписокПолейКартотеки[zz1]);
                    fi;
                 fi;
               od;
               j1=ДлинаМассива(TempStrArray3);
               war=OpenArray(wa,r,карт1,'',фильтр1);
                 rs1=Records(war);
                 if rs1>0 и длина(фильтр1)>3:ТолькоСучетомПодтаблиц=true;fi;
                 for r1=1..rs1 do
                   ssstab=sstab+Карт1+'@'+format('%.6d',r1)+']'; -- РПО_ОСТ_НФА@000017]ПОЗИЦИИ@000004]#ИНВ#25
                   -- пишем поля картотеки
                   wac=war;rt=r1;
                   for zz1=1..j1 do
                     типполя=ВыделитьСлово(3,TempStrArray3[zz1],'#');
                     имяполя=ВыделитьСлово(2,TempStrArray3[zz1],'#');
                     lll=false;
                     if типполя='NЧ':curN=GetFieldN(wac,rt,имяполя);if curN<>0      :РАБ.НФА.B03.СоздатьCRD_VAL[iiCRD]=str(curN,8)         ;lll=true;fi;
                      | типполя='IЦ':curI=GetFieldI(wac,rt,имяполя);if curI<>0      :РАБ.НФА.B03.СоздатьCRD_VAL[iiCRD]=str(curI)           ;lll=true;fi;
                      | типполя='LЛ':curL=GetFieldL(wac,rt,имяполя);if curL         :РАБ.НФА.B03.СоздатьCRD_VAL[iiCRD]='T'                 ;lll=true;fi;
                      | типполя='SС':curS=GetFieldS(wac,rt,имяполя);if curS<>''     :РАБ.НФА.B03.СоздатьCRD_VAL[iiCRD]=curS                ;lll=true;fi;
                      | типполя='DД':curD=GetFieldD(wac,rt,имяполя);if curD<>1.1.100:РАБ.НФА.B03.СоздатьCRD_VAL[iiCRD]=ДатуВстроку(curD)   ;lll=true;fi;
                      | типполя='RЗ':curR=GetFieldR(wac,rt,имяполя);if curR<>nil    :РАБ.НФА.B03.СоздатьCRD_VAL[iiCRD]=str(ЗаписьКчислу(curR));lll=true;fi;
                     fi;
                     if lll:РАБ.НФА.B03.СоздатьCRD_VAR[iiCRD]=ssstab+'#'+имяполя+'#'+str(iiCRD);iiCRD=iiCRD+1;fi;
                   od;

                 od;
               CloseWorkArea(war);
             od;
             if (not ТолькоСучетомПодтаблиц) and iiCRD>iiCRD_Откат:
                iiCRD_Откат=iiCRD_Откат+1;
                for tt=iiCRD_Откат..iiCRD do
                  УдалитьИзМассива(РАБ.НФА.B03.СоздатьCRD_VAL,iiCRD_Откат);
                  УдалитьИзМассива(РАБ.НФА.B03.СоздатьCRD_VAR,iiCRD_Откат);
                od;
                iiCRD_Откат=iiCRD_Откат-1;
                iiCRD=iiCRD_Откат;
             fi;
             if ТолькоСучетомПодтаблиц:
               wac=wa;rt=r;
               for zz=1..j do
                 типполя=ВыделитьСлово(3,TempStrArray1[zz],'#');
                 имяполя=ВыделитьСлово(2,TempStrArray1[zz],'#');
                 lll=false;
                 if типполя='NЧ':curN=GetFieldN(wac,rt,имяполя);if curN<>0      :РАБ.НФА.B03.СоздатьCRD_VAL[iiCRD]=str(curN,8)         ;lll=true;fi;
                  | типполя='IЦ':curI=GetFieldI(wac,rt,имяполя);if curI<>0      :РАБ.НФА.B03.СоздатьCRD_VAL[iiCRD]=str(curI)           ;lll=true;fi;
                  | типполя='LЛ':curL=GetFieldL(wac,rt,имяполя);if curL :РАБ.НФА.B03.СоздатьCRD_VAL[iiCRD]='T'                 ;lll=true;fi;
                  | типполя='SС':curS=GetFieldS(wac,rt,имяполя);if curS<>''     :РАБ.НФА.B03.СоздатьCRD_VAL[iiCRD]=curS        ;lll=true;fi;
                  | типполя='DД':curD=GetFieldD(wac,rt,имяполя);if curD<>1.1.100:РАБ.НФА.B03.СоздатьCRD_VAL[iiCRD]=ДатуВстроку(curD)   ;lll=true;fi;
                  | типполя='RЗ':curR=GetFieldR(wac,rt,имяполя);if curR<>nil    :РАБ.НФА.B03.СоздатьCRD_VAL[iiCRD]=str(ЗаписьКчислу(curR));lll=true;fi;
                 fi;
                 if lll:РАБ.НФА.B03.СоздатьCRD_VAR[iiCRD]=sstab+'#'+имяполя+'#'+str(iiCRD);iiCRD=iiCRD+1;fi;
               od;
             fi;
           fi;
         od;
       ОкноВыполненияЗакрыть;
       CloseWorkArea(wa);
     fi;
  if ДлинаМассива(РАБ.НФА.B03.СоздатьCRD_VAR)>0:
    lll=СоздатьCDF(ПутьФайл+Карт+Префикс+'.CDF',Карт,false,false,false,false);
    ii =СоздатьCRD(ПутьФайл+Карт+Префикс+'.CRD',Карт,false,false,false,false);
  fi;
   ^true;
  end;

2_----------------- Функции и процедуры для работы с табличными журналами ------------
func ВзятьКлючРаздела(ИмяЖур:s):i;-- возвращает UKEY раздела
  var wa,i:i;
  ИмяЖур=up(ИмяЖур);
--  if up(ТипЖурнала(ИмяЖур))<>'РАЗД':^-2;fi;
  wa=ОткрытьРабочуюОбласть('Table_Razd','','UP(РАЗДЕЛ)="'+ИмяЖур+'"');
  if записей(wa)>0:i=ЗаписьКЧислу(ВзятьКлючЗаписи(wa,1));
   | true:i=0;
  fi;
  ЗакрытьРабочуюОбласть(wa);
  ^i;
end;

var СписокЖурналов[]:s;-- список журналов номер#тип#имя
func ЗаполнитьСписокЖурналов(тип:s):i;--  тип='ТЕКСТ#РАЗД#КАРТ'.    wordc
 var КолЖур,i:i;
 var ИмяЖур,ТипЖур:s;
  ОчиститьПеременную(СписокЖурналов);
  КолЖур=ЧислоЖурналов;
  for i=0..КолЖур do
    ИмяЖур=up(ИмяЖурнала(i));
    ТипЖур=up(ТипЖурнала(ИмяЖур));
    if СловоВСтроке(ТипЖур,тип,'#'):
       ДобавитьВМассив(СписокЖурналов,true,false,str(i)+'#'+ТипЖур+'#'+ИмяЖур);
    fi;
  od;
  КолЖур=ДлинаМассива(СписокЖурналов);
  --for i=1..КолЖур do trace(СписокЖурналов[i]);od;
  ^ДлинаМассива(СписокЖурналов);
end;
func ОткрытьРазделНом(НомЖур:i):i; -- Открывает рабочую область на раздел по номеру журнала, в случае ошибки значение меньше нуля
 var i:i;
 var ИмяЖур:s;
    if НомЖур<0 or НомЖур>ЧислоЖурналов:^-1;fi;
    ИмяЖур=ИмяЖурнала(НомЖур);
    if up(ТипЖурнала(ИмяЖур))<>'РАЗД':^-2;fi;
    i=ВзятьКлючРаздела(ИмяЖур);if i>0:^ОткрытьРабочуюОбласть('Table_Oper','','РАЗДЕЛ='+ЗаписьВстроку(ЧислоВЗапись(i)));fi;^-1;
end;
func ОткрытьРазделИмя(ИмяЖур:s):i; -- Открывает рабочую область на раздел по имени журнала, в случае ошибки значение меньше нуля
 var i:i;
    i=ВзятьКлючРаздела(ИмяЖур);if i>0:^ОткрытьРабочуюОбласть('Table_Oper','','РАЗДЕЛ='+ЗаписьВстроку(ЧислоВЗапись(i)));fi;^-1;
end;
func ОткрытьРазделИмяФильтр(ИмяЖур:s;Фильтр:s):i; -- Открывает рабочую область на раздел по имени журнала с фильтром, в случае ошибки значение меньше нуля
 var i:i;
    Фильтр=trim(Фильтр);
    if Фильтр<>'':Фильтр=' and ('+Фильтр+')';fi;
    i=ВзятьКлючРаздела(ИмяЖур);if i>0:^ОткрытьРабочуюОбласть('Table_Oper','','РАЗДЕЛ='+ЗаписьВстроку(ЧислоВЗапись(i))+Фильтр);fi;^-1;
end;

func ОткрытьРазделыНомера(НомераЖур:s):i; -- НомЖур=0,1,2,3 Открывает рабочую область на разделы по номерам журналов через запятую, в случае ошибки значение меньше нуля
 var фильтр,ss:s;
 var i,j,НомЖур:i;
    j=КоличествоСлов(НомераЖур,',');
    ss='';
    for i=1..j do
      НомЖур=int(ВыделитьСлово(i,НомераЖур,','));
      if НомЖур<0 or НомЖур>ЧислоЖурналов:^-1;fi;
      if up(ТипЖурнала(ИмяЖурнала(НомЖур)))<>'РАЗД':^-2;fi;
      ss=ss+','+str(НомЖур);
    od;
    ^ОткрытьРабочуюОбласть('Table_Oper','','pos(","+str(РАЗДЕЛ),'+НомераЖур+')>0');

end;
func ОткрытьРазделыВсе:i;
    ^ОткрытьРабочуюОбласть('Table_Oper','');
end;

var vCreateTime  :date   ;
var vUpdateTime  :date   ;
var vClosedModFob:l      ;
var vCreatedUser :string ;
var vModifiedUser:string ;
var vX           :l      ;
var vДата        :date   ;
var vСумма       :string ;
var vValSum      :n      ;
var vBalSum      :n      ;
var vВалюта      :string ;
var vHasBalSum   :l      ;
var vIsBalFirst  :l      ;
var vКоличество  :n      ;
var vКолАналитика:string ;
var vРаздел      :record ;
var vINTONOM     :n      ;
var vОперация    :string ;
var vСодержание  :string ;
var vDEBET       :string ;
var vCREDIT      :string ;
var vПараметры   :string ;
var vАналитика   :string ;
Proc ClearTrVar;
 ClearVariable(vCreateTime  );
 ClearVariable(vUpdateTime  );
 ClearVariable(vClosedModFob);
 ClearVariable(vCreatedUser );
 ClearVariable(vModifiedUser);
 ClearVariable(vX           );
 ClearVariable(vДата        );
 ClearVariable(vСумма       );
 ClearVariable(vValSum      );
 ClearVariable(vBalSum      );
 ClearVariable(vВалюта      );
 ClearVariable(vHasBalSum   );
 ClearVariable(vIsBalFirst  );
 ClearVariable(vКоличество  );
 ClearVariable(vКолАналитика);
-- ClearVariable(vРаздел      );
 ClearVariable(vINTONOM     );
 ClearVariable(vОперация    );
 ClearVariable(vСодержание  );
 ClearVariable(vDEBET       );
 ClearVariable(vCREDIT      );
 ClearVariable(vПараметры   );
 ClearVariable(vАналитика   );
end;
Proc ЗагрузитьРазделИмя(ИмяТабЖурОст:s; ВременныйФайл:s;СтрокВременныйФайл:i);
 var wa,rs,i,ii,t,нз,p,ТекущНомСтр:i;
 var СетеваяВерсия:l;
 var ss1,ss2:s;
 var nn1,vСумм:n;
 var ssl,sslrec,sslNet:LongString;
         i=ВзятьКлючРаздела(ИмяТабЖурОст);
         if i>0:
            ssl='vCreateTime=CreateTime|vUpdateTime=UpdateTime';
            sslrec='vДата=Дата'
                  +'|vX=X|vHasBalSum=HasBalSum|vIsBalFirst=IsBalFirst'
                  +'|vСумма=Сумма|vВалюта=Валюта|vКолАналитика=КолАналитика|vОперация=Операция|vСодержание=Содержание|vDEBET=DEBET|vCREDIT=CREDIT|vПараметры=Параметры|vАналитика=Аналитика'
                  +'|vValSum=ValSum|vBalSum=BalSum|vКоличество=Количество|vINTONOM=INTONOM'
                  +'|vРаздел=Раздел';
            sslNet='vCreatedUser=CreatedUser|vModifiedUser=ModifiedUser';
            vРаздел=числовзапись(i);
            wa=ОткрытьРабочуюОбласть('Table_Oper','','1=0');
             Попытка
               НачатьИзменения(wa);
                Попытка
                ОткрытьТекстовыйЖурнал(ВременныйФайл);
                ОкноВыполненияПоказать(СтрокВременныйФайл,'Загрузка проводок в табличный журнал '+ИмяТабЖурОст);
                 While not ВзятьПроводкуИзТекстовогоЖурнала(vДата, vСумм, ss1, nn1, ss2, vDEBET, vCREDIT, Раб.НФА.B03.TempStrArray1, vСодержание) do
                   vСумма=str(vСумм,2);
                   vОперация=vDEBET+' '+vCREDIT;
                   ii=ДлинаМассива(Раб.НФА.B03.TempStrArray1);
                   vАналитика='';
                   for t=1..ii do
                     p=pos(':',TempStrArray1[t]);
                     if p>0:
                        vКолАналитика=SubStr(TempStrArray1[t],1,p-1);
                        vКоличество=round(trim(SubStr(TempStrArray1[t],p+1,255)),точность(vКолАналитика));
                      | true:vАналитика=vАналитика+' '+up(TempStrArray1[t]);
                     fi;

                   od;
                  ТекущНомСтр=ТекущНомСтр+1;
                  нз=insertrecord(wa);
                  нз=ЗаписатьВполяПеременные(wa,нз,'',sslrec);
    --              deleteallrecords(wa);
    --             for i=1..rs do
    --              нз=ЗаписатьВполяПеременные(wa,i,'',sslrec);
    --              if СетеваяВерсия:
    --        --        нз=ЗаписатьВполяПеременные(wa,i,'',sslNet);
    --              fi;
    --             od;


                  ОкноВыполненияПоложение(ТекущНомСтр);
                  ClearTrVar;
                 od;
--                ЗакрытьТекстовыйЖурнал;
                ОкноВыполненияЗакрыть;

               ЗакончитьИзменения(wa);
                Исключение
               ОтменитьИзменения(wa);
                Возбудить;
                Конец;
             Окончание
                ЗакрытьТекстовыйЖурнал;
             ЗакрытьРабочуюОбласть(wa);
             Конец;
         fi;

end;
Proc ButtonTest_OnClick(Sender: String);
 var wa,rs,i,нз:i;
 var СетеваяВерсия:l;
 var ssl,sslrec,sslNet:LongString;
 СетеваяВерсия=ИмяПользователя(ИмяБазы('Table_Oper'))<>'';
 --trace(str(ЗаполнитьСписокЖурналов('ТЕКСТ#РАЗД#КАРТ')));
 trace('разделы='+str(ЗаполнитьСписокЖурналов('РАЗД')));
 wa=ОткрытьРазделИмя(ВыборЖурнала);
 if wa>0:
  -- wa=ОткрытьВсеРазделы;
   rs=records(wa);
   ssl='vCreateTime=CreateTime|vUpdateTime=UpdateTime';
   sslrec='vДата=Дата'
         +'|vClosedModFob=ClosedModFob|vДата=Дата|vX=X|vHasBalSum=HasBalSum|vIsBalFirst=IsBalFirst'
         +'|vСумма=Сумма|vВалюта=Валюта|vКолАналитика=КолАналитика|vОперация=Операция|vСодержание=Содержание|vDEBET=DEBET|vCREDIT=CREDIT|vПараметры=Параметры|vАналитика=Аналитика'
         +'|vValSum=ValSum|vBalSum=BalSum|vКоличество=Количество|vINTONOM=INTONOM'
         +'|vРаздел=Раздел';
   sslNet='vCreatedUser=CreatedUser|vModifiedUser=ModifiedUser';
   Попытка
     НачатьИзменения(wa);
      Попытка
       for i=1..rs do
        ВзятьПоляВПеременные(wa,i,'',ssl);
        ВзятьПоляВПеременные(wa,i,'',sslrec);
        if СетеваяВерсия:
          ВзятьПоляВПеременные(wa,i,'',sslNet);
        fi;
        ---- перемещаем проводку из одного раздела в другой -----------
        нз=ЗаписьКчислу(vРаздел);
        if нз=4:vРаздел=ЧислоВзапись(1);
         | нз=1:vРаздел=ЧислоВзапись(4);
        fi;
        ---------------------------------------------------------------
        trace(ЗаписьВстроку(vРаздел));
        vX=not vX;

        нз=ЗаписатьВполяПеременные(wa,i,'',sslrec);
        if СетеваяВерсия:
  --        нз=ЗаписатьВполяПеременные(wa,i,'',sslNet);
        fi;
       od;
     ЗакончитьИзменения(wa);
      Исключение
     ОтменитьИзменения(wa);
      Возбудить;
      Конец;
   Окончание
   ЗакрытьРабочуюОбласть(wa);
 Конец;
 fi;
end;

-- РАБ.НФА.B01.КопироватьЗаписьПодтаблицыБланкаРедактора(BlnName+'.СписокПолейКартотеки',ДлинаМассива(СписокПолейКартотеки),CrdName,'ПОЗИЦИИ',i,i+1);
--ВзятьИменаКартотек(УсловиеОтбора : Строка; МассивКартотек[] : Строка; Подтаблицы : Логич; Комментарий : Логич; СсылочнаяКартотека : Строка): Целое;
--ВзятьКоментарийПоляКартотеки (Картотека : Строка; ИмяПоля : Строка) : Строка;
--ВзятьТипПоляКартотеки(ИмяКарт:Строка; ИмяПоля:Целое) :Целое;
--ВыборКартотеки(ИмяКарт:Строка) :Целое;
--ЕстьКартотека(Имя : Строка) : Логич;
--Задан(Поле : Ссылка) : Логич;  Поле = ссылочное поле картотеки.
--ЗаписьСуществует(ИмяКарт : Строка; ЗаписьКарт: Запись) : Логич;
--КартотекаЖурнала(ИмяЖурналаjdf : Строка) : Строка;
--КартотекаПризнака(АналитПризнак : Строка[; ОбработатьАналит: Логич])) : Строка;
--КартотекаПризнакЗаписи(Картотека:Строка; Поле:Строка; Справочник:Строка; Ссылка:Запись[; ГрупДоп:Строка]): Строка;
-- ПризнакВЗапись(АналитПризнак : Строка[; ОбработкаАналит:Логич]) : Запись;
-- Зап = ПризнакВЗапись(Признак, Ложь);
-- задано значение "Ложь", т.к. до начала цикла вызывали процедуру ОбработатьАналит

--ЭкспортБазы(Формат:Целое; Файл:Строка; ЗаголовокЛогич; Режим:Логич; DOS:Логич);
--ИмпортБазы(Формат:Целое; Файл:Строка; Режим:Логич; DOS:Логич; Подтв:Логич; Действ:Целое; Удал:Логич [; ПоказДиалог:Логич]);
--ЭкспортКартотеки(Формат:Целое; Картотека:Строка | Картотеки[]:Строка; Файл:Строка; Фильтр:Логич; ВидимПоля:Логич; РазымПоля:Логич; НомЗап:Логич; ЗаголовокЛогич; Режим:Логич; DOS:Логич; ТаблСсыл:Логич);
--ИмпортКартотеки(Формат:Целое; Картотека:Строка; Файл:Строка; ВидимПоля:Логич; Режим:Логич; DOS:Логич; Подтв:Логич; Действ:Целое; Удал:Логич [; ПоказДиалог:Логич [;Настройки:Логич ]]);
Конец
