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


БланкСШаблоном "Броузер";
-- бланк для работы с данными в формате CRD и CDF
-- Возможности:

-- открывает card.CRD с описанием структуры card.CDF

-- при отсутствии card.bro_ini, создает card.bro_ini по умолчанию из структуры card.CDF, 
-- или по card.bro из $LocalData\Картотеки или другого места на выбор

--редактирование данных
--выбор записей для работы с ними (фильр)
--запись данных в картотеку по записям попавшим в фильр в режиме добавления, восстановления(замена по ukey)
--запись данных в картотеку по любой записи и полю выборочно
--сохранение данных в формат CRD и CDF другой картотеки с подстановкой по полям и конвертацией форматов(используется функция формат)

--хранение данных с историей изменений данных в записи по UpdateTime

--  var СоздатьCRD_VAR[]:s; -- РПО_ОСТ_НФА@000017]ПОЗИЦИИ@000004]#ИНВ#25
--  -- картотека РПО_ОСТ_НФА с ukey=17, подтаблица ПОЗИЦИИ с ukey=4, поле ИНВ со значением СоздатьCRD_VAL[25]

--CreateTime=18.08.2006 10:36:42
--UpdateTime=18.08.2006 10:37:01


--CreateTime=CreateTime,0,15,0,1,f,0
--UpdateTime=UpdateTime,0,15,0,1,f,1

--ЛИМИТ=Лимит(значение),0,10,2,1,t,110
--поле=синоним_броузера,вывод_столбуа(0/1),ширина(знаков),точность_знаков,только_чтение(0/1),сумма(f/t),порядковый_номер_столбца




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_--0.  2Func0 _СоздатьCRD.(файлимя:s;ukey:l;crTime:l;upTime:l;Добавить:l):l;
2_----------------- Функции и процедуры для работы с табличными журналами ------------

var Tables[]:s;
var TablesUkey[]:i;
var TempStrArray3[]:s;
var TempStrArray4[]:s;
var TempIntArray1[]:i;

--2_Func0. ЗагрузкаCRD(Файл:s):i;--загрузка картотеки во внутренний формат РПО_ОСТ_НФА@000017]ПОЗИЦИИ@000004]#ИНВ#25--значение
--				     -- 0-без ошибок, или код ошибки
--    var нф,i:i;
--    var ss1,ss2,curTable:s;
--    var ll:l;
--    if не ЕстьФайл(Файл):^-1;fi;
--    ClearVariable(Tables);
--    ClearVariable(TablesUkey);
--     Попытка
--	нф =ТекстФайлОткрытьНаЧтение(Файл);
--	Пока не ТекстФайлКонецФайла(нф) do
--	  ss1=ТекстФайлПрочитать(нф,255);
--	  if не ТекстФайлКонецФайла(нф):
--	   ss2=ТекстФайлПрочитатьСтроку(нф);
--	  fi;
--	  if pos('[',trim(ss1))=1:-- смена таблицы или подтаблицы
--	     curTable=SubStr(trim(ss1),2,255);

--	   | true:
--	  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;


--  ^0;
--2_end;


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;

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;
    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 в случае ошибки
  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='';
    ii=ЗаполнитьСписокВсехПолейКартотеки(картимя);
    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
 ):s;
-----------------------------------------------------------------------------------------------------------------------------------------
 var ll,ll1,ИерархическаяКарт,Автообр:l;
 var CardName,ss,ss1,prizn:s;
 var ii,p,j,j0,i,k,z,kk,kolUkey,UKEYnomRec,wa,kolzk,t:i;
 var rec:запись;
   Автообр=Автообработка;
   ЗадатьАвтообработку(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;
 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);
      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;
    | 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],'=');
	  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,Ложь,Ложь,Ложь,Ложь,дублЗаменить,Ложь);
--     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.2020 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;
    if up(ТипЖурнала(ИмяЖур))<>'РАЗД':^-2;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 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:Логич; Подтв:Логич; Действ:Целое; Удал:Логич [; ПоказДиалог:Логич [;Настройки:Логич ]]);
Конец
