БЛАНКСШАБЛОНОМ "Оборотка НФА";
-- Разработка бланка: ТБ.БЮДЖЕТ
-- Первый релиз: 01.02.2011
var MaskUserVoc  :String="ВД.*|ВКЛ.*|КТ.*|П.*|ПБС.*|ПГР.*|РБС.*";
var infoVersion  :String="Версия отчета: 1.13.1106";
var sМаскаНФА    :String="((*.101.*|*.102.*|*.105.*)&(ЗАБ.??.???.??|???.????.???????.???.?.???.??.???))";
-- Объекты
btn_Exit:Object;   rb_AccAll:Object;   rb_ИстAll:Object;   rb_СчтВсе:Object;   rb_НФАEXT:Object;   cb_НФААМТ:Object;
btn_Calc:Object;   rb_Acc101:Object;   rb_ИстБюд:Object;   rb_СчтБал:Object;   rb_НФАONL:Object;   cb_НФА100:Object;
btnExcel:Object;   rb_Acc105:Object;   rb_ИстДох:Object;   rb_СчтЗаб:Object;   rb_NOUНФА:Object;   cb_НФАБЕЗ:Object;
--
Bevel1:Object;   rbtЦЕНАФОД:Object;   cb_Учет106xURep:Object;   cb_Use_ЦНП:Object;   lblVersion:Object;
Bevel2:Object;   rbtЦЕНАФРН:Object;   cb_Учет106xOnly:Object;   cb_Use_ЦДО:Object;
Bevel3:Object;   rbtЦЕНАУСЛ:Object;   cb_СкрытьПарОтч:Object;   cb_Use_ЦКО:Object;
Bevel4:Object;   rbtНЕТЦЕНЫ:Object;   cb_НстрВнВидОтч:Object;   cb_Use_ЦКП:Object;
Bevel5:Object;   rbtЦЕНАТИП:Object;
--
cb_УчетОст:Object; cb_ОстНП:Object; cb_Уч_М_НП:Object; cb_Уч_Р_НП:Object; cb_Уч_Б_НП:Object;
cb_УчетОбо:Object; cb_ОбДеб:Object; cb_Уч_М_ОД:Object; cb_Уч_Р_ОД:Object; cb_Уч_Б_ОД:Object;
                   cb_ОбКре:Object; cb_Уч_М_ОК:Object; cb_Уч_Р_ОК:Object; cb_Уч_Б_ОК:Object;
                   cb_ОстКП:Object; cb_Уч_М_КП:Object; cb_Уч_Р_КП:Object; cb_Уч_Б_КП:Object;
--
СекцArrayНФА     :Object;
СекцArrayМОЛ     :Object;
СекцArrayМХЭ     :Object;
СекцArrayДОП     :Object;

СекцШапка1       :Object;
СекцШапка2       :Object;
СекцОтбЦен       :Object;
Секц_ВнВид       :Object;
СекцДопСпр       :Object;
Секц_Групп       :Object;
Секц_Услов       :Object;
Секц_ОтДат       :Object;
Секц_UСорт       :Object;
СекцФксШап       :Object;
СекцТитул1       :Object;
СекцТитул2       :Object;
СекцТитул3       :Object;

СекцТ1З:Object;   СекцТ1Д:Object;   СекцТ1И:Object;
СекцТ2З:Object;   СекцТ2Д:Object;   СекцТ2И:Object;
СекцТ3З:Object;   СекцТ3Д:Object;   СекцТ3И:Object;

СекцWorkЗТ :Object; -- Основная таблица (ведомость) - строка заголовков
СекцWorkДТ :Object; -- Основная таблица (ведомость) - строки данных
СекцWorkИТ :Object; -- Основная таблица (ведомость) - строка итогов

всгОстНачСум     :Numeric;
всгПрхДебСум     :Numeric;
всгВнпДебСум     :Numeric;
всгОбоДебСум     :Numeric;
всгРсхКреСум     :Numeric;
всгВнпКреСум     :Numeric;
всгОбоКреСум     :Numeric;
всгОстКонСум     :Numeric;

СтрокиТ1         :Integer;  -- строки вспом таблицы N1
СтрокиТ2         :Integer;  -- строки вспом таблицы N2
СтрокиТ3         :Integer;  -- строки вспом таблицы N3
Позиции          :Integer;  -- строки ведомости
ПозицииArrayНФА  :Integer;  -- строки вспомогательного массива
ПозицииArrayМОЛ  :Integer;  -- строки вспомогательного массива
ПозицииArrayМХЭ  :Integer;  -- строки вспомогательного массива
ПозицииArrayДОП  :Integer;  -- строки вспомогательного массива
ДляПостроения    :Integer;  -- строки ведомости

-- Переменные
var btnName_menu :String='Оборотно-сальдовая ведомость НФА';
var Sort_menu    :String='08';
var Фокус        :String="";
var crdНФА       :String="РПО_НФА";
var crdГРП       :String="РПО_ОКЕИ_ГРУППЫ";
var pfxУЧН       :String="УЧН";
var ИзмГрп       :String;
var ИзмГрп_      :String=ИзмГрп;
flgClear         :String;   -- контроль очистки бланков
TimeCreationRep  :String;
СлужИнфоСЧТ      :String;
СлужИнфоАНА      :String;
СлужИнфоГРП      :String;
fldСОРТкод       :String;   -- поле сортировки
fldСОРТимя       :String;   -- расшифровка поля сортировки
fldСОРТимя_      :String=fldСОРТимя;
var LastGRP_num  :Integer;
var LastGRP_key  :String=["{0}"];
var OldОтчАНА    :String;   -- для запоминания и возвратов (дополнительная аналитика)
var OldЦена      :Integer;  -- для запоминания и возвратов
var OldDateНП    :Date;     -- для запоминания и возвратов
var OldDateКП    :Date;     -- для запоминания и возвратов
var Flag_onEnter :Logical;
curФтрAcc        :Integer=[1];
var oldФтрAcc    :Integer;
curФтрИст        :Integer=[1];
var oldФтрИст    :Integer;
curБалЗаб        :Integer=[1];
var oldБалЗаб    :Integer;
curФтрНФА        :Integer=[1];
var oldФтрНФА    :Integer;
curФтрЦен        :Integer=[1];
var oldФтрЦен    :Integer;

flgНФААМТ        :Logical;
flgНФА100        :Logical;
flgНФАБЕЗ        :Logical;
--
flgUse_ЦНП       :Logical;
flgUse_ЦДО       :Logical;
flgUse_ЦКО       :Logical;
flgUse_ЦКП       :Logical;
--
flgУчетОст:Logical; flgОстНП:Logical; flgУч_М_НП:Logical; flgУч_Р_НП:Logical; flgУч_Б_НП:Logical;
flgУчетОбо:Logical; flgОбДеб:Logical; flgУч_М_ОД:Logical; flgУч_Р_ОД:Logical; flgУч_Б_ОД:Logical;
                    flgОбКре:Logical; flgУч_М_ОК:Logical; flgУч_Р_ОК:Logical; flgУч_Б_ОК:Logical;
                    flgОстКП:Logical; flgУч_М_КП:Logical; flgУч_Р_КП:Logical; flgУч_Б_КП:Logical;
--
flgУчет106xURep  :Logical;
flgУчет106xOnly  :Logical;


flgSgnЕЦ         :Integer;
flgSgnНП         :Integer;
flgSgnДО         :Integer;
flgSgnКО         :Integer;
flgSgnКП         :Integer;

var flgSgnЕЦ_    :Integer=flgSgnЕЦ;
var flgSgnНП_    :Integer=flgSgnНП;
var flgSgnДО_    :Integer=flgSgnДО;
var flgSgnКО_    :Integer=flgSgnКО;
var flgSgnКП_    :Integer=flgSgnКП;

БМЦеныЕЦ         :Integer;
БМЦеныНП         :Integer;
БМЦеныДО         :Integer;
БМЦеныКО         :Integer;
БМЦеныКП         :Integer;

var flgСкрытьПарОтч  :Logical;
var flgНстрВнВидОтч  :Logical;

flgСлужИнф       :Logical;
flgПечСлужИнф    :Logical=[True];
intСхемаЦветов   :Integer=[1];
flgОтбЦенИИли    :Logical=[False];
intРежимСохр     :Integer=[1];
intРежимСохр_    :Integer=intРежимСохр;
flgЧиститьАна    :Logical=[True];
flgТолькоИнв     :Logical=[False];
flgТолькоИмя     :Logical=[False];
flgРсчИтгТаб1    :Logical=[True];
flgРсчИтгТаб2    :Logical=[True];
flgРсчИтгТаб3    :Logical=[True];
flgПечНовСтр     :Logical=[False];
flgВыдСчтНФА     :Logical=[False];

var flgФиксШапка :Logical=[False];
var flgФиксШапка_:Logical=flgФиксШапка;

flgСЧТ:Logical;   var flgСЧТ_:Logical=flgСЧТ;
flgКБК:Logical;   var flgКБК_:Logical=flgКБК;
flgИСТ:Logical;   var flgИСТ_:Logical=flgИСТ;
flgМОЛ:Logical;   var flgМОЛ_:Logical=flgМОЛ;
flgМХЭ:Logical;   var flgМХЭ_:Logical=flgМХЭ;
flgГРП:Logical;   var flgГРП_:Logical=flgГРП;
flgДОП:Logical;   var flgДОП_:Logical=flgДОП;
flgНФА:Logical;   var flgНФА_:Logical=flgНФА;

VOCКОД      :String;          -- Дополнительный справочник
VOCИМЯ      :String;
var VOCКОД_ :String=VOCКОД;

отчСЧТ      :String;          -- Фильтр по счету
отчКБК      :String;          -- Фильтр по КБК
valКБК      :String;          -- Фильтр по КБК (полное значение - для возвратов в меню)
отчМОЛ      :String;          -- Фильтр по МОЛ
nmsМОЛ      :String;          -- Ф.И.О. МОЛ
отчМХЭ      :String;          -- Фильтр по местонахождению
nmsМХЭ      :String;          -- Наименование местонахождения
keyГРП      :String;          -- Фильтр по группам НФА (ссылка на значение)
отчГРП      :String;          -- Фильтр по группам НФА (код аналитики)
nmsГРП      :String;          -- Наименование групп НФА
отчДОП      :String;          -- Фильтр по дополнителньому справочнику
nmsДОП      :String;          -- Наименование признака из дополнительного справочника
отчНФА      :String;          -- Фильтр по справочнику НФА
nmsНФА      :String;          -- Наименование признака НФА
--
отчАНА      :String;          -- Фильтр по дополнительной аналитике

var отчСЧТ_ :String=отчСЧТ;
var отчКБК_ :String=отчКБК;
var отчМОЛ_ :String=отчМОЛ;
var отчМХЭ_ :String=отчМХЭ;
var отчГРП_ :String=отчГРП;
var отчДОП_ :String=отчДОП;
var отчНФА_ :String=отчНФА;

УЧР_ИМЯ          :String;
УЧР_ОКПО         :String;
УЧР_REC          :Record;
ПОД_ИМЯ          :String;
ПОД_КОД          :String;
ИспДол           :String;
ИспФИО           :String;
ИспREC           :Record;
ДатИсп           :Date;
DataНП           :Date;
DataКП           :Date;
ОтчПрд           :Integer;
ОтчПрд_          :Integer=ОтчПрд;
отчПерТит        :String=if(DataНП>1.1.1900 and DataКП>1.1.1900, "отчет за период с "+DateToString(DataНП)+" по "+DateToString(DataКП-1), "");
--
ЗагОстНП         :String;
ЗагОборот        :String;
ЗагОстКП         :String;

флагиACC         :String;  -- для фильтра по счетам
Иерархия         :String;  -- строка формирования порядка полей иерархической группировки

count_arrНФА     :Integer;
count_arrМОЛ     :Integer;
count_arrМХЭ     :Integer;
count_arrДОП     :Integer;

-- Массивы
var Buf[]        :String;
var Txt[]        :String;
var aAna[]       :String;
var BufInt[]     :Integer;
var BufMsk[]     :String;
var BufStr[]     :String;
var KeyMsk[]     :String;
var KeyStr[]     :String;
var BufFlag[]    :Logical;
var иррхГРП[]    :String;  -- группы для возможного создания иерархии отчета
var иррхUSE[]    :Logical; -- вид отчета группы для возможного создания иерархии отчета (False - без вывода; True - иерархично)
var bindVOC[]    :String;  -- Привязанный справочник
var bindINT[]    :Integer; -- Количество привязок

var Fnd_101V[]   :String;  -- Имена справочников для выборки аналитики
var Fnd_106V[]   :String;  -- Имена справочников для выборки аналитики
var Fnd_AnaO[]   :String;  -- Значения справочников (аналитический признак) ОБЩИЙ
var Fnd_AnaD[]   :String;  -- Значения справочников (аналитический признак) для ДЕБЕТОВОГО оборота
var Fnd_AnaK[]   :String;  -- Значения справочников (аналитический признак) для КРЕДИТОВОГО оборота

GRPBUF[]         :String; -- Группы НФА (для вывода)
GRPDAT[]         :String; -- Группы НФА (данные)
GRPKEY[]         :String; -- Группы НФА (системная инфа)

var arr_REFНФА[] :String;
var arr_КОДНФА[] :String;
var arr_REFМОЛ[] :String;
var arr_КОДМОЛ[] :String;
var arr_REFМХЭ[] :String;
var arr_КОДМХЭ[] :String;
var arr_REFДОП[] :String;
var arr_КОДДОП[] :String;
var aHdrFldSRT[] :String;
var aUsrFldSRT[] :String;
--
var LST_UNIQUE[] :String;
var LST_OSTСУМ[] :Numeric;
var LST_OSTКОЛ[] :Numeric;
var LST_DEBСУМ[] :Numeric;
var LST_DEBКОЛ[] :Numeric;
var LST_DVPСУМ[] :Numeric;
var LST_DVPКОЛ[] :Numeric;
var LST_KREСУМ[] :Numeric;
var LST_KREКОЛ[] :Numeric;
var LST_KVPСУМ[] :Numeric;
var LST_KVPКОЛ[] :Numeric;
var LST_КОДИСТ[] :String;  -- источник (код)
var LST_КОДКБК[] :String;  -- КБК (код)
var LST_КОДСЧ6[] :String;  -- счет вида ???.?? (код)
var LST_ИМЯНФА[] :String;  -- наименование НФА
var LST_ИМЯИНВ[] :String;  -- инвентарный номер (расшифровка УЧН)
var LST_ИМЯМОЛ[] :String;  -- расшифровка кода МОЛ
var LST_ИМЯМХЭ[] :String;  -- расшифровка кода местонахождения
var LST_ИМЯДОП[] :String;  -- расшифровка дополнительного справочника
var LST_НЕТУЧН[] :Logical; -- без инвентарного номера
var LST_ЮЗРСРТ[] :String;  -- значение пользовательской сортировки

тSRTFLD[]        :String;
тНЕТУЧН[]        :Logical;
тНФАТИП[]        :String;
тНФАКОД[]        :String;
тНФАИМЯ[]        :String;
тНФАГРК[]        :String;
тНФАГРИ[]        :String;
тНФАЕДИ[]        :String;
тНФАУЧН[]        :String;
тНФАИНВ[]        :String;
тНФАИСТ[]        :String;
тНФАКБК[]        :String;
тНФАСЧ6[]        :String;
тМОЛКОД[]        :String;
тМОЛИМЯ[]        :String;
тМХЭКОД[]        :String;
тМХЭИМЯ[]        :String;
тДОПКОД[]        :String;
тДОПИМЯ[]        :String;

тСУМОСТ[]        :Numeric;
тКОЛОСТ[]        :Numeric;

тСУМДПО[]        :Numeric;
тКОЛДПО[]        :Numeric;
тСУМДВП[]        :Numeric;
тКОЛДВП[]        :Numeric;
тСУМДЕБ[]        :Numeric;
тКОЛДЕБ[]        :Numeric;

тСУМКРО[]        :Numeric;
тКОЛКРО[]        :Numeric;
тСУМКВП[]        :Numeric;
тКОЛКВП[]        :Numeric;
тСУМКРЕ[]        :Numeric;
тКОЛКРЕ[]        :Numeric;

тСУМКОН[]        :Numeric;
тКОЛКОН[]        :Numeric;

иСЧТнаимен[]     :String;
иСЧТостнач[]     :Numeric;      вСЧТостнач:Numeric;
иСЧТпрхдеб[]     :Numeric;      вСЧТпрхдеб:Numeric;
иСЧТвнпдеб[]     :Numeric;      вСЧТвнпдеб:Numeric;
иСЧТободеб[]     :Numeric;      вСЧТободеб:Numeric;
иСЧТрсхкре[]     :Numeric;      вСЧТрсхкре:Numeric;
иСЧТвнпкре[]     :Numeric;      вСЧТвнпкре:Numeric;
иСЧТобокре[]     :Numeric;      вСЧТобокре:Numeric;
иСЧТосткон[]     :Numeric;      вСЧТосткон:Numeric;

иИСТнаимен[]     :String;
иИСТостнач[]     :Numeric;      вИСТостнач:Numeric;
иИСТпрхдеб[]     :Numeric;      вИСТпрхдеб:Numeric;
иИСТвнпдеб[]     :Numeric;      вИСТвнпдеб:Numeric;
иИСТободеб[]     :Numeric;      вИСТободеб:Numeric;
иИСТрсхкре[]     :Numeric;      вИСТрсхкре:Numeric;
иИСТвнпкре[]     :Numeric;      вИСТвнпкре:Numeric;
иИСТобокре[]     :Numeric;      вИСТобокре:Numeric;
иИСТосткон[]     :Numeric;      вИСТосткон:Numeric;

иФКРнаимен[]     :String;
иФКРостнач[]     :Numeric;      вФКРостнач:Numeric;
иФКРпрхдеб[]     :Numeric;      вФКРпрхдеб:Numeric;
иФКРвнпдеб[]     :Numeric;      вФКРвнпдеб:Numeric;
иФКРободеб[]     :Numeric;      вФКРободеб:Numeric;
иФКРрсхкре[]     :Numeric;      вФКРрсхкре:Numeric;
иФКРвнпкре[]     :Numeric;      вФКРвнпкре:Numeric;
иФКРобокре[]     :Numeric;      вФКРобокре:Numeric;
иФКРосткон[]     :Numeric;      вФКРосткон:Numeric;

2-- Общие процедуры и функции
Proc ОчиститьВспомМассив;
 ClearVariable(arr_REFНФА);
 ClearVariable(arr_КОДНФА);
 ClearVariable(arr_REFМОЛ);
 ClearVariable(arr_КОДМОЛ);
 ClearVariable(arr_REFМХЭ);
 ClearVariable(arr_КОДМХЭ);
 ClearVariable(arr_REFДОП);
 ClearVariable(arr_КОДДОП);
 ClearVariable(aHdrFldSRT);
 count_arrНФА=0; count_arrМОЛ=0; count_arrМХЭ=0; count_arrДОП=0;
end;

Proc ОчиститьLST;
 ClearVariable(LST_UNIQUE);
 ClearVariable(LST_OSTСУМ);
 ClearVariable(LST_OSTКОЛ);
 ClearVariable(LST_DEBСУМ);
 ClearVariable(LST_DEBКОЛ);
 ClearVariable(LST_DVPСУМ);
 ClearVariable(LST_DVPКОЛ);
 ClearVariable(LST_KREСУМ);
 ClearVariable(LST_KREКОЛ);
 ClearVariable(LST_KVPСУМ);
 ClearVariable(LST_KVPКОЛ);
 ClearVariable(LST_КОДИСТ);
 ClearVariable(LST_КОДКБК);
 ClearVariable(LST_КОДСЧ6);
 ClearVariable(LST_ИМЯНФА);
 ClearVariable(LST_ИМЯИНВ);
 ClearVariable(LST_ИМЯМОЛ);
 ClearVariable(LST_ИМЯМХЭ);
 ClearVariable(LST_ИМЯДОП);
 ClearVariable(LST_НЕТУЧН);
 ClearVariable(LST_ЮЗРСРТ);
end;

Proc Очистить;
 ClearVariable(Buf);
 ClearVariable(Txt);
 ClearVariable(aAna);
 ClearVariable(BufInt);
 ClearVariable(BufMsk);
 ClearVariable(BufStr);
 ClearVariable(KeyMsk);
 ClearVariable(KeyStr);
 ClearVariable(BufFlag);
 --
 ClearVariable(иррхГРП);
 ClearVariable(иррхUSE);
 --
 ClearVariable(bindVOC);
 ClearVariable(bindINT);
 --
 ClearVariable(Fnd_101V);
 ClearVariable(Fnd_106V);
 ClearVariable(Fnd_AnaO);
 ClearVariable(Fnd_AnaD);
 ClearVariable(Fnd_AnaK);
 ОчиститьВспомМассив;
 ОчиститьLST;
end;

Proc ОчиститьГРПНФА;
 ClearVariable(GRPBUF); ClearVariable(GRPDAT); ClearVariable(GRPKEY);
end;

Proc ОчиститьОформление;
var OffsetCol, ii :Integer;
 OffsetCol=1;
 СекцWorkДТ.RowsCount=1;
 СекцWorkДТ.Row(1, RowVisible, False);
 СекцWorkДТ.CellLinks(OffsetCol+1, 1, -1, -1);
 for ii=1 to 12 do
   СекцWorkДТ.Cell(1, OffsetCol+ii,  CellContents, "", True);
   СекцWorkДТ.Cell(1, OffsetCol+ii,  CellFontStyle, 0);
   СекцWorkДТ.Cell(1, OffsetCol+ii,  CellFontSize,  8);
   СекцWorkДТ.Cell(1, OffsetCol+ii,  CellFontColor, coBlack);
   СекцWorkДТ.Cell(1, OffsetCol+ii,  CellBgColor,   coTransparent);
   СекцWorkДТ.Cell(1, OffsetCol+ii,  CellAlignment, 2);
   СекцWorkДТ.Cell(1, OffsetCol+ii,  CellBorder, "1,1,1,1");
   СекцWorkДТ.Cell(1, OffsetCol+ii,  CellWrap, True);
 od;
 СекцWorkДТ.Row(1, RowVisible, True);
end;

Proc ОчиститьТаблицу;
 ClearVariable(Позиции);
 ClearVariable(тSRTFLD);
 ClearVariable(тНЕТУЧН);
 ClearVariable(тНФАТИП);
 ClearVariable(тНФАКОД);
 ClearVariable(тНФАИМЯ);
 ClearVariable(тНФАГРК);
 ClearVariable(тНФАГРИ);
 ClearVariable(тНФАЕДИ);
 ClearVariable(тНФАУЧН);
 ClearVariable(тНФАИНВ);
 ClearVariable(тНФАИСТ);
 ClearVariable(тНФАКБК);
 ClearVariable(тНФАСЧ6);
 ClearVariable(тМОЛКОД);
 ClearVariable(тМОЛИМЯ);
 ClearVariable(тМХЭКОД);
 ClearVariable(тМХЭИМЯ);
 ClearVariable(тДОПКОД);
 ClearVariable(тДОПИМЯ);
 --
 ClearVariable(тСУМОСТ);
 ClearVariable(тКОЛОСТ);
 ClearVariable(тСУМДПО);
 ClearVariable(тКОЛДПО);
 ClearVariable(тСУМДВП);
 ClearVariable(тКОЛДВП);
 ClearVariable(тСУМДЕБ);
 ClearVariable(тКОЛДЕБ);
 ClearVariable(тСУМКРО);
 ClearVariable(тКОЛКРО);
 ClearVariable(тСУМКВП);
 ClearVariable(тКОЛКВП);
 ClearVariable(тСУМКРЕ);
 ClearVariable(тКОЛКРЕ);
 ClearVariable(тСУМКОН);
 ClearVariable(тКОЛКОН);
 ОчиститьОформление;
end;

Proc ОчиститьТаблицуN1;
 ClearVariable(СтрокиТ1);
 ClearVariable(иСЧТнаимен);
 ClearVariable(иСЧТостнач); ClearVariable(вСЧТостнач);
 ClearVariable(иСЧТпрхдеб); ClearVariable(вСЧТпрхдеб);
 ClearVariable(иСЧТвнпдеб); ClearVariable(вСЧТвнпдеб);
 ClearVariable(иСЧТободеб); ClearVariable(вСЧТободеб);
 ClearVariable(иСЧТрсхкре); ClearVariable(вСЧТрсхкре);
 ClearVariable(иСЧТвнпкре); ClearVariable(вСЧТвнпкре);
 ClearVariable(иСЧТобокре); ClearVariable(вСЧТобокре);
 ClearVariable(иСЧТосткон); ClearVariable(вСЧТосткон);
end;

Proc ОчиститьТаблицуN2;
 ClearVariable(СтрокиТ2);
 ClearVariable(иИСТнаимен);
 ClearVariable(иИСТостнач); ClearVariable(вИСТостнач);
 ClearVariable(иИСТпрхдеб); ClearVariable(вИСТпрхдеб);
 ClearVariable(иИСТвнпдеб); ClearVariable(вИСТвнпдеб);
 ClearVariable(иИСТободеб); ClearVariable(вИСТободеб);
 ClearVariable(иИСТрсхкре); ClearVariable(вИСТрсхкре);
 ClearVariable(иИСТвнпкре); ClearVariable(вИСТвнпкре);
 ClearVariable(иИСТобокре); ClearVariable(вИСТобокре);
 ClearVariable(иИСТосткон); ClearVariable(вИСТосткон);
end;

Proc ОчиститьТаблицуN3;
 ClearVariable(СтрокиТ3);
 ClearVariable(иФКРнаимен);
 ClearVariable(иФКРостнач); ClearVariable(вФКРостнач);
 ClearVariable(иФКРпрхдеб); ClearVariable(вФКРпрхдеб);
 ClearVariable(иФКРвнпдеб); ClearVariable(вФКРвнпдеб);
 ClearVariable(иФКРободеб); ClearVariable(вФКРободеб);
 ClearVariable(иФКРрсхкре); ClearVariable(вФКРрсхкре);
 ClearVariable(иФКРвнпкре); ClearVariable(вФКРвнпкре);
 ClearVariable(иФКРобокре); ClearVariable(вФКРобокре);
 ClearVariable(иФКРосткон); ClearVariable(вФКРосткон);
end;

Proc ОчиститьИтоги;
 ОчиститьТаблицуN1;
 ОчиститьТаблицуN2;
 ОчиститьТаблицуN3;
end;

Proc SetFLGСлужИнф;
 if flgПечСлужИнф and (СлужИнфоСЧТ<>"" or СлужИнфоАНА<>"" or СлужИнфоГРП<>""): flgСлужИнф=True; else flgСлужИнф=False; fi;
end;

Func ОтчетныйПериодВТекст(numПериод:Integer) :String;
if numПериод=01: ^"Сегодня";
|  numПериод=02: ^"Текущий месяц";
|  numПериод=03: ^"Текущий квартал";
|  numПериод=04: ^"Текущий год";
|  numПериод=05: ^"Вчера";
|  numПериод=06: ^"Прошлый месяц";
|  numПериод=07: ^"Прошлый квартал";
|  numПериод=08: ^"Прошлый год";
|  numПериод=09: ^"Текущий год - Январь";
|  numПериод=10: ^"Текущий год - Февраль";
|  numПериод=11: ^"Текущий год - Март";
|  numПериод=12: ^"Текущий год - Апрель";
|  numПериод=13: ^"Текущий год - Май";
|  numПериод=14: ^"Текущий год - Июнь";
|  numПериод=15: ^"Текущий год - Июль";
|  numПериод=16: ^"Текущий год - Август";
|  numПериод=17: ^"Текущий год - Сентябрь";
|  numПериод=18: ^"Текущий год - Октябрь";
|  numПериод=19: ^"Текущий год - Ноябрь";
|  numПериод=20: ^"Текущий год - Декабрь";
|  numПериод=21: ^"Текущий год - 1 квартал";
|  numПериод=22: ^"Текущий год - 2 квартал";
|  numПериод=23: ^"Текущий год - 3 квартал";
|  numПериод=24: ^"Текущий год - 4 квартал";
|  numПериод=25: ^"Прошлый год - Январь";
|  numПериод=26: ^"Прошлый год - Февраль";
|  numПериод=27: ^"Прошлый год - Март";
|  numПериод=28: ^"Прошлый год - Апрель";
|  numПериод=29: ^"Прошлый год - Май";
|  numПериод=30: ^"Прошлый год - Июнь";
|  numПериод=31: ^"Прошлый год - Июль";
|  numПериод=32: ^"Прошлый год - Август";
|  numПериод=33: ^"Прошлый год - Сентябрь";
|  numПериод=34: ^"Прошлый год - Октябрь";
|  numПериод=35: ^"Прошлый год - Ноябрь";
|  numПериод=36: ^"Прошлый год - Декабрь";
|  numПериод=37: ^"Прошлый год - 1 квартал";
|  numПериод=38: ^"Прошлый год - 2 квартал";
|  numПериод=39: ^"Прошлый год - 3 квартал";
|  numПериод=40: ^"Прошлый год - 4 квартал";
else ^"";
fi;
end;

Proc ИменаПериодовЗаголовков;
var Value :String;
  ЗагОстНП  = if(DataНП>1.1.1900, if(ОтчПрд<1, Chr(13), "")+DateToString(DataНП), "");
  if DataНП>1.1.1900 and DataКП>1.1.1900:
    Value=if(ОтчПрд<1, "произвольный период с"+Chr(13)+DateToString(DataНП)+" по "+DateToString(DataКП-1), ОтчетныйПериодВТекст(ОтчПрд));
  else
    Value="";
  fi;
  ЗагОборот = Value;
  ЗагОстКП  = if(DataКП>1.1.1900, if(ОтчПрд<1, Chr(13), "")+DateToString(DataКП), "");
end;

Proc ValidateВедомостьSection(СкрытьТаблицу:Logical);
var FF :Logical;
 if Позиции>0 and not СкрытьТаблицу: FF=True; else FF=False; fi;
 СекцWorkЗТ.Visible=FF;
 СекцWorkДТ.Visible=FF;
 СекцWorkИТ.Visible=FF;
 СекцТитул1.Visible=FF;
 СекцТитул2.Visible=FF;
 СекцТитул3.Visible=FF;
 СекцФксШап.Visible=FF;
   btnExcel.Enabled=FF;
 ИменаПериодовЗаголовков;
end;

Proc ValidateИтогиSection(СкрытьТаблицу:Logical);
var FF :Logical;
 FF=if(СтрокиТ1>0 and not СкрытьТаблицу, True, False); СекцТ1З.Visible=FF; СекцТ1Д.Visible=FF; СекцТ1И.Visible=FF;
 FF=if(СтрокиТ2>0 and not СкрытьТаблицу, True, False); СекцТ2З.Visible=FF; СекцТ2Д.Visible=FF; СекцТ2И.Visible=FF;
 FF=if(СтрокиТ3>0 and not СкрытьТаблицу, True, False); СекцТ3З.Visible=FF; СекцТ3Д.Visible=FF; СекцТ3И.Visible=FF;
end;

Proc ValidateОтчетSection;
 ValidateВедомостьSection(False);
 ValidateИтогиSection(False);
end;

Proc ОчисткаОтчета;
 Очистить;
 ОчиститьТаблицу;
 ОчиститьИтоги;
 ValidateОтчетSection;
 TimeCreationRep="";
 СлужИнфоСЧТ="";
 СлужИнфоАНА="";
 СлужИнфоГРП="";
 SetFLGСлужИнф;
 Template.Freeze(0, 0);
end;

Proc ValidateSection(СкрытьУсловия:Logical; ЭтоНастройка:Logical);
var Flag :Logical;
 ShowProgress(1, "Работаем...");
 Try
   Flag = not СкрытьУсловия;
   --
   if ЭтоНастройка: 
     cb_СкрытьПарОтч.Visible=Flag;
   else
     if not Flag: flgНстрВнВидОтч=False; cb_НстрВнВидОтч.State=False; fi;
     cb_НстрВнВидОтч.Visible=Flag;
   fi;
   --
   СекцШапка1.Visible=Flag;
   СекцОтбЦен.Visible=Flag;
   СекцШапка2.Visible=Flag;
   СекцДопСпр.Visible=Flag;
   Секц_Групп.Visible=Flag;
   Секц_Услов.Visible=Flag;
   Секц_ОтДат.Visible=Flag;
   Секц_UСорт.Visible=Flag;
   --
   btn_Calc.Visible=Flag;
   --
   cb_Учет106xURep.Visible=Flag;
   cb_Учет106xOnly.Visible=Flag;
   --
   rb_AccAll.Visible=Flag; rb_ИстAll.Visible=Flag; rb_СчтВсе.Visible=Flag; rb_НФАEXT.Visible=Flag;
   rb_Acc101.Visible=Flag; rb_ИстБюд.Visible=Flag; rb_СчтБал.Visible=Flag; rb_НФАONL.Visible=Flag;
   rb_Acc105.Visible=Flag; rb_ИстДох.Visible=Flag; rb_СчтЗаб.Visible=Flag; rb_NOUНФА.Visible=Flag;
   --
   Bevel1.Visible=Flag; rbtЦЕНАФОД.Visible=Flag; cb_Use_ЦНП.Visible=Flag; cb_НФААМТ.Visible=Flag;
   Bevel2.Visible=Flag; rbtЦЕНАФРН.Visible=Flag; cb_Use_ЦДО.Visible=Flag; cb_НФА100.Visible=Flag;
   Bevel3.Visible=Flag; rbtЦЕНАУСЛ.Visible=Flag; cb_Use_ЦКО.Visible=Flag; cb_НФАБЕЗ.Visible=Flag;
   Bevel4.Visible=Flag; rbtНЕТЦЕНЫ.Visible=Flag; cb_Use_ЦКП.Visible=Flag;
   Bevel5.Visible=Flag; rbtЦЕНАТИП.Visible=Flag;
   --
   cb_УчетОст.Visible=Flag; cb_ОстНП.Visible=Flag; cb_Уч_М_НП.Visible=Flag; cb_Уч_Р_НП.Visible=Flag; cb_Уч_Б_НП.Visible=Flag;
   cb_УчетОбо.Visible=Flag; cb_ОбДеб.Visible=Flag; cb_Уч_М_ОД.Visible=Flag; cb_Уч_Р_ОД.Visible=Flag; cb_Уч_Б_ОД.Visible=Flag;
                            cb_ОбКре.Visible=Flag; cb_Уч_М_ОК.Visible=Flag; cb_Уч_Р_ОК.Visible=Flag; cb_Уч_Б_ОК.Visible=Flag;
                            cb_ОстКП.Visible=Flag; cb_Уч_М_КП.Visible=Flag; cb_Уч_Р_КП.Visible=Flag; cb_Уч_Б_КП.Visible=Flag;
   --
   ValidateОтчетSection;
   --
 Finally
   CloseProgress;
 end;
end;

Proc ОчиститьУсловияОтбора(МожноСчт:Logical; МожноГрп:Logical; МожноАна:Logical);
 if МожноСчт:
   отчКБК=""; valКБК="";
 fi;
 if МожноГрп:
   keyГРП=""; отчГРП=""; nmsГРП=""; LastGRP_key="{0}"; LastGRP_num=0; ОчиститьГРПНФА;
 fi;
 if МожноАна:
   отчМОЛ=""; nmsМОЛ="";
   отчМХЭ=""; nmsМХЭ="";
   отчДОП=""; nmsДОП="";
   отчНФА=""; nmsНФА="";
 fi;
end;

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

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

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

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


Proc Даты_ЗаполнитьМенюДат(NODE:String);
 ClearVariable(Buf);
 if NODE="ROOT":
   Buf[01]="Произвольный период";
   Buf[02]=">> Выбрать из текущих периодов";
   Buf[03]=">> Выбрать из предыдущих периодов";
   Buf[04]=">> Выбрать текущий год - месяц";
   Buf[05]=">> Выбрать текущий год - квартал";
   Buf[06]=">> Выбрать прошлый год - месяц";
   Buf[07]=">> Выбрать прошлый год - квартал";
 |  NODE="СЕГОДНЯ":
   Buf[01]="...";
   Buf[02]="Сегодня";
   Buf[03]="Текущий месяц";
   Buf[04]="Текущий квартал";
   Buf[05]="Текущий год";
 |  NODE="ВЧЕРА":
   Buf[01]="...";
   Buf[02]="Вчера";
   Buf[03]="Прошлый месяц";
   Buf[04]="Прошлый квартал";
   Buf[05]="Прошлый год";
 |  NODE="ТЕКМЕС":
   Buf[01]="...";
   Buf[02]="Текущий год - Январь";
   Buf[03]="Текущий год - Февраль";
   Buf[04]="Текущий год - Март";
   Buf[05]="Текущий год - Апрель";
   Buf[06]="Текущий год - Май";
   Buf[07]="Текущий год - Июнь";
   Buf[08]="Текущий год - Июль";
   Buf[09]="Текущий год - Август";
   Buf[10]="Текущий год - Сентябрь";
   Buf[11]="Текущий год - Октябрь";
   Buf[12]="Текущий год - Ноябрь";
   Buf[13]="Текущий год - Декабрь";
 |  NODE="ТЕККВР":
   Buf[01]="...";
   Buf[02]="Текущий год - 1 квартал";
   Buf[03]="Текущий год - 2 квартал";
   Buf[04]="Текущий год - 3 квартал";
   Buf[05]="Текущий год - 4 квартал";
 |  NODE="ПРШМЕС":
   Buf[01]="...";
   Buf[02]="Прошлый год - Январь";
   Buf[03]="Прошлый год - Февраль";
   Buf[04]="Прошлый год - Март";
   Buf[05]="Прошлый год - Апрель";
   Buf[06]="Прошлый год - Май";
   Buf[07]="Прошлый год - Июнь";
   Buf[08]="Прошлый год - Июль";
   Buf[09]="Прошлый год - Август";
   Buf[10]="Прошлый год - Сентябрь";
   Buf[11]="Прошлый год - Октябрь";
   Buf[12]="Прошлый год - Ноябрь";
   Buf[13]="Прошлый год - Декабрь";
 |  NODE="ПРШКВР":
   Buf[01]="...";
   Buf[02]="Прошлый год - 1 квартал";
   Buf[03]="Прошлый год - 2 квартал";
   Buf[04]="Прошлый год - 3 квартал";
   Buf[05]="Прошлый год - 4 квартал";
 fi;
end;

Func Даты_ВыбратьПериодОтчета(prevПериод:Integer) :Integer;
var iNum, iMum, iK1, iK2, iWorkYear, iDelta, iRes :Integer;
var lOK, lEdit :Logical;
 lOK=True;
 iRes=-1;
 iNum=0;
 iDelta=0;
 ClearVariable(Buf);
 if prevПериод>0:
   lEdit=True;
   if prevПериод>00 and prevПериод<05: iK1=2; iK2=prevПериод+01;
   |  prevПериод>04 and prevПериод<09: iK1=3; iK2=prevПериод-03;
   |  prevПериод>08 and prevПериод<21: iK1=4; iK2=prevПериод-07;
   |  prevПериод>20 and prevПериод<25: iK1=5; iK2=prevПериод-19;
   |  prevПериод>24 and prevПериод<37: iK1=6; iK2=prevПериод-23;
   |  prevПериод>36 and prevПериод<41: iK1=7; iK2=prevПериод-35;
   else iK1=1; iK2=0;
   fi;
 else
   lEdit=False;
   iK1=1; iK2=0;
 fi;
 while lOK do
   Даты_ЗаполнитьМенюДат("ROOT");
   if not lEdit:
     iNum=Alternate("Выберите тип периода отчета...", Buf, -1, iK1, 12);
   else
     iNum=iK1;
   fi;
   if iNum=0: iRes=-1; lOK=False;
   |  iNum=1: iRes=0;  lOK=False;
   |  iNum=2: Даты_ЗаполнитьМенюДат("СЕГОДНЯ"); iK1=iNum; iDelta=00; iWorkYear=0;
   |  iNum=3: Даты_ЗаполнитьМенюДат("ВЧЕРА");   iK1=iNum; iDelta=04; iWorkYear=0;
   |  iNum=4: Даты_ЗаполнитьМенюДат("ТЕКМЕС");  iK1=iNum; iDelta=08; iWorkYear=Year(ToDay);
   |  iNum=5: Даты_ЗаполнитьМенюДат("ТЕККВР");  iK1=iNum; iDelta=20; iWorkYear=Year(ToDay);
   |  iNum=6: Даты_ЗаполнитьМенюДат("ПРШМЕС");  iK1=iNum; iDelta=24; iWorkYear=Year(ToDay)-1;
   |  iNum=7: Даты_ЗаполнитьМенюДат("ПРШКВР");  iK1=iNum; iDelta=36; iWorkYear=Year(ToDay)-1;
   fi;
   while lOK do
     if lEdit:
       iMum=Alternate("Выберите период отчета"+if(iWorkYear>2000, " за "+Str(iWorkYear)+" год", "")+"...", Buf, -1, iK2, 12);
       lEdit=False;
     else
       iMum=Alternate("Выберите период отчета"+if(iWorkYear>2000, " за "+Str(iWorkYear)+" год", "")+"...", Buf, -1,   1, 12);
     fi;
     if iMum=0: iRes=-1; lOK=False;
     |  iMum=1: iK2=1; Break;
     |  iMum>1: iRes=iMum+iDelta-1; lOK=False;
     fi;
   od;
 od;
 if iRes<>prevПериод and iRes>-1: ^iRes; else ^prevПериод; fi;
end;

Proc Даты_ТЧSet(Произвольный:Logical);
var цвFont, цвBack :Integer;
var ТЧ :Logical;
 if Произвольный: цвFont=coBlack; цвBack=coAqua; ТЧ=False; else цвFont=coBlack; цвBack=coTransparent; ТЧ=True; fi;
 Секц_ОтДат.Cell(3, 3, CellFontColor, цвFont); Секц_ОтДат.Cell(3, 3, CellBgColor, цвBack); Секц_ОтДат.Cell(3, 3, CellReadOnly, ТЧ);
 Секц_ОтДат.Cell(4, 3, CellFontColor, цвFont); Секц_ОтДат.Cell(4, 3, CellBgColor, цвBack); Секц_ОтДат.Cell(4, 3, CellReadOnly, ТЧ);
end;

Func МесяцНачалаКвартала(текДата:Date) :Date;
var mm, mk :Integer;
 mm=Mon(текДата);
 if mm=01 or mm=02 or mm=03: mk=01;
 |  mm=04 or mm=05 or mm=06: mk=04;
 |  mm=07 or mm=08 or mm=09: mk=07;
 |  mm=10 or mm=11 or mm=12: mk=10;
 else ^текДата;
 fi;
 ^Dat(1, mk, Year(текДата));
end;

Proc Даты_SetДНДК(repОтч:Integer);
--01="Сегодня";
--02="Текущий месяц";
--03="Текущий квартал";
--04="Текущий год";
--05="Вчера";
--06="Прошлый месяц";
--07="Прошлый квартал";
--08="Прошлый год";
--09="Текущий год - Январь";
--10="Текущий год - Февраль";
--11="Текущий год - Март";
--12="Текущий год - Апрель";
--13="Текущий год - Май";
--14="Текущий год - Июнь";
--15="Текущий год - Июль";
--16="Текущий год - Август";
--17="Текущий год - Сентябрь";
--18="Текущий год - Октябрь";
--19="Текущий год - Ноябрь";
--20="Текущий год - Декабрь";
--21="Текущий год - 1 квартал";
--22="Текущий год - 2 квартал";
--23="Текущий год - 3 квартал";
--24="Текущий год - 4 квартал";
--25="Прошлый год - Январь";
--26="Прошлый год - Февраль";
--27="Прошлый год - Март";
--28="Прошлый год - Апрель";
--29="Прошлый год - Май";
--30="Прошлый год - Июнь";
--31="Прошлый год - Июль";
--32="Прошлый год - Август";
--33="Прошлый год - Сентябрь";
--34="Прошлый год - Октябрь";
--35="Прошлый год - Ноябрь";
--36="Прошлый год - Декабрь";
--37="Прошлый год - 1 квартал";
--38="Прошлый год - 2 квартал";
--39="Прошлый год - 3 квартал";
--40="Прошлый год - 4 квартал";
 if repОтч=01: DataНП = ToDay;                           DataКП = DataНП+1;
 |  repОтч=02: DataНП = Dat(1, Mon(ToDay), Year(ToDay)); DataКП = AddMon(DataНП, 1);
 |  repОтч=03: DataНП = МесяцНачалаКвартала(ToDay);      DataКП = AddMon(DataНП, 3);
 |  repОтч=04: DataНП = Dat(1, 1, Year(ToDay));          DataКП = Dat(1, 1, Year(ToDay)+1);
 |  repОтч=05: DataКП = ToDay;                           DataНП = ToDay-1;
 |  repОтч=06: DataКП = Dat(1, Mon(ToDay), Year(ToDay)); DataНП = AddMon(DataКП, -1);
 |  repОтч=07: DataКП = МесяцНачалаКвартала(ToDay);      DataНП = AddMon(DataКП, -3);
 |  repОтч=08: DataКП = Dat(1, 01, Year(ToDay));         DataНП = Dat(1, 1, Year(ToDay)-1);
 |  repОтч=09: DataНП = Dat(1, 01, Year(ToDay));         DataКП = AddMon(DataНП, 1);
 |  repОтч=10: DataНП = Dat(1, 02, Year(ToDay));         DataКП = AddMon(DataНП, 1);
 |  repОтч=11: DataНП = Dat(1, 03, Year(ToDay));         DataКП = AddMon(DataНП, 1);
 |  repОтч=12: DataНП = Dat(1, 04, Year(ToDay));         DataКП = AddMon(DataНП, 1);
 |  repОтч=13: DataНП = Dat(1, 05, Year(ToDay));         DataКП = AddMon(DataНП, 1);
 |  repОтч=14: DataНП = Dat(1, 06, Year(ToDay));         DataКП = AddMon(DataНП, 1);
 |  repОтч=15: DataНП = Dat(1, 07, Year(ToDay));         DataКП = AddMon(DataНП, 1);
 |  repОтч=16: DataНП = Dat(1, 08, Year(ToDay));         DataКП = AddMon(DataНП, 1);
 |  repОтч=17: DataНП = Dat(1, 09, Year(ToDay));         DataКП = AddMon(DataНП, 1);
 |  repОтч=18: DataНП = Dat(1, 10, Year(ToDay));         DataКП = AddMon(DataНП, 1);
 |  repОтч=19: DataНП = Dat(1, 11, Year(ToDay));         DataКП = AddMon(DataНП, 1);
 |  repОтч=20: DataНП = Dat(1, 12, Year(ToDay));         DataКП = AddMon(DataНП, 1);
 |  repОтч=21: DataНП = Dat(1, 01, Year(ToDay));         DataКП = AddMon(DataНП, 3);
 |  repОтч=22: DataНП = Dat(1, 04, Year(ToDay));         DataКП = AddMon(DataНП, 3);
 |  repОтч=23: DataНП = Dat(1, 07, Year(ToDay));         DataКП = AddMon(DataНП, 3);
 |  repОтч=24: DataНП = Dat(1, 10, Year(ToDay));         DataКП = AddMon(DataНП, 3);
 |  repОтч=25: DataНП = Dat(1, 01, Year(ToDay)-1);       DataКП = AddMon(DataНП, 1);
 |  repОтч=26: DataНП = Dat(1, 02, Year(ToDay)-1);       DataКП = AddMon(DataНП, 1);
 |  repОтч=27: DataНП = Dat(1, 03, Year(ToDay)-1);       DataКП = AddMon(DataНП, 1);
 |  repОтч=28: DataНП = Dat(1, 04, Year(ToDay)-1);       DataКП = AddMon(DataНП, 1);
 |  repОтч=29: DataНП = Dat(1, 05, Year(ToDay)-1);       DataКП = AddMon(DataНП, 1);
 |  repОтч=30: DataНП = Dat(1, 06, Year(ToDay)-1);       DataКП = AddMon(DataНП, 1);
 |  repОтч=31: DataНП = Dat(1, 07, Year(ToDay)-1);       DataКП = AddMon(DataНП, 1);
 |  repОтч=32: DataНП = Dat(1, 08, Year(ToDay)-1);       DataКП = AddMon(DataНП, 1);
 |  repОтч=33: DataНП = Dat(1, 09, Year(ToDay)-1);       DataКП = AddMon(DataНП, 1);
 |  repОтч=34: DataНП = Dat(1, 10, Year(ToDay)-1);       DataКП = AddMon(DataНП, 1);
 |  repОтч=35: DataНП = Dat(1, 11, Year(ToDay)-1);       DataКП = AddMon(DataНП, 1);
 |  repОтч=36: DataНП = Dat(1, 12, Year(ToDay)-1);       DataКП = AddMon(DataНП, 1);
 |  repОтч=37: DataНП = Dat(1, 01, Year(ToDay)-1);       DataКП = AddMon(DataНП, 3);
 |  repОтч=38: DataНП = Dat(1, 04, Year(ToDay)-1);       DataКП = AddMon(DataНП, 3);
 |  repОтч=39: DataНП = Dat(1, 07, Year(ToDay)-1);       DataКП = AddMon(DataНП, 3);
 |  repОтч=40: DataНП = Dat(1, 10, Year(ToDay)-1);       DataКП = AddMon(DataНП, 3);
 fi;
end;

Proc Даты_ВыборДаты(onExit:Logical);
var StoreДН, StoreДК :Date;
var StoreПериод, NewПериод :Integer;
var SaveValue :Logical;
 SaveValue=False;
 StoreДН=DataНП;
 StoreДК=DataКП;
 StoreПериод=ОтчПрд;
 if onExit: NewПериод=0; else NewПериод=Даты_ВыбратьПериодОтчета(StoreПериод); fi;
 if NewПериод<>StoreПериод: if not ОтменитьИзмененияУсловийОтчета: SaveValue=True; fi; fi;
 if SaveValue: 
   ОтчПрд=NewПериод;
   if NewПериод>0: Даты_SetДНДК(NewПериод); else Template.Field="DataНП"; fi;
   OldDateНП=DataНП;
   OldDateКП=DataКП;
   Даты_ТЧSet(if(NewПериод>0, False, True));
   ИменаПериодовЗаголовков;
 fi;
end;

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

Func TimeToHMSstring(valTime :Integer) :String;
var ihh, imm, icc :Integer;
var shh, smm, scc :String;
 shh=''; smm=''; scc='';
 ihh=Int(Trunc(valTime/3600));
 imm=Int(Trunc((valTime-ihh*3600)/60));
 icc=valTime-ihh*3600-imm*60;
 shh=Str(ihh); shh=RepStr('0', 2-Length(shh))+shh;
 smm=Str(imm); smm=RepStr('0', 2-Length(smm))+smm;
 scc=Str(icc); scc=RepStr('0', 2-Length(scc))+scc;
 ^(shh+':'+smm+':'+scc);
end;

Func Цвет(r:Integer; g:Integer; b:Integer) :Integer; -- цвет по стандарту ТБ 6.9
 ^(256*256*b+256*g+r);
end;

Proc ФормированиеЦветовЗаголовков(СхемаЦвета:Integer);
var ColorH1, ColorH2, ColorH3, ColorH4, ColorH5, ColorH6, ColorH7, ColorH8 :Integer;
 ClearVariable(BufInt);
 ColorH1=0; ColorH5=0;
 ColorH2=0; ColorH6=0;
 ColorH3=0; ColorH7=0;
 ColorH4=0; ColorH8=0;
 if СхемаЦвета=0: --Стартовый цвет: 'Светло-коричневый'
   ColorH1=Цвет(255, 204, 153);
   ColorH2=Цвет(255, 255, 153);
   ColorH3=Цвет(204, 255, 204);
   ColorH4=Цвет(153, 204, 255);
   ColorH5=Цвет(204, 255, 255);
   ColorH6=Цвет(255, 153, 204);
   ColorH7=Цвет(204, 153, 255);
   ColorH8=Цвет(230, 230, 230);
 |  СхемаЦвета=1: --Стартовый цвет: 'Светло-желтый'
   ColorH1=Цвет(255, 255, 153);
   ColorH2=Цвет(204, 255, 204);
   ColorH3=Цвет(153, 204, 255);
   ColorH4=Цвет(204, 255, 255);
   ColorH5=Цвет(255, 153, 204);
   ColorH6=Цвет(204, 153, 255);
   ColorH7=Цвет(230, 230, 230);
   ColorH8=Цвет(255, 204, 153);
 |  СхемаЦвета=2: --Стартовый цвет: 'Бледно-зеленый'
   ColorH1=Цвет(204, 255, 204);
   ColorH2=Цвет(153, 204, 255);
   ColorH3=Цвет(204, 255, 255);
   ColorH4=Цвет(255, 153, 204);
   ColorH5=Цвет(204, 153, 255);
   ColorH6=Цвет(230, 230, 230);
   ColorH7=Цвет(255, 204, 153);
   ColorH8=Цвет(255, 255, 153);
 |  СхемаЦвета=3: --Стартовый цвет: 'Бледно-голубой'
   ColorH1=Цвет(153, 204, 255);
   ColorH2=Цвет(204, 255, 255);
   ColorH3=Цвет(255, 153, 204);
   ColorH4=Цвет(204, 153, 255);
   ColorH5=Цвет(230, 230, 230);
   ColorH6=Цвет(255, 204, 153);
   ColorH7=Цвет(255, 255, 153);
   ColorH8=Цвет(204, 255, 204);
 |  СхемаЦвета=4: --Стартовый цвет: 'Светло-бирюзовый'
   ColorH1=Цвет(204, 255, 255);
   ColorH2=Цвет(255, 153, 204);
   ColorH3=Цвет(204, 153, 255);
   ColorH4=Цвет(230, 230, 230);
   ColorH5=Цвет(255, 204, 153);
   ColorH6=Цвет(255, 255, 153);
   ColorH7=Цвет(204, 255, 204);
   ColorH8=Цвет(153, 204, 255);
 |  СхемаЦвета=5: --Стартовый цвет: 'Розовый'
   ColorH1=Цвет(255, 153, 204);
   ColorH2=Цвет(204, 153, 255);
   ColorH3=Цвет(230, 230, 230);
   ColorH4=Цвет(255, 204, 153);
   ColorH5=Цвет(255, 255, 153);
   ColorH6=Цвет(204, 255, 204);
   ColorH7=Цвет(153, 204, 255);
   ColorH8=Цвет(204, 255, 255);
 |  СхемаЦвета=6: --Стартовый цвет: 'Сиреневый'
   ColorH1=Цвет(204, 153, 255);
   ColorH2=Цвет(230, 230, 230);
   ColorH3=Цвет(255, 204, 153);
   ColorH4=Цвет(255, 255, 153);
   ColorH5=Цвет(204, 255, 204);
   ColorH6=Цвет(153, 204, 255);
   ColorH7=Цвет(204, 255, 255);
   ColorH8=Цвет(255, 153, 204);
 |  СхемаЦвета=7: --Стартовый цвет: 'Бледно-серый'
   ColorH1=Цвет(230, 230, 230);
   ColorH2=Цвет(255, 204, 153);
   ColorH3=Цвет(255, 255, 153);
   ColorH4=Цвет(204, 255, 204);
   ColorH5=Цвет(153, 204, 255);
   ColorH6=Цвет(204, 255, 255);
   ColorH7=Цвет(255, 153, 204);
   ColorH8=Цвет(204, 153, 255);
 fi;
 BufInt[1]=ColorH1;
 BufInt[2]=ColorH2;
 BufInt[3]=ColorH3;
 BufInt[4]=ColorH4;
 BufInt[5]=ColorH5;
 BufInt[6]=ColorH6;
 BufInt[7]=ColorH7;
 BufInt[8]=ColorH8;
end;

Proc ПрименитьЦвета;
var ColorH1, ColorH2, ColorH3, ColorH4, ColorH5, ColorH6, ColorH7, ColorH8 :Integer;
 ФормированиеЦветовЗаголовков(intСхемаЦветов);
 ColorH1=BufInt[1];
 ColorH2=BufInt[2];
 ColorH3=BufInt[3];
 ColorH4=BufInt[4];
 ColorH5=BufInt[5];
 ColorH6=BufInt[6];
 ColorH7=BufInt[7];
 ColorH8=BufInt[8];
 -- Проверять координаты !!!
 Секц_ВнВид.Cell(03, 04, CellBgColor, ColorH1);
 Секц_ВнВид.Cell(03, 05, CellBgColor, ColorH2);
 Секц_ВнВид.Cell(03, 06, CellBgColor, ColorH3);
 Секц_ВнВид.Cell(03, 07, CellBgColor, ColorH4);
 Секц_ВнВид.Cell(03, 08, CellBgColor, ColorH5);
 Секц_ВнВид.Cell(03, 09, CellBgColor, ColorH6);
 Секц_ВнВид.Cell(03, 10, CellBgColor, ColorH7);
 Секц_ВнВид.Cell(03, 11, CellBgColor, ColorH8);
end;

Func ВыбратьСхемуЦветовИерархическихЗаголовков(ТекущийЦвет:Integer) :Integer;
var num:Integer;
 ClearVariable(Buf);
 Buf[01]="Стартовый цвет: 'Светло-коричневый'";
 Buf[02]="Стартовый цвет: 'Светло-желтый'";
 Buf[03]="Стартовый цвет: 'Бледно-зеленый'";
 Buf[04]="Стартовый цвет: 'Бледно-голубой'";
 Buf[05]="Стартовый цвет: 'Светло-бирюзовый'";
 Buf[06]="Стартовый цвет: 'Розовый'";
 Buf[07]="Стартовый цвет: 'Сиреневый'";
 Buf[08]="Стартовый цвет: 'Бледно-серый'";
 num=Alternate("Выберите цветовую схему", Buf, -1, ТекущийЦвет+1, 12);
 if not num>0: ^ТекущийЦвет; else ^(num-1); fi;
end;

Func ВыбратьРежимСохранения(ТекущийРежим:Integer) :Integer;
var num:Integer;
 ClearVariable(Buf);
 Buf[01]="Всегда сохранять";
 Buf[02]="Сохранять по запросу";
 Buf[03]="Никогда не сохранять";
 num=Alternate("Выберите режим сохранения ведомости", Buf, -1, ТекущийРежим+1, 12);
 if not num>0: ^ТекущийРежим; else ^(num-1); fi;
end;

--Func ВыбратьПоправкуExcel(ТекущаяПоправка:Integer) :Integer;
--var num, kk :Integer;
-- ClearVariable(Buf);
-- ClearVariable(BufInt);
-- Buf[01]="01 единица"; BufInt[01]=01;
-- Buf[02]="02 единицы"; BufInt[02]=02;
-- Buf[03]="03 единицы"; BufInt[03]=03;
-- Buf[04]="04 единицы"; BufInt[04]=04;
-- Buf[05]="05 единиц";  BufInt[05]=05;
-- Buf[06]="06 единиц";  BufInt[06]=06;
-- Buf[07]="07 единиц";  BufInt[07]=07;
-- Buf[08]="08 единиц";  BufInt[08]=08;
-- Buf[09]="09 единиц";  BufInt[09]=09;
-- Buf[10]="10 единиц";  BufInt[10]=10;
-- Buf[11]="12 единиц";  BufInt[11]=12;
-- Buf[12]="14 единиц";  BufInt[12]=14;
-- Buf[13]="16 единиц";  BufInt[13]=16;
-- Buf[14]="18 единиц";  BufInt[14]=18;
-- Buf[15]="20 единиц";  BufInt[15]=20;
-- Buf[16]="25 единиц";  BufInt[16]=25;
-- kk=SearchInArray(BufInt, ТекущаяПоправка, True, 1);
-- if kk=-1: kk=3; fi;
-- num=Alternate("Выберите число...", Buf, -1, kk, 12);
-- if not num>0: ^ТекущаяПоправка; else ^BufInt[num]; fi;
--end;

Proc ВзятьРеквизиты(saveREC:Record; Auto:Logical);
var RO, num :Integer;
var REC :Record;
 if Auto:
   if Trim(УЧР_ИМЯ)="":
     RO=OpenWorkArea("КОНТРАГЕНТ", "", "НАШЕ");
     Try
       num=Records(RO);
       if num<1: REC=NIL;
       |  num=1: REC=GetRecordKey(RO, 1);
       |  num>1: REC=GetRecordKey(RO, 1);
                 SetFilter(RO, "НАШЕ and РПО_УМОЛЧАНИЕ");
                 if Records(RO)>0: REC=GetRecordKey(RO, 1); fi;
       fi;
       if REC=NIL and saveREC<>NIL: REC=saveREC; fi;
       if REC<>NIL:
         SetFilter(RO, "UKey="+RecordToString(REC));
         if Records(RO)=1:
            УЧР_ИМЯ = GetFieldS(RO, 1, "КОРИМЯ");
           УЧР_ОКПО = GetFieldS(RO, 1, "ОКПО");
         fi;
       fi;
     Finally
       CloseWorkArea(RO);
     end;
   fi;
 else
   REC=OpenCardFile("КОНТРАГЕНТ", "НАШЕ", saveREC, crdRecordOnly);
   if REC=NIL: Exit; fi;
   RO=OpenWorkArea("КОНТРАГЕНТ", "", "UKey="+RecordToString(REC));
   Try
     if Records(RO)=1:
        УЧР_ИМЯ = GetFieldS(RO, 1, "КОРИМЯ");
       УЧР_ОКПО = GetFieldS(RO, 1, "ОКПО");
     fi;
   Finally
     CloseWorkArea(RO);
   end;
 fi;
end;

Proc ПО_Выбор(prevVal:String);
var КОД, ИМЯ, Value :String;
 Value=AnaElection("П.*", False, False, prevVal);
 if Value="": Exit; fi;
 КОД=Value;
 Value=Name_A(КОД);
 ИМЯ=if(Value<>"" and Value<>" ", Value, КОД);
 ПОД_ИМЯ=ИМЯ;
 ПОД_КОД=КОД;
end;

Func Mod(X:Integer; Y:Integer) :Integer; -- возвращает остаток от деления (X - делимое; Y - делитель)
 ^Int(X-Y*Int(Trunc(X/Y)));
end;

Func ЧетныйИндекс(Iter:Integer) :Logical;
 Iter=Abs(Iter);
 if Iter=1: ^False;
 |  Iter=2: ^True;
 |  Iter>2: if Mod(Iter, 2)=0: ^True; else ^False; fi;
 else ^False;
 fi;
end;

Func ГруппаТекст(nameField:String) :String;
 if nameField="<СЧТ>": ^"Счет (синтетический)";
 |  nameField="<КБК>": ^"КБК счета";
 |  nameField="<ИСТ>": ^"Вид финансового обеспечения";
 |  nameField="<МОЛ>": ^"Материально ответственное лицо";
 |  nameField="<МХЭ>": ^"Местонахождение";
 |  nameField="<ГРП>": ^"Пользовательские группы НФА";
 |  nameField="<ДОП>": ^"Дополнительный справочник";
 |  nameField="<НФА>": ^"НФА по типам";
 else ^"";
 fi;
end;

Proc ПорядокГрупп_СформироватьМеню;
var ii, kk, num :Integer;
var tmp :String;
 ClearVariable(Buf); ClearVariable(иррхГРП);
 Buf[1]="*Выполнено*";
 kk=2;
 num=WordsCount(Иерархия, " ");
 for ii=1 to num do
   tmp=ExtractWord(ii, Иерархия, " ");
   иррхГРП[ii] = tmp;
   Buf[kk]     = "на уровень ВЫШЕ - "+ГруппаТекст(tmp);
   Buf[kk+1]   = "на уровень НИЖЕ - "+ГруппаТекст(tmp);
   kk=kk+2;
 od;
end;

Proc ПорядокГрупп_ПоменятьМестами(Iter:Integer; Вверх:Logical);
var ii, num :Integer;
var Value :String;
 Value="";
 if Вверх:
   if Iter=1:
     Message("Это первая строчка.^MПередвинуть выше строчку нельзя!", mtInformation);
   else
     Value=иррхГРП[Iter-1]; иррхГРП[Iter-1]=иррхГРП[Iter]; иррхГРП[Iter]=Value;
   fi;
 else
   if Iter=LengthOfArray(иррхГРП):
     Message("Это последняя строчка.^MПередвинуть ниже строчку нельзя!", mtInformation);
   else
     Value=иррхГРП[Iter+1]; иррхГРП[Iter+1]=иррхГРП[Iter]; иррхГРП[Iter]=Value;
   fi;
 fi;
 -- Формируем новый порядок полей групп
 Иерархия="";
 num=LengthOfArray(иррхГРП);
 for ii=1 to num do Иерархия=Объединить(Иерархия, иррхГРП[ii], " "); od;
 ПорядокГрупп_СформироватьМеню;
end;

Proc ПорядокГрупп_ПоменятьМестамиМеню;
var num, kk, jj :Integer;
var Flag :Logical;
 if Иерархия="":
   Message("Нет ни одной группы, применяемой^Mпри построении таблицы!", mtError);
   Template.Field="flgСЧТ_";
   Exit;
 fi;
 num=WordsCount(Иерархия, " ");
 if num=1: Message("Обнаружена одна группа.^MПередвигать нечего!", mtInformation); Exit; fi;
 ПорядокГрупп_СформироватьМеню;
 num=0; jj=1;
 while num<>1 do
   num=Alternate("Выберите действие...", Buf, -1, jj, 12);
   if num>1:
     Flag=ЧетныйИндекс(num);
     kk=Int(Trunc(num/2));
     ПорядокГрупп_ПоменятьМестами(kk, Flag);
     if Flag: jj=num-2; if jj<2: jj=2; fi; else jj=num+2; fi;
   fi;
 od;
end;

Func DeleteWordInStr(sStr:String; dStr:String; Sep:String) :String;
var out :String;
var pp, len :Integer;
 out="";
 len=Length(dStr);
 if len=0: ^sStr; fi;
 pp=Pos(Up(dStr), Up(sStr));
 if pp=0: ^sStr; fi;
 if pp>1: pp=pp-1; fi;
 len=len+1;
 out=Delete(sStr, pp, len);
 ^out;
end;

Proc ПорядокГрупп_СобратьГруппы;
var num, ii, pp :Integer;
 ClearVariable(иррхГРП); ClearVariable(иррхUSE);
 -- узнаем текущие настройки
 иррхГРП[01] = "<СЧТ>";   иррхUSE[01] = flgСЧТ;
 иррхГРП[02] = "<КБК>";   иррхUSE[02] = flgКБК;
 иррхГРП[03] = "<ИСТ>";   иррхUSE[03] = flgИСТ;
 иррхГРП[04] = "<МОЛ>";   иррхUSE[04] = flgМОЛ;
 иррхГРП[05] = "<МХЭ>";   иррхUSE[05] = flgМХЭ;
 иррхГРП[06] = "<ГРП>";   иррхUSE[06] = flgГРП;
 иррхГРП[07] = "<ДОП>";   иррхUSE[07] = flgДОП;
 иррхГРП[08] = "<НФА>";   иррхUSE[08] = flgНФА;
 -- синхронизируем порядок группировки полей с настройками
 num=LengthOfArray(иррхГРП);
 if num>0:
   for ii=1 to num do
     pp=Pos(иррхГРП[ii], Иерархия);
     if     иррхUSE[ii] and pp<1: Иерархия =      Объединить(Иерархия, иррхГРП[ii], " ");
     |  not иррхUSE[ii] and pp>0: Иерархия = DeleteWordInStr(Иерархия, иррхГРП[ii], " ");
     fi;
   od;
 else
   Иерархия="";
 fi;
end;

Proc ПорядокГрупп_ОтобразитьГруппыТаблицы(USEТипыНФА:Logical);
var num, kk, ii :Integer;
var Flag :Logical;
 num=WordsCount(Иерархия, " ");
 if num>0:
   for ii=1 to num do
     Секц_Групп.Cell(ii+1, 5, CellContents, Str(ii)+" уровень");
     Секц_Групп.Cell(ii+1, 6, CellContents, ГруппаТекст(ExtractWord(ii, Иерархия, " ")));
   od;
   Flag=True;
 else
   num=1;
   Секц_Групп.Cell(num+1, 5, CellContents, "", True);
   Секц_Групп.Cell(num+1, 6, CellContents, "нет групп для разбиения на таблицы");
   Flag=False;
 fi;
 if not Flag and curФтрНФА=3: curФтрНФА=1; fi;
 rb_NOUНФА.Enabled = Flag;
 kk=if(USEТипыНФА, 8, 7)-num;
 if kk>0:
   for ii=1 to kk do
     Секц_Групп.Cell(ii+1+num, 5, CellContents, "", True);
     Секц_Групп.Cell(ii+1+num, 6, CellContents, "", True);
   od;
 fi;
end;

Proc ПорядокГрупп_ПеречитатьГруппы;
 ПорядокГрупп_СобратьГруппы;
 ПорядокГрупп_ОтобразитьГруппыТаблицы(if(curФтрЦен=2, True, False));
end;

Proc ФлагиПараметровДетализации(FieldREF:String; onExit:Logical);
var OldValue, NewValue, SaveValue :Logical;
var FieldFLG :String;
 SaveValue=False;
 FieldFLG=SubStr(FieldREF, 1, Length(FieldREF)-1);
 Try OldValue=GetVariableL(FieldFLG); Except end;
 if onExit: NewValue=False; else NewValue = not OldValue; fi;
 if NewValue<>OldValue: if not ОтменитьИзмененияУсловийОтчета: SaveValue=True; fi; fi;
 if SaveValue:
   PutVariableL(FieldFLG, NewValue);
   ПорядокГрупп_ПеречитатьГруппы;
 fi;
end;

Func ВыбратьФлагСравненияЦен(ТекущийФлаг:Integer) :Integer;
var num:Integer;
 ClearVariable(Buf);
 Buf[01]= "<"  ;
 Buf[02]= "<=" ;
 Buf[03]= ">"  ;
 Buf[04]= ">=" ;
 Buf[05]= "="  ;
 Buf[06]= "<>" ;
 num=Alternate("Выберите знак сравнения цен", Buf, -1, ТекущийФлаг, 12);
 if not num>0: ^ТекущийФлаг; else ^num; fi;
end;

Proc ЗнакСравненияЦен(FieldREF:String);
var OldValue, NewValue :Integer;
var SaveValue :Logical;
var FieldFLG :String;
 SaveValue=False; FieldFLG=SubStr(FieldREF, 1, Length(FieldREF)-1);
 OldValue=GetVariableI(FieldFLG);
 NewValue=ВыбратьФлагСравненияЦен(OldValue);
 if NewValue<>OldValue: if not ОтменитьИзмененияУсловийОтчета: SaveValue=True; fi; fi;
 if SaveValue:
   PutVariableI(FieldFLG, NewValue);
 fi;
end;

Proc ИзменитьПорядокГрупп(иррхValue:String);
var prevValue :String;
 prevValue=иррхValue;
 ПорядокГрупп_ПоменятьМестамиМеню;
 if prevValue<>Иерархия: if ОтменитьИзмененияУсловийОтчета: Иерархия=prevValue; fi; fi;
 ПорядокГрупп_ПеречитатьГруппы;
end;

Proc Счета_МассивФлаговVПеременные(FTRсчета:Integer);
var Value :String;
var ii :Integer;
 Value="";
 if FTRсчета=2:
   -- 11111111100000000
   for ii=1 to 09 do Value=Value+if(BufFlag[ii], "1", "0"); od;
   флагиACC=Value+"00000000";
 |  FTRсчета=3:
   -- 00000000011111111
   for ii=1 to 08 do Value=Value+if(BufFlag[ii], "1", "0"); od;
   флагиACC="000000000"+Value;
 else
   -- 11111111111111111
   for ii=1 to 17 do Value=Value+if(BufFlag[ii], "1", "0"); od;
   флагиACC=Value;
 fi;
end;

Proc Счета_ПеременныеVМассивФлагов(FTRсчета:Integer);
var Value :String;
var ii :Integer;
 if FTRсчета=2:
   -- 11111111100000000
   Value=SubStr(флагиACC, 01, 09);
   for ii=1 to 09 do BufFlag[ii]=if(SubStr(Value, ii, 1)="1", True, False); od;
 |  FTRсчета=3:
   -- 00000000011111111
   Value=SubStr(флагиACC, 10, 08);
   for ii=1 to 08 do BufFlag[ii]=if(SubStr(Value, ii, 1)="1", True, False); od;
 else
   -- 11111111111111111
   Value=флагиACC;
   for ii=1 to 17 do BufFlag[ii]=if(SubStr(Value, ii, 1)="1", True, False); od;
 fi;
end;

Proc Счета_СоздатьМассивВидовНФА(FTRсчета:Integer);
 if Length(флагиACC)<>17: флагиACC="00000000000000000"; fi;
 ClearVariable(BufMsk); ClearVariable(BufStr); ClearVariable(BufFLAG);
 -- XXXXXXXXYZZZZZZZZ
 -- 12345678901234567
 if FTRсчета=2:
   -- 11111111100000000
   BufMsk[01] = "101.?1"; BufStr[01] = "жилые помещения";
   BufMsk[02] = "101.?2"; BufStr[02] = "нежилые помещения";
   BufMsk[03] = "101.?3"; BufStr[03] = "сооружения";
   BufMsk[04] = "101.?4"; BufStr[04] = "машины и оборудование";
   BufMsk[05] = "101.?5"; BufStr[05] = "транспортные средства";
   BufMsk[06] = "101.?6"; BufStr[06] = "производственный и хозяйственный инвентарь";
   BufMsk[07] = "101.?7"; BufStr[07] = "библиотечный фонд";
   BufMsk[08] = "101.?8"; BufStr[08] = "прочие основные средства";
   BufMsk[09] = "102.?0"; BufStr[09] = "нематериальные активы";
 |  FTRсчета=3:
   -- 00000000011111111
   BufMsk[01] = "105.?1"; BufStr[01] = "медикаменты и перевязочные средства";
   BufMsk[02] = "105.?2"; BufStr[02] = "продукты питания";
   BufMsk[03] = "105.?3"; BufStr[03] = "горюче-смазочные материалы";
   BufMsk[04] = "105.?4"; BufStr[04] = "строительные материалы";
   BufMsk[05] = "105.?5"; BufStr[05] = "мягкий инвентарь";
   BufMsk[06] = "105.?6"; BufStr[06] = "прочие материальные запасы";
   BufMsk[07] = "105.?7"; BufStr[07] = "готовая продукция";
   BufMsk[08] = "105.?8"; BufStr[08] = "товары";
 else
   -- 11111111111111111
   BufMsk[01] = "101.?1"; BufStr[01] = "жилые помещения";
   BufMsk[02] = "101.?2"; BufStr[02] = "нежилые помещения";
   BufMsk[03] = "101.?3"; BufStr[03] = "сооружения";
   BufMsk[04] = "101.?4"; BufStr[04] = "машины и оборудование";
   BufMsk[05] = "101.?5"; BufStr[05] = "транспортные средства";
   BufMsk[06] = "101.?6"; BufStr[06] = "производственный и хозяйственный инвентарь";
   BufMsk[07] = "101.?7"; BufStr[07] = "библиотечный фонд";
   BufMsk[08] = "101.?8"; BufStr[08] = "прочие основные средства";
   BufMsk[09] = "102.?0"; BufStr[09] = "нематериальные активы";
   BufMsk[10] = "105.?1"; BufStr[10] = "медикаменты и перевязочные средства";
   BufMsk[11] = "105.?2"; BufStr[11] = "продукты питания";
   BufMsk[12] = "105.?3"; BufStr[12] = "горюче-смазочные материалы";
   BufMsk[13] = "105.?4"; BufStr[13] = "строительные материалы";
   BufMsk[14] = "105.?5"; BufStr[14] = "мягкий инвентарь";
   BufMsk[15] = "105.?6"; BufStr[15] = "прочие материальные запасы";
   BufMsk[16] = "105.?7"; BufStr[16] = "готовая продукция";
   BufMsk[17] = "105.?8"; BufStr[17] = "товары";
 fi;
end;

Proc Счета_ОбновитьМеню(Iter:Integer; MaxK:Integer);
 if Iter>MaxK: Buf[Iter]="КОД$"+BufMsk[Iter-MaxK]+"-->> "+if(BufFlag[Iter-MaxK], "[ВКЛ.]: ", "[ВЫКЛ.]: ")+BufStr[Iter-MaxK]; fi;
end;

Proc Счета_ФлагиВТекст(FTRсчета:Integer);
var num, ii, kk, j1, j2, j5 :Integer;
var res, res101, res102, res105 :String;
 num=LengthOfArray(BufFlag);
 kk=0; j1=0; j2=0; j5=0;
 res101=""; res102=""; res105="";
 for ii=1 to num do
   if BufFlag[ii]:
     kk=kk+1;
     if FTRсчета=2:
       if Match(BufMsk[ii], "101.??"): j1=j1+1; res101=res101+" "+BufMsk[ii];
       |  Match(BufMsk[ii], "102.??"): j2=j2+1; res102=res102+" "+BufMsk[ii];
       fi;
     |  FTRсчета=3:
       if Match(BufMsk[ii], "105.??"): j5=j5+1; res105=res105+" "+BufMsk[ii]; fi;
     else
       if Match(BufMsk[ii], "101.??"): j1=j1+1; res101=res101+" "+BufMsk[ii];
       |  Match(BufMsk[ii], "102.??"): j2=j2+1; res102=res102+" "+BufMsk[ii];
       |  Match(BufMsk[ii], "105.??"): j5=j5+1; res105=res105+" "+BufMsk[ii];
       fi;
     fi;
   fi;
 od;
 res101=Trim(res101);
 res102=Trim(res102);
 res105=Trim(res105);
 if j1=8: res101="101.??"; fi; -- субсчетов 101 - 8 штук
 if j2=1: res102="102.?0"; fi; -- субсчетов 102 - 1 штук
 if j5=8: res105="105.??"; fi; -- субсчетов 105 - 8 штук
 res="";
 if FTRсчета=2:
    if kk=num: res="101.?? 102.?0"; else res=res101+" "+res102; fi;
 |  FTRсчета=3:
    if kk=num: res="105.??"; else res=res105; fi;
 else
    if kk=num: res="101.?? 102.?0 103.1? 105.??"; else res=res101+" "+res102+" "+res105; fi;
 fi;
 отчСЧТ=Trim(res);
end;

Proc Счета_ОбновитьВидыНФА(FTRсчета:Integer);
 Счета_СоздатьМассивВидовНФА(FTRсчета);
 Счета_ПеременныеVМассивФлагов(FTRсчета);
 Счета_ФлагиВТекст(FTRсчета);
end;

Proc Счета_ВнешнийВид;
 Счета_ОбновитьВидыНФА(curФтрAcc);
end;

Proc Счета_ВыборВидаНФА(FTRсчета:Integer);
var kk, MaxK, num, ii :Integer;
 ClearVariable(Buf); ClearVariable(BufMsk); ClearVariable(BufStr); ClearVariable(BufFLAG);
 MaxK=0;
 Buf[1]=Chr(149)+"-->> Отмена изменений";
 Buf[2]=Chr(169)+"-->> Утвердить изменения";
 Buf[3]=Chr(187)+Chr(043)+Chr(171)+"-->> Выделить все счета НФА";
 Buf[4]=Chr(171)+Chr(151)+Chr(187)+"-->> Сбросить все счета НФА";
 Buf[5]="КОД$-->> Счета учета НФА.";
 MaxK=LengthOfArray(Buf);
 Счета_СоздатьМассивВидовНФА(FTRсчета);
 Счета_ПеременныеVМассивФлагов(FTRсчета);
 num=LengthOfArray(BufMsk);
 for ii=1 to num do Buf[ii+MaxK]="КОД$"+BufMsk[ii]+"-->> "+if(BufFlag[ii], "[ВКЛ.]: ", "[ВЫКЛ.]: ")+BufStr[ii]; od;
 kk=0;
 while kk=0 or kk>MaxK do
   Счета_ОбновитьМеню(kk, MaxK);
   kk=AlternateTree("", Buf, -1, if(kk>MaxK, kk, MaxK), 12, "$", "Параметр", "Комментарий", -1, False);
   if kk=1:
     Exit;
   |  kk=2:
     if SearchInArray(BufFlag, True, False, 1)<1:
        Message("[Утвердить изменения]^MНет выбранных счетов!", mtWarning);
        kk=0;
     fi;
   |  kk=3:
     for ii=1 to num do BufFlag[ii]=True;  Счета_ОбновитьМеню(ii+MaxK, MaxK); od;
     kk=0;
   |  kk=4:
     for ii=1 to num do BufFlag[ii]=False; Счета_ОбновитьМеню(ii+MaxK, MaxK); od;
     kk=0;
   |  kk>MaxK:
     BufFlag[kk-MaxK]=not(BufFlag[kk-MaxK]);
   fi;
 od;
 --
 Счета_МассивФлаговVПеременные(FTRсчета);
 Счета_ФлагиВТекст(FTRсчета);
end;

Proc РазрешенУчетОстатковНачало(Разрешено:Logical);
 if not Разрешено:
   flgУч_М_НП=False;
   flgУч_Р_НП=False;
   flgУч_Б_НП=False;
 fi;
 cb_Уч_М_НП.Enabled=Разрешено;
 cb_Уч_Р_НП.Enabled=Разрешено;
 cb_Уч_Б_НП.Enabled=Разрешено;
end;

Proc РазрешенУчетОстатков_Конец(Разрешено:Logical);
 if not Разрешено:
   flgУч_М_КП=False;
   flgУч_Р_КП=False;
   flgУч_Б_КП=False;
 fi;
 cb_Уч_М_КП.Enabled=Разрешено;
 cb_Уч_Р_КП.Enabled=Разрешено;
 cb_Уч_Б_КП.Enabled=Разрешено;
end;

Proc РазрешенУчетУсловийОстатков(Разрешено:Logical);
 if not Разрешено:
   flgОстНП=False;
   flgОстКП=False;
 fi;
 cb_ОстНП.Enabled=Разрешено;
 cb_ОстКП.Enabled=Разрешено;
 if Разрешено:
   РазрешенУчетОстатковНачало(flgОстНП);
   РазрешенУчетОстатков_Конец(flgОстКП);
 | True:
   РазрешенУчетОстатковНачало(False);
   РазрешенУчетОстатков_Конец(False);
 fi;
end;

Proc РазрешенУчетОборотов_Дебета(Разрешено:Logical);
 if not Разрешено:
   flgУч_М_ОД=False;
   flgУч_Р_ОД=False;
   flgУч_Б_ОД=False;
 fi;
 cb_Уч_М_ОД.Enabled=Разрешено;
 cb_Уч_Р_ОД.Enabled=Разрешено;
 cb_Уч_Б_ОД.Enabled=Разрешено;
end;

Proc РазрешенУчетОборотовКредита(Разрешено:Logical);
 if not Разрешено:
   flgУч_М_ОК=False;
   flgУч_Р_ОК=False;
   flgУч_Б_ОК=False;
 fi;
 cb_Уч_М_ОК.Enabled=Разрешено;
 cb_Уч_Р_ОК.Enabled=Разрешено;
 cb_Уч_Б_ОК.Enabled=Разрешено;
end;

Proc РазрешенУчетУсловийОборотов(Разрешено:Logical);
 if not Разрешено:
   flgОбДеб=False;
   flgОбКре=False;
 fi;
 cb_ОбДеб.Enabled=Разрешено;
 cb_ОбКре.Enabled=Разрешено;
 if Разрешено:
   РазрешенУчетОборотов_Дебета(flgОбДеб);
   РазрешенУчетОборотовКредита(flgОбКре);
 | True:
   РазрешенУчетОборотов_Дебета(False);
   РазрешенУчетОборотовКредита(False);
 fi;
end;

Proc ВнешнийВид_ФтрПоСумме_типНФА(Разрешено:Logical);
 if not Разрешено:
   flgНФААМТ=False;
   flgНФА100=False;
   flgНФАБЕЗ=False;
      flgНФА=False; -- строка дополнительной детализации НФА по типам
   Секц_Групп.Row(9, RowVisible, False);
 else
   Секц_Групп.Row(9, RowVisible, True);
 fi;
 cb_НФААМТ.Enabled = Разрешено;
 cb_НФА100.Enabled = Разрешено;
 cb_НФАБЕЗ.Enabled = Разрешено;
 --
 ПорядокГрупп_ПеречитатьГруппы;
end;

Proc ВнешнийВид_ФтрПоСумме_ЦенЕдн(Разрешено:Logical);
 if not Разрешено: БМЦеныЕЦ=0; OldЦена=0; flgSgnЕЦ=0; fi;
 СекцОтбЦен.Cell(1, 3, CellFontColor, if(Разрешено, coWhite, coBlack));
 СекцОтбЦен.Cell(1, 3, CellBgColor,   if(Разрешено, coTeal, coTransparent));
 СекцОтбЦен.Cell(1, 3, CellReadOnly,  not Разрешено);
 СекцОтбЦен.Cell(1, 4, CellFontColor, coBlack);
 СекцОтбЦен.Cell(1, 4, CellBgColor,   if(Разрешено, coAqua, coTransparent));
 СекцОтбЦен.Cell(1, 4, CellReadOnly,  not Разрешено);
 СекцОтбЦен.Cell(1, 3, CellBorder,    if(Разрешено, "1,1,1,1", "0,0,0,0"));
 СекцОтбЦен.Cell(1, 4, CellBorder,    if(Разрешено, "1,1,1,1", "0,0,0,0"));
 СекцОтбЦен.Cell(1, 5, CellContents,  if(Разрешено, " рублей (целых, без копеек)", ""), True);
end;

Proc ВнешнийВид_ФтрПоСумме_РУБКОП;
var Разрешено :Logical;
 if flgUse_ЦНП or flgUse_ЦДО or flgUse_ЦКО or flgUse_ЦКП: Разрешено=True; else Разрешено=False; fi;
 СекцОтбЦен.Cell(3, 5, CellContents,  if(Разрешено, Chr(13)+"рублей"+Chr(13)+"(целых, без копеек)", ""), True);
end;

Proc ВнешнийВид_ФтрПоСумме_cbЦНП(Разрешено:Logical);
 if not Разрешено: БМЦеныНП=0; OldЦена=0; flgSgnНП=0; fi;
 СекцОтбЦен.Cell(3, 3, CellFontColor, if(Разрешено, coWhite, coBlack));
 СекцОтбЦен.Cell(3, 3, CellBgColor,   if(Разрешено, coTeal, coTransparent));
 СекцОтбЦен.Cell(3, 3, CellReadOnly,  not Разрешено);
 СекцОтбЦен.Cell(3, 4, CellFontColor, coBlack);
 СекцОтбЦен.Cell(3, 4, CellBgColor,   if(Разрешено, coAqua, coTransparent));
 СекцОтбЦен.Cell(3, 4, CellReadOnly,  not Разрешено);
 СекцОтбЦен.Cell(3, 3, CellBorder,    if(Разрешено, "1,1,1,1", "0,0,0,0"));
 СекцОтбЦен.Cell(3, 4, CellBorder,    if(Разрешено, "1,1,1,1", "0,0,0,0"));
 ВнешнийВид_ФтрПоСумме_РУБКОП;
end;

Proc ВнешнийВид_ФтрПоСумме_cbЦДО(Разрешено:Logical);
 if not Разрешено: БМЦеныДО=0; OldЦена=0; flgSgnДО=0; fi;
 СекцОтбЦен.Cell(4, 3, CellFontColor, if(Разрешено, coWhite, coBlack));
 СекцОтбЦен.Cell(4, 3, CellBgColor,   if(Разрешено, coTeal, coTransparent));
 СекцОтбЦен.Cell(4, 3, CellReadOnly,  not Разрешено);
 СекцОтбЦен.Cell(4, 4, CellFontColor, coBlack);
 СекцОтбЦен.Cell(4, 4, CellBgColor,   if(Разрешено, coAqua, coTransparent));
 СекцОтбЦен.Cell(4, 4, CellReadOnly,  not Разрешено);
 СекцОтбЦен.Cell(4, 3, CellBorder,    if(Разрешено, "1,1,1,1", "0,0,0,0"));
 СекцОтбЦен.Cell(4, 4, CellBorder,    if(Разрешено, "1,1,1,1", "0,0,0,0"));
 ВнешнийВид_ФтрПоСумме_РУБКОП;
end;

Proc ВнешнийВид_ФтрПоСумме_cbЦКО(Разрешено:Logical);
 if not Разрешено: БМЦеныКО=0; OldЦена=0; flgSgnКО=0; fi;
 СекцОтбЦен.Cell(5, 3, CellFontColor, if(Разрешено, coWhite, coBlack));
 СекцОтбЦен.Cell(5, 3, CellBgColor,   if(Разрешено, coTeal, coTransparent));
 СекцОтбЦен.Cell(5, 3, CellReadOnly,  not Разрешено);
 СекцОтбЦен.Cell(5, 4, CellFontColor, coBlack);
 СекцОтбЦен.Cell(5, 4, CellBgColor,   if(Разрешено, coAqua, coTransparent));
 СекцОтбЦен.Cell(5, 4, CellReadOnly,  not Разрешено);
 СекцОтбЦен.Cell(5, 3, CellBorder,    if(Разрешено, "1,1,1,1", "0,0,0,0"));
 СекцОтбЦен.Cell(5, 4, CellBorder,    if(Разрешено, "1,1,1,1", "0,0,0,0"));
 ВнешнийВид_ФтрПоСумме_РУБКОП;
end;

Proc ВнешнийВид_ФтрПоСумме_cbЦКП(Разрешено:Logical);
 if not Разрешено: БМЦеныКП=0; OldЦена=0; flgSgnКП=0; fi;
 СекцОтбЦен.Cell(6, 3, CellFontColor, if(Разрешено, coWhite, coBlack));
 СекцОтбЦен.Cell(6, 3, CellBgColor,   if(Разрешено, coTeal, coTransparent));
 СекцОтбЦен.Cell(6, 3, CellReadOnly,  not Разрешено);
 СекцОтбЦен.Cell(6, 4, CellFontColor, coBlack);
 СекцОтбЦен.Cell(6, 4, CellBgColor,   if(Разрешено, coAqua, coTransparent));
 СекцОтбЦен.Cell(6, 4, CellReadOnly,  not Разрешено);
 СекцОтбЦен.Cell(6, 3, CellBorder,    if(Разрешено, "1,1,1,1", "0,0,0,0"));
 СекцОтбЦен.Cell(6, 4, CellBorder,    if(Разрешено, "1,1,1,1", "0,0,0,0"));
 ВнешнийВид_ФтрПоСумме_РУБКОП;
end;

Proc ВнешнийВид_ФтрПоСумме_ЦенРаз(Разрешено:Logical);
 if not Разрешено:
   flgUse_ЦНП=False; БМЦеныНП=0;
   flgUse_ЦДО=False; БМЦеныДО=0;
   flgUse_ЦКО=False; БМЦеныКО=0;
   flgUse_ЦКП=False; БМЦеныКП=0;
 fi;
 cb_Use_ЦНП.Enabled = Разрешено;
 cb_Use_ЦДО.Enabled = Разрешено;
 cb_Use_ЦКО.Enabled = Разрешено;
 cb_Use_ЦКП.Enabled = Разрешено;
 if Разрешено:
   ВнешнийВид_ФтрПоСумме_cbЦНП(flgUse_ЦНП);
   ВнешнийВид_ФтрПоСумме_cbЦДО(flgUse_ЦДО);
   ВнешнийВид_ФтрПоСумме_cbЦКО(flgUse_ЦКО);
   ВнешнийВид_ФтрПоСумме_cbЦКП(flgUse_ЦКП);
 | True:
   ВнешнийВид_ФтрПоСумме_cbЦНП(False);
   ВнешнийВид_ФтрПоСумме_cbЦДО(False);
   ВнешнийВид_ФтрПоСумме_cbЦКО(False);
   ВнешнийВид_ФтрПоСумме_cbЦКП(False);
 fi;
end;

Proc ВнешнийВид_ФтрПоСумме_УчтУсл(Разрешено:Logical);
 if not Разрешено:
   flgУчетОст=False;
   flgУчетОбо=False;
 fi;
 cb_УчетОст.Enabled=Разрешено;
 cb_УчетОбо.Enabled=Разрешено;
 if Разрешено:
   РазрешенУчетУсловийОстатков(flgУчетОст);
   РазрешенУчетУсловийОборотов(flgУчетОбо);
 | True:
   РазрешенУчетУсловийОстатков(False);
   РазрешенУчетУсловийОборотов(False);
 fi;
end;

Proc ВнешнийВид_ФильтрПоСумме(ТипФильтраПоСумме:Integer; Разрешено:Logical; AllCheck:Logical);
 ВнешнийВид_ФтрПоСумме_типНФА(if(ТипФильтраПоСумме=2 and Разрешено, True, False));
 if AllCheck:
   ВнешнийВид_ФтрПоСумме_ЦенЕдн(if(ТипФильтраПоСумме=3, True, False));
   ВнешнийВид_ФтрПоСумме_ЦенРаз(if(ТипФильтраПоСумме=4, True, False));
   ВнешнийВид_ФтрПоСумме_УчтУсл(if(ТипФильтраПоСумме=5, True, False));
 fi;
end;

Proc ВнешнийВид_ФильтрПоСуммеПроверить(ТипФильтраПоСумме:Integer; ftrПоТипамСЧТ:Integer; ftrПоГруппСЧТ:Integer; Есть106:Logical; ftrСпособ_НФА:Integer; AllCheck:Logical);
var aFlg, Wrk2, Flag1, Flag2, Flag3 :Logical;

  if ftrСпособ_НФА=3: aFlg=False; if ТипФильтраПоСумме>1: curФтрЦен=1; ТипФильтраПоСумме=1; fi; else aFlg=True; fi;

  Flag1=if(ftrПоТипамСЧТ=2, True, False);
  Flag2=if(ftrПоГруппСЧТ=2, True, False);
  Flag3=if(ftrСпособ_НФА=1, True, False);

  Wrk2=if(Flag1 and Flag2 and Flag3 and not Есть106, True, False);
  if ТипФильтраПоСумме=2 and not Wrk2: curФтрЦен=1; ТипФильтраПоСумме=1; fi;

  rbtЦЕНАТИП.Enabled = Wrk2;
  rbtЦЕНАФОД.Enabled = aFlg;
  rbtЦЕНАФРН.Enabled = aFlg;
  rbtЦЕНАУСЛ.Enabled = aFlg;

  ВнешнийВид_ФильтрПоСумме(ТипФильтраПоСумме, Wrk2, AllCheck);
end;

Proc ВнешнийВид_ЕстьТолько106(ЕстьТолько106:Logical);
 if ЕстьТолько106 and curФтрНФА=1: curФтрНФА=2; fi;
 rb_НФАEXT.Enabled = not ЕстьТолько106;
end;

Proc ВнешнийВид_Есть106(Есть106:Logical; ftrПоГруппСЧТ:Integer; AllCheck:Logical);
var ЕстьЗабаланс :Logical;
 ЕстьЗабаланс=if(ftrПоГруппСЧТ=3, True, False);
 if ЕстьЗабаланс and Есть106: Есть106=False; flgУчет106xURep=Есть106; fi;
 cb_Учет106xURep.Enabled = not ЕстьЗабаланс;
 if not Есть106: flgУчет106xOnly=False; fi;
 cb_Учет106xOnly.Enabled = Есть106;
 ВнешнийВид_ЕстьТолько106(flgУчет106xOnly);
 ВнешнийВид_ФильтрПоСуммеПроверить(curФтрЦен, curФтрAcc, curБалЗаб, Есть106, curФтрНФА, AllCheck);
end;

Proc ВнешнийВид_ФильтрКБК(ftrПоГруппСЧТ:Integer);
var цвFont, цвBack :Integer;
var ТЧ, NotUseKBK :Logical;
 if ftrПоГруппСЧТ<>2: NotUseKBK=True; else NotUseKBK=False; fi;
 if NotUseKBK: цвFont=coBlack; цвBack=coTransparent; ТЧ=True; else цвFont=coWhite; цвBack=coTeal; ТЧ=False; fi;
 if ТЧ: отчКБК=""; valКБК=""; fi;
 Секц_Услов.Cell(3, 3, CellFontColor, цвFont);
 Секц_Услов.Cell(3, 3, CellBgColor,   цвBack);
 Секц_Услов.Cell(3, 3, CellReadOnly,  ТЧ);
end;

Proc ВнешнийВид_ФильтрДопСпр;
var ТЧ, ЕстьОтбор :Logical;
var цвFont, цвBack :Integer;
 if Name_A(VOCКОД+".")<>" ": ЕстьОтбор=True; else ЕстьОтбор=False; fi;
 if ЕстьОтбор: цвFont=coWhite; цвBack=coTeal; ТЧ=False; else цвFont=coBlack; цвBack=coTransparent; ТЧ=True; fi;
 if ТЧ: flgДОП=False; отчДОП=""; nmsДОП=""; fi;
 Секц_Групп.Cell(08, 3, CellFontColor, цвFont);
 Секц_Групп.Cell(08, 3, CellBgColor,   цвBack);
 Секц_Групп.Cell(08, 3, CellFontStyle, if(ТЧ, 0, fsBold));
 Секц_Групп.Cell(08, 3, CellReadOnly,  ТЧ);
 Секц_Услов.Cell(10, 3, CellFontColor, цвFont);
 Секц_Услов.Cell(10, 3, CellBgColor,   цвBack);
 Секц_Услов.Cell(10, 3, CellReadOnly,  ТЧ);
 ПорядокГрупп_ПеречитатьГруппы;
end;

Func AddVocOPER(PrevValue:String; Auto:Logical) :String;
var res, tmp, voc :String;
var RO, OA, i, num, len, k :Integer;
var REC :Record;
var OK :Logical;
 RefreshAna;
 res="";
 REC=SignToRecord("ДНФА.ВНПР.ЭЭ", False);
 if REC<>NIL:
   RO=OpenWorkArea("РПО_ДНФА", "", "Ukey="+RecordToString(REC));
   Try
     if Records(RO)=1:
       OA=OpenArray(RO, 1, "ЗАПРОС", "ПОЛЕПОДТАБЛИЦЫ", "Match(ПОЛЕПОДТАБЛИЦЫ, 'АН*')");
       num=Records(OA);
       if num>0:
         ClearVariable(Txt);
         voc=GetFieldS(RO, 1, "НЕДЕЙСТВСПР");
         len=WordsCount(voc, "|");
         if len>0:
           for i=1 to len do
             tmp=Up(ExtractWord(i, voc, "|"));
             if SearchInArray(Txt, tmp, True, 1)=-1: k=InsertInArraySort(Txt, tmp); fi;
           od;
         fi;
         voc=GetFieldS(RO, 1, "НЕДЕЙСТВОСТ");
         len=WordsCount(voc, "|");
         if len>0:
           for i=1 to len do
             tmp=Up(ExtractWord(i, voc, "|"));
             if SearchInArray(Txt, tmp, True, 1)=-1: k=InsertInArraySort(Txt, tmp); fi;
           od;
         fi;
         ClearVariable(Buf);
         for i=1 to num do
           tmp=GetFieldS(OA, i, "ОТВЕТ");
           OK=GetFieldL(OA, i, "ОСТАТОК");
           if not Match(tmp, "НФА.*") and
              not Match(tmp, "МОЛ.*") and
              not Match(tmp, "М.*")   and
              not Match(tmp, pfxУЧН+".*") and OK:
              tmp=Up(ExtractWord(1, tmp, "."));
              if SearchInArray(Txt, tmp, True, 1)=-1 and SearchInArray(Buf, tmp, True, 1)=-1:
                k=InsertInArraySort(Buf, tmp);
              fi;
           fi;
         od;
       fi;
       CloseWorkArea(OA);
       num=LengthOfArray(Buf);
       if num>0:
         res="";
         for i=1 to num do res=Объединить(res, Buf[i], "|"); od;
       else
         if not Auto: Message("В операции 'ДНФА.ВНПР.ЭЭ'^Mне найдено дополнительной аналитики!", mtInformation); fi;
         ^PrevValue;
       fi;
     fi;
   Finally
     CloseWorkArea(RO);
   end;
 else
   if not Auto: Message("В базе операции нет 'ДНФА.ВНПР.ЭЭ'", mtInformation); fi;
   ^PrevValue;
 fi;
 ^res;
end;

Proc ОчиститьAddVoc;
 ClearVariable(Buf);
 ClearVariable(aAna);
 ClearVariable(BufInt);
 ClearVariable(BufStr);
 ClearVariable(BufMsk);
end;

Func AddVoc_OSTOPER(RepDat:Date; ИсклОБЗ:Logical; AllVOC:Logical; SepRes:String) :String;
-- ИсклОБЗ - исключать набор обязательных для учета НФА справочников (М МОЛ НФА УЧН)
-- AllVOC  - всегда выводить все найденные справочники
var RO, OA, num, ii, len, jj, kk, cnt :Integer;
var Путь, ANA, Value, VOC :String;
var Отч1 :Report;
var REC :Record;
var OK :Logical;
 Refresh(False);
 ClearVariable(aAna);
 Путь=PlanVar("НФА")+"\ОТЧЕТЫ\НФАОТЧ2007.lst";
 if ExistFile(Путь):
   Try
     Отч1=RepOpen(Путь+"|По_признакам_БАЛиЗАБ", sМаскаНФА, "(ДНФА.РАСХ.*|ДНФА.ВНПР.*)&МОЛ.*&М.*&НФА.*", 1.1.100, RepDat+1, "", "ДНФА");
     Try
       while RepNext(Отч1) do AddInArray(aAna, True, False, RepIdent(Отч1)); end;
     Finally
       Отч1=RepClose(Отч1);
     end;
   Except
   end;
 fi;
 if LengthOfArray(aAna)=0: for Sign ANA="ДНФА.РАСХ.*|ДНФА.ВНПР.*" do AddInArray(aAna, True, False, ANA); od; fi;
 ClearVariable(BufStr);
 ClearVariable(BufInt);
 num=LengthOfArray(aAna); -- количество нужных типов операций движения НФА
 if num>0:
   ShowProgress(num, "Анализируем...");
   RO=OpenWorkArea("РПО_ДНФА", "", "1=0");
   Try
     for ii=1 to num do
       ProgressPos(ii);
       ClearVariable(BufMsk);
       ANA=aAna[ii];
       if SignCardFile(ANA)="РПО_ДНФА": -- чтоб не попасть на текстовый признак
         REC=SignToRecord(ANA, False);
         if REC<>NIL:
           SetFilter(RO, "Ukey="+RecordToString(REC));
           if Records(RO)=1:
             ClearVariable(Buf); -- для исключенных справочников
             if ИсклОБЗ:
               Buf[1]="М";
               Buf[2]="МОЛ";
               Buf[3]="НФА";
               Buf[4]="УЧН";
             fi;
             Value=Up(Trim(GetFieldS(RO, 1, "НЕДЕЙСТВСПР")));
             len=WordsCount(Value, "|"); if len>0: for jj=1 to len do AddInArray(Buf, True, False, ExtractWord(jj, Value, "|")); od; fi;
             Value=Up(Trim(GetFieldS(RO, 1, "НЕДЕЙСТВОСТ")));
             len=WordsCount(Value, "|"); if len>0: for jj=1 to len do AddInArray(Buf, True, False, ExtractWord(jj, Value, "|")); od; fi;
             OA=OpenArray(RO, 1, "ЗАПРОС", "", "ОСТАТОК and (ТИППАРАМЕТРА=1 or ТИППАРАМЕТРА=9 or ТИППАРАМЕТРА=14)"); -- (1 НФА) (9 аналитика) (14 аналитика ручного ввода)
             len=Records(OA);
             if len>0:
               for jj=1 to len do
                 OK=False;
                 Value=Trim(GetFieldS(OA, jj, "СПР"));
                 if Value<>"":
                   cnt=WordsCount(Value, "|");
                   if cnt>0:
                     for kk=1 to cnt do
                       VOC=GetAnaGlossary(Up(ExtractWord(1, ExtractWord(kk, Value, "|"), ".")));
                       if VOC<>"": 
                         if SearchInArray(Buf, VOC, True, 1)=-1:
                           AddInArray(BufMsk, True, False, VOC);
                           if not OK: OK=True; fi;
                         fi;
                       fi;
                     od;
                   fi;
                 fi;
                 if not OK:
                   Value=Trim(GetFieldS(OA, jj, "ОТВЕТ"));
                   if Value<>"":
                     cnt=WordsCount(Value, "|");
                     if cnt>0:
                       for kk=1 to cnt do
                         VOC=GetAnaGlossary(Up(ExtractWord(1, ExtractWord(kk, Value, "|"), ".")));
                         if VOC<>"":
                           if SearchInArray(Buf, VOC, True, 1)=-1:
                             AddInArray(BufMsk, True, False, VOC);
                             if not OK: OK=True; fi;
                           fi;
                         fi;
                       od;
                     fi;
                   fi;
                 fi;
               od;
             fi;
             CloseWorkArea(OA);
           fi;
         fi;
       fi;
       len=lengthOfArray(BufMsk);
       if len>0:
         for jj=1 to len do
           cnt=SearchInArray(BufStr, BufMsk[jj], True, 1);
           if cnt=-1:
             kk=InsertInArraySort(BufStr, BufMsk[jj]);
             InsertInArray(BufInt, kk, 1);
           else
             BufInt[cnt]=BufInt[cnt]+1;
           fi;
         od;
       fi;
     od;
   Finally
     CloseWorkArea(RO);
     CloseProgress;
   end;
   Value="";
   len=LengthOfArray(BufStr);
   if len>0:
     cnt=0;
     if not AllVOC:
       OK=False;
       for jj=1 to len do if BufInt[jj]<>num: OK=True; Break; fi; od;
       if OK:
         kk=0;
         while kk=0 do
           kk=Enquiry("Выберите действие...", "В операциях движения НФА обнаружены неодинаковые наборы справочников для остатков.^MНеобходимо выбрать...", "...только общие справочники;...все справочники", mtConfirmation);
         od;
         if kk=1: cnt=+1; | kk=2: cnt=-1; fi;
       else
         cnt=-1;
       fi;
     else
       cnt=-1;
     fi;
     if cnt>0:
       for jj=1 to len do if BufInt[jj]=num: Value=Объединить(Value, BufStr[jj], SepRes); fi; od;
     else
       for jj=1 to len do Value=Объединить(Value, BufStr[jj], SepRes); od;
     fi;
   fi;
   ОчиститьAddVoc;
   ^Value;
 fi; --num>0
 ОчиститьAddVoc;
 ^"";
end;

Func ИсключитьСправочники :String;
var ANA, Value, ANA0:String;
var ii, num :Integer;
 ClearVariable(Buf);
   ANA=AddVoc_OSTOPER(if(DataКП>1.1.2000, DataКП, ToDay+1), True, True, "|");
   if ANA<>"":
     num=WordsCount(ANA, "|");
     if num>0:
       ANA0=' НФА МОЛ М УЧН '+up(VOCКОД)+' ';
       for ii=1 to num do
	 Value=up(ExtractWord(ii, ANA, "|"));
	 if pos(Value, ANA0)<1:
	   Value=Value+".*";
	   AddInArray(Buf, True, False, Value);
	 fi;
       od;
     fi;
   fi;

   Value='ИНВВЕД'      ;if pos(Value, ANA0)<1:Value=Value+".*";AddInArray(Buf, True, False, Value);fi;
   Value='ФКР'	       ;if pos(Value, ANA0)<1:Value=Value+".*";AddInArray(Buf, True, False, Value);fi;
   Value='КОСГУ'       ;if pos(Value, ANA0)<1:Value=Value+".*";AddInArray(Buf, True, False, Value);fi;
   Value='ДВИЖ_НФА'    ;if pos(Value, ANA0)<1:Value=Value+".*";AddInArray(Buf, True, False, Value);fi;
   Value='К'	       ;if pos(Value, ANA0)<1:Value=Value+".*";AddInArray(Buf, True, False, Value);fi;
   Value='КТ'	       ;if pos(Value, ANA0)<1:Value=Value+".*";AddInArray(Buf, True, False, Value);fi;
   Value='ПБС'	       ;if pos(Value, ANA0)<1:Value=Value+".*";AddInArray(Buf, True, False, Value);fi;
   Value='ДНФА'        ;if pos(Value, ANA0)<1:Value=Value+".*";AddInArray(Buf, True, False, Value);fi;
   Value='НФА_СПРАВКА' ;if pos(Value, ANA0)<1:Value=Value+".*";AddInArray(Buf, True, False, Value);fi;
   num=lengthofarray(Buf);
   ANA="";
   for ii=1 to num do
     ANA=ANA+'|'+Buf[ii];
   od;
   if ANA<>'':ANA=SubStr(ANA,2,255);fi;
   ClearVariable(Buf);
   ^ANA;
end;

Func ВыборСправочникаФильтра(VOC:String) :String;
var ANA, Value :String;
var ii, num, kk :Integer;
 kk=-1;
 ClearVariable(Buf);
 Buf[1]="Из справочников остатков движения НФА";
 Buf[2]="Типичные допсправочники (из переменной)";
 Buf[3]="Смешанный вариант (из пунктов 1 и 2)";
 num=Alternate("Выберите тип выборки справочников...", Buf, -1, 1, 12);
 if num>0: kk=num; else ^VOC; fi;
 --
 ClearVariable(Buf);
 if kk=1 or kk=3: --Из справочников остатков движения НФА
   ANA="";
   --ANA=AddVocOPER("", True); -- устаревший вариант
   ANA=AddVoc_OSTOPER(if(DataКП>1.1.2000, DataКП, ToDay+1), True, True, "|");
   if ANA<>"":
     num=WordsCount(ANA, "|");
     if num>0:
       for ii=1 to num do
         Value=ExtractWord(ii, ANA, "|")+".*";
         AddInArray(Buf, True, False, Value);
       od;
     fi;
   fi;
 fi;
 if kk=2 or kk=3: --Типичные допсправочники (из переменной)
   num=WordsCount(MaskUserVoc, "|");
   if num>0:
     for ii=1 to num do
       Value=ExtractWord(ii, MaskUserVoc, "|");
       if Value<>"М.*" and Value<>"МОЛ.*" and Value<>"НФА.*" and Value<>"УЧН.*": AddInArray(Buf, True, False, Value); fi;
     od;
   fi;
 fi;
 --
 Value="";
 num=LengthOfArray(Buf);
 if num>0: for ii=1 to num do Value=Value+"|"+Buf[ii]; od; fi;
 if SubStr(Value, 1, 1)="|": Value=Trim(SubStr(Value, 2, 255)); fi;
 --
 ANA="";
 if Value<>"":
   ANA=AnaElection(Value, True, False, VOC+".");
 else
   Message("Не найдено дополнительных справочников для отбора", mtError);
 fi;
 if ANA="": ^VOC; else ^ANA; fi;
end;

Proc ВыборДопСправочника(onExit:Logical);
var StoreVoc, NewVoc :String;
var SaveValue :Logical;
 SaveValue=False;
 StoreVoc=VOCКОД;
 if onExit: NewVoc=""; else NewVoc=ВыборСправочникаФильтра(StoreVoc); fi;
 if NewVoc<>StoreVoc: if not ОтменитьИзмененияУсловийОтчета: SaveValue=True; fi; fi;
 if SaveValue:
   VOCКОД=NewVoc;
   VOCИМЯ=Name_A(VOCКОД+".");
   ОТЧДОП="";
   NMSДОП="";
   ВнешнийВид_ФильтрДопСпр;
 fi;
end;

Proc Счета_ВыборВидаНФАonEnter(FTRсчета:Integer);
var StoreСЧТ :String;
 StoreСЧТ=отчСЧТ;
 Счета_ВыборВидаНФА(FTRсчета);
 if отчСЧТ<>StoreСЧТ: 
   if ОтменитьИзмененияУсловийОтчета: 
     отчСЧТ=StoreСЧТ;
   else
     ОчиститьУсловияОтбора(True, True, flgЧиститьАна);
     if not flgЧиститьАна: отчНФА=""; nmsНФА=""; fi;
   fi;
 fi;
 ВнешнийВид_ФильтрКБК(curБалЗаб);
 ValidateОтчетSection;
end;

Func ИтоговаяМаскаСчетаЦС(ВФО:Integer; maskКБК:String; aFTRсчета:Integer) :String;
var ИФД, maskUSEкбк, maskUSEсчт, resMask :String;
 resMask="";
 if ВФО=2: ИФД="1"; | ВФО=3: ИФД="2"; else ИФД="?"; fi;
 if maskКБК<>"": maskUSEкбк=maskКБК; else maskUSEкбк="???.????.???????.???"; fi;
 if aFTRсчета=2: maskUSEсчт="106.?1.??0";
 |  aFTRсчета=3: maskUSEсчт="106.?4.??0";
 else            maskUSEсчт="106.??.??0";
 fi;
 resMask=maskUSEкбк+"."+ИФД+"."+maskUSEсчт;
 ^resMask;
end;

Func ПравильнаяМаскаСчетовОС(maskСчета:String) :String;
var num, ii :Integer;
var res :String;
 res="";
 num=WordsCount(maskСчета, " ");
 if num>0: for ii=1 to num do res=res+"|"+"*."+ExtractWord(ii, maskСчета, " ")+"*"; od; fi;
 if SubStr(res, 1, 1)="|": res=Trim(SubStr(res, 2, 255)); fi;
 ^res;
end;

Func ИтоговаяМаскаСчета(ВФО:Integer; maskСЧТ:String; maskКБК:String; useБАЛ:Logical; useЗАБ:Logical) :String;
var ИФД, maskUSEсчт, maskUSEкбк, resMask :String;
 if ВФО=2: ИФД="1"; | ВФО=3: ИФД="2"; else ИФД="?"; fi;
 if maskКБК<>"": maskUSEкбк=maskКБК; else maskUSEкбк="???.????.???????.???"; fi;
 if maskСЧТ<>"": maskUSEсчт=ПравильнаяМаскаСчетовОС(maskСЧТ); else maskUSEсчт="*.101.??.?10|*.102.?0.?20|*.105.??.?40"; fi;
 resMask="("+maskUSEсчт+")&("+if(useБАЛ, maskUSEкбк+"."+ИФД+".???.??.???", "")+if(useБАЛ and useЗАБ, "|", "")+if(useЗАБ, "ЗАБ.??.10?.??", "")+")";
 ^resMask;
end;

Func ИмяЭлементаСтруктурыКБК(НомерЭлемента:Integer; ТипСтруктуры:String) :String;
--???.????.???????.??? - Глава # Подраздел # Целевая статья # Вид расходов
--???.?.??.?????.??.???? - Администратор # Группа # Подгруппа # Статья # Элемент # Программа, Подпрограмма
--???.??.??.??.??.??.???? - Администратор # Группа # Подгруппа # Статья # Подстатья # Элемент # Программа, Подпрограмма
 if ТипСтруктуры="ФКР":  ТипСтруктуры="КР"; fi;
 if ТипСтруктуры="КИФД": ТипСтруктуры="ФД"; fi;
 if ТипСтруктуры="КР":
   if НомерЭлемента=1: ^"Глава";
   |  НомерЭлемента=2: ^"Подраздел";
   |  НомерЭлемента=3: ^"Целевая статья";
   |  НомерЭлемента=4: ^"Вид расходов";
   fi;
 |  ТипСтруктуры="КД":
   if НомерЭлемента=1: ^"Администратор";
   |  НомерЭлемента=2: ^"Группа";
   |  НомерЭлемента=3: ^"Подгруппа";
   |  НомерЭлемента=4: ^"Статья";
   |  НомерЭлемента=5: ^"Элемент";
   |  НомерЭлемента=6: ^"Программа, подпрограмма";
   fi;
 |  ТипСтруктуры="ФД":
   if НомерЭлемента=1: ^"Администратор";
   |  НомерЭлемента=2: ^"Группа";
   |  НомерЭлемента=3: ^"Подгруппа";
   |  НомерЭлемента=4: ^"Статья";
   |  НомерЭлемента=5: ^"Подстатья";
   |  НомерЭлемента=6: ^"Элемент";
   |  НомерЭлемента=7: ^"Программа, подпрограмма";
   fi;
 fi;
 ^"";
end;

Proc КБК_ОбновитьМенюВсе(isMaxA:Integer; isMaxS:Integer; isResVal:String; isResMsk:String; isтипКБК:String);
var ii :Integer;
 for ii=1 to isMaxS do
   BufStr[ii]=ExtractWord(ii, isResVal, ".");
   BufMsk[ii]=ExtractWord(ii, isResMsk, ".");
   Buf[ii+isMaxA]=BufMsk[ii]+"--"+Chr(187)+" "+ИмяЭлементаСтруктурыКБК(ii, isтипКБК);
 od;
end;

Proc КБК_ОбновитьМенюЭлемент(Iter:Integer; isMaxA:Integer; isтипКБК:String);
 if Iter>isMaxA: Buf[Iter]=BufMsk[Iter-isMaxA]+"--"+Chr(187)+" "+ИмяЭлементаСтруктурыКБК(Iter-isMaxA, isтипКБК); fi;
end;

Func КБК_СформироватьМенюМасокКБК(StoreКБКMsk:String; StoreКБКVal:String; maskСЧТ:String; ModeКБК:Integer; editКБК:Logical) :String;
var MaxA, MaxS, num, ii :Integer;
var типКБК, ResVal, ResMsk, маскКБК, tmp :String;
 if ModeКБК=1: типКБК="КР";   MaxS=4; маскКБК="???.????.???????.???";
 |  ModeКБК=2: типКБК="КД";   MaxS=6; маскКБК="???.?.??.?????.??.????";
 |  ModeКБК=3: типКБК="КИФД"; MaxS=7; маскКБК="???.??.??.??.??.??.????";
 else типКБК="";
 fi;
 if типКБК="": ^StoreКБКMsk; fi;
 --
 ClearVariable(Buf); ClearVariable(BufStr); ClearVariable(BufMsk);
 --
 if Match(StoreКБКVal, маскКБК) and not Pos("?", StoreКБКVal)>0: РАБ.УПП.КБК2005.StoreКБК=StoreКБКVal; fi;
 if editКБК: if not Match(StoreКБКVal, маскКБК) or Pos("?", StoreКБКVal)>0: editКБК=False; fi; fi;
 if editКБК:
   ResMsk=StoreКБКMsk;
   ResVal=StoreКБКVal;
 else

   ResMsk=Trim(РАБ.УПП.КБК2005.ВыборКБКиерарх2005(maskСЧТ, типКБК, False));
   if ResMsk="": ^StoreКБКMsk; fi;
   ResVal=ResMsk;
 fi;
 --
 Buf[1]="...--К выбору КБК";
 Buf[2]=Chr(169)+"--Утвердить маску";
 MaxA=LengthOfArray(Buf);
 КБК_ОбновитьМенюВсе(MaxA, MaxS, ResVal, ResMsk, типКБК);
 num=0;
 while num<>2 do
   КБК_ОбновитьМенюЭлемент(num, MaxA, типКБК);
   num=AlternateTree("", Buf, 35, num, 12, "$", "Параметр", "Комментарий", -1, False);
   if num=1:
     ResMsk=Trim(РАБ.УПП.КБК2005.ВыборКБКиерарх2005(maskСЧТ, типКБК, False));
     if ResMsk="": ^StoreКБКMsk; fi;
     ResVal=ResMsk;
     КБК_ОбновитьМенюВсе(MaxA, MaxS, ResVal, ResMsk, типКБК);
   | num=2: Break;
   | num>2:
     tmp=BufMsk[num-MaxA];
     if Pos("?", tmp)>0:
       BufMsk[num-MaxA]=BufStr[num-MaxA];
     else
       BufMsk[num-MaxA]=RepStr("?", Length(tmp));
     fi;
   else
     ^StoreКБКMsk;
   fi;
 od;
 ResMsk="";
 for ii=1 to MaxS do ResMsk=ResMsk+"."+BufMsk[ii]; od;
 if SubStr(ResMsk, 1, 1)=".": ResMsk=SubStr(ResMsk, 2, Length(ResMsk)-1); fi;
 valКБК=ResVal;
 ^ResMsk;
end;

Func КБК_ВыборКБК(maskСЧТ:String; SaveКБК:String) :String;
var Value :String;
var Edit :Logical;
 Value="";
 if Match(SaveКБК, "???.????.???????.???"):  Edit=True; else Edit=False; fi;
 РАБ.БЮДЖЕТ2005.РежимМаски="?";
 Value=КБК_СформироватьМенюМасокКБК(SaveКБК, valКБК, maskСЧТ, 1, Edit);
 if Value="" or Value=" ": ^SaveКБК; fi;
 ^Value;
end;

Proc КБК_ВыбратьФильтрКБК(OnExit:Logical);
var StoreКБК, NewКБК, mskСЧТ :String;
var SaveValue :Logical;
 SaveValue=False;
 StoreКБК=отчКБК;
 --
 if OnExit:
   NewКБК="";
 else
   mskСЧТ=ИтоговаяМаскаСчета(curФтрИст, отчСЧТ, "", True, False);
   NewКБК=КБК_ВыборКБК(mskСЧТ, StoreКБК);
 fi;
 --
 if NewКБК<>StoreКБК: if not ОтменитьИзмененияУсловийОтчета: SaveValue=True; fi; fi;
 if SaveValue: 
   ОчиститьУсловияОтбора(False, False, flgЧиститьАна);
   отчКБК=NewКБК;
 fi;
end;

Func ЗаменитьСимволСтрокиВпозиции(valStr:String; repChar:String; repPos:Integer) :String;
var tmpFirst, tmpLast, out :String;
var len :Integer;
 tmpFirst=""; tmpLast=""; out="";
 len=Length(valStr);
 if repPos<1: repPos=1; fi;
 if repPos>len or repChar="" or valStr="": ^valStr; fi;
 repChar=SubStr(repChar, 1, 1);
 if repPos>1: tmpFirst=SubStr(valStr, 1, repPos-1); else tmpFirst=""; fi;
 if repPos<len: tmpLast=SubStr(valStr, repPos+1, len-repPos); else tmpLast=""; fi;
 out=tmpFirst+repChar+tmpLast;
 ^out;
end;

Func УдалитьРазделитель_дляНашаСорт(Value:String) :String;
var nn :Integer;
 nn=Pos("#", Value);
 while nn>0 do Value=ЗаменитьСимволСтрокиВпозиции(Value, "_", nn); nn=Pos("#", Value);      od;
 nn=Pos(Chr(169), Value);
 while nn>0 do Value=ЗаменитьСимволСтрокиВпозиции(Value, "_", nn); nn=Pos(Chr(169), Value); od;
 ^Value;
end;

Func УдалитьРазделительЧерта(Value:String) :String;
var nn :Integer;
 nn=Pos("|", Value);
 while nn>0 do Value=ЗаменитьСимволСтрокиВпозиции(Value, "_", nn); nn=Pos("|", Value); od;
 ^Value;
end;

Func ВхожденийНет(ANA:String; MSK:String) :Logical;
 ^(Pos(ANA, MSK)=0);
end;

Func КорректныеСимволыПризнака(Value:String) :String;
var num, ii, intChars :Integer;
var Res, Chars :String;
 Res="";
 num=Length(Value);
 if num>0:
   for ii=1 to num do
     Chars=SubStr(Value, ii, 1);
     intChars=Ascii(Chars);
     if intChars=46 or                        -- точка
        (intChars>= 48 and intChars<= 57) or  -- цифры
        (intChars>= 65 and intChars<= 90) or  -- латиница заглавные
        intChars=95 or                        -- нижнее подчеркивание
        (intChars>= 97 and intChars<=122) or  -- латиница строчные
        (intChars>=192 and intChars<=255):    -- национальный алфавит
           Res=Res+Chars; else Res=Res+"_";
     fi;
   od;
 fi;
 ^Res;
end;

Func MatchMask(Src:String; Mask:String; SepMask:String) :Logical;
var ii, num :Integer;
var tmp :String;
 num=WordsCount(Mask, SepMask);
 for ii=1 to num do
   tmp=ExtractWord(ii, Mask, SepMask);
   if Match(Src, tmp): ^True; fi;
 od;
 ^if(num=0, Match(Src, Mask), False);
end;

Func СоответствуетФильтруПоСчетам(ftrAcc:String; grpAcc:String) :Logical;
var num1, num2, ii, jj :Integer;
var OK :Logical;
 ClearVariable(KeyMsk);
 num1=WordsCount(ftrAcc, " ");
 if num1>0: for ii=1 to num1 do KeyMsk[ii]=ExtractWord(ii, ftrAcc, " "); od; fi; -- фильтр счетов отчета
 ClearVariable(KeyStr);
 num2=WordsCount(grpAcc, " ");
 if num2>0: for jj=1 to num2 do KeyStr[jj]=ExtractWord(jj, grpAcc, " "); od; fi; -- фильтр счетов группы НФА
 if num1>0 and num2>0:
   for ii=1 to num1 do
     for jj=1 to num2 do
       OK=MatchMask(KeyStr[jj], KeyMsk[ii], " ");
       if OK: ^True; fi;
     od;
   od;
 fi;
 ^False;
end;

Func ГруппаНФА_СчитатьСправочник(maskAcc:String; FlagUpdate:Logical) :Logical;
var RO, jj, num, kk :Integer;
var OK, Work :Logical;
var GRPUNQ, GRPВИД, GRPКОД, GRPИМЯ, GRPСЧТ, Value :String;
 OK=False;
 if not FlagUpdate:
    if GRPBUF[1]="" or not LengthOfArray(GRPBUF)>0:
      FlagUpdate=True;
    else
      if LengthOfArray(GRPBUF)<>LengthOfArray(GRPDAT) or LengthOfArray(GRPBUF)<>LengthOfArray(GRPKEY):
        FlagUpdate=True;
      fi;
    fi;
 fi;
 if not FlagUpdate: ^True; fi;
 RO=OpenWorkArea(crdГРП, "ВИД", "КОД<>'' or НАИМЕНОВАНИЕ<>''");
 ShowProgress(0, "Считывание групп НФА...");
 Try
   num=Records(RO);
   if num>0:
     ОчиститьГРПНФА;
     ShowProgress(num, "Считывание групп НФА...");
     for jj=1 to num do
       ProgressPos(jj);
       GRPСЧТ=Lo(Trim(GetFieldS(RO, jj, "ГРНФА")));
       Work=СоответствуетФильтруПоСчетам(maskAcc, GRPСЧТ);
       if Work:
         GRPUNQ=RecordToString(GetRecordKey(RO, jj));
         GRPВИД=КорректныеСимволыПризнака(Lo(Trim(GetFieldS(RO, jj, "ВИД"))));
         if GRPВИД="": GRPВИД="_без группировки"; fi;
         GRPКОД=КорректныеСимволыПризнака(Lo(Trim(GetFieldS(RO, jj, "КОД"))));
         GRPИМЯ=УдалитьРазделительЧерта(Lo(Trim(GetFieldS(RO, jj, "НАИМЕНОВАНИЕ"))));
         if GRPКОД=""  and GRPИМЯ<>"": GRPКОД=GRPИМЯ;
         |  GRPКОД<>"" and GRPИМЯ="" : GRPИМЯ=GRPКОД;
         fi;
         Value=Up(GRPВИД)+"|"+Up(GRPКОД)+"--Подгруппа '"+GRPИМЯ+"'";
         if SearchInArray(GRPBUF, Value, True, 1)<0:
           kk=InsertInArraySort(GRPBUF, Value);
           InsertInArray(GRPDAT, kk, GRPВИД+"|"+GRPКОД+"|"+GRPИМЯ);
           InsertInArray(GRPKEY, kk, GRPUNQ);
         fi;
         Value=Up(GRPВИД)+"|--Группа '"+GRPВИД+"'";
         if SearchInArray(GRPBUF, Value, True, 1)<0:
           kk=InsertInArraySort(GRPBUF, Value);
           InsertInArray(GRPDAT, kk, GRPВИД);
           InsertInArray(GRPKEY, kk, "{0}");
         fi;
       fi;
     od;
     if LengthOfArray(GRPBUF)>0: OK=True; else OK=False; fi;
     InsertInArray(GRPBUF, 1, "*--Перечитать группы НФА");
     InsertInArray(GRPDAT, 1, "");
     InsertInArray(GRPKEY, 1, "");
   fi;
 Finally
   CloseProgress;
   CloseWorkArea(RO);
 end;
 ^OK;
end;

Proc ГруппыНФА_ВзятьИменаГрупп(грпValue:String; кейValue:String; Sep:String);
var Final_NAME, currVal, currKey, ИМЯGRP, GRPвер, GRPниж, tmp1, tmp2, tmp3 :String;
var num, ii, pp :Integer;
var OK: Logical;
 Final_NAME="";
 num=WordsCount(грпValue, Sep);
 if num>0:
   for ii=1 to num do
     ИМЯGRP="";
     currVal=ExtractWord(ii, грпValue, Sep);
     currKey=ExtractWord(ii, кейValue, Sep);
     GRPвер=ExtractWord(1, currVal, "$");
     GRPниж=ExtractWord(2, currVal, "$");
     if GRPниж="*":
       ИМЯGRP="Вся группа "+Up(GRPвер);
     else
       if currKey<>"{0}":
         pp=SearchInArray(GRPKEY, currKey, False, 1);
         if pp>0:
           OK=False;
           tmp1=Lo(ExtractWord(1, GRPDAT[pp], "|"));
           tmp2=Lo(ExtractWord(2, GRPDAT[pp], "|"));
           tmp3=Lo(ExtractWord(3, GRPDAT[pp], "|"));
           if Lo(GRPвер)=tmp1 and Lo(GRPниж)=tmp2: OK=True; fi;
           if OK: ИМЯGRP=Up(GRPвер)+" "+Chr(151)+" "+Lo(tmp3); fi;
         fi;
       fi;
       if ИМЯGRP="": ИМЯGRP=Up(GRPвер)+" "+Chr(151)+" "+Lo(GRPниж); fi;
     fi;
     Final_NAME=Объединить(Final_NAME, ИМЯGRP, " | ");
   od;
 fi;
 nmsГРП=Final_NAME;
end;

Func ГруппыНФА_ВыборФильтраОтбораГруппНФА(StoreVal:String; StoreKey:String; Sep:String) :String;
var len, ii, num1, num2, kk, nn, pp :Integer;
var NewValue, tmp, ANA, UKG, currVal, currKey, ВИДGRP, КОДGRP, КЛЧGRP :String;
var ВыбранаМаска, f1, f2 :Logical;
 if not ГруппаНФА_СчитатьСправочник(отчСЧТ, False):
   Message("Не заполнен справочник групп НФА ["+crdГРП+"]!", mtError);
   keyГРП=StoreKey;
   ^StoreVal;
 fi;
 currVal=Up(StoreVal);
 currKey=Up(StoreKey);
 kk=-1;
 if Pos("|", currVal)<1:
   ii=Length(currVal);
   if Pos("*", currVal)=ii and ii>2:
     tmp=Up(SubStr(currVal, 1, ii-2))+"|--Группа '"+Lo(SubStr(currVal, 1, ii-2))+"'";
     kk=SearchInArray(GRPBUF, tmp, True, 1);
   else
     if LastGRP_key<>"{0}": kk=SearchInArray(GRPKEY, LastGRP_key, False, 1); fi;
   fi;
 fi;
 if kk=-1: if LastGRP_num>0: kk=LastGRP_num; else kk=1; fi; fi;
 len=1;
 while len=1 do
   len=AlternateTree("Выберите группу...", GRPBUF, -1, kk, 12, "|", "ГРУППЫ", "ПОЯСНЕНИЕ", -1, True);
   if len=0:
     --Message("Отказ от выбора группы!", mtInformation);
     keyГРП=StoreKey;
     ^StoreVal;
   |  len=1:
     if not ГруппаНФА_СчитатьСправочник(отчСЧТ, True):
       Message("Не заполнен справочник групп НФА ["+crdГРП+"]!", mtError);
       keyГРП=StoreKey;
       ^StoreVal;
     fi;
   fi;
 od;
 ВыбранаМаска=False;
 ВИДGRP=ExtractWord(1, GRPDAT[len], "|");
 КОДGRP=ExtractWord(2, GRPDAT[len], "|");
 КЛЧGRP=GRPKEY[len];
 if Pos("|--", GRPBUF[len])>0: NewValue=Up(ВИДGRP+"$*"); tmp=SubStr(NewValue, 1, Length(NewValue)-2); ВыбранаМаска=True; else NewValue=Up(ВИДGRP+"$"+КОДGRP); tmp=NewValue; fi;
 if currVal="": LastGRP_key=КЛЧGRP; LastGRP_num=len; keyГРП=КЛЧGRP; ^NewValue; fi;
 --
 ClearVariable(Buf); ClearVariable(BufMsk); ClearVariable(BufStr); ClearVariable(KeyMsk); ClearVariable(KeyStr); ClearVariable(aAna);
 num1=WordsCount(currVal, Sep);
 for ii=1 to num1 do
   ANA=ExtractWord(ii, currVal, Sep);
   UKG=ExtractWord(ii, currKey, Sep);
   if Pos("*", ANA)>0:
     pp=InsertInArraySort(BufMsk, ANA);
     InsertInArray(KeyMsk, pp, UKG);
   else
     pp=InsertInArraySort(BufStr, ANA);
     InsertInArray(KeyStr, pp, UKG);
   fi;
 od;
 num1=LengthOfArray(BufMsk);
 num2=LengthOfArray(BufStr);
 if ВыбранаМаска:
   pp=InsertInArraySort(Buf, NewValue); InsertInArray(aAna, pp, КЛЧGRP);
   if num1>0:
     for ii=1 to num1 do
       f1=Match(NewValue, BufMsk[ii]);
       f2=ВхожденийНет(tmp, BufMsk[ii]);
       if (not f1) and f2: pp=InsertInArraySort(Buf, BufMsk[ii]); InsertInArray(aAna, pp, KeyMsk[ii]); fi;
     od;
   fi;
   if num2>0:
     for ii=1 to num2 do
       f1=Match(BufStr[ii], NewValue);
       f2=ВхожденийНет(BufStr[ii], NewValue);
       if (not f1) and f2: pp=InsertInArraySort(Buf, BufStr[ii]); InsertInArray(aAna, pp, KeyStr[ii]); fi;
     od;
   fi;
 else
   if num1>0:
     for ii=1 to num1 do
       f1=Match(NewValue+"$", BufMsk[ii]);
       if not f1:
         pp=InsertInArraySort(Buf, BufMsk[ii]); InsertInArray(aAna, pp, KeyMsk[ii]);
       else
         nn=Enquiry("Выберите действие...", "Значение '"+NewValue+"' соответствует маске '"+BufMsk[ii]+"'!", "Заменить маску на значение;Сохранить маску, значение опустить", mtConfirmation);
         if nn=2: pp=InsertInArraySort(Buf, BufMsk[ii]); InsertInArray(aAna, pp, KeyMsk[ii]); NewValue=""; fi;
       fi;
     od;
   fi;
   if num2>0:
     for ii=1 to num2 do
       pp=InsertInArraySort(Buf, BufStr[ii]);
       InsertInArray(aAna, pp, KeyStr[ii]);
     od;
   fi;
   --
   if NewValue<>"":
     num1=SearchInArray(Buf, NewValue, True, 1);
     if num1=-1: pp=InsertInArraySort(Buf, NewValue); InsertInArray(aAna, pp, КЛЧGRP); fi;
   fi;
 fi;
 num1=LengthOfArray(Buf);
 ANA=""; UKG="";
 for ii=1 to num1 do
   ANA=Объединить(ANA,  Buf[ii], Sep);
   UKG=Объединить(UKG, aAna[ii], Sep);
   if Length(ANA)>255:
     Message("Строка аналитики не может быть больше 255 символов.^MВыбор отменен!", mtWarning);
     keyГРП=StoreKey;
     ^StoreVal;
   fi;
 od;
 -- Заполняем служебную инфу
 if Pos("|", ANA)<1: LastGRP_key=КЛЧGRP; else LastGRP_key="{0}"; fi;
 LastGRP_num=len;
 keyГРП=UKG;
 ^ANA;
end;

Func УдалитьСловоНомер(strNumber:Integer; strValue:String; strSep:String) :String;
var ii, num :Integer;
var newValue :String;
 newValue=strValue;
 num=WordsCount(strValue, strSep);
 if num>0:
   newValue="";
   if num>=strNumber:
     for ii=1 to num do
       if not strNumber=ii: 
         newValue=Объединить(newValue,  ExtractWord(ii, strValue, strSep), strSep);
       fi;
     od;
   fi;
 fi;
 ^newValue;
end;

Func ГруппыНФА_УдалитьИзНабора_Диалог(грпVal:String; грпKey:String; грпSep:String) :String;
var num, ii, nn :Integer;
var currVal, currKey, ИМЯGRP, GRPвер, GRPниж, tmp1, tmp2, tmp3 :String;
var OK :Logical;
 ClearVariable(Buf);
 num=WordsCount(грпVal, грпSep);
 if num<2: keyГРП=""; ^""; fi;
   for ii=1 to num do
     ИМЯGRP="";
     currVal=ExtractWord(ii, грпVal, грпSep);
     currKey=ExtractWord(ii, грпKey, грпSep);
     GRPвер=ExtractWord(1, currVal, "$");
     GRPниж=ExtractWord(2, currVal, "$");
     if GRPниж="*":
       ИМЯGRP="Вся группа "+Up(GRPвер);
     else
       if currKey<>"{0}":
         nn=SearchInArray(GRPKEY, currKey, False, 1);
         if nn>0:
           OK=False;
           tmp1=Lo(ExtractWord(1, GRPDAT[nn], "|"));
           tmp2=Lo(ExtractWord(2, GRPDAT[nn], "|"));
           tmp3=Lo(ExtractWord(3, GRPDAT[nn], "|"));
           if Lo(GRPвер)=tmp1 and Lo(GRPниж)=tmp2: OK=True; fi;
           if OK: ИМЯGRP=Up(GRPвер)+" "+Chr(151)+" "+Lo(tmp3); fi;
         fi;
       fi;
       if ИМЯGRP="": ИМЯGRP=Up(GRPвер)+" "+Chr(151)+" "+Lo(GRPниж); fi;
     fi;
     Buf[ii+1]=ИМЯGRP;
   od;
 Buf[1]="* Удалить все значения *";
 nn=Alternate("Удаление...", Buf, -1, 1, 12);
 if nn<1:
   keyГРП=грпKey;
   ^грпVal;
 |  nn=1:
   keyГРП="";
   ^"";
 |  nn>1:
   грпVal=УдалитьСловоНомер(nn-1, грпVal, грпSep);
   грпKey=УдалитьСловоНомер(nn-1, грпKey, грпSep);
   keyГРП=грпKey;
   ^грпVal;
 fi;
end;

Proc ГруппыНФА_ВыбратьФильтрГруппыНФА(OnExit:Logical);
var StoreАНА, StoreКЕЙ, NewАНА :String;
var SaveValue :Logical;
 SaveValue=False;
 StoreАНА=отчГРП;
 StoreКЕЙ=keyГРП;
 --
 if OnExit:
   NewАНА=ГруппыНФА_УдалитьИзНабора_Диалог(StoreАНА, StoreКЕЙ, "|");
 else
   NewАНА=ГруппыНФА_ВыборФильтраОтбораГруппНФА(StoreАНА, StoreКЕЙ, "|");
 fi;
 --
 if NewАНА<>StoreАНА: if not ОтменитьИзмененияУсловийОтчета: SaveValue=True; fi; fi;
 if SaveValue:
   отчГРП=NewАНА;
   ГруппыНФА_ВзятьИменаГрупп(отчГРП, keyГРП, "|");
 fi;
end;

Func УдалитьСловоИзНабора_Диалог(Set:String; SepSet:String) :String;
var num, ii, nn :Integer;
 ClearVariable(Buf);
 num=WordsCount(Set, SepSet);
 if num<2: ^""; fi;
 for ii=1 to num do Buf[ii+1]=ExtractWord(ii, Set, SepSet); od;
 Buf[1]="Удалить все";
 nn=Alternate("Удаление...", Buf, -1, 1, 12);
 if nn=0: ^Set; fi;
 Set="";
 if nn=1: ^Set; fi;
 num=num+1;
 for ii=2 to num do if not ii=nn: Set=Set+SepSet+Buf[ii]; fi; od;
 Set=SubStr(Set, Length(SepSet)+1, 255);
 ^Set;
end;

Func СформироватьУсловиеОтбораНФА :String;
var ii, num :Integer;
var Res, Value :String;
 Res="";
 num=WordsCount(отчСЧТ, " ");
 if num>0:
   for ii=1 to num do
     Value=ExtractWord(ii, отчСЧТ, " ");
     Res=Объединить(Res, "НФА."+Value+".*", "|");
   od;
 fi;
 if Res="": Res="НФА.*"; fi;
 ^Res;
end;

Func Аналитика_ВыборПризнака(VOC:String; StoreANA:String) :String;
var Value, MaskAnaElec :String;
 Value="";
 RefreshAna;
 if Up(VOC)="НФА": MaskAnaElec=СформироватьУсловиеОтбораНФА; else MaskAnaElec=VOC+".*"; fi;
 Value=AnaElection(MaskAnaElec, False, True, StoreANA);
 if Trim(Value)="": ^""; fi;
 ^Value;
end;

Func Аналитика_ВыборПризнакаИзПроводок(VOC:String; StoreANA:String) :String;
var Путь, Value, MaskAnaElec, MaskAcc, tmp :String;
var num, kk, jj :Integer;
var ИзСписка, OK :Logical;
var Отч1 :Report;
 Value="";
 ИзСписка=False;
 ClearVariable(Buf);
 ClearVariable(BufMsk);
 ClearVariable(BufStr);
 Путь=PlanVar("НФА")+"\ОТЧЕТЫ\НФАОТЧ2007.lst";
 if not ExistFile(Путь): Message("Файл с отчетами отсутствует!", mtError); ИзСписка=True; fi;
 if not ИзСписка:
   Try
     MaskAcc=ИтоговаяМаскаСчета(curФтрИст, отчСЧТ, отчКБК, if(curБалЗаб=1 or curБалЗаб=2, True, False), if(curБалЗаб=1 or curБалЗаб=3, True, False));
     if Up(VOC)="НФА": 
       MaskAnaElec=СформироватьУсловиеОтбораНФА;
       if (Length(MaskAcc)+Length(MaskAnaElec)+7)>255: MaskAnaElec=VOC+".*"; fi;
     else
       MaskAnaElec=VOC+".*";
     fi;
     Refresh(False);
     Отч1=RepOpen(Путь+"|По_признакам_БАЛиЗАБ", MaskAcc, MaskAnaElec, 1.1.100, if(DataКП>1.1.2000, DataКП, ToDay+1), "", VOC);
     RepReset(Отч1);
     Try
       while RepNext(Отч1) do
         if RepIdent(Отч1)<>"":
           tmp=Trim(Name_A(RepIdent(Отч1)));
           if tmp="": tmp=" "; fi;
           kk=InsertInArraySort(BufStr, tmp);
           InsertInArray(BufMsk, kk, RepIdent(Отч1));
           InsertInArray(Buf,    kk, RepIdent(Отч1)+"--"+tmp);
         fi;
       end;
     Finally
       Отч1=RepClose(Отч1);
     end;
   Except
     ИзСписка=True;
     --Message("Ошибка создания отчета^Mпри выборке аналитики из проводок!", mtError);
     --Raise;
     --^"";
   end;
   num=LengthOfArray(BufMsk);
   if not ИзСписка and num>0:
     InsertInArray(Buf,    1, Chr(149)+"--");
     InsertInArray(Buf,    1, Chr(169)+"--Выбор признака или группы признаков из списка");
     kk=SearchInArray(BufMsk, StoreANA, False, 1);
     OK=True;
     while OK do
       jj=AlternateTree("Выберите признак...", Buf, -1, kk+2, 12, "#", "Код признака", "Расшифровка признака", -1, False);
       if jj=0: OK=False; ^"";
       |  jj=1: OK=False; Value=Аналитика_ВыборПризнака(VOC, StoreANA);
       |  jj>2: OK=False; Value=BufMsk[jj-2];
       fi;
     od;
   else
     ИзСписка=True;
   fi;
 fi;
 if ИзСписка: Value=Аналитика_ВыборПризнака(VOC, StoreANA); fi;
 if Trim(Value)="": ^""; fi;
 ^Value;
end;

Func Аналитика_ВыборГрупповойАналитики(VOC:String; StoreANA:String; Sep:String; МаскаЗначение:Logical) :String;
var ANA, wrd, curValue, newValue :String;
var ВыбранаМаска, flg1, flg2 :Logical;
var ii, num1, num2, nn :Integer;
 ВыбранаМаска=False;
 curValue=Up(StoreANA);
 if Pos(Sep, curValue)>0:
   wrd="";
 else
   ii=Length(curValue);
   if Pos("*", curValue)=ii and ii>2:
     wrd=SubStr(curValue, 1, ii-1);
   else
     wrd=if(ValidSign(curValue), curValue, "");
   fi;
 fi;
 --
 -- newValue=Up(Аналитика_ВыборПризнака(VOC, wrd));
 newValue=Up(Аналитика_ВыборПризнакаИзПроводок(VOC, wrd));
 --
 if newValue="": ^StoreANA; fi;
 if SubStr(newValue, Length(newValue), 1)=".": newValue=newValue+"*"; wrd=SubStr(newValue, 1, Length(newValue)-2); ВыбранаМаска=True; else wrd=newValue; fi;
 if curValue="" or (ВыбранаМаска and (WordsCount(newValue, ".")<3)): ^newValue; fi;
 --
 ClearVariable(Buf); ClearVariable(BufMsk); ClearVariable(BufStr);
 -- отделяем маски значений от конкретных значений
 num1=WordsCount(curValue, Sep);
 for ii=1 to num1 do
   ANA=ExtractWord(ii, curValue, Sep);
   if Pos("*", ANA)>0: InsertInArraySort(BufMsk, ANA); else InsertInArraySort(BufStr, ANA); fi;
 od;
 num1=LengthOfArray(BufMsk);
 num2=LengthOfArray(BufStr);
 -- синхронизируем выбранное значение или маску с результирующим набором
 if ВыбранаМаска:
   InsertInArraySort(Buf, newValue);
   if num1>0:
     for ii=1 to num1 do
       flg1=Match(newValue, BufMsk[ii]);
       flg2=ВхожденийНет(wrd, BufMsk[ii]);
       if not flg1 and flg2: InsertInArraySort(Buf, BufMsk[ii]); fi;
     od;
   fi;
   if num2>0:
     for ii=1 to num2 do
       flg1=Match(BufStr[ii], newValue);
       flg2=ВхожденийНет(BufStr[ii], newValue);
       if not flg1 and flg2: InsertInArraySort(Buf, BufStr[ii]); fi;
     od;
   fi;
 else
   if num1>0:
     for ii=1 to num1 do
       flg1=Match(newValue+".", BufMsk[ii]);
       if not flg1:
         InsertInArraySort(Buf, BufMsk[ii]);
       else
         if МаскаЗначение:
           nn=Enquiry("Выберите действие...", "Значение '"+newValue+"' соответствует маске '"+BufMsk[ii]+"'!", "Заменить маску на значение;Сохранить маску, значение опустить;Вставить значение и сохранить маску", mtConfirmation);
           if nn=2: InsertInArraySort(Buf, BufMsk[ii]); newValue="";
           |  nn=3: InsertInArraySort(Buf, BufMsk[ii]);
           fi;
         else
           nn=Enquiry("Выберите действие...", "Значение '"+newValue+"' соответствует маске '"+BufMsk[ii]+"'!", "Заменить маску на значение;Сохранить маску, значение опустить", mtConfirmation);
           if nn=2: InsertInArraySort(Buf, BufMsk[ii]); newValue=""; fi;
         fi;
       fi;
     od;
   fi;
   if num2>0:
     CopyArray(BufStr, Buf, 1, LengthOfArray(Buf)+1);
   fi;
   SortArray(Buf, True);
   if newValue<>"":
     num1=SearchInArray(Buf, newValue, True, 1);
     if num1=-1: InsertInArraySort(Buf, newValue); fi;
   fi;
 fi;
 num1=LengthOfArray(Buf);
 ANA="";
 for ii=1 to num1 do
   ANA=Объединить(ANA, Buf[ii], Sep);
   if Length(ANA)>253:
     Message("Строка аналитики не может быть больше 253 символов.^MВыбор отменен!", mtWarning);
     ^StoreANA;
   fi;
 od;
 ^ANA;
end;

Func Аналитика_ВыбранВесьСправочник(voc:String) :String;
 if voc="ВД"  : ^"Все виды деятельности ["+voc+".*]";
 |  voc="ВКЛ" : ^"Вся ведомственная классификация ["+voc+".*]";
 |  voc="КТ"  : ^"Все категории ["+voc+".*]";
 |  voc="М"   : ^"Все местонахождения ["+voc+".*]";
 |  voc="МОЛ" : ^"Все материально ответственные лица ["+voc+".*]";
 |  voc="П"   : ^"Все подразделения ["+voc+".*]";
 |  voc="ПБС" : ^"Все получатели средств бюджета ["+voc+".*]";
 |  voc="ПГР" : ^"Все пункты генерального разрешния ["+voc+".*]";
 |  voc="РБС" : ^"Все распорядители бюджетных средств ["+voc+".*]";
 |  voc=""    : ^"";
 else ^"Все элементы справочника ["+voc+".*]";
 fi;
end;

Func Аналитика_ИмяГруппы(ANA:String) :String;
var nn :Integer;
var tmp :String;
 tmp="";
 nn=Length(ANA);
 if Pos("*", ANA)=nn and nn>2: tmp=(Name_A(SubStr(ANA, 1, nn-1))); else tmp=""; fi;
 if tmp="": tmp="нет наименования"; fi;
 ^tmp;
end;

Func Аналитика_FormatSetANA(Set:String; SepSet:String; SepOut:String) :String;-- набор описаний признаков в одной строке (разделители разные)
var num, i :Integer;
var OUT, ANA, tmp, tmp2, voc :String;
 OUT="";
 if SepSet<>"":
   num=WordsCount(Set, SepSet);
   for i=1 to num do
     ANA=ExtractWord(i, Set, SepSet);
     voc=ExtractWord(1, ANA, ".");
     tmp=Name_A(ANA);
     tmp2=if(tmp<>"" and tmp<>" ", tmp, if(ANA=voc+".*", Аналитика_ВыбранВесьСправочник(voc), Аналитика_ИмяГруппы(ANA)));
     OUT=Объединить(OUT, tmp2, SepOut);
   od;
 fi;
 ^OUT;
end;

Proc Аналитика_ВыбратьФильтрАналитики(refField:String; OnExit:Logical);
var ValueСПР, FieldАНА, FieldИМЯ, StoreАНА, NewАНА, NewИМЯ :String;
var SaveValue :Logical;
 SaveValue=False;
 --
 FieldАНА=Up(SubStr(refField, 1, Length(refField)-1));
 if FieldАНА="отчМОЛ": ValueСПР="МОЛ";
 |  FieldАНА="отчМХЭ": ValueСПР="М";
 |  FieldАНА="отчДОП": ValueСПР=VOCКОД;
 |  FieldАНА="отчНФА": ValueСПР="НФА";
 fi;
 FieldИМЯ="nms"+SubStr(FieldАНА, 4, 3);
 --
 StoreАНА=GetVariableS(FieldАНА);
 --
 if OnExit:
   NewАНА=УдалитьСловоИзНабора_Диалог(StoreАНА, "|");
 else
   NewАНА=Аналитика_ВыборГрупповойАналитики(ValueСПР, StoreАНА, "|", False);
 fi;
 --
 if NewАНА<>StoreАНА: if not ОтменитьИзмененияУсловийОтчета: SaveValue=True; fi; fi;
 if SaveValue:
    PutVariableS(FieldАНА, NewАНА);
    NewИМЯ=Аналитика_FormatSetANA(NewАНА, "|", " | ");
    PutVariableS(FieldИМЯ, NewИМЯ);
 fi;
end;

Func Оператор :String;
var nn :Integer;
 ClearVariable(Buf);
 Buf[1]="И";
 Buf[2]="ИЛИ";
 Buf[3]="И ИСКЛЮЧИТЬ";
 nn=Alternate("Выбор оператора",Buf, 20, 1, 12);
 if nn=1: ^"&";
 |  nn=2: ^"|";
 |  nn=3: ^"&~";
 fi;
 ^"";
end;

Proc ЗапомнитьЗначения;
 oldФтрAcc = curФтрAcc;
 oldФтрИст = curФтрИст;
 oldБалЗаб = curБалЗаб;
 oldФтрНФА = curФтрНФА;
 oldФтрЦен = curФтрЦен;
 OldDateНП = DataНП;
 OldDateКП = DataКП;
 OldОтчАНА = отчАНА;
end;

Proc ВнешнийВид_ИтоговыеТаблицы(РсчИтгТаб1:Logical; РсчИтгТаб2:Logical; РсчИтгТаб3:Logical; сНовСтр:Logical);

СекцТ1З.CanPrint = РсчИтгТаб1;
СекцТ1Д.CanPrint = РсчИтгТаб1;
СекцТ1И.CanPrint = РсчИтгТаб1;
СекцТ1З.Row(1, RowNewPage, True);
if not РсчИтгТаб1: ОчиститьТаблицуN1; fi;

СекцТ2З.CanPrint = РсчИтгТаб2;
СекцТ2Д.CanPrint = РсчИтгТаб2;
СекцТ2И.CanPrint = РсчИтгТаб2;
СекцТ2З.Row(1, RowNewPage, сНовСтр);
if not РсчИтгТаб2: ОчиститьТаблицуN2; fi;

СекцТ3З.CanPrint = РсчИтгТаб3;
СекцТ3Д.CanPrint = РсчИтгТаб3;
СекцТ3И.CanPrint = РсчИтгТаб3;
СекцТ3З.Row(1, RowNewPage, сНовСтр);
if not РсчИтгТаб3: ОчиститьТаблицуN3; fi;

ValidateИтогиSection(False);

end;

Proc Инициализация;
var chislo1, chislo2 :Numeric;
var tmp1 ,tmp2 :String;
var ddWork :Date;
 ddWork=if(DataКП>1.1.100, DataКП, ToDay+1);
 Try chislo1=Com_Var("ОС_РАСХ" , ddWork); Except chislo1=0.00; end;
 Try chislo2=Com_Var("ОС_100"  , ddWork); Except chislo2=0.00; end;
 if chislo1=0.00: if ddWork>=1.1.2009: chislo1= 3000.00; else chislo1= 1000.00; fi; fi;
 if chislo2=0.00: if ddWork>=1.1.2011: chislo2=40000.00; else chislo1=20000.00; fi; fi;
 tmp1="НФА > "+Format("%6.0m", chislo2);
 tmp2="... НФА на которые положено ежемесячно начислять амортизацию ("+tmp1+")";
 cb_НФААМТ.Caption=tmp2;
 tmp1="НФА > "+Format("%6.0m", chislo1)+" и <= "+Format("%6.0m", chislo2);
 tmp2="... НФА на которые положено начислять амортизацию 100% при вводе в эксплуатацию ("+tmp1+")";
 cb_НФА100.Caption=tmp2;
 tmp1="НФА <= "+Format("%6.0m", chislo1);
 tmp2="... НФА которые положено списывать с учета при вводе в эксплуатацию ("+tmp1+")";
 cb_НФАБЕЗ.Caption=tmp2;
 lblVersion.Caption=infoVersion;
 --
 ИзмГрп=Chr(13)+"  Изменить"+Chr(13)+"  порядок"+Chr(13)+"  сортировки";
 --
 if not Позиции>0:
   if Trim(Иерархия)="":
     flgСЧТ=True;
     flgКБК=False;
     flgИСТ=False;
     flgМОЛ=True;
     flgМХЭ=False;
     flgГРП=True;
     flgДОП=False;
     flgНФА=False;
     Иерархия="<МОЛ> <ГРП> <СЧТ>";
     отчСЧТ="101.?? 102.?0 103.1? 105.??"; флагиACC="11111111111111111";
     отчКБК="";
     valКБК="";
     отчМОЛ=""; nmsМОЛ="";
     отчМХЭ=""; nmsМХЭ="";
     отчДОП=""; nmsДОП="";
     отчНФА=""; nmsНФА="";
     keyГРП=""; отчГРП=""; nmsГРП=""; LastGRP_key="{0}"; LastGRP_num=0;
     ОчиститьГРПНФА;
     отчАНА=""; OldОтчАНА="";
     intРежимСохр   = 1;
     intСхемаЦветов = 1;
   fi;
   if fldСОРТкод="": fldСОРТкод="тНФАКОД"; fldСОРТимя="... коду НФА"; fi;
   --
   flgПечСлужИнф = True;
   flgСлужИнф    = True;
   flgОтбЦенИИли = False;
   flgЧиститьАна = True;
   flgТолькоИнв  = False;
   flgТолькоИмя  = False;
   flgРсчИтгТаб1 = True;
   flgРсчИтгТаб2 = True;
   flgРсчИтгТаб3 = True;
   flgПечНовСтр  = False;
   flgВыдСчтНФА  = False;
 fi;
 --
 ЗапомнитьЗначения;
 --
 Счета_ВнешнийВид;
 ВнешнийВид_ФильтрКБК(curБалЗаб);
 ВнешнийВид_ФильтрДопСпр;
 ВнешнийВид_Есть106(flgУчет106xURep, curБалЗаб, True); -- ВнешнийВид_ФильтрПоСуммеПроверить проверяется в составе ВнешнийВид_Есть106
 --
 ВнешнийВид_ИтоговыеТаблицы(flgРсчИтгТаб1, flgРсчИтгТаб2, flgРсчИтгТаб3, flgПечНовСтр);
 ValidateSection(False, False);
 --
 ВзятьРеквизиты(УЧР_REC, True);
end;

Func Template_OnClear :Logical;
 if Trim(flgClear)="":
   Message("Ошибка!^MВероятно была произведена 'очистка полей'.^MБудет произведена инициализация значений по умолчанию.^MПосле этого бланк будет готов к работе!", mtError);
   ОчисткаОтчета;
   Инициализация;
   flgClear=GetGuid;
   Message("Бланк проинициализирован!", mtInformation);
   Template.Field="Фокус";
   ^True;
 fi;
 ^False;
end;

Func ПроверкаДат :Logical;
var ddНачало :Date;
 ddНачало=1.1.1990;
 if DataНП<=1.1.100: Message('Не задана дата начала периода!',               mtWarning); Template.Field="ОтчПрд_"; ^False; fi;
 if DataНП<ddНачало: Message('Не задана корректная дата начала периода!',    mtWarning); Template.Field="ОтчПрд_"; ^False; fi;
 if DataКП<=1.1.100: Message('Не задана дата окончания периода!',            mtWarning); Template.Field="ОтчПрд_"; ^False; fi;
 if DataКП<ddНачало: Message('Не задана корректная дата окончания периода!', mtWarning); Template.Field="ОтчПрд_"; ^False; fi;
 if DataНП>DataКП:
   Message('Дата начала "'+DateToString(DataНП)+'" периода позже даты окончания периода "'+DateToString(DataКП)+'"!'
          +Chr(13)+'Необходимо скорректировать даты!', mtError);
   Template.Field="ОтчПрд_";
   ^False;
 fi;
 ^True;
end;

Func СчетаНФА_вУчете(maskСЧТ:String; ddBP:Date; ddEP:Date) :Integer;
var Путь, Acc :String;
var num, kk :Integer;
var Отч1 :Report;
 ClearVariable(Buf);
 Путь=PlanVar("НФА")+"\ОТЧЕТЫ\НФАОТЧ2007.lst";
 if not ExistFile(Путь): ^-1; fi;
 Try
   Отч1=RepOpen(Путь+"|По_счетам_НФА_Бал_Заб", maskСЧТ, "", if(ddBP>1.1.1990, ddBP, 1.1.100), if(ddEP>1.1.1990, ddEP, ToDay));
   RepReset(Отч1);
   Try
     num=RepRowsCount(Отч1);
     kk=0;
     while RepNext(Отч1) do
       Acc=RepIdent(Отч1);
       if Match(Acc, "???.????.???????.???.?.???.??.???")    or
          Match(Acc, "???.??.??.??.??.??.????.?.???.??.???") or
          Match(Acc, "ЗАБ.??.???.??"):
         kk=kk+1;
         Buf[kk]=Объединить(SignsMask(Acc, True), SignsMask(Acc, False), "|");
       fi;
     end; -- while
   Finally
     Отч1=RepClose(Отч1);
   end;
 Except
   ^-1;
 end;
 ^LengthOfArray(Buf);
end;

Func СчетаНФА_поСтруктуре(maskСЧТ:String) :Integer;
var Acc :String;
var kk :Integer;
 ClearVariable(Buf);
 kk=0;
 for Account Acc=maskСЧТ, Sort do 
   kk=kk+1;
   Buf[kk]=Объединить(SignsMask(Acc, True), SignsMask(Acc, False), "|");
 od;
 ^LengthOfArray(Buf);
end;

Func СправочникиСтруктурыПоМаскеСчетовПрогресс(maskСЧТ:String; ddBP:Date; ddEP:Date; OnlyUseAcc:Logical; EnableProgress:Logical) :String;
var Voc, MaskVoc :String;
var xx, ii, num, jj, kk :Integer;
var qq :Numeric;
 Try qq=Saldo(maskСЧТ, 1.1.100); Except ^" "; end;
 ClearVariable(bindVOC); ClearVariable(bindINT);
 if EnableProgress: ShowProgress(0, "Подготовка..."); fi;
 MaskVoc="";
 Try
   xx=0;
   if OnlyUseAcc: xx=СчетаНФА_вУчете(maskСЧТ, ddBP, ddEP); fi;
   if not xx>0:   xx=СчетаНФА_поСтруктуре(maskСЧТ); fi;
   if xx>0:
     if EnableProgress: ShowProgress(xx, "Анализ привязки справочников к счетам..."); fi;
     for ii=1 to xx do
       if EnableProgress: ProgressPos(ii); fi;
       num=WordsCount(Buf[ii], "|");
       for jj=1 to num do
         Voc=ExtractWord(jj, Buf[ii], "|");
         kk=SearchInArray(bindVOC, Voc, True, 1);
         if kk>0:
           bindINT[kk]=bindINT[kk]+1;
         else
           kk=InsertInArraySort(bindVOC, Voc);
           InsertInArray(bindINT, kk, 1);
         fi;
       od;
     od;
     num=LengthOfArray(bindVOC);
     if num>0:
       if EnableProgress: ShowProgress(num, "Обработка полученных данных..."); fi;
       jj=num; -- удаляем с конца
       for ii=1 to num do
         if EnableProgress: ProgressPos(ii); fi;
         -- xx - количество рабочих счетов
         if bindINT[jj]<>xx: DeleteFromArray(bindVOC, jj); else MaskVoc=Объединить(MaskVoc, bindVOC[jj], "|"); fi;
         jj=jj-1;
       od;
     fi;
   fi; -- xx>0
 Finally
   if EnableProgress: CloseProgress; fi;
 end;
 ^MaskVoc;
end;

Func ПравильныйСимволАналитики(Value:String) :Logical;
var intChars :Integer;
 intChars=Ascii(Value);
 if intChars=42 or                        -- звездочка (*)
    intChars=46 or                        -- точка
    (intChars>= 48 and intChars<= 57) or  -- цифры
    intChars=63 or                        -- знак вопроса (?)
    (intChars>= 65 and intChars<= 90) or  -- латиница заглавные
    intChars=95 or                        -- нижнее подчеркивание
    (intChars>= 97 and intChars<=122) or  -- латиница строчные
    (intChars>=192 and intChars<=255):    -- национальный алфавит
       ^True;
 fi;
 ^False;
end;

Func ВсеСправочникиДопАналитикиПривязаны(vДопАна:String) :Integer;
var ii, num :Integer;
var Value, tmp :String;
 vДопАна=Trim(vДопАна);
 if vДопАна<>"" and LengthOfArray(bindVOC)>0:
   num=Length(vДопАна);
   if num>0:
     ClearVariable(Buf);
     Value="";
     for ii=1 to num do
       tmp=SubStr(vДопАна, ii, 1);
       if ПравильныйСимволАналитики(tmp):
         Value=Value+tmp;
       else
         if Value<>"":
           if Pos(".", Value)>0: Value=ExtractWord(1, Value, ".")+".*"; fi;
           AddInArray(Buf, True, False, Value);
           Value="";
         fi;
       fi;
     od;
     if Value<>"": AddInArray(Buf, True, False, Value); Value=""; fi;
     num=LengthOfArray(Buf);
     if num>0:
       for ii=1 to num do
         if SearchInArray(bindVOC, Buf[ii], True, 1)<1:
           Message("Длинное условие отбора аналитики.^MИспользуется свертка...^M^MСправочник '"+Buf[ii]+"' не привязан к выбранному фильтру по счетам!", mtError);
           ^-1;
         fi;
       od;
       ^+1;
     fi;
   fi;
 fi;
 ^0;
end;

Func ИтогоФильтрАналитики :String;
var Value, tmpНФА :String;
var len, kk, num :Integer;
var OK :Logical;
 Value=""; len=0; OK=False;
 if отчНФА<>"": tmpНФА=отчНФА; else tmpНФА="НФА.*"; fi;
 if tmpНФА<>"": if OK: num=3; else num=2; OK=True; fi; kk=Length(tmpНФА)+num; if (len+kk)<=255: len=len+kk; Value=Объединить("("+tmpНФА+")", Value, "&"); fi; fi;
 if отчМОЛ<>"": if OK: num=3; else num=2; OK=True; fi; kk=Length(отчМОЛ)+num; if (len+kk)<=255: len=len+kk; Value=Объединить("("+отчМОЛ+")", Value, "&"); fi; fi;
 if отчМХЭ<>"": if OK: num=3; else num=2; OK=True; fi; kk=Length(отчМХЭ)+num; if (len+kk)<=255: len=len+kk; Value=Объединить("("+отчМХЭ+")", Value, "&"); fi; fi;
 if отчДОП<>"": if OK: num=3; else num=2; OK=True; fi; kk=Length(отчДОП)+num; if (len+kk)<=255: len=len+kk; Value=Объединить("("+отчДОП+")", Value, "&"); fi; fi;
 if отчАНА<>"": if OK: num=3; else num=2; OK=True; fi; kk=Length(отчАНА)+num; if (len+kk)<=255: len=len+kk; Value=Объединить("("+отчАНА+")", Value, "&"); fi; fi;
 if Value="": Value="нет"; fi;
 ^Value;
end;

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

Func ПризнакСоотвНабору(ANA:String; Набор:String) :Logical;
-- ANA должно являтся полным значением, а не маской!
var ii, num :Integer;
var Value :String;
 num=WordsCount(Набор, "|");
 if num>0:
   for ii=1 to num do
     Value=Up(ExtractWord(ii, Набор, "|"));
     if Match(Up(ANA), Value): ^True; fi;
   od;
 fi;
 ^False;
end;

Func ПроводкаПроходитОтборПоАналитике(len:Integer; УслАналитики:String; СложноеУсловие:Logical) :Logical;
var OK, MatchOK :Logical;
var ii, pp :Integer;
var Value, tmp :String;
 if Trim(УслАналитики)<>"":
   OK=False;
   if len>0: -- у проводки есть аналитика
     MatchOK=False;
     for ii=1 to len do  -- цикл по аналитике проводки
       pp=Pos(":", aAna[ii]);
       if pp>0: Value=SubStr(aAna[ii], 1, pp-1); else Value=aAna[ii]; fi;
       tmp=SubStr(Value, 1, 1);
       if tmp="+" or tmp="-": Value=Trim(SubStr(Value, 2, 255)); fi;
       if СложноеУсловие: -- простое условие - один признак или набор признаков через логическое "или" ( "|" )
         MatchOK=ПризнакСоотвМаске(Value, Trim(УслАналитики));
       else
         MatchOK=ПризнакСоотвНабору(Value, Trim(УслАналитики));
       fi;
       if MatchOK: Break; fi;
     od;
     if MatchOK: OK=True; fi;
   fi;
 else
   OK=True;
 fi;
 ^OK;
end;

--Func USE_ИНВЕНТАРНЫЙ_НОМЕР(ACC:String; SUM:Numeric; KOL:Numeric; ddОТЧ:Date; FindУЧН:String; ctНФА100П:Numeric; ctНФА_ИНВ:Numeric) :Logical;
--var Цена :Numeric;
-- if Match(ACC, "*.?.101.0?.???"):
--      if Match(ACC, "*.?.101.08.???"):
--           ^False;
--      |  Match(ACC, "*.?.101.07.???"):
--           if ctНФА100П>0.00 and (SUM<>0.00 and KOL<>0.00): Цена=Abs(SUM)/Abs(KOL); if Цена>ctНФА100П: ^True; fi;
--           |  ctНФА100П>0.00 and (SUM =0.00  or KOL =0.00): if Match(FindУЧН, pfxУЧН+".*"): ^True; fi;
--           fi;
--      else
--           if ctНФА_ИНВ>0.00 and (SUM<>0.00 and KOL<>0.00): Цена=Abs(SUM)/Abs(KOL); if Цена>ctНФА_ИНВ: ^True; else if Match(FindУЧН, pfxУЧН+".*"): ^True; fi; fi;
--           |  ctНФА_ИНВ>0.00 and (SUM =0.00  or KOL =0.00): if Match(FindУЧН, pfxУЧН+".*"): ^True; fi;
--           fi;
--      fi;
-- |  Match(ACC, "*.?.102.01.???"): ^True;
-- |  Match(ACC, "*.?.103.0?.???"): ^True;
-- fi;
-- ^False;
--end;

Func USE_ИНВЕНТАРНЫЙ_НОМЕР(ACC:String; SUM:Numeric; KOL:Numeric; ddОТЧ:Date; FindУЧН:String; ctНФА100П:Numeric; ctНФА_ИНВ:Numeric) :Logical;
var Цена :Numeric;
 if Match(ACC, "*.?.101.??.???"):
    if Match(ACC, "*.?.101.?7.???"):
      if Match(FindУЧН, pfxУЧН+".*"): ^True; else if ctНФА100П>0.00 and SUM<>0.00 and KOL<>0.00: Цена=Abs(SUM)/Abs(KOL); if Цена>ctНФА100П: ^True; fi; fi; fi;
    else 
      if Match(FindУЧН, pfxУЧН+".*"): ^True; else if ctНФА_ИНВ>0.00 and SUM<>0.00 and KOL<>0.00: Цена=Abs(SUM)/Abs(KOL); if Цена>ctНФА_ИНВ: ^True; fi; fi; fi;
    fi;
 |  Match(ACC, "*.?.102.??.???"): ^True;
 |  Match(ACC, "*.?.103.??.???"): ^True;
 fi;
 ^False;
end;

Func СформироватьШаблонСортировки :String;
var Res, Value :String;
var num, ii :Integer;
 Res="";
 if Trim(Иерархия)<>"":
   num=WordsCount(Иерархия, " ");
   for ii=1 to num do
     Value=ExtractWord(ii, Иерархия, " ");
     if Value="<СЧТ>": Res=Res+" тНФАСЧ6";
     |  Value="<КБК>": Res=Res+" тНФАКБК";
     |  Value="<ИСТ>": Res=Res+" тНФАИСТ";
     |  Value="<МОЛ>": Res=Res+" "+Chr(183)+"1тМОЛИМЯ";
     |  Value="<МХЭ>": Res=Res+" "+Chr(183)+"2тМХЭИМЯ";
     |  Value="<ДОП>": Res=Res+" "+Chr(183)+"3тДОПИМЯ";
     |  Value="<ГРП>": Res=Res+" тНФАГРК";
     |  Value="<НФА>": Res=Res+" тНФАТИП";
     fi;
   od;
 fi;
 ^Trim(Res);
end;

Func СоответствуетФильтруПоГруппеНФА(аФтрГРП:String; аКОДГРП:String; аКОДПГР:String) :Logical;
var aValГРП, aValПГР, wdValue :String;
var ii, num :Integer;
var OK :Logical;
 if аФтрГРП<>"":
   num=WordsCount(аФтрГРП, "|");
   if num>0:
     OK=False;
     for ii=1 to num do
       wdValue=Lo(ExtractWord(ii, аФтрГРП, "|"));
       aValГРП=ExtractWord(1, wdValue, "$");
       aValПГР=ExtractWord(2, wdValue, "$");
       if (aValГРП=Lo(аКОДГРП) and aValПГР=Lo(аКОДПГР)) or (aValГРП=Lo(аКОДГРП) and aValПГР="*"): OK=True; fi;
       if OK: Break; fi;
     od;
     if OK: ^True; else ^False; fi;
   fi;
 else
   ^True;
 fi;
 ^False;
end;

Proc INIСправочникиФильтраОтбора101(UserVOC:String);
 ClearVariable(Fnd_101V);
 if отчМХЭ<>"" or flgМХЭ: AddInArray(Fnd_101V, True, False,   "М"); fi;
 if отчМОЛ<>"" or flgМОЛ: AddInArray(Fnd_101V, True, False, "МОЛ"); fi;
 if отчДОП<>"" or flgДОП: if Name_A(UserVOC+".")<>" ": AddInArray(Fnd_101V, True, False, UserVOC); fi; fi;
end;

Proc INIСправочникиФильтраОтбора106(UserVOC:String);
 ClearVariable(Fnd_106V);
 if отчМХЭ<>"" or flgМХЭ: AddInArray(Fnd_106V, True, False,   "М"); fi;
 if отчМОЛ<>"" or flgМОЛ: AddInArray(Fnd_106V, True, False, "МОЛ"); fi;
 if отчДОП<>"" or flgДОП: if Name_A(UserVOC+".")<>" ": AddInArray(Fnd_106V, True, False, UserVOC); fi; fi;
end;

Proc ПоискДанных_ИщемОстакиНФА101(vНПОТЧ:Date; vЕстьБал:Logical; vЕстьЗаб:Logical; vMaskACC:String; vMaskANA:String; vИспНФА:Logical; vИспМОЛ:Logical; vИспМХЭ:Logical; vИспДОП:Logical; vИспАНА:Logical; constНФА100П:Numeric; constНФА_ИНВ:Numeric; ПустойУЧН:Logical);
var ВременныйФайл, aVal1, aVal2, aDeb, aCre, aComment, svrANA, svrSGN, refStrНФА, refStrМОЛ, refStrМХЭ, refStrДОП, Value :String;
var КОДСЧТ, КОДИСТ, КОДКБК, КОДСЧ6, КОДНФА, КОДУЧН, КОДМОЛ, КОДМХЭ, КОДДОП, NAMНФА, NAMУЧН, NAMМОЛ, NAMМХЭ, NAMДОП :String;
var aSum1, aSum2, SUM, QUA, KOL :Numeric;
var len, xx, ii, jj, pp, hh :Integer;
var СЧДЕБ, БЕЗУЧН, Work :Logical;
var aDate :Date;
 ClearVariable(aAna);
 ВременныйФайл=PlanVar('CACHE')+"\"+GetGUID;
 xx=TujRepNoNullBal+TujRepCombinedAna+TujRepBalAccount+if(vЕстьЗаб, TujRepZabalance, 0);
 -- TujRepBalAccount ???  -- маска должна точно соответствовать
 len=TujReport(ВременныйФайл, 1.1.100, vНПОТЧ, vMaskACC, vMaskANA, ИсключитьСправочники, "", "", xx, False);
 if len>0:
   ShowProgress(len, "Выборка остатков НФА...");
   OpenTextJur(ВременныйФайл);
   Try
     ii=1;
     while not GetTransFromTextJur(aDate, aSum1, aVal1, aSum2, aVal2, aDeb, aCre, aAna, aComment) do
       ProgressPos(ii);
       ii=ii+1;
       -- Очистка аналитики
       КОДИСТ=""; КОДКБК=""; КОДСЧ6=""; КОДСЧТ=""; КОДНФА=""; КОДУЧН=""; КОДМОЛ=""; КОДМХЭ=""; КОДДОП=""; svrANA=""; svrSGN="";
       SUM=0.00; KOL=0.00; QUA=0.00;
       -- Отбор счетов
       if aDeb="00" or aDeb="00Z": КОДСЧТ=aCre; СЧДЕБ=False; fi;
       if aCre="00" or aCre="00Z": КОДСЧТ=aDeb; СЧДЕБ=True;  fi;
       if Match(КОДСЧТ, "???.????.???????.???.?.101.??.???")   : КОДСЧТ=SubStr(КОДСЧТ, 1, 30)+"???"; БЕЗУЧН=False; КОДИСТ=SubStr(КОДСЧТ, 22, 1); КОДКБК=SubStr(КОДСЧТ, 1, 20); КОДСЧ6=SubStr(КОДСЧТ, 24, 6);
       |  Match(КОДСЧТ, "???.????.???????.???.?.102.??.???")   : КОДСЧТ=SubStr(КОДСЧТ, 1, 30)+"???"; БЕЗУЧН=False; КОДИСТ=SubStr(КОДСЧТ, 22, 1); КОДКБК=SubStr(КОДСЧТ, 1, 20); КОДСЧ6=SubStr(КОДСЧТ, 24, 6);
       |  Match(КОДСЧТ, "???.????.???????.???.?.105.??.???")   : КОДСЧТ=SubStr(КОДСЧТ, 1, 30)+"???"; БЕЗУЧН=True;  КОДИСТ=SubStr(КОДСЧТ, 22, 1); КОДКБК=SubStr(КОДСЧТ, 1, 20); КОДСЧ6=SubStr(КОДСЧТ, 24, 6);
       |  Match(КОДСЧТ, "ЗАБ.??.10?.??")                       : КОДСЧТ=КОДСЧТ;                      БЕЗУЧН=True;  КОДИСТ="З";                   КОДКБК="Забаланс";            if flgВыдСчтНФА: КОДСЧ6=SubStr(КОДСЧТ,  8, 6); else КОДСЧ6=SubStr(КОДСЧТ,  1, 6); fi;
       else КОДИСТ=""; КОДКБК=""; КОДСЧ6=""; КОДСЧТ="";
       fi;
       if КОДСЧТ<>"":
         if (aVal1="" or aVal1="РУБ") and aSum1<>0: if СЧДЕБ: SUM=aSum1; else SUM=-aSum1; fi;
         |  (aVal2="" or aVal2="РУБ") and aSum2<>0: if СЧДЕБ: SUM=aSum2; else SUM=-aSum2; fi;
         else SUM=0.00;
         fi;
         -- Проводим далее отбор аналитики
         xx=LengthOfArray(aAna);
         if xx>0:
           for jj=1 to xx do
             pp=Pos(":", aAna[jj]);
             if pp>0:
               QUA=StringToNumeric(SubStr(aAna[jj], pp+1, Length(aAna[jj])-pp));
               svrANA=SubStr(aAna[jj], 1, pp-1);
             else
               svrANA=aAna[jj];
             fi;
             svrSGN=SubStr(svrANA, 1, 1);
             if svrSGN="+" or svrSGN="-": svrANA=SubStr(svrANA, 2, 255); fi;
             if Match(svrANA,     "НФА.*"): КОДНФА=svrANA; KOL=if(СЧДЕБ, QUA, -QUA);
             |  Match(svrANA, pfxУЧН+".*"): КОДУЧН=svrANA;
             fi;
             if отчМОЛ<>"" or flgМОЛ: if Match(svrANA,     "МОЛ.*"): КОДМОЛ=svrANA; fi; fi;
             if отчМХЭ<>"" or flgМХЭ: if Match(svrANA,       "М.*"): КОДМХЭ=svrANA; fi; fi;
             if отчДОП<>"" or flgДОП: if Match(svrANA, VOCКОД+".*"): КОДДОП=svrANA; fi; fi;
--             if vИспМОЛ or flgМОЛ: if Match(svrANA,     "МОЛ.*"): КОДМОЛ=svrANA; fi; fi;
--             if vИспМХЭ or flgМХЭ: if Match(svrANA,       "М.*"): КОДМХЭ=svrANA; fi; fi;
--             if vИспДОП or flgДОП: if Match(svrANA, VOCКОД+".*"): КОДДОП=svrANA; fi; fi;
           od; -- цикл по аналитике
         fi; --xx>0
         -- формирование задействованной аналитики
         -- НФА
         if КОДНФА="": КОДНФА="НФА.$$$"; fi;
         -- УЧН
         if Trim(КОДУЧН)="" or БЕЗУЧН or ПустойУЧН:
           КОДУЧН=pfxУЧН+".$$$"; 
         else
           if not USE_ИНВЕНТАРНЫЙ_НОМЕР(КОДСЧТ, SUM, KOL, vНПОТЧ, КОДУЧН, constНФА100П, constНФА_ИНВ): КОДУЧН=pfxУЧН+".$$$"; fi;
         fi;
         -- МОЛ
         if КОДМОЛ="": КОДМОЛ="МОЛ.$$$"; fi;
         -- МХЭ
         if КОДМХЭ="": КОДМХЭ="М.Э.$$$"; fi;
         -- Дополнительный справочник
         if КОДДОП="": if Name_A(VOCКОД+".")<>" ": КОДДОП=VOCКОД+".$$$"; else КОДДОП="$$$.$$$"; fi; fi;
         --  *** Отбор по условию ***
         Work=True;
         if Work and vИспНФА: Work=ПризнакСоотвНабору(КОДНФА, отчНФА); fi;
         if Work and vИспМОЛ: Work=ПризнакСоотвНабору(КОДМОЛ, отчМОЛ); fi;
         if Work and vИспМХЭ: Work=ПризнакСоотвНабору(КОДМХЭ, отчМХЭ); fi;
         if Work and vИспДОП: Work=ПризнакСоотвНабору(КОДДОП, отчДОП); fi;
         if Work and vИспАНА: Work=ПроводкаПроходитОтборПоАналитике(xx, отчАНА, True); fi;
         -- *** Проводка отобрана ***
         if Work:
           -- Формирование ссылок на аналитику
           -- НФА
           refStrНФА="";
           hh=SearchInArray(arr_КОДНФА, КОДНФА, True, 1);
           if hh=-1:
             count_arrНФА=count_arrНФА+1;
             refStrНФА=Format("%.10d", count_arrНФА);
             pp=InsertInArraySort(arr_КОДНФА, КОДНФА);
             InsertInArray(arr_REFНФА, pp, refStrНФА);
           else
             refStrНФА=arr_REFНФА[hh];
           fi;
           -- МОЛ
           refStrМОЛ="";
           hh=SearchInArray(arr_КОДМОЛ, КОДМОЛ, True, 1);
           if hh=-1:
             count_arrМОЛ=count_arrМОЛ+1;
             refStrМОЛ=Format("%.10d", count_arrМОЛ);
             pp=InsertInArraySort(arr_КОДМОЛ, КОДМОЛ);
             InsertInArray(arr_REFМОЛ, pp, refStrМОЛ);
           else
             refStrМОЛ=arr_REFМОЛ[hh];
           fi;
           -- МХЭ
           refStrМХЭ="";
           hh=SearchInArray(arr_КОДМХЭ, КОДМХЭ, True, 1);
           if hh=-1:
             count_arrМХЭ=count_arrМХЭ+1;
             refStrМХЭ=Format("%.10d", count_arrМХЭ);
             pp=InsertInArraySort(arr_КОДМХЭ, КОДМХЭ);
             InsertInArray(arr_REFМХЭ, pp, refStrМХЭ);
           else
             refStrМХЭ=arr_REFМХЭ[hh];
           fi;
           -- Дополнительный справочник
           refStrДОП="";
           hh=SearchInArray(arr_КОДДОП, КОДДОП, True, 1);
           if hh=-1:
             count_arrДОП=count_arrДОП+1;
             refStrДОП=Format("%.10d", count_arrДОП);
             pp=InsertInArraySort(arr_КОДДОП, КОДДОП);
             InsertInArray(arr_REFДОП, pp, refStrДОП);
           else
             refStrДОП=arr_REFДОП[hh];
           fi;
           --
           NAMНФА=""; NAMУЧН=""; NAMМОЛ=""; NAMМХЭ=""; NAMДОП=""; svrANA="";
           -- *** СТРОКА ОТБОРА ОБЪЕКТОВ УЧЕТА ***
           svrANA=refStrМОЛ+"#"+refStrМХЭ+"#"+refStrДОП+"#"+КОДСЧТ+"#"+refStrНФА+"#"+КОДУЧН;
           -- refStrМОЛ#refStrМХЭ#refStrДОП#КОДСЧТ#refStrНФА#КОДУЧН
           hh=SearchInArray(LST_UNIQUE, svrANA, True, 1);
           if hh=-1:
             -- НФА
             NAMНФА=УдалитьРазделитель_дляНашаСорт(Trim(Name_A(КОДНФА)));
             if NAMНФА="": if КОДНФА="НФА.$$$": NAMНФА="> нет кода НФА"; else NAMНФА=КОДНФА; fi; fi;
             -- УЧН
             NAMУЧН=УдалитьРазделитель_дляНашаСорт(Trim(Name_A("ИНВВЕД."+КОДНФА+"."+КОДУЧН)));
             if NAMУЧН="": NAMУЧН="> не присвоен"; fi;
             -- МОЛ
             NAMМОЛ=УдалитьРазделитель_дляНашаСорт(Trim(Name_A(КОДМОЛ)));
             if NAMМОЛ="": if КОДМОЛ="МОЛ.$$$": NAMМОЛ="> нет кода МОЛ"; else NAMМОЛ=КОДМОЛ; fi; fi;
             -- МХЭ
             NAMМХЭ=УдалитьРазделитель_дляНашаСорт(Trim(Name_A(КОДМХЭ)));
             if NAMМХЭ="": if КОДМХЭ="М.Э.$$$": NAMМХЭ="> нет кода МХЭ"; else NAMМХЭ=КОДМХЭ; fi; fi;
             -- Дополнительный справочник
             NAMДОП=УдалитьРазделитель_дляНашаСорт(Trim(Name_A(КОДДОП)));
             if NAMДОП="":
               if КОДДОП=VOCКОД+".$$$": NAMДОП="> нет кода "+VOCКОД;
               |  КОДДОП="$$$.$$$":     NAMДОП="> нет доп.справочника";
               else NAMДОП=КОДДОП;
               fi;
             fi;
             --
             pp=0;
             if flgМОЛ: Value=NAMМОЛ+Chr(169)+КОДМОЛ; AddInArray(aHdrFldSRT, True, False, Value); fi;
             if flgМХЭ: Value=NAMМХЭ+Chr(169)+КОДМХЭ; AddInArray(aHdrFldSRT, True, False, Value); fi;
             if flgДОП: Value=NAMДОП+Chr(169)+КОДДОП; AddInArray(aHdrFldSRT, True, False, Value); fi;
             --
             Value="";
             if fldСОРТкод="тНФАКОД": Value=КОДНФА;
             |  fldСОРТкод="тНФАИМЯ": Value=NAMНФА;
             |  fldСОРТкод="тНФАИНВ": Value=NAMУЧН;
             |  fldСОРТкод="тНФАУЧН": Value=КОДУЧН;
             fi;
             if Value<>"": AddInArray(aUsrFldSRT, True, False, Value); fi;
             --
             pp=InsertInArraySort(LST_UNIQUE, svrANA);
             InsertInArray(LST_OSTСУМ, pp, SUM);
             InsertInArray(LST_OSTКОЛ, pp, KOL);
             InsertInArray(LST_DEBСУМ, pp, 0.00);
             InsertInArray(LST_DEBКОЛ, pp, 0.00);
             InsertInArray(LST_DVPСУМ, pp, 0.00);
             InsertInArray(LST_DVPКОЛ, pp, 0.00);
             InsertInArray(LST_KREСУМ, pp, 0.00);
             InsertInArray(LST_KREКОЛ, pp, 0.00);
             InsertInArray(LST_KVPСУМ, pp, 0.00);
             InsertInArray(LST_KVPКОЛ, pp, 0.00);
             InsertInArray(LST_КОДИСТ, pp, КОДИСТ);
             InsertInArray(LST_КОДКБК, pp, КОДКБК);
             InsertInArray(LST_КОДСЧ6, pp, КОДСЧ6);
             InsertInArray(LST_ИМЯНФА, pp, NAMНФА);
             InsertInArray(LST_ИМЯИНВ, pp, NAMУЧН);
             InsertInArray(LST_ИМЯМОЛ, pp, NAMМОЛ);
             InsertInArray(LST_ИМЯМХЭ, pp, NAMМХЭ);
             InsertInArray(LST_ИМЯДОП, pp, NAMДОП);
             InsertInArray(LST_НЕТУЧН, pp, БЕЗУЧН);
             InsertInArray(LST_ЮЗРСРТ, pp, Value);
           else
             LST_OSTСУМ[hh]=LST_OSTСУМ[hh]+SUM;
             LST_OSTКОЛ[hh]=LST_OSTКОЛ[hh]+KOL;
           fi; -- объект найден
         fi; --Work (проводка отобрана)
       fi; --КОДСЧТ
     end; -- while
   Finally
     CloseTextJur;
     CloseProgress;
   end; -- Try
   Try DeleteFile(ВременныйФайл); Except end;
 fi; -- len>0 (TujReport)
end;

Proc ПоискДанных_ИщемОборотНФА101(vНПОТЧ:Date; vКПОТЧ:Date; vЕстьБал:Logical; vЕстьЗаб:Logical; vMaskACC:String; vMaskANA:String; vИспНФА:Logical; vИспМОЛ:Logical; vИспМХЭ:Logical; vИспДОП:Logical; vИспАНА:Logical; constНФА100П:Numeric; constНФА_ИНВ:Numeric; ПустойУЧН:Logical);
var ВременныйФайл, aVal1, aVal2, aDeb, aCre, aComment, svrANA, svrSGN, refStrНФА, refStrМОЛ, refStrМХЭ, refStrДОП, Value :String;
var КОДСЧТ, КОДИСТ, КОДКБК, КОДСЧ6, СЧТDeb, СЧТCre, КОДНФА, КОДУЧН, КОДМОЛ, КОДМХЭ, КОДДОП, NAMНФА, NAMУЧН, NAMМОЛ, NAMМХЭ, NAMДОП :String;
var СЧДЕБ, БЕЗУЧН, transВНПР, Work, flgДЕБ, flgКРЕ :Logical;
var len, xx, ii, jj, pp, hh, Find_Iter, vAnaNum :Integer;
var aSum1, aSum2, SUM, QUA, KOL :Numeric;
var aDate :Date;
 ClearVariable(aAna);
 vAnaNum=LengthOfArray(Fnd_101V);
 ВременныйФайл=PlanVar('CACHE')+"\"+GetGUID;
 xx=TujRepNoNullBal+TujRepCombinedAna+TujRepCrossTurn+if(vЕстьЗаб, TujRepZabalance, 0);
 --TujRepCrossTurn ??? -- маска по счетам должна точно соответствовать так как ТБ не включает в свертку чисто забалансовые счета
 len=TujReport(ВременныйФайл, vНПОТЧ, vКПОТЧ, vMaskACC, vMaskANA, ИсключитьСправочники, "", "", xx, False);
 if len>0:
   ShowProgress(len, "Выборка оборотов НФА...");
   OpenTextJur(ВременныйФайл);
   Try
     ii=1;
     while not GetTransFromTextJur(aDate, aSum1, aVal1, aSum2, aVal2, aDeb, aCre, aAna, aComment) do
       ProgressPos(ii);
       ii=ii+1;
       -- Очистка аналитики
       КОДСЧТ=""; КОДИСТ=""; КОДКБК=""; КОДСЧ6=""; СЧТDeb=""; СЧТCre=""; svrANA=""; svrSGN="";
       SUM=0.00;
       ClearVariable(Fnd_AnaO);
       ClearVariable(Fnd_AnaD);
       ClearVariable(Fnd_AnaK);
       if vAnaNum>0: Fnd_AnaD[vAnaNum]=""; Fnd_AnaK[vAnaNum]=""; Fnd_AnaO[vAnaNum]=""; fi; -- инициализация размерности массивов
       transВНПР=False;
       --
       if Match(aDeb, "*.?.101.??.???") or Match(aDeb, "*.?.102.??.???") or Match(aDeb, "*.?.105.??.???") or Match(aDeb, "ЗАБ.??.10?.??"): СЧТDeb=aDeb; fi;
       if Match(aCre, "*.?.101.??.???") or Match(aCre, "*.?.102.??.???") or Match(aCre, "*.?.105.??.???") or Match(aCre, "ЗАБ.??.10?.??"): СЧТCre=aCre; fi;
       if СЧТDeb<>"" and СЧТCre ="": КОДСЧТ=СЧТDeb; СЧДЕБ=True;  fi;
       if СЧТDeb ="" and СЧТCre<>"": КОДСЧТ=СЧТCre; СЧДЕБ=False; fi;
       if СЧТDeb<>"" and СЧТCre<>"": if СЧТDeb=СЧТCre: КОДСЧТ=СЧТDeb; СЧДЕБ=True; transВНПР=True; fi; fi;
       --
       if КОДСЧТ<>"":
         if Match(КОДСЧТ, "???.????.???????.???.?.101.??.???")   : КОДСЧТ=SubStr(КОДСЧТ, 1, 30)+"???"; БЕЗУЧН=False; КОДИСТ=SubStr(КОДСЧТ, 22, 1); КОДКБК=SubStr(КОДСЧТ, 1, 20); КОДСЧ6=SubStr(КОДСЧТ, 24, 6);
         |  Match(КОДСЧТ, "???.????.???????.???.?.102.??.???")   : КОДСЧТ=SubStr(КОДСЧТ, 1, 30)+"???"; БЕЗУЧН=False; КОДИСТ=SubStr(КОДСЧТ, 22, 1); КОДКБК=SubStr(КОДСЧТ, 1, 20); КОДСЧ6=SubStr(КОДСЧТ, 24, 6);
         |  Match(КОДСЧТ, "???.????.???????.???.?.105.??.???")   : КОДСЧТ=SubStr(КОДСЧТ, 1, 30)+"???"; БЕЗУЧН=True;  КОДИСТ=SubStr(КОДСЧТ, 22, 1); КОДКБК=SubStr(КОДСЧТ, 1, 20); КОДСЧ6=SubStr(КОДСЧТ, 24, 6);
         |  Match(КОДСЧТ, "ЗАБ.??.10?.??")                       : КОДСЧТ=КОДСЧТ;                      БЕЗУЧН=True;  КОДИСТ="З";                   КОДКБК="Забаланс";            if flgВыдСчтНФА: КОДСЧ6=SubStr(КОДСЧТ,  8, 6); else КОДСЧ6=SubStr(КОДСЧТ,  1, 6); fi;
         else КОДИСТ=""; КОДКБК=""; КОДСЧ6=""; КОДСЧТ="";
         fi;
         if КОДСЧТ<>"":
           if (aVal1="" or aVal1="РУБ") and aSum1<>0: SUM=aSum1;
           |  (aVal2="" or aVal2="РУБ") and aSum2<>0: SUM=aSum2;
           else SUM=0.00;
           fi;
           -- *** Отбор аналитики ***
           КОДНФА=""; КОДУЧН=""; refStrНФА="";
           KOL=0.00; QUA=0.00;
           xx=LengthOfArray(aAna);
           if xx>0:
             for jj=1 to xx do
               pp=Pos(":", aAna[jj]);
               if pp>0:
                 QUA=StringToNumeric(SubStr(aAna[jj], pp+1, Length(aAna[jj])-pp));
                 svrANA=SubStr(aAna[jj], 1, pp-1);
               else
                 svrANA=aAna[jj];
               fi;
               svrSGN=SubStr(svrANA, 1, 1);
               if svrSGN="+" or svrSGN="-": svrANA=SubStr(svrANA, 2, 255); fi;
               if Match(svrANA,     "НФА.*"): КОДНФА=svrANA; KOL=QUA;
               |  Match(svrANA, pfxУЧН+".*"): КОДУЧН=svrANA;
               else
                 Value=GetAnaGlossary(svrANA);
                 if Value<>"": Find_Iter=SearchInArray(Fnd_101V, Value, False, 1); else Find_Iter=0; fi;
                 -- если признак проводки из набора справочников для отбора (массив Fnd_101V)
                 if Find_Iter>0:
                   -- Если внутр. преремещение - распределение аналитики на дебетовую и кредитовую,
                   -- а для НЕ внутреннего перемещения аналитика всегда общая
                   -- В массив общей аналитики отбираем признак без разбиения на дебет/кредит
                   -- или отбираем дебетовую/кредитовую часть признака в соответсвии с положением счета НФА
                   if svrSGN="+": if transВНПР: Fnd_AnaD[Find_Iter]=svrANA; else if     СЧДЕБ: Fnd_AnaO[Find_Iter]=svrANA; fi; fi;
                   |  svrSGN="-": if transВНПР: Fnd_AnaK[Find_Iter]=svrANA; else if not СЧДЕБ: Fnd_AnaO[Find_Iter]=svrANA; fi; fi;
                   else           Fnd_AnaO[Find_Iter]=svrANA;
                   fi;
-- СТАРЫЙ ВАРИАНТ
--                   if transВНПР: -- если внутр. преремещение - распределение аналитики на дебетовую и кредитовую
--                     if svrSGN="+": Fnd_AnaD[Find_Iter]=svrANA;
--                     |  svrSGN="-": Fnd_AnaK[Find_Iter]=svrANA;
--                     else           Fnd_AnaO[Find_Iter]=svrANA;
--                     fi;
--                   else -- для НЕ внутреннего перемещения аналитика всегда общая
--                     --в массив общей аналитики отбираем признак без разбиения на дебет/кредит
--                     --или отбираем дебетовую/кредитовую часть признака в соответсвии с положением счета НФА
--                     if Pos(svrSGN, "+-")<1 or (СЧДЕБ and svrSGN="+") or (not СЧДЕБ and svrSGN="-"): Fnd_AnaO[Find_Iter]=svrANA; fi;
--                   fi; -- transВНПР
                 fi; -- Find_Iter>0
               fi; -- Match(svrANA, "")
             od; -- цикл по аналитике свертки
           fi; --xx>0
           -- Формирование аналитики (часть 1)
           -- НФА
           if КОДНФА="": КОДНФА="НФА.$$$"; fi;
           -- УЧН
           if Trim(КОДУЧН)="" or БЕЗУЧН or ПустойУЧН:
             КОДУЧН=pfxУЧН+".$$$";
           else
             if not USE_ИНВЕНТАРНЫЙ_НОМЕР(КОДСЧТ, SUM, KOL, vКПОТЧ-1, КОДУЧН, constНФА100П, constНФА_ИНВ): КОДУЧН=pfxУЧН+".$$$"; fi;
           fi;
           -- Формирование ссылок на аналитику (часть 1)
           -- НФА
           hh=SearchInArray(arr_КОДНФА, КОДНФА, True, 1);
           if hh=-1:
             count_arrНФА=count_arrНФА+1;
             refStrНФА=Format("%.10d", count_arrНФА);
             pp=InsertInArraySort(arr_КОДНФА, КОДНФА);
             InsertInArray(arr_REFНФА, pp, refStrНФА);
           else
             refStrНФА=arr_REFНФА[hh];
           fi;
           --
           -- *** АНАЛИЗИРУЕМ НАЙДЕННЫЕ ПРИЗНАКИ ***
           if transВНПР:
             -- если это внутренние перемещения, то проводка свертки возможно разбивается на две - с дебетовой и кредитовой аналитикой
             flgДЕБ=False; flgКРЕ=False;
             if vAnaNum>0:
               for hh=1 to vAnaNum do
                 if Fnd_AnaD[hh]<>"": flgДЕБ=True; fi; -- необходима проводка с дебетовой  аналитикой
                 if Fnd_AnaK[hh]<>"": flgКРЕ=True; fi; -- необходима проводка с кредитовой аналитикой
                 if flgДЕБ and flgКРЕ: Break; fi;
               od;
             fi;
             -- формируем проводку с дебетовой аналитикой
             if flgДЕБ:
               -- Очистка аналитики
               refStrМОЛ=""; КОДМОЛ="";
               refStrМХЭ=""; КОДМХЭ="";
               refStrДОП=""; КОДДОП="";
               ClearVariable(Buf);
               --
               CopyArray(Fnd_AnaD, Buf);      -- бэкапим дебетовую аналитику
               CopyArray(Fnd_AnaO, Fnd_AnaD); -- копируем в Fnd_AnaD общую аналитику, в дальнейшем здесь будет результат
               --
               for hh=1 to vAnaNum do
                 if Buf[hh]<>"": Fnd_AnaD[hh]=Buf[hh]; fi; -- объединяем возможную дебетовую аналитику с общей
                 svrANA=Fnd_AnaD[hh];
                 if отчМОЛ<>"" or flgМОЛ: if Match(svrANA,     "МОЛ.*"): КОДМОЛ=svrANA; fi; fi;
                 if отчМХЭ<>"" or flgМХЭ: if Match(svrANA,       "М.*"): КОДМХЭ=svrANA; fi; fi;
                 if отчДОП<>"" or flgДОП: if Match(svrANA, VOCКОД+".*"): КОДДОП=svrANA; fi; fi;
               od;
               -- Формирование аналитики (часть 2)
               -- МОЛ
               if КОДМОЛ="": КОДМОЛ="МОЛ.$$$"; fi;
               -- МХЭ
               if КОДМХЭ="": КОДМХЭ="М.Э.$$$"; fi;
               -- Дополнительный справочник
               if КОДДОП="": if Name_A(VOCКОД+".")<>" ": КОДДОП=VOCКОД+".$$$"; else КОДДОП="$$$.$$$"; fi; fi;
               --
               --  *** Отбор по условию ***
               Work=True;
               if Work and отчНФА<>"": Work=ПризнакСоотвНабору(КОДНФА, отчНФА); fi;
               if Work and отчМОЛ<>"": Work=ПризнакСоотвНабору(КОДМОЛ, отчМОЛ); fi;
               if Work and отчМХЭ<>"": Work=ПризнакСоотвНабору(КОДМХЭ, отчМХЭ); fi;
               if Work and отчДОП<>"": Work=ПризнакСоотвНабору(КОДДОП, отчДОП); fi;
               if Work and отчАНА<>"": Work=ПроводкаПроходитОтборПоАналитике(xx, отчАНА, True); fi;
               -- *** Проводка отобрана ***
               if Work:
                 -- Формирование ссылок на аналитику (часть 2)
                 -- МОЛ
                 hh=SearchInArray(arr_КОДМОЛ, КОДМОЛ, True, 1);
                 if hh=-1:
                   count_arrМОЛ=count_arrМОЛ+1;
                   refStrМОЛ=Format("%.10d", count_arrМОЛ);
                   pp=InsertInArraySort(arr_КОДМОЛ, КОДМОЛ);
                   InsertInArray(arr_REFМОЛ, pp, refStrМОЛ);
                 else
                   refStrМОЛ=arr_REFМОЛ[hh];
                 fi;
                 -- МХЭ
                 hh=SearchInArray(arr_КОДМХЭ, КОДМХЭ, True, 1);
                 if hh=-1:
                   count_arrМХЭ=count_arrМХЭ+1;
                   refStrМХЭ=Format("%.10d", count_arrМХЭ);
                   pp=InsertInArraySort(arr_КОДМХЭ, КОДМХЭ);
                   InsertInArray(arr_REFМХЭ, pp, refStrМХЭ);
                 else
                   refStrМХЭ=arr_REFМХЭ[hh];
                 fi;
                 -- Дополнительный справочник
                 hh=SearchInArray(arr_КОДДОП, КОДДОП, True, 1);
                 if hh=-1:
                   count_arrДОП=count_arrДОП+1;
                   refStrДОП=Format("%.10d", count_arrДОП);
                   pp=InsertInArraySort(arr_КОДДОП, КОДДОП);
                   InsertInArray(arr_REFДОП, pp, refStrДОП);
                 else
                   refStrДОП=arr_REFДОП[hh];
                 fi;
                 --
                 NAMНФА=""; NAMУЧН=""; NAMМОЛ=""; NAMМХЭ=""; NAMДОП=""; svrANA="";
                 -- *** СТРОКА ОТБОРА ОБЪЕКТОВ УЧЕТА ***
                 svrANA=refStrМОЛ+"#"+refStrМХЭ+"#"+refStrДОП+"#"+КОДСЧТ+"#"+refStrНФА+"#"+КОДУЧН;
                 -- refStrМОЛ#refStrМХЭ#refStrДОП#КОДСЧТ#refStrНФА#КОДУЧН
                 hh=SearchInArray(LST_UNIQUE, svrANA, True, 1);
                 if hh=-1:
                   -- Наименования признаков для правильной сортировки
                   -- НФА
                   NAMНФА=УдалитьРазделитель_дляНашаСорт(Trim(Name_A(КОДНФА)));
                   if NAMНФА="": if КОДНФА="НФА.$$$": NAMНФА="> нет кода НФА"; else NAMНФА=КОДНФА; fi; fi;
                   -- УЧН
                   NAMУЧН=УдалитьРазделитель_дляНашаСорт(Trim(Name_A("ИНВВЕД."+КОДНФА+"."+КОДУЧН)));
                   if NAMУЧН="": NAMУЧН="> не присвоен"; fi;
                   -- МОЛ
                   NAMМОЛ=УдалитьРазделитель_дляНашаСорт(Trim(Name_A(КОДМОЛ)));
                   if NAMМОЛ="": if КОДМОЛ="МОЛ.$$$": NAMМОЛ="> нет кода МОЛ"; else NAMМОЛ=КОДМОЛ; fi; fi;
                   -- МХЭ
                   NAMМХЭ=УдалитьРазделитель_дляНашаСорт(Trim(Name_A(КОДМХЭ)));
                   if NAMМХЭ="": if КОДМХЭ="М.Э.$$$": NAMМХЭ="> нет кода МХЭ"; else NAMМХЭ=КОДМХЭ; fi; fi;
                   -- Дополнительный справочник
                   NAMДОП=УдалитьРазделитель_дляНашаСорт(Trim(Name_A(КОДДОП)));
                   if NAMДОП="":
                     if КОДДОП=VOCКОД+".$$$": NAMДОП="> нет кода "+VOCКОД;
                     |  КОДДОП="$$$.$$$":     NAMДОП="> нет доп.справочника";
                     else NAMДОП=КОДДОП;
                     fi;
                   fi;
                   --
                   pp=0;
                   if flgМОЛ: Value=NAMМОЛ+Chr(169)+КОДМОЛ; AddInArray(aHdrFldSRT, True, False, Value); fi;
                   if flgМХЭ: Value=NAMМХЭ+Chr(169)+КОДМХЭ; AddInArray(aHdrFldSRT, True, False, Value); fi;
                   if flgДОП: Value=NAMДОП+Chr(169)+КОДДОП; AddInArray(aHdrFldSRT, True, False, Value); fi;
                   --
                   Value="";
                   if fldСОРТкод="тНФАКОД": Value=КОДНФА;
                   |  fldСОРТкод="тНФАИМЯ": Value=NAMНФА;
                   |  fldСОРТкод="тНФАИНВ": Value=NAMУЧН;
                   |  fldСОРТкод="тНФАУЧН": Value=КОДУЧН;
                   fi;
                   if Value<>"": AddInArray(aUsrFldSRT, True, False, Value); fi;
                   --
                   pp=InsertInArraySort(LST_UNIQUE, svrANA);
                   InsertInArray(LST_OSTСУМ, pp, 0.00);
                   InsertInArray(LST_OSTКОЛ, pp, 0.00);
                   InsertInArray(LST_DEBСУМ, pp, 0.00);
                   InsertInArray(LST_DEBКОЛ, pp, 0.00);
                   InsertInArray(LST_DVPСУМ, pp,  SUM);
                   InsertInArray(LST_DVPКОЛ, pp,  KOL);
                   InsertInArray(LST_KREСУМ, pp, 0.00);
                   InsertInArray(LST_KREКОЛ, pp, 0.00);
                   InsertInArray(LST_KVPСУМ, pp, 0.00);
                   InsertInArray(LST_KVPКОЛ, pp, 0.00);
                   InsertInArray(LST_КОДИСТ, pp, КОДИСТ);
                   InsertInArray(LST_КОДКБК, pp, КОДКБК);
                   InsertInArray(LST_КОДСЧ6, pp, КОДСЧ6);
                   InsertInArray(LST_ИМЯНФА, pp, NAMНФА);
                   InsertInArray(LST_ИМЯИНВ, pp, NAMУЧН);
                   InsertInArray(LST_ИМЯМОЛ, pp, NAMМОЛ);
                   InsertInArray(LST_ИМЯМХЭ, pp, NAMМХЭ);
                   InsertInArray(LST_ИМЯДОП, pp, NAMДОП);
                   InsertInArray(LST_НЕТУЧН, pp, БЕЗУЧН);
                   InsertInArray(LST_ЮЗРСРТ, pp, Value);
                 else
                   LST_DVPСУМ[hh]=LST_DVPСУМ[hh]+SUM;
                   LST_DVPКОЛ[hh]=LST_DVPКОЛ[hh]+KOL;
                 fi; -- объект найден
               fi; -- Проводка отобрана
             fi; -- формируем проводку с дебетовой аналитикой
             -- формируем проводку с кредитовой аналитикой
             if flgКРЕ:
               -- Очистка аналитики
               refStrМОЛ=""; КОДМОЛ="";
               refStrМХЭ=""; КОДМХЭ="";
               refStrДОП=""; КОДДОП="";
               ClearVariable(Buf);
               --
               CopyArray(Fnd_AnaK, Buf);      -- бэкапим кредитовую аналитику
               CopyArray(Fnd_AnaO, Fnd_AnaK); -- копируем в Fnd_AnaK общую аналитику, в дальнейшем здесь будет результат
               --
               for hh=1 to vAnaNum do
                 if Buf[hh]<>"": Fnd_AnaK[hh]=Buf[hh]; fi; -- объединяем возможную дебетовую аналитику с общей
                 svrANA=Fnd_AnaK[hh];
                 if отчМОЛ<>"" or flgМОЛ: if Match(svrANA,     "МОЛ.*"): КОДМОЛ=svrANA; fi; fi;
                 if отчМХЭ<>"" or flgМХЭ: if Match(svrANA,       "М.*"): КОДМХЭ=svrANA; fi; fi;
                 if отчДОП<>"" or flgДОП: if Match(svrANA, VOCКОД+".*"): КОДДОП=svrANA; fi; fi;
               od;
               -- Формирование аналитики (часть 2)
               -- МОЛ
               if КОДМОЛ="": КОДМОЛ="МОЛ.$$$"; fi;
               -- МХЭ
               if КОДМХЭ="": КОДМХЭ="М.Э.$$$"; fi;
               -- Дополнительный справочник
               if КОДДОП="": if Name_A(VOCКОД+".")<>" ": КОДДОП=VOCКОД+".$$$"; else КОДДОП="$$$.$$$"; fi; fi;
               --
               --  *** Отбор по условию ***
               Work=True;
               if Work and отчНФА<>"": Work=ПризнакСоотвНабору(КОДНФА, отчНФА); fi;
               if Work and отчМОЛ<>"": Work=ПризнакСоотвНабору(КОДМОЛ, отчМОЛ); fi;
               if Work and отчМХЭ<>"": Work=ПризнакСоотвНабору(КОДМХЭ, отчМХЭ); fi;
               if Work and отчДОП<>"": Work=ПризнакСоотвНабору(КОДДОП, отчДОП); fi;
               if Work and отчАНА<>"": Work=ПроводкаПроходитОтборПоАналитике(xx, отчАНА, True); fi;
               -- *** Проводка отобрана ***
               if Work:
                 -- Формирование ссылок на аналитику (часть 2)
                 -- МОЛ
                 hh=SearchInArray(arr_КОДМОЛ, КОДМОЛ, True, 1);
                 if hh=-1:
                   count_arrМОЛ=count_arrМОЛ+1;
                   refStrМОЛ=Format("%.10d", count_arrМОЛ);
                   pp=InsertInArraySort(arr_КОДМОЛ, КОДМОЛ);
                   InsertInArray(arr_REFМОЛ, pp, refStrМОЛ);
                 else
                   refStrМОЛ=arr_REFМОЛ[hh];
                 fi;
                 -- МХЭ
                 hh=SearchInArray(arr_КОДМХЭ, КОДМХЭ, True, 1);
                 if hh=-1:
                   count_arrМХЭ=count_arrМХЭ+1;
                   refStrМХЭ=Format("%.10d", count_arrМХЭ);
                   pp=InsertInArraySort(arr_КОДМХЭ, КОДМХЭ);
                   InsertInArray(arr_REFМХЭ, pp, refStrМХЭ);
                 else
                   refStrМХЭ=arr_REFМХЭ[hh];
                 fi;
                 -- Дополнительный справочник
                 hh=SearchInArray(arr_КОДДОП, КОДДОП, True, 1);
                 if hh=-1:
                   count_arrДОП=count_arrДОП+1;
                   refStrДОП=Format("%.10d", count_arrДОП);
                   pp=InsertInArraySort(arr_КОДДОП, КОДДОП);
                   InsertInArray(arr_REFДОП, pp, refStrДОП);
                 else
                   refStrДОП=arr_REFДОП[hh];
                 fi;
                 --
                 NAMНФА=""; NAMУЧН=""; NAMМОЛ=""; NAMМХЭ=""; NAMДОП=""; svrANA="";
                 -- *** СТРОКА ОТБОРА ОБЪЕКТОВ УЧЕТА ***
                 svrANA=refStrМОЛ+"#"+refStrМХЭ+"#"+refStrДОП+"#"+КОДСЧТ+"#"+refStrНФА+"#"+КОДУЧН;
                 -- refStrМОЛ#refStrМХЭ#refStrДОП#КОДСЧТ#refStrНФА#КОДУЧН
                 hh=SearchInArray(LST_UNIQUE, svrANA, True, 1);
                 if hh=-1:
                   -- Наименования признаков для правильной сортировки
                   -- НФА
                   NAMНФА=УдалитьРазделитель_дляНашаСорт(Trim(Name_A(КОДНФА)));
                   if NAMНФА="": if КОДНФА="НФА.$$$": NAMНФА="> нет кода НФА"; else NAMНФА=КОДНФА; fi; fi;
                   -- УЧН
                   NAMУЧН=УдалитьРазделитель_дляНашаСорт(Trim(Name_A("ИНВВЕД."+КОДНФА+"."+КОДУЧН)));
                   if NAMУЧН="": NAMУЧН="> не присвоен"; fi;
                   -- МОЛ
                   NAMМОЛ=УдалитьРазделитель_дляНашаСорт(Trim(Name_A(КОДМОЛ)));
                   if NAMМОЛ="": if КОДМОЛ="МОЛ.$$$": NAMМОЛ="> нет кода МОЛ"; else NAMМОЛ=КОДМОЛ; fi; fi;
                   -- МХЭ
                   NAMМХЭ=УдалитьРазделитель_дляНашаСорт(Trim(Name_A(КОДМХЭ)));
                   if NAMМХЭ="": if КОДМХЭ="М.Э.$$$": NAMМХЭ="> нет кода МХЭ"; else NAMМХЭ=КОДМХЭ; fi; fi;
                   -- Дополнительный справочник
                   NAMДОП=УдалитьРазделитель_дляНашаСорт(Trim(Name_A(КОДДОП)));
                   if NAMДОП="":
                     if КОДДОП=VOCКОД+".$$$": NAMДОП="> нет кода "+VOCКОД;
                     |  КОДДОП="$$$.$$$":     NAMДОП="> нет доп.справочника";
                     else NAMДОП=КОДДОП;
                     fi;
                   fi;
                   --
                   pp=0;
                   if flgМОЛ: Value=NAMМОЛ+Chr(169)+КОДМОЛ; AddInArray(aHdrFldSRT, True, False, Value); fi;
                   if flgМХЭ: Value=NAMМХЭ+Chr(169)+КОДМХЭ; AddInArray(aHdrFldSRT, True, False, Value); fi;
                   if flgДОП: Value=NAMДОП+Chr(169)+КОДДОП; AddInArray(aHdrFldSRT, True, False, Value); fi;
                   --
                   Value="";
                   if fldСОРТкод="тНФАКОД": Value=КОДНФА;
                   |  fldСОРТкод="тНФАИМЯ": Value=NAMНФА;
                   |  fldСОРТкод="тНФАИНВ": Value=NAMУЧН;
                   |  fldСОРТкод="тНФАУЧН": Value=КОДУЧН;
                   fi;
                   if Value<>"": AddInArray(aUsrFldSRT, True, False, Value); fi;
                   --
                   pp=InsertInArraySort(LST_UNIQUE, svrANA);
                   InsertInArray(LST_OSTСУМ, pp, 0.00);
                   InsertInArray(LST_OSTКОЛ, pp, 0.00);
                   InsertInArray(LST_DEBСУМ, pp, 0.00);
                   InsertInArray(LST_DEBКОЛ, pp, 0.00);
                   InsertInArray(LST_DVPСУМ, pp, 0.00);
                   InsertInArray(LST_DVPКОЛ, pp, 0.00);
                   InsertInArray(LST_KREСУМ, pp, 0.00);
                   InsertInArray(LST_KREКОЛ, pp, 0.00);
                   InsertInArray(LST_KVPСУМ, pp,  SUM);
                   InsertInArray(LST_KVPКОЛ, pp,  KOL);
                   InsertInArray(LST_КОДИСТ, pp, КОДИСТ);
                   InsertInArray(LST_КОДКБК, pp, КОДКБК);
                   InsertInArray(LST_КОДСЧ6, pp, КОДСЧ6);
                   InsertInArray(LST_ИМЯНФА, pp, NAMНФА);
                   InsertInArray(LST_ИМЯИНВ, pp, NAMУЧН);
                   InsertInArray(LST_ИМЯМОЛ, pp, NAMМОЛ);
                   InsertInArray(LST_ИМЯМХЭ, pp, NAMМХЭ);
                   InsertInArray(LST_ИМЯДОП, pp, NAMДОП);
                   InsertInArray(LST_НЕТУЧН, pp, БЕЗУЧН);
                   InsertInArray(LST_ЮЗРСРТ, pp, Value);
                 else
                   LST_KVPСУМ[hh]=LST_KVPСУМ[hh]+SUM;
                   LST_KVPКОЛ[hh]=LST_KVPКОЛ[hh]+KOL;
                 fi; -- объект найден
               fi; -- Проводка отобрана
             fi; -- формируем проводку с кредитовой аналитикой
             -- формируем проводку с общей аналитикой (разделения на дебетовую и кредитовую аналитику НЕ было)
             if not flgДЕБ and not flgКРЕ:
               -- Очистка аналитики
               refStrМОЛ=""; КОДМОЛ="";
               refStrМХЭ=""; КОДМХЭ="";
               refStrДОП=""; КОДДОП="";
               --
               for hh=1 to vAnaNum do
                 svrANA=Fnd_AnaO[hh];
                 if отчМОЛ<>"" or flgМОЛ: if Match(svrANA,     "МОЛ.*"): КОДМОЛ=svrANA; fi; fi;
                 if отчМХЭ<>"" or flgМХЭ: if Match(svrANA,       "М.*"): КОДМХЭ=svrANA; fi; fi;
                 if отчДОП<>"" or flgДОП: if Match(svrANA, VOCКОД+".*"): КОДДОП=svrANA; fi; fi;
               od;
               -- Формирование аналитики (часть 2)
               -- МОЛ
               if КОДМОЛ="": КОДМОЛ="МОЛ.$$$"; fi;
               -- МХЭ
               if КОДМХЭ="": КОДМХЭ="М.Э.$$$"; fi;
               -- Дополнительный справочник
               if КОДДОП="": if Name_A(VOCКОД+".")<>" ": КОДДОП=VOCКОД+".$$$"; else КОДДОП="$$$.$$$"; fi; fi;
               --
               --  *** Отбор по условию ***
               Work=True;
               if Work and vИспНФА: Work=ПризнакСоотвНабору(КОДНФА, отчНФА); fi;
               if Work and vИспМОЛ: Work=ПризнакСоотвНабору(КОДМОЛ, отчМОЛ); fi;
               if Work and vИспМХЭ: Work=ПризнакСоотвНабору(КОДМХЭ, отчМХЭ); fi;
               if Work and vИспДОП: Work=ПризнакСоотвНабору(КОДДОП, отчДОП); fi;
               if Work and vИспАНА: Work=ПроводкаПроходитОтборПоАналитике(xx, отчАНА, True); fi;
               -- *** Проводка отобрана ***
               if Work:
                 -- Формирование ссылок на аналитику (часть 2)
                 -- МОЛ
                 hh=SearchInArray(arr_КОДМОЛ, КОДМОЛ, True, 1);
                 if hh=-1:
                   count_arrМОЛ=count_arrМОЛ+1;
                   refStrМОЛ=Format("%.10d", count_arrМОЛ);
                   pp=InsertInArraySort(arr_КОДМОЛ, КОДМОЛ);
                   InsertInArray(arr_REFМОЛ, pp, refStrМОЛ);
                 else
                   refStrМОЛ=arr_REFМОЛ[hh];
                 fi;
                 -- МХЭ
                 hh=SearchInArray(arr_КОДМХЭ, КОДМХЭ, True, 1);
                 if hh=-1:
                   count_arrМХЭ=count_arrМХЭ+1;
                   refStrМХЭ=Format("%.10d", count_arrМХЭ);
                   pp=InsertInArraySort(arr_КОДМХЭ, КОДМХЭ);
                   InsertInArray(arr_REFМХЭ, pp, refStrМХЭ);
                 else
                   refStrМХЭ=arr_REFМХЭ[hh];
                 fi;
                 -- Дополнительный справочник
                 hh=SearchInArray(arr_КОДДОП, КОДДОП, True, 1);
                 if hh=-1:
                   count_arrДОП=count_arrДОП+1;
                   refStrДОП=Format("%.10d", count_arrДОП);
                   pp=InsertInArraySort(arr_КОДДОП, КОДДОП);
                   InsertInArray(arr_REFДОП, pp, refStrДОП);
                 else
                   refStrДОП=arr_REFДОП[hh];
                 fi;
                 --
                 NAMНФА=""; NAMУЧН=""; NAMМОЛ=""; NAMМХЭ=""; NAMДОП=""; svrANA="";
                 -- *** СТРОКА ОТБОРА ОБЪЕКТОВ УЧЕТА ***
                 svrANA=refStrМОЛ+"#"+refStrМХЭ+"#"+refStrДОП+"#"+КОДСЧТ+"#"+refStrНФА+"#"+КОДУЧН;
                 -- refStrМОЛ#refStrМХЭ#refStrДОП#КОДСЧТ#refStrНФА#КОДУЧН
                 hh=SearchInArray(LST_UNIQUE, svrANA, True, 1);
                 if hh=-1:
                   -- Наименования признаков для правильной сортировки
                   -- НФА
                   NAMНФА=УдалитьРазделитель_дляНашаСорт(Trim(Name_A(КОДНФА)));
                   if NAMНФА="": if КОДНФА="НФА.$$$": NAMНФА="> нет кода НФА"; else NAMНФА=КОДНФА; fi; fi;
                   -- УЧН
                   NAMУЧН=УдалитьРазделитель_дляНашаСорт(Trim(Name_A("ИНВВЕД."+КОДНФА+"."+КОДУЧН)));
                   if NAMУЧН="": NAMУЧН="> не присвоен"; fi;
                   -- МОЛ
                   NAMМОЛ=УдалитьРазделитель_дляНашаСорт(Trim(Name_A(КОДМОЛ)));
                   if NAMМОЛ="": if КОДМОЛ="МОЛ.$$$": NAMМОЛ="> нет кода МОЛ"; else NAMМОЛ=КОДМОЛ; fi; fi;
                   -- МХЭ
                   NAMМХЭ=УдалитьРазделитель_дляНашаСорт(Trim(Name_A(КОДМХЭ)));
                   if NAMМХЭ="": if КОДМХЭ="М.Э.$$$": NAMМХЭ="> нет кода МХЭ"; else NAMМХЭ=КОДМХЭ; fi; fi;
                   -- Дополнительный справочник
                   NAMДОП=УдалитьРазделитель_дляНашаСорт(Trim(Name_A(КОДДОП)));
                   if NAMДОП="":
                     if КОДДОП=VOCКОД+".$$$": NAMДОП="> нет кода "+VOCКОД;
                     |  КОДДОП="$$$.$$$":     NAMДОП="> нет доп.справочника";
                     else NAMДОП=КОДДОП;
                     fi;
                   fi;
                   --
                   pp=0;
                   if flgМОЛ: Value=NAMМОЛ+Chr(169)+КОДМОЛ; AddInArray(aHdrFldSRT, True, False, Value); fi;
                   if flgМХЭ: Value=NAMМХЭ+Chr(169)+КОДМХЭ; AddInArray(aHdrFldSRT, True, False, Value); fi;
                   if flgДОП: Value=NAMДОП+Chr(169)+КОДДОП; AddInArray(aHdrFldSRT, True, False, Value); fi;
                   --
                   Value="";
                   if fldСОРТкод="тНФАКОД": Value=КОДНФА;
                   |  fldСОРТкод="тНФАИМЯ": Value=NAMНФА;
                   |  fldСОРТкод="тНФАИНВ": Value=NAMУЧН;
                   |  fldСОРТкод="тНФАУЧН": Value=КОДУЧН;
                   fi;
                   if Value<>"": AddInArray(aUsrFldSRT, True, False, Value); fi;
                   --
                   pp=InsertInArraySort(LST_UNIQUE, svrANA);
                   InsertInArray(LST_OSTСУМ, pp, 0.00);
                   InsertInArray(LST_OSTКОЛ, pp, 0.00);
                   InsertInArray(LST_DEBСУМ, pp, 0.00);
                   InsertInArray(LST_DEBКОЛ, pp, 0.00);
                   InsertInArray(LST_DVPСУМ, pp,  SUM);
                   InsertInArray(LST_DVPКОЛ, pp,  KOL);
                   InsertInArray(LST_KREСУМ, pp, 0.00);
                   InsertInArray(LST_KREКОЛ, pp, 0.00);
                   InsertInArray(LST_KVPСУМ, pp,  SUM);
                   InsertInArray(LST_KVPКОЛ, pp,  KOL);
                   InsertInArray(LST_КОДИСТ, pp, КОДИСТ);
                   InsertInArray(LST_КОДКБК, pp, КОДКБК);
                   InsertInArray(LST_КОДСЧ6, pp, КОДСЧ6);
                   InsertInArray(LST_ИМЯНФА, pp, NAMНФА);
                   InsertInArray(LST_ИМЯИНВ, pp, NAMУЧН);
                   InsertInArray(LST_ИМЯМОЛ, pp, NAMМОЛ);
                   InsertInArray(LST_ИМЯМХЭ, pp, NAMМХЭ);
                   InsertInArray(LST_ИМЯДОП, pp, NAMДОП);
                   InsertInArray(LST_НЕТУЧН, pp, БЕЗУЧН);
                   InsertInArray(LST_ЮЗРСРТ, pp, Value);
                 else
                   LST_DVPСУМ[hh]=LST_DVPСУМ[hh]+SUM;
                   LST_DVPКОЛ[hh]=LST_DVPКОЛ[hh]+KOL;
                   LST_KVPСУМ[hh]=LST_KVPСУМ[hh]+SUM;
                   LST_KVPКОЛ[hh]=LST_KVPКОЛ[hh]+KOL;
                 fi; -- объект найден
               fi; -- Проводка отобрана
             fi; -- формируем проводку с общей аналитикой (разделения на дебетовую и кредитовую аналитику НЕ было)
           else -- transВНПР<>True
             -- если это НЕ внутренние перемещения, то аналитику проводки свертки берем общую
             -- Очистка аналитики
             refStrМОЛ=""; КОДМОЛ="";
             refStrМХЭ=""; КОДМХЭ="";
             refStrДОП=""; КОДДОП="";
             ClearVariable(Buf);
             --
             for hh=1 to vAnaNum do
               svrANA=Fnd_AnaO[hh];
               if отчМОЛ<>"" or flgМОЛ: if Match(svrANA,     "МОЛ.*"): КОДМОЛ=svrANA; fi; fi;
               if отчМХЭ<>"" or flgМХЭ: if Match(svrANA,       "М.*"): КОДМХЭ=svrANA; fi; fi;
               if отчДОП<>"" or flgДОП: if Match(svrANA, VOCКОД+".*"): КОДДОП=svrANA; fi; fi;
--               if vИспМОЛ or flgМОЛ: if Match(svrANA,     "МОЛ.*"): КОДМОЛ=svrANA; fi; fi;
--               if vИспМХЭ or flgМХЭ: if Match(svrANA,       "М.*"): КОДМХЭ=svrANA; fi; fi;
--               if vИспДОП or flgДОП: if Match(svrANA, VOCКОД+".*"): КОДДОП=svrANA; fi; fi;
             od;
             -- Формирование аналитики (часть 2)
             -- МОЛ
             if КОДМОЛ="": КОДМОЛ="МОЛ.$$$"; fi;
             -- МХЭ
             if КОДМХЭ="": КОДМХЭ="М.Э.$$$"; fi;
             -- Дополнительный справочник
             if КОДДОП="": if Name_A(VOCКОД+".")<>" ": КОДДОП=VOCКОД+".$$$"; else КОДДОП="$$$.$$$"; fi; fi;
             --
             --  *** Отбор по условию ***
             Work=True;
             if Work and vИспНФА: Work=ПризнакСоотвНабору(КОДНФА, отчНФА); fi;
             if Work and vИспМОЛ: Work=ПризнакСоотвНабору(КОДМОЛ, отчМОЛ); fi;
             if Work and vИспМХЭ: Work=ПризнакСоотвНабору(КОДМХЭ, отчМХЭ); fi;
             if Work and vИспДОП: Work=ПризнакСоотвНабору(КОДДОП, отчДОП); fi;
             if Work and vИспАНА: Work=ПроводкаПроходитОтборПоАналитике(xx, отчАНА, True); fi;
             -- *** Проводка отобрана ***
             if Work:
               -- Формирование ссылок на аналитику (часть 2)
               -- МОЛ
               hh=SearchInArray(arr_КОДМОЛ, КОДМОЛ, True, 1);
               if hh=-1:
                 count_arrМОЛ=count_arrМОЛ+1;
                 refStrМОЛ=Format("%.10d", count_arrМОЛ);
                 pp=InsertInArraySort(arr_КОДМОЛ, КОДМОЛ);
                 InsertInArray(arr_REFМОЛ, pp, refStrМОЛ);
               else
                 refStrМОЛ=arr_REFМОЛ[hh];
               fi;
               -- МХЭ
               hh=SearchInArray(arr_КОДМХЭ, КОДМХЭ, True, 1);
               if hh=-1:
                 count_arrМХЭ=count_arrМХЭ+1;
                 refStrМХЭ=Format("%.10d", count_arrМХЭ);
                 pp=InsertInArraySort(arr_КОДМХЭ, КОДМХЭ);
                 InsertInArray(arr_REFМХЭ, pp, refStrМХЭ);
               else
                 refStrМХЭ=arr_REFМХЭ[hh];
               fi;
               -- Дополнительный справочник
               hh=SearchInArray(arr_КОДДОП, КОДДОП, True, 1);
               if hh=-1:
                 count_arrДОП=count_arrДОП+1;
                 refStrДОП=Format("%.10d", count_arrДОП);
                 pp=InsertInArraySort(arr_КОДДОП, КОДДОП);
                 InsertInArray(arr_REFДОП, pp, refStrДОП);
               else
                 refStrДОП=arr_REFДОП[hh];
               fi;
               --
               NAMНФА=""; NAMУЧН=""; NAMМОЛ=""; NAMМХЭ=""; NAMДОП=""; svrANA="";
               -- *** СТРОКА ОТБОРА ОБЪЕКТОВ УЧЕТА ***
               svrANA=refStrМОЛ+"#"+refStrМХЭ+"#"+refStrДОП+"#"+КОДСЧТ+"#"+refStrНФА+"#"+КОДУЧН;
               -- refStrМОЛ#refStrМХЭ#refStrДОП#КОДСЧТ#refStrНФА#КОДУЧН
               hh=SearchInArray(LST_UNIQUE, svrANA, True, 1);
               if hh=-1:
                 -- Наименования признаков для правильной сортировки
                 -- НФА
                 NAMНФА=УдалитьРазделитель_дляНашаСорт(Trim(Name_A(КОДНФА)));
                 if NAMНФА="": if КОДНФА="НФА.$$$": NAMНФА="> нет кода НФА"; else NAMНФА=КОДНФА; fi; fi;
                 -- УЧН
                 NAMУЧН=УдалитьРазделитель_дляНашаСорт(Trim(Name_A("ИНВВЕД."+КОДНФА+"."+КОДУЧН)));
                 if NAMУЧН="": NAMУЧН="> не присвоен"; fi;
                 -- МОЛ
                 NAMМОЛ=УдалитьРазделитель_дляНашаСорт(Trim(Name_A(КОДМОЛ)));
                 if NAMМОЛ="": if КОДМОЛ="МОЛ.$$$": NAMМОЛ="> нет кода МОЛ"; else NAMМОЛ=КОДМОЛ; fi; fi;
                 -- МХЭ
                 NAMМХЭ=УдалитьРазделитель_дляНашаСорт(Trim(Name_A(КОДМХЭ)));
                 if NAMМХЭ="": if КОДМХЭ="М.Э.$$$": NAMМХЭ="> нет кода МХЭ"; else NAMМХЭ=КОДМХЭ; fi; fi;
                 -- Дополнительный справочник
                 NAMДОП=УдалитьРазделитель_дляНашаСорт(Trim(Name_A(КОДДОП)));
                 if NAMДОП="":
                   if КОДДОП=VOCКОД+".$$$": NAMДОП="> нет кода "+VOCКОД;
                   |  КОДДОП="$$$.$$$":     NAMДОП="> нет доп.справочника";
                   else NAMДОП=КОДДОП;
                   fi;
                 fi;
                 --
                 pp=0;
                 if flgМОЛ: Value=NAMМОЛ+Chr(169)+КОДМОЛ; AddInArray(aHdrFldSRT, True, False, Value); fi;
                 if flgМХЭ: Value=NAMМХЭ+Chr(169)+КОДМХЭ; AddInArray(aHdrFldSRT, True, False, Value); fi;
                 if flgДОП: Value=NAMДОП+Chr(169)+КОДДОП; AddInArray(aHdrFldSRT, True, False, Value); fi;
                 --
                 Value="";
                 if fldСОРТкод="тНФАКОД": Value=КОДНФА;
                 |  fldСОРТкод="тНФАИМЯ": Value=NAMНФА;
                 |  fldСОРТкод="тНФАИНВ": Value=NAMУЧН;
                 |  fldСОРТкод="тНФАУЧН": Value=КОДУЧН;
                 fi;
                 if Value<>"": AddInArray(aUsrFldSRT, True, False, Value); fi;
                 --
                 pp=InsertInArraySort(LST_UNIQUE, svrANA);
                 InsertInArray(LST_OSTСУМ, pp, 0.00);
                 InsertInArray(LST_OSTКОЛ, pp, 0.00);
                 InsertInArray(LST_DEBСУМ, pp, if(СЧДЕБ, SUM, 0.00));
                 InsertInArray(LST_DEBКОЛ, pp, if(СЧДЕБ, KOL, 0.00));
                 InsertInArray(LST_DVPСУМ, pp, 0.00);
                 InsertInArray(LST_DVPКОЛ, pp, 0.00);
                 InsertInArray(LST_KREСУМ, pp, if(СЧДЕБ, 0.00, SUM));
                 InsertInArray(LST_KREКОЛ, pp, if(СЧДЕБ, 0.00, KOL));
                 InsertInArray(LST_KVPСУМ, pp, 0.00);
                 InsertInArray(LST_KVPКОЛ, pp, 0.00);
                 InsertInArray(LST_КОДИСТ, pp, КОДИСТ);
                 InsertInArray(LST_КОДКБК, pp, КОДКБК);
                 InsertInArray(LST_КОДСЧ6, pp, КОДСЧ6);
                 InsertInArray(LST_ИМЯНФА, pp, NAMНФА);
                 InsertInArray(LST_ИМЯИНВ, pp, NAMУЧН);
                 InsertInArray(LST_ИМЯМОЛ, pp, NAMМОЛ);
                 InsertInArray(LST_ИМЯМХЭ, pp, NAMМХЭ);
                 InsertInArray(LST_ИМЯДОП, pp, NAMДОП);
                 InsertInArray(LST_НЕТУЧН, pp, БЕЗУЧН);
                 InsertInArray(LST_ЮЗРСРТ, pp, Value);
               else
                 if СЧДЕБ:
                   LST_DEBСУМ[hh]=LST_DEBСУМ[hh]+SUM;
                   LST_DEBКОЛ[hh]=LST_DEBКОЛ[hh]+KOL;
                 else
                   LST_KREСУМ[hh]=LST_KREСУМ[hh]+SUM;
                   LST_KREКОЛ[hh]=LST_KREКОЛ[hh]+KOL;
                 fi;
               fi; -- объект найден
             fi; -- Проводка отобрана
           fi; -- transВНПР=True (Анализируем найденные признаки)
         fi; -- КОДСЧТ<>""
       fi; -- КОДСЧТ<>"" (анализ внутр.перемещений)
     end; -- while
   Finally
     CloseTextJur;
     CloseProgress;
   end; -- Try
   Try DeleteFile(ВременныйФайл); Except end;
 fi; -- len>0 (TujReport)
end;

Proc ПоискДанных_ИщемОстаки106(vНПОТЧ:Date; vMaskACC:String; vMaskANA:String; vИспНФА:Logical; vИспМОЛ:Logical; vИспМХЭ:Logical; vИспДОП:Logical; vИспАНА:Logical);
var ВременныйФайл, aVal1, aVal2, aDeb, aCre, aComment, svrANA, svrSGN, refStrНФА, refStrМОЛ, refStrМХЭ, refStrДОП, Value :String;
var КОДСЧТ, КОДИСТ, КОДКБК, КОДСЧ6, КОДНФА, КОДМОЛ, КОДМХЭ, КОДДОП, NAMНФА, NAMМОЛ, NAMМХЭ, NAMДОП :String;
var aSum1, aSum2, SUM, QUA, KOL :Numeric;
var len, xx, ii, jj, pp, hh :Integer;
var СЧДЕБ, Work :Logical;
var aDate :Date;
 ClearVariable(aAna);
 ВременныйФайл=PlanVar('CACHE')+"\"+GetGUID;
 xx=TujRepBalAccount+TujRepNoNullBal+TujRepCombinedAna;
 len=TujReport(ВременныйФайл, 1.1.100, vНПОТЧ, vMaskACC, vMaskANA, ИсключитьСправочники, "", "", xx, False);
 if len>0:
   ShowProgress(len, "Выборка остатков ЦС...");
   OpenTextJur(ВременныйФайл);
   Try
     ii=1;
     while not GetTransFromTextJur(aDate, aSum1, aVal1, aSum2, aVal2, aDeb, aCre, aAna, aComment) do
       ProgressPos(ii);
       ii=ii+1;
       -- Очистка аналитики
       КОДИСТ=""; КОДКБК=""; КОДСЧ6=""; КОДСЧТ=""; КОДНФА=""; КОДМОЛ=""; КОДМХЭ=""; КОДДОП=""; svrANA=""; svrSGN="";
       SUM=0.00; KOL=0.00; QUA=0.00;
       -- Отбор счетов
       if aDeb="00" or aDeb="00Z": КОДСЧТ=aCre; СЧДЕБ=False; fi;
       if aCre="00" or aCre="00Z": КОДСЧТ=aDeb; СЧДЕБ=True;  fi;
       if Match(КОДСЧТ, "???.????.???????.???.?.106.??.???"):
         КОДСЧТ=SubStr(КОДСЧТ, 1, 30)+"???";
         КОДИСТ=SubStr(КОДСЧТ, 22, 1);
         КОДКБК=SubStr(КОДСЧТ, 1, 20);
         КОДСЧ6=SubStr(КОДСЧТ, 24, 6);
       else 
         КОДСЧТ=""; КОДИСТ=""; КОДКБК=""; КОДСЧ6="";
       fi;
       if КОДСЧТ<>"":
         if (aVal1="" or aVal1="РУБ") and aSum1<>0: if СЧДЕБ: SUM=aSum1; else SUM=-aSum1; fi;
         |  (aVal2="" or aVal2="РУБ") and aSum2<>0: if СЧДЕБ: SUM=aSum2; else SUM=-aSum2; fi;
         else SUM=0.00;
         fi;
         -- Проводим далее отбор аналитики
         xx=LengthOfArray(aAna);
         if xx>0:
           for jj=1 to xx do
             pp=Pos(":", aAna[jj]);
             if pp>0:
               QUA=StringToNumeric(SubStr(aAna[jj], pp+1, Length(aAna[jj])-pp));
               svrANA=SubStr(aAna[jj], 1, pp-1);
             else
               svrANA=aAna[jj];
             fi;
             svrSGN=SubStr(svrANA, 1, 1);
             if svrSGN="+" or svrSGN="-": svrANA=SubStr(svrANA, 2, 255); fi;
             if Match(svrANA, "НФА.*"): КОДНФА=svrANA; KOL=if(СЧДЕБ, QUA, -QUA); fi;
             if отчМОЛ<>"" or flgМОЛ: if Match(svrANA,     "МОЛ.*"): КОДМОЛ=svrANA; fi; fi;
             if отчМХЭ<>"" or flgМХЭ: if Match(svrANA,       "М.*"): КОДМХЭ=svrANA; fi; fi;
             if отчДОП<>"" or flgДОП: if Match(svrANA, VOCКОД+".*"): КОДДОП=svrANA; fi; fi;
--             if vИспМОЛ or flgМОЛ: if Match(svrANA,     "МОЛ.*"): КОДМОЛ=svrANA; fi; fi;
--             if vИспМХЭ or flgМХЭ: if Match(svrANA,       "М.*"): КОДМХЭ=svrANA; fi; fi;
--             if vИспДОП or flgДОП: if Match(svrANA, VOCКОД+".*"): КОДДОП=svrANA; fi; fi;
           od; -- цикл по аналитике
         fi; --xx>0
         -- формирование задействованной аналитики
         -- НФА
         if КОДНФА="": КОДНФА="НФА.$$$"; fi;
         -- МОЛ
         if КОДМОЛ="": КОДМОЛ="МОЛ.$$$"; fi;
         -- МХЭ
         if КОДМХЭ="": КОДМХЭ="М.Э.$$$"; fi;
         -- Дополнительный справочник
         if КОДДОП="": if Name_A(VOCКОД+".")<>" ": КОДДОП=VOCКОД+".$$$"; else КОДДОП="$$$.$$$"; fi; fi;
         --  *** Отбор по условию ***
         Work=True;
         if Work and vИспНФА: Work=ПризнакСоотвНабору(КОДНФА, отчНФА); fi;
         if Work and vИспМОЛ: Work=ПризнакСоотвНабору(КОДМОЛ, отчМОЛ); fi;
         if Work and vИспМХЭ: Work=ПризнакСоотвНабору(КОДМХЭ, отчМХЭ); fi;
         if Work and vИспДОП: Work=ПризнакСоотвНабору(КОДДОП, отчДОП); fi;
         if Work and vИспАНА: Work=ПроводкаПроходитОтборПоАналитике(xx, отчАНА, True); fi;
         -- *** Проводка отобрана ***
         if Work:
           -- Формирование ссылок на аналитику
           -- НФА
           refStrНФА="";
           hh=SearchInArray(arr_КОДНФА, КОДНФА, True, 1);
           if hh=-1:
             count_arrНФА=count_arrНФА+1;
             refStrНФА=Format("%.10d", count_arrНФА);
             pp=InsertInArraySort(arr_КОДНФА, КОДНФА);
             InsertInArray(arr_REFНФА, pp, refStrНФА);
           else
             refStrНФА=arr_REFНФА[hh];
           fi;
           -- МОЛ
           refStrМОЛ="";
           hh=SearchInArray(arr_КОДМОЛ, КОДМОЛ, True, 1);
           if hh=-1:
             count_arrМОЛ=count_arrМОЛ+1;
             refStrМОЛ=Format("%.10d", count_arrМОЛ);
             pp=InsertInArraySort(arr_КОДМОЛ, КОДМОЛ);
             InsertInArray(arr_REFМОЛ, pp, refStrМОЛ);
           else
             refStrМОЛ=arr_REFМОЛ[hh];
           fi;
           -- МХЭ
           refStrМХЭ="";
           hh=SearchInArray(arr_КОДМХЭ, КОДМХЭ, True, 1);
           if hh=-1:
             count_arrМХЭ=count_arrМХЭ+1;
             refStrМХЭ=Format("%.10d", count_arrМХЭ);
             pp=InsertInArraySort(arr_КОДМХЭ, КОДМХЭ);
             InsertInArray(arr_REFМХЭ, pp, refStrМХЭ);
           else
             refStrМХЭ=arr_REFМХЭ[hh];
           fi;
           -- Дополнительный справочник
           refStrДОП="";
           hh=SearchInArray(arr_КОДДОП, КОДДОП, True, 1);
           if hh=-1:
             count_arrДОП=count_arrДОП+1;
             refStrДОП=Format("%.10d", count_arrДОП);
             pp=InsertInArraySort(arr_КОДДОП, КОДДОП);
             InsertInArray(arr_REFДОП, pp, refStrДОП);
           else
             refStrДОП=arr_REFДОП[hh];
           fi;
           --
           NAMНФА=""; NAMМОЛ=""; NAMМХЭ=""; NAMДОП=""; svrANA="";
           -- *** СТРОКА ОТБОРА ОБЪЕКТОВ УЧЕТА ***
           svrANA=refStrМОЛ+"#"+refStrМХЭ+"#"+refStrДОП+"#"+КОДСЧТ+"#"+refStrНФА+"#"+pfxУЧН+".$$$";
           -- refStrМОЛ#refStrМХЭ#refStrДОП#КОДСЧТ#refStrНФА#КОДУЧН
           hh=SearchInArray(LST_UNIQUE, svrANA, True, 1);
           if hh=-1:
             -- НФА
             NAMНФА=УдалитьРазделитель_дляНашаСорт(Trim(Name_A(КОДНФА)));
             if NAMНФА="": if КОДНФА="НФА.$$$": NAMНФА="> нет кода НФА"; else NAMНФА=КОДНФА; fi; fi;
             -- МОЛ
             NAMМОЛ=УдалитьРазделитель_дляНашаСорт(Trim(Name_A(КОДМОЛ)));
             if NAMМОЛ="": if КОДМОЛ="МОЛ.$$$": NAMМОЛ="> нет кода МОЛ"; else NAMМОЛ=КОДМОЛ; fi; fi;
             -- МХЭ
             NAMМХЭ=УдалитьРазделитель_дляНашаСорт(Trim(Name_A(КОДМХЭ)));
             if NAMМХЭ="": if КОДМХЭ="М.Э.$$$": NAMМХЭ="> нет кода МХЭ"; else NAMМХЭ=КОДМХЭ; fi; fi;
             -- Дополнительный справочник
             NAMДОП=УдалитьРазделитель_дляНашаСорт(Trim(Name_A(КОДДОП)));
             if NAMДОП="":
               if КОДДОП=VOCКОД+".$$$": NAMДОП="> нет кода "+VOCКОД;
               |  КОДДОП="$$$.$$$":     NAMДОП="> нет доп.справочника";
               else NAMДОП=КОДДОП;
               fi;
             fi;
             --
             pp=0;
             if flgМОЛ: Value=NAMМОЛ+Chr(169)+КОДМОЛ; AddInArray(aHdrFldSRT, True, False, Value); fi;
             if flgМХЭ: Value=NAMМХЭ+Chr(169)+КОДМХЭ; AddInArray(aHdrFldSRT, True, False, Value); fi;
             if flgДОП: Value=NAMДОП+Chr(169)+КОДДОП; AddInArray(aHdrFldSRT, True, False, Value); fi;
             --
             Value="";
             if fldСОРТкод="тНФАКОД": Value=КОДНФА;
             |  fldСОРТкод="тНФАИМЯ": Value=NAMНФА;
             |  fldСОРТкод="тНФАИНВ": Value="> не присвоен";
             |  fldСОРТкод="тНФАУЧН": Value="> не присвоен";
             fi;
             if Value<>"": AddInArray(aUsrFldSRT, True, False, Value); fi;
             --
             pp=InsertInArraySort(LST_UNIQUE, svrANA);
             InsertInArray(LST_OSTСУМ, pp, SUM);
             InsertInArray(LST_OSTКОЛ, pp, KOL);
             InsertInArray(LST_DEBСУМ, pp, 0.00);
             InsertInArray(LST_DEBКОЛ, pp, 0.00);
             InsertInArray(LST_DVPСУМ, pp, 0.00);
             InsertInArray(LST_DVPКОЛ, pp, 0.00);
             InsertInArray(LST_KREСУМ, pp, 0.00);
             InsertInArray(LST_KREКОЛ, pp, 0.00);
             InsertInArray(LST_KVPСУМ, pp, 0.00);
             InsertInArray(LST_KVPКОЛ, pp, 0.00);
             InsertInArray(LST_КОДИСТ, pp, КОДИСТ);
             InsertInArray(LST_КОДКБК, pp, КОДКБК);
             InsertInArray(LST_КОДСЧ6, pp, КОДСЧ6);
             InsertInArray(LST_ИМЯНФА, pp, NAMНФА);
             InsertInArray(LST_ИМЯИНВ, pp, "> не присвоен");
             InsertInArray(LST_ИМЯМОЛ, pp, NAMМОЛ);
             InsertInArray(LST_ИМЯМХЭ, pp, NAMМХЭ);
             InsertInArray(LST_ИМЯДОП, pp, NAMДОП);
             InsertInArray(LST_НЕТУЧН, pp, True);
             InsertInArray(LST_ЮЗРСРТ, pp, Value);
           else
             LST_OSTСУМ[hh]=LST_OSTСУМ[hh]+SUM;
             LST_OSTКОЛ[hh]=LST_OSTКОЛ[hh]+KOL;
           fi; -- объект найден
         fi; --Work (проводка отобрана)
       fi; --КОДСЧТ
     end; -- while
   Finally
     CloseTextJur;
     CloseProgress;
   end; -- Try
   Try DeleteFile(ВременныйФайл); Except end;
 fi; -- len>0 (TujReport)
end;

Proc ПоискДанных_ИщемОборот106(vНПОТЧ:Date; vКПОТЧ:Date; vMaskACC:String; vMaskANA:String; vИспНФА:Logical; vИспМОЛ:Logical; vИспМХЭ:Logical; vИспДОП:Logical; vИспАНА:Logical);
var ВременныйФайл, aVal1, aVal2, aDeb, aCre, aComment, svrANA, svrSGN, refStrНФА, refStrМОЛ, refStrМХЭ, refStrДОП, Value :String;
var КОДСЧТ, КОДИСТ, КОДКБК, КОДСЧ6, СЧТDeb, СЧТCre, КОДНФА, КОДМОЛ, КОДМХЭ, КОДДОП, NAMНФА, NAMМОЛ, NAMМХЭ, NAMДОП :String;
var СЧДЕБ, transВНПР, Work, flgДЕБ, flgКРЕ :Logical;
var len, xx, ii, jj, pp, hh, Find_Iter, vAnaNum :Integer;
var aSum1, aSum2, SUM, QUA, KOL :Numeric;
var aDate :Date;
 ClearVariable(aAna);
 vAnaNum=LengthOfArray(Fnd_106V);
 ВременныйФайл=PlanVar('CACHE')+"\"+GetGUID;
 xx=TujRepCrossTurn+TujRepNoNullBal+TujRepCombinedAna;
 len=TujReport(ВременныйФайл, vНПОТЧ, vКПОТЧ, vMaskACC, vMaskANA, ИсключитьСправочники, "", "", xx, False);
 if len>0:
   ShowProgress(len, "Выборка оборотов ЦС...");
   OpenTextJur(ВременныйФайл);
   Try
     ii=1;
     while not GetTransFromTextJur(aDate, aSum1, aVal1, aSum2, aVal2, aDeb, aCre, aAna, aComment) do
       ProgressPos(ii);
       ii=ii+1;
       -- Очистка аналитики
       КОДСЧТ=""; КОДИСТ=""; КОДКБК=""; КОДСЧ6=""; СЧТDeb=""; СЧТCre=""; svrANA=""; svrSGN="";
       SUM=0.00;
       ClearVariable(Fnd_AnaO);
       ClearVariable(Fnd_AnaD);
       ClearVariable(Fnd_AnaK);
       if vAnaNum>0: Fnd_AnaD[vAnaNum]=""; Fnd_AnaK[vAnaNum]=""; Fnd_AnaO[vAnaNum]=""; fi; -- инициализация размерности массивов
       transВНПР=False;
       --
       if Match(aDeb, "*.?.106.??.???"): СЧТDeb=aDeb; fi;
       if Match(aCre, "*.?.106.??.???"): СЧТCre=aCre; fi;
       if СЧТDeb<>"" and СЧТCre ="": КОДСЧТ=СЧТDeb; СЧДЕБ=True;  fi;
       if СЧТDeb ="" and СЧТCre<>"": КОДСЧТ=СЧТCre; СЧДЕБ=False; fi;
       if СЧТDeb<>"" and СЧТCre<>"": if СЧТDeb=СЧТCre: КОДСЧТ=СЧТDeb; СЧДЕБ=True; transВНПР=True; fi; fi;
       --
       if КОДСЧТ<>"":
         if Match(КОДСЧТ, "???.????.???????.???.?.106.??.???"):
            КОДСЧТ=SubStr(КОДСЧТ, 1, 30)+"???";
            КОДИСТ=SubStr(КОДСЧТ, 22, 1);
            КОДКБК=SubStr(КОДСЧТ, 1, 20);
            КОДСЧ6=SubStr(КОДСЧТ, 24, 6);
         else
            КОДСЧТ=""; КОДИСТ=""; КОДКБК=""; КОДСЧ6="";
         fi;
         if КОДСЧТ<>"":
           if (aVal1="" or aVal1="РУБ") and aSum1<>0: SUM=aSum1;
           |  (aVal2="" or aVal2="РУБ") and aSum2<>0: SUM=aSum2;
           else SUM=0.00;
           fi;
           -- *** Отбор аналитики ***
           КОДНФА=""; refStrНФА="";
           KOL=0.00; QUA=0.00;
           xx=LengthOfArray(aAna);
           if xx>0:
             for jj=1 to xx do
               pp=Pos(":", aAna[jj]);
               if pp>0:
                 QUA=StringToNumeric(SubStr(aAna[jj], pp+1, Length(aAna[jj])-pp));
                 svrANA=SubStr(aAna[jj], 1, pp-1);
               else
                 svrANA=aAna[jj];
               fi;
               svrSGN=SubStr(svrANA, 1, 1);
               if svrSGN="+" or svrSGN="-": svrANA=SubStr(svrANA, 2, 255); fi;
               if Match(svrANA, "НФА.*"):
                 КОДНФА=svrANA; KOL=QUA;
               else
                 Value=GetAnaGlossary(svrANA);
                 if Value<>"": Find_Iter=SearchInArray(Fnd_106V, Value, False, 1); else Find_Iter=0; fi;
                 -- если признак проводки из набора справочников для отбора (массив Fnd_106V)
                 if Find_Iter>0:
                   -- Если внутр. преремещение - распределение аналитики на дебетовую и кредитовую,
                   -- а для НЕ внутреннего перемещения аналитика всегда общая
                   -- В массив общей аналитики отбираем признак без разбиения на дебет/кредит
                   -- или отбираем дебетовую/кредитовую часть признака в соответсвии с положением счета НФА
                   if svrSGN="+": if transВНПР: Fnd_AnaD[Find_Iter]=svrANA; else if     СЧДЕБ: Fnd_AnaO[Find_Iter]=svrANA; fi; fi;
                   |  svrSGN="-": if transВНПР: Fnd_AnaK[Find_Iter]=svrANA; else if not СЧДЕБ: Fnd_AnaO[Find_Iter]=svrANA; fi; fi;
                   else           Fnd_AnaO[Find_Iter]=svrANA;
                   fi;
                 fi; -- Find_Iter>0
               fi; -- Match(svrANA, "")
             od; -- цикл по аналитике свертки
           fi; --xx>0
           -- Формирование аналитики (часть 1)
           -- НФА
           if КОДНФА="": КОДНФА="НФА.$$$"; fi;
           -- Формирование ссылок на аналитику (часть 1)
           -- НФА
           hh=SearchInArray(arr_КОДНФА, КОДНФА, True, 1);
           if hh=-1:
             count_arrНФА=count_arrНФА+1;
             refStrНФА=Format("%.10d", count_arrНФА);
             pp=InsertInArraySort(arr_КОДНФА, КОДНФА);
             InsertInArray(arr_REFНФА, pp, refStrНФА);
           else
             refStrНФА=arr_REFНФА[hh];
           fi;
           --
           -- *** АНАЛИЗИРУЕМ НАЙДЕННЫЕ ПРИЗНАКИ ***
           if transВНПР:
             -- если это внутренние перемещения, то проводка свертки возможно разбивается на две - с дебетовой и кредитовой аналитикой
             flgДЕБ=False; flgКРЕ=False;
             if vAnaNum>0:
               for hh=1 to vAnaNum do
                 if Fnd_AnaD[hh]<>"": flgДЕБ=True; fi; -- необходима проводка с дебетовой  аналитикой
                 if Fnd_AnaK[hh]<>"": flgКРЕ=True; fi; -- необходима проводка с кредитовой аналитикой
                 if flgДЕБ and flgКРЕ: Break; fi;
               od;
             fi;
             -- формируем проводку с дебетовой аналитикой
             if flgДЕБ:
               -- Очистка аналитики
               refStrМОЛ=""; КОДМОЛ="";
               refStrМХЭ=""; КОДМХЭ="";
               refStrДОП=""; КОДДОП="";
               ClearVariable(Buf);
               --
               CopyArray(Fnd_AnaD, Buf);      -- бэкапим дебетовую аналитику
               CopyArray(Fnd_AnaO, Fnd_AnaD); -- копируем в Fnd_AnaD общую аналитику, в дальнейшем здесь будет результат
               --
               for hh=1 to vAnaNum do
                 if Buf[hh]<>"": Fnd_AnaD[hh]=Buf[hh]; fi; -- объединяем возможную дебетовую аналитику с общей
                 svrANA=Fnd_AnaD[hh];
                 if отчМОЛ<>"" or flgМОЛ: if Match(svrANA,     "МОЛ.*"): КОДМОЛ=svrANA; fi; fi;
                 if отчМХЭ<>"" or flgМХЭ: if Match(svrANA,       "М.*"): КОДМХЭ=svrANA; fi; fi;
                 if отчДОП<>"" or flgДОП: if Match(svrANA, VOCКОД+".*"): КОДДОП=svrANA; fi; fi;
               od;
               -- Формирование аналитики (часть 2)
               -- МОЛ
               if КОДМОЛ="": КОДМОЛ="МОЛ.$$$"; fi;
               -- МХЭ
               if КОДМХЭ="": КОДМХЭ="М.Э.$$$"; fi;
               -- Дополнительный справочник
               if КОДДОП="": if Name_A(VOCКОД+".")<>" ": КОДДОП=VOCКОД+".$$$"; else КОДДОП="$$$.$$$"; fi; fi;
               --
               --  *** Отбор по условию ***
               Work=True;
               if Work and отчНФА<>"": Work=ПризнакСоотвНабору(КОДНФА, отчНФА); fi;
               if Work and отчМОЛ<>"": Work=ПризнакСоотвНабору(КОДМОЛ, отчМОЛ); fi;
               if Work and отчМХЭ<>"": Work=ПризнакСоотвНабору(КОДМХЭ, отчМХЭ); fi;
               if Work and отчДОП<>"": Work=ПризнакСоотвНабору(КОДДОП, отчДОП); fi;
               if Work and отчАНА<>"": Work=ПроводкаПроходитОтборПоАналитике(xx, отчАНА, True); fi;
               -- *** Проводка отобрана ***
               if Work:
                 -- Формирование ссылок на аналитику (часть 2)
                 -- МОЛ
                 hh=SearchInArray(arr_КОДМОЛ, КОДМОЛ, True, 1);
                 if hh=-1:
                   count_arrМОЛ=count_arrМОЛ+1;
                   refStrМОЛ=Format("%.10d", count_arrМОЛ);
                   pp=InsertInArraySort(arr_КОДМОЛ, КОДМОЛ);
                   InsertInArray(arr_REFМОЛ, pp, refStrМОЛ);
                 else
                   refStrМОЛ=arr_REFМОЛ[hh];
                 fi;
                 -- МХЭ
                 hh=SearchInArray(arr_КОДМХЭ, КОДМХЭ, True, 1);
                 if hh=-1:
                   count_arrМХЭ=count_arrМХЭ+1;
                   refStrМХЭ=Format("%.10d", count_arrМХЭ);
                   pp=InsertInArraySort(arr_КОДМХЭ, КОДМХЭ);
                   InsertInArray(arr_REFМХЭ, pp, refStrМХЭ);
                 else
                   refStrМХЭ=arr_REFМХЭ[hh];
                 fi;
                 -- Дополнительный справочник
                 hh=SearchInArray(arr_КОДДОП, КОДДОП, True, 1);
                 if hh=-1:
                   count_arrДОП=count_arrДОП+1;
                   refStrДОП=Format("%.10d", count_arrДОП);
                   pp=InsertInArraySort(arr_КОДДОП, КОДДОП);
                   InsertInArray(arr_REFДОП, pp, refStrДОП);
                 else
                   refStrДОП=arr_REFДОП[hh];
                 fi;
                 --
                 NAMНФА=""; NAMМОЛ=""; NAMМХЭ=""; NAMДОП=""; svrANA="";
                 -- *** СТРОКА ОТБОРА ОБЪЕКТОВ УЧЕТА ***
                 svrANA=refStrМОЛ+"#"+refStrМХЭ+"#"+refStrДОП+"#"+КОДСЧТ+"#"+refStrНФА+"#"+pfxУЧН+".$$$";
                 -- refStrМОЛ#refStrМХЭ#refStrДОП#КОДСЧТ#refStrНФА#КОДУЧН
                 hh=SearchInArray(LST_UNIQUE, svrANA, True, 1);
                 if hh=-1:
                   -- Наименования признаков для правильной сортировки
                   -- НФА
                   NAMНФА=УдалитьРазделитель_дляНашаСорт(Trim(Name_A(КОДНФА)));
                   if NAMНФА="": if КОДНФА="НФА.$$$": NAMНФА="> нет кода НФА"; else NAMНФА=КОДНФА; fi; fi;
                   -- МОЛ
                   NAMМОЛ=УдалитьРазделитель_дляНашаСорт(Trim(Name_A(КОДМОЛ)));
                   if NAMМОЛ="": if КОДМОЛ="МОЛ.$$$": NAMМОЛ="> нет кода МОЛ"; else NAMМОЛ=КОДМОЛ; fi; fi;
                   -- МХЭ
                   NAMМХЭ=УдалитьРазделитель_дляНашаСорт(Trim(Name_A(КОДМХЭ)));
                   if NAMМХЭ="": if КОДМХЭ="М.Э.$$$": NAMМХЭ="> нет кода МХЭ"; else NAMМХЭ=КОДМХЭ; fi; fi;
                   -- Дополнительный справочник
                   NAMДОП=УдалитьРазделитель_дляНашаСорт(Trim(Name_A(КОДДОП)));
                   if NAMДОП="":
                     if КОДДОП=VOCКОД+".$$$": NAMДОП="> нет кода "+VOCКОД;
                     |  КОДДОП="$$$.$$$":     NAMДОП="> нет доп.справочника";
                     else NAMДОП=КОДДОП;
                     fi;
                   fi;
                   --
                   pp=0;
                   if flgМОЛ: Value=NAMМОЛ+Chr(169)+КОДМОЛ; AddInArray(aHdrFldSRT, True, False, Value); fi;
                   if flgМХЭ: Value=NAMМХЭ+Chr(169)+КОДМХЭ; AddInArray(aHdrFldSRT, True, False, Value); fi;
                   if flgДОП: Value=NAMДОП+Chr(169)+КОДДОП; AddInArray(aHdrFldSRT, True, False, Value); fi;
                   --
                   Value="";
                   if fldСОРТкод="тНФАКОД": Value=КОДНФА;
                   |  fldСОРТкод="тНФАИМЯ": Value=NAMНФА;
                   |  fldСОРТкод="тНФАИНВ": Value="> не присвоен";
                   |  fldСОРТкод="тНФАУЧН": Value="> не присвоен";
                   fi;
                   if Value<>"": AddInArray(aUsrFldSRT, True, False, Value); fi;
                   --
                   pp=InsertInArraySort(LST_UNIQUE, svrANA);
                   InsertInArray(LST_OSTСУМ, pp, 0.00);
                   InsertInArray(LST_OSTКОЛ, pp, 0.00);
                   InsertInArray(LST_DEBСУМ, pp, 0.00);
                   InsertInArray(LST_DEBКОЛ, pp, 0.00);
                   InsertInArray(LST_DVPСУМ, pp,  SUM);
                   InsertInArray(LST_DVPКОЛ, pp,  KOL);
                   InsertInArray(LST_KREСУМ, pp, 0.00);
                   InsertInArray(LST_KREКОЛ, pp, 0.00);
                   InsertInArray(LST_KVPСУМ, pp, 0.00);
                   InsertInArray(LST_KVPКОЛ, pp, 0.00);
                   InsertInArray(LST_КОДИСТ, pp, КОДИСТ);
                   InsertInArray(LST_КОДКБК, pp, КОДКБК);
                   InsertInArray(LST_КОДСЧ6, pp, КОДСЧ6);
                   InsertInArray(LST_ИМЯНФА, pp, NAMНФА);
                   InsertInArray(LST_ИМЯИНВ, pp, "> не присвоен");
                   InsertInArray(LST_ИМЯМОЛ, pp, NAMМОЛ);
                   InsertInArray(LST_ИМЯМХЭ, pp, NAMМХЭ);
                   InsertInArray(LST_ИМЯДОП, pp, NAMДОП);
                   InsertInArray(LST_НЕТУЧН, pp, True);
                   InsertInArray(LST_ЮЗРСРТ, pp, Value);
                 else
                   LST_DVPСУМ[hh]=LST_DVPСУМ[hh]+SUM;
                   LST_DVPКОЛ[hh]=LST_DVPКОЛ[hh]+KOL;
                 fi; -- объект найден
               fi; -- Проводка отобрана
             fi; -- формируем проводку с дебетовой аналитикой
             -- формируем проводку с кредитовой аналитикой
             if flgКРЕ:
               -- Очистка аналитики
               refStrМОЛ=""; КОДМОЛ="";
               refStrМХЭ=""; КОДМХЭ="";
               refStrДОП=""; КОДДОП="";
               ClearVariable(Buf);
               --
               CopyArray(Fnd_AnaK, Buf);      -- бэкапим кредитовую аналитику
               CopyArray(Fnd_AnaO, Fnd_AnaK); -- копируем в Fnd_AnaK общую аналитику, в дальнейшем здесь будет результат
               --
               for hh=1 to vAnaNum do
                 if Buf[hh]<>"": Fnd_AnaK[hh]=Buf[hh]; fi; -- объединяем возможную дебетовую аналитику с общей
                 svrANA=Fnd_AnaK[hh];
                 if отчМОЛ<>"" or flgМОЛ: if Match(svrANA,     "МОЛ.*"): КОДМОЛ=svrANA; fi; fi;
                 if отчМХЭ<>"" or flgМХЭ: if Match(svrANA,       "М.*"): КОДМХЭ=svrANA; fi; fi;
                 if отчДОП<>"" or flgДОП: if Match(svrANA, VOCКОД+".*"): КОДДОП=svrANA; fi; fi;
               od;
               -- Формирование аналитики (часть 2)
               -- МОЛ
               if КОДМОЛ="": КОДМОЛ="МОЛ.$$$"; fi;
               -- МХЭ
               if КОДМХЭ="": КОДМХЭ="М.Э.$$$"; fi;
               -- Дополнительный справочник
               if КОДДОП="": if Name_A(VOCКОД+".")<>" ": КОДДОП=VOCКОД+".$$$"; else КОДДОП="$$$.$$$"; fi; fi;
               --
               --  *** Отбор по условию ***
               Work=True;
               if Work and отчНФА<>"": Work=ПризнакСоотвНабору(КОДНФА, отчНФА); fi;
               if Work and отчМОЛ<>"": Work=ПризнакСоотвНабору(КОДМОЛ, отчМОЛ); fi;
               if Work and отчМХЭ<>"": Work=ПризнакСоотвНабору(КОДМХЭ, отчМХЭ); fi;
               if Work and отчДОП<>"": Work=ПризнакСоотвНабору(КОДДОП, отчДОП); fi;
               if Work and отчАНА<>"": Work=ПроводкаПроходитОтборПоАналитике(xx, отчАНА, True); fi;
               -- *** Проводка отобрана ***
               if Work:
                 -- Формирование ссылок на аналитику (часть 2)
                 -- МОЛ
                 hh=SearchInArray(arr_КОДМОЛ, КОДМОЛ, True, 1);
                 if hh=-1:
                   count_arrМОЛ=count_arrМОЛ+1;
                   refStrМОЛ=Format("%.10d", count_arrМОЛ);
                   pp=InsertInArraySort(arr_КОДМОЛ, КОДМОЛ);
                   InsertInArray(arr_REFМОЛ, pp, refStrМОЛ);
                 else
                   refStrМОЛ=arr_REFМОЛ[hh];
                 fi;
                 -- МХЭ
                 hh=SearchInArray(arr_КОДМХЭ, КОДМХЭ, True, 1);
                 if hh=-1:
                   count_arrМХЭ=count_arrМХЭ+1;
                   refStrМХЭ=Format("%.10d", count_arrМХЭ);
                   pp=InsertInArraySort(arr_КОДМХЭ, КОДМХЭ);
                   InsertInArray(arr_REFМХЭ, pp, refStrМХЭ);
                 else
                   refStrМХЭ=arr_REFМХЭ[hh];
                 fi;
                 -- Дополнительный справочник
                 hh=SearchInArray(arr_КОДДОП, КОДДОП, True, 1);
                 if hh=-1:
                   count_arrДОП=count_arrДОП+1;
                   refStrДОП=Format("%.10d", count_arrДОП);
                   pp=InsertInArraySort(arr_КОДДОП, КОДДОП);
                   InsertInArray(arr_REFДОП, pp, refStrДОП);
                 else
                   refStrДОП=arr_REFДОП[hh];
                 fi;
                 --
                 NAMНФА=""; NAMМОЛ=""; NAMМХЭ=""; NAMДОП=""; svrANA="";
                 -- *** СТРОКА ОТБОРА ОБЪЕКТОВ УЧЕТА ***
                 svrANA=refStrМОЛ+"#"+refStrМХЭ+"#"+refStrДОП+"#"+КОДСЧТ+"#"+refStrНФА+"#"+pfxУЧН+".$$$";
                 -- refStrМОЛ#refStrМХЭ#refStrДОП#КОДСЧТ#refStrНФА#КОДУЧН
                 hh=SearchInArray(LST_UNIQUE, svrANA, True, 1);
                 if hh=-1:
                   -- Наименования признаков для правильной сортировки
                   -- НФА
                   NAMНФА=УдалитьРазделитель_дляНашаСорт(Trim(Name_A(КОДНФА)));
                   if NAMНФА="": if КОДНФА="НФА.$$$": NAMНФА="> нет кода НФА"; else NAMНФА=КОДНФА; fi; fi;
                   -- МОЛ
                   NAMМОЛ=УдалитьРазделитель_дляНашаСорт(Trim(Name_A(КОДМОЛ)));
                   if NAMМОЛ="": if КОДМОЛ="МОЛ.$$$": NAMМОЛ="> нет кода МОЛ"; else NAMМОЛ=КОДМОЛ; fi; fi;
                   -- МХЭ
                   NAMМХЭ=УдалитьРазделитель_дляНашаСорт(Trim(Name_A(КОДМХЭ)));
                   if NAMМХЭ="": if КОДМХЭ="М.Э.$$$": NAMМХЭ="> нет кода МХЭ"; else NAMМХЭ=КОДМХЭ; fi; fi;
                   -- Дополнительный справочник
                   NAMДОП=УдалитьРазделитель_дляНашаСорт(Trim(Name_A(КОДДОП)));
                   if NAMДОП="":
                     if КОДДОП=VOCКОД+".$$$": NAMДОП="> нет кода "+VOCКОД;
                     |  КОДДОП="$$$.$$$":     NAMДОП="> нет доп.справочника";
                     else NAMДОП=КОДДОП;
                     fi;
                   fi;
                   --
                   pp=0;
                   if flgМОЛ: Value=NAMМОЛ+Chr(169)+КОДМОЛ; AddInArray(aHdrFldSRT, True, False, Value); fi;
                   if flgМХЭ: Value=NAMМХЭ+Chr(169)+КОДМХЭ; AddInArray(aHdrFldSRT, True, False, Value); fi;
                   if flgДОП: Value=NAMДОП+Chr(169)+КОДДОП; AddInArray(aHdrFldSRT, True, False, Value); fi;
                   --
                   Value="";
                   if fldСОРТкод="тНФАКОД": Value=КОДНФА;
                   |  fldСОРТкод="тНФАИМЯ": Value=NAMНФА;
                   |  fldСОРТкод="тНФАИНВ": Value="> не присвоен";
                   |  fldСОРТкод="тНФАУЧН": Value="> не присвоен";
                   fi;
                   if Value<>"": AddInArray(aUsrFldSRT, True, False, Value); fi;
                   --
                   pp=InsertInArraySort(LST_UNIQUE, svrANA);
                   InsertInArray(LST_OSTСУМ, pp, 0.00);
                   InsertInArray(LST_OSTКОЛ, pp, 0.00);
                   InsertInArray(LST_DEBСУМ, pp, 0.00);
                   InsertInArray(LST_DEBКОЛ, pp, 0.00);
                   InsertInArray(LST_DVPСУМ, pp, 0.00);
                   InsertInArray(LST_DVPКОЛ, pp, 0.00);
                   InsertInArray(LST_KREСУМ, pp, 0.00);
                   InsertInArray(LST_KREКОЛ, pp, 0.00);
                   InsertInArray(LST_KVPСУМ, pp,  SUM);
                   InsertInArray(LST_KVPКОЛ, pp,  KOL);
                   InsertInArray(LST_КОДИСТ, pp, КОДИСТ);
                   InsertInArray(LST_КОДКБК, pp, КОДКБК);
                   InsertInArray(LST_КОДСЧ6, pp, КОДСЧ6);
                   InsertInArray(LST_ИМЯНФА, pp, NAMНФА);
                   InsertInArray(LST_ИМЯИНВ, pp, "> не присвоен");
                   InsertInArray(LST_ИМЯМОЛ, pp, NAMМОЛ);
                   InsertInArray(LST_ИМЯМХЭ, pp, NAMМХЭ);
                   InsertInArray(LST_ИМЯДОП, pp, NAMДОП);
                   InsertInArray(LST_НЕТУЧН, pp, True);
                   InsertInArray(LST_ЮЗРСРТ, pp, Value);
                 else
                   LST_KVPСУМ[hh]=LST_KVPСУМ[hh]+SUM;
                   LST_KVPКОЛ[hh]=LST_KVPКОЛ[hh]+KOL;
                 fi; -- объект найден
               fi; -- Проводка отобрана
             fi; -- формируем проводку с кредитовой аналитикой
             -- формируем проводку с общей аналитикой (разделения на дебетовую и кредитовую аналитику НЕ было)
             if not flgДЕБ and not flgКРЕ:
               -- Очистка аналитики
               refStrМОЛ=""; КОДМОЛ="";
               refStrМХЭ=""; КОДМХЭ="";
               refStrДОП=""; КОДДОП="";
               --
               for hh=1 to vAnaNum do
                 svrANA=Fnd_AnaO[hh];
                 if отчМОЛ<>"" or flgМОЛ: if Match(svrANA,     "МОЛ.*"): КОДМОЛ=svrANA; fi; fi;
                 if отчМХЭ<>"" or flgМХЭ: if Match(svrANA,       "М.*"): КОДМХЭ=svrANA; fi; fi;
                 if отчДОП<>"" or flgДОП: if Match(svrANA, VOCКОД+".*"): КОДДОП=svrANA; fi; fi;
               od;
               -- Формирование аналитики (часть 2)
               -- МОЛ
               if КОДМОЛ="": КОДМОЛ="МОЛ.$$$"; fi;
               -- МХЭ
               if КОДМХЭ="": КОДМХЭ="М.Э.$$$"; fi;
               -- Дополнительный справочник
               if КОДДОП="": if Name_A(VOCКОД+".")<>" ": КОДДОП=VOCКОД+".$$$"; else КОДДОП="$$$.$$$"; fi; fi;
               --
               --  *** Отбор по условию ***
               Work=True;
               if Work and vИспНФА: Work=ПризнакСоотвНабору(КОДНФА, отчНФА); fi;
               if Work and vИспМОЛ: Work=ПризнакСоотвНабору(КОДМОЛ, отчМОЛ); fi;
               if Work and vИспМХЭ: Work=ПризнакСоотвНабору(КОДМХЭ, отчМХЭ); fi;
               if Work and vИспДОП: Work=ПризнакСоотвНабору(КОДДОП, отчДОП); fi;
               if Work and vИспАНА: Work=ПроводкаПроходитОтборПоАналитике(xx, отчАНА, True); fi;
               -- *** Проводка отобрана ***
               if Work:
                 -- Формирование ссылок на аналитику (часть 2)
                 -- МОЛ
                 hh=SearchInArray(arr_КОДМОЛ, КОДМОЛ, True, 1);
                 if hh=-1:
                   count_arrМОЛ=count_arrМОЛ+1;
                   refStrМОЛ=Format("%.10d", count_arrМОЛ);
                   pp=InsertInArraySort(arr_КОДМОЛ, КОДМОЛ);
                   InsertInArray(arr_REFМОЛ, pp, refStrМОЛ);
                 else
                   refStrМОЛ=arr_REFМОЛ[hh];
                 fi;
                 -- МХЭ
                 hh=SearchInArray(arr_КОДМХЭ, КОДМХЭ, True, 1);
                 if hh=-1:
                   count_arrМХЭ=count_arrМХЭ+1;
                   refStrМХЭ=Format("%.10d", count_arrМХЭ);
                   pp=InsertInArraySort(arr_КОДМХЭ, КОДМХЭ);
                   InsertInArray(arr_REFМХЭ, pp, refStrМХЭ);
                 else
                   refStrМХЭ=arr_REFМХЭ[hh];
                 fi;
                 -- Дополнительный справочник
                 hh=SearchInArray(arr_КОДДОП, КОДДОП, True, 1);
                 if hh=-1:
                   count_arrДОП=count_arrДОП+1;
                   refStrДОП=Format("%.10d", count_arrДОП);
                   pp=InsertInArraySort(arr_КОДДОП, КОДДОП);
                   InsertInArray(arr_REFДОП, pp, refStrДОП);
                 else
                   refStrДОП=arr_REFДОП[hh];
                 fi;
                 --
                 NAMНФА=""; NAMМОЛ=""; NAMМХЭ=""; NAMДОП=""; svrANA="";
                 -- *** СТРОКА ОТБОРА ОБЪЕКТОВ УЧЕТА ***
                 svrANA=refStrМОЛ+"#"+refStrМХЭ+"#"+refStrДОП+"#"+КОДСЧТ+"#"+refStrНФА+"#"+pfxУЧН+".$$$";
                 -- refStrМОЛ#refStrМХЭ#refStrДОП#КОДСЧТ#refStrНФА#КОДУЧН
                 hh=SearchInArray(LST_UNIQUE, svrANA, True, 1);
                 if hh=-1:
                   -- Наименования признаков для правильной сортировки
                   -- НФА
                   NAMНФА=УдалитьРазделитель_дляНашаСорт(Trim(Name_A(КОДНФА)));
                   if NAMНФА="": if КОДНФА="НФА.$$$": NAMНФА="> нет кода НФА"; else NAMНФА=КОДНФА; fi; fi;
                   -- МОЛ
                   NAMМОЛ=УдалитьРазделитель_дляНашаСорт(Trim(Name_A(КОДМОЛ)));
                   if NAMМОЛ="": if КОДМОЛ="МОЛ.$$$": NAMМОЛ="> нет кода МОЛ"; else NAMМОЛ=КОДМОЛ; fi; fi;
                   -- МХЭ
                   NAMМХЭ=УдалитьРазделитель_дляНашаСорт(Trim(Name_A(КОДМХЭ)));
                   if NAMМХЭ="": if КОДМХЭ="М.Э.$$$": NAMМХЭ="> нет кода МХЭ"; else NAMМХЭ=КОДМХЭ; fi; fi;
                   -- Дополнительный справочник
                   NAMДОП=УдалитьРазделитель_дляНашаСорт(Trim(Name_A(КОДДОП)));
                   if NAMДОП="":
                     if КОДДОП=VOCКОД+".$$$": NAMДОП="> нет кода "+VOCКОД;
                     |  КОДДОП="$$$.$$$":     NAMДОП="> нет доп.справочника";
                     else NAMДОП=КОДДОП;
                     fi;
                   fi;
                   --
                   pp=0;
                   if flgМОЛ: Value=NAMМОЛ+Chr(169)+КОДМОЛ; AddInArray(aHdrFldSRT, True, False, Value); fi;
                   if flgМХЭ: Value=NAMМХЭ+Chr(169)+КОДМХЭ; AddInArray(aHdrFldSRT, True, False, Value); fi;
                   if flgДОП: Value=NAMДОП+Chr(169)+КОДДОП; AddInArray(aHdrFldSRT, True, False, Value); fi;
                   --
                   Value="";
                   if fldСОРТкод="тНФАКОД": Value=КОДНФА;
                   |  fldСОРТкод="тНФАИМЯ": Value=NAMНФА;
                   |  fldСОРТкод="тНФАИНВ": Value="> не присвоен";
                   |  fldСОРТкод="тНФАУЧН": Value="> не присвоен";
                   fi;
                   if Value<>"": AddInArray(aUsrFldSRT, True, False, Value); fi;
                   --
                   pp=InsertInArraySort(LST_UNIQUE, svrANA);
                   InsertInArray(LST_OSTСУМ, pp, 0.00);
                   InsertInArray(LST_OSTКОЛ, pp, 0.00);
                   InsertInArray(LST_DEBСУМ, pp, 0.00);
                   InsertInArray(LST_DEBКОЛ, pp, 0.00);
                   InsertInArray(LST_DVPСУМ, pp,  SUM);
                   InsertInArray(LST_DVPКОЛ, pp,  KOL);
                   InsertInArray(LST_KREСУМ, pp, 0.00);
                   InsertInArray(LST_KREКОЛ, pp, 0.00);
                   InsertInArray(LST_KVPСУМ, pp,  SUM);
                   InsertInArray(LST_KVPКОЛ, pp,  KOL);
                   InsertInArray(LST_КОДИСТ, pp, КОДИСТ);
                   InsertInArray(LST_КОДКБК, pp, КОДКБК);
                   InsertInArray(LST_КОДСЧ6, pp, КОДСЧ6);
                   InsertInArray(LST_ИМЯНФА, pp, NAMНФА);
                   InsertInArray(LST_ИМЯИНВ, pp, "> не присвоен");
                   InsertInArray(LST_ИМЯМОЛ, pp, NAMМОЛ);
                   InsertInArray(LST_ИМЯМХЭ, pp, NAMМХЭ);
                   InsertInArray(LST_ИМЯДОП, pp, NAMДОП);
                   InsertInArray(LST_НЕТУЧН, pp, True);
                   InsertInArray(LST_ЮЗРСРТ, pp, Value);
                 else
                   LST_DVPСУМ[hh]=LST_DVPСУМ[hh]+SUM;
                   LST_DVPКОЛ[hh]=LST_DVPКОЛ[hh]+KOL;
                   LST_KVPСУМ[hh]=LST_KVPСУМ[hh]+SUM;
                   LST_KVPКОЛ[hh]=LST_KVPКОЛ[hh]+KOL;
                 fi; -- объект найден
               fi; -- Проводка отобрана
             fi; -- формируем проводку с общей аналитикой (разделения на дебетовую и кредитовую аналитику НЕ было)
           else -- transВНПР<>True
             -- если это НЕ внутренние перемещения, то аналитику проводки свертки берем общую
             -- Очистка аналитики
             refStrМОЛ=""; КОДМОЛ="";
             refStrМХЭ=""; КОДМХЭ="";
             refStrДОП=""; КОДДОП="";
             ClearVariable(Buf);
             --
             for hh=1 to vAnaNum do
               svrANA=Fnd_AnaO[hh];
               if отчМОЛ<>"" or flgМОЛ: if Match(svrANA,     "МОЛ.*"): КОДМОЛ=svrANA; fi; fi;
               if отчМХЭ<>"" or flgМХЭ: if Match(svrANA,       "М.*"): КОДМХЭ=svrANA; fi; fi;
               if отчДОП<>"" or flgДОП: if Match(svrANA, VOCКОД+".*"): КОДДОП=svrANA; fi; fi;
--               if vИспМОЛ or flgМОЛ: if Match(svrANA,     "МОЛ.*"): КОДМОЛ=svrANA; fi; fi;
--               if vИспМХЭ or flgМХЭ: if Match(svrANA,       "М.*"): КОДМХЭ=svrANA; fi; fi;
--               if vИспДОП or flgДОП: if Match(svrANA, VOCКОД+".*"): КОДДОП=svrANA; fi; fi;
             od;
             -- Формирование аналитики (часть 2)
             -- МОЛ
             if КОДМОЛ="": КОДМОЛ="МОЛ.$$$"; fi;
             -- МХЭ
             if КОДМХЭ="": КОДМХЭ="М.Э.$$$"; fi;
             -- Дополнительный справочник
             if КОДДОП="": if Name_A(VOCКОД+".")<>" ": КОДДОП=VOCКОД+".$$$"; else КОДДОП="$$$.$$$"; fi; fi;
             --
             --  *** Отбор по условию ***
             Work=True;
             if Work and vИспНФА: Work=ПризнакСоотвНабору(КОДНФА, отчНФА); fi;
             if Work and vИспМОЛ: Work=ПризнакСоотвНабору(КОДМОЛ, отчМОЛ); fi;
             if Work and vИспМХЭ: Work=ПризнакСоотвНабору(КОДМХЭ, отчМХЭ); fi;
             if Work and vИспДОП: Work=ПризнакСоотвНабору(КОДДОП, отчДОП); fi;
             if Work and vИспАНА: Work=ПроводкаПроходитОтборПоАналитике(xx, отчАНА, True); fi;
             -- *** Проводка отобрана ***
             if Work:
               -- Формирование ссылок на аналитику (часть 2)
               -- МОЛ
               hh=SearchInArray(arr_КОДМОЛ, КОДМОЛ, True, 1);
               if hh=-1:
                 count_arrМОЛ=count_arrМОЛ+1;
                 refStrМОЛ=Format("%.10d", count_arrМОЛ);
                 pp=InsertInArraySort(arr_КОДМОЛ, КОДМОЛ);
                 InsertInArray(arr_REFМОЛ, pp, refStrМОЛ);
               else
                 refStrМОЛ=arr_REFМОЛ[hh];
               fi;
               -- МХЭ
               hh=SearchInArray(arr_КОДМХЭ, КОДМХЭ, True, 1);
               if hh=-1:
                 count_arrМХЭ=count_arrМХЭ+1;
                 refStrМХЭ=Format("%.10d", count_arrМХЭ);
                 pp=InsertInArraySort(arr_КОДМХЭ, КОДМХЭ);
                 InsertInArray(arr_REFМХЭ, pp, refStrМХЭ);
               else
                 refStrМХЭ=arr_REFМХЭ[hh];
               fi;
               -- Дополнительный справочник
               hh=SearchInArray(arr_КОДДОП, КОДДОП, True, 1);
               if hh=-1:
                 count_arrДОП=count_arrДОП+1;
                 refStrДОП=Format("%.10d", count_arrДОП);
                 pp=InsertInArraySort(arr_КОДДОП, КОДДОП);
                 InsertInArray(arr_REFДОП, pp, refStrДОП);
               else
                 refStrДОП=arr_REFДОП[hh];
               fi;
               --
               NAMНФА=""; NAMМОЛ=""; NAMМХЭ=""; NAMДОП=""; svrANA="";
               -- *** СТРОКА ОТБОРА ОБЪЕКТОВ УЧЕТА ***
               svrANA=refStrМОЛ+"#"+refStrМХЭ+"#"+refStrДОП+"#"+КОДСЧТ+"#"+refStrНФА+"#"+pfxУЧН+".$$$";
               -- refStrМОЛ#refStrМХЭ#refStrДОП#КОДСЧТ#refStrНФА#КОДУЧН
               hh=SearchInArray(LST_UNIQUE, svrANA, True, 1);
               if hh=-1:
                 -- Наименования признаков для правильной сортировки
                 -- НФА
                 NAMНФА=УдалитьРазделитель_дляНашаСорт(Trim(Name_A(КОДНФА)));
                 if NAMНФА="": if КОДНФА="НФА.$$$": NAMНФА="> нет кода НФА"; else NAMНФА=КОДНФА; fi; fi;
                 -- МОЛ
                 NAMМОЛ=УдалитьРазделитель_дляНашаСорт(Trim(Name_A(КОДМОЛ)));
                 if NAMМОЛ="": if КОДМОЛ="МОЛ.$$$": NAMМОЛ="> нет кода МОЛ"; else NAMМОЛ=КОДМОЛ; fi; fi;
                 -- МХЭ
                 NAMМХЭ=УдалитьРазделитель_дляНашаСорт(Trim(Name_A(КОДМХЭ)));
                 if NAMМХЭ="": if КОДМХЭ="М.Э.$$$": NAMМХЭ="> нет кода МХЭ"; else NAMМХЭ=КОДМХЭ; fi; fi;
                 -- Дополнительный справочник
                 NAMДОП=УдалитьРазделитель_дляНашаСорт(Trim(Name_A(КОДДОП)));
                 if NAMДОП="":
                   if КОДДОП=VOCКОД+".$$$": NAMДОП="> нет кода "+VOCКОД;
                   |  КОДДОП="$$$.$$$":     NAMДОП="> нет доп.справочника";
                   else NAMДОП=КОДДОП;
                   fi;
                 fi;
                 --
                 pp=0;
                 if flgМОЛ: Value=NAMМОЛ+Chr(169)+КОДМОЛ; AddInArray(aHdrFldSRT, True, False, Value); fi;
                 if flgМХЭ: Value=NAMМХЭ+Chr(169)+КОДМХЭ; AddInArray(aHdrFldSRT, True, False, Value); fi;
                 if flgДОП: Value=NAMДОП+Chr(169)+КОДДОП; AddInArray(aHdrFldSRT, True, False, Value); fi;
                 --
                 Value="";
                 if fldСОРТкод="тНФАКОД": Value=КОДНФА;
                 |  fldСОРТкод="тНФАИМЯ": Value=NAMНФА;
                 |  fldСОРТкод="тНФАИНВ": Value="> не присвоен";
                 |  fldСОРТкод="тНФАУЧН": Value="> не присвоен";
                 fi;
                 if Value<>"": AddInArray(aUsrFldSRT, True, False, Value); fi;
                 --
                 pp=InsertInArraySort(LST_UNIQUE, svrANA);
                 InsertInArray(LST_OSTСУМ, pp, 0.00);
                 InsertInArray(LST_OSTКОЛ, pp, 0.00);
                 InsertInArray(LST_DEBСУМ, pp, if(СЧДЕБ, SUM, 0.00));
                 InsertInArray(LST_DEBКОЛ, pp, if(СЧДЕБ, KOL, 0.00));
                 InsertInArray(LST_DVPСУМ, pp, 0.00);
                 InsertInArray(LST_DVPКОЛ, pp, 0.00);
                 InsertInArray(LST_KREСУМ, pp, if(СЧДЕБ, 0.00, SUM));
                 InsertInArray(LST_KREКОЛ, pp, if(СЧДЕБ, 0.00, KOL));
                 InsertInArray(LST_KVPСУМ, pp, 0.00);
                 InsertInArray(LST_KVPКОЛ, pp, 0.00);
                 InsertInArray(LST_КОДИСТ, pp, КОДИСТ);
                 InsertInArray(LST_КОДКБК, pp, КОДКБК);
                 InsertInArray(LST_КОДСЧ6, pp, КОДСЧ6);
                 InsertInArray(LST_ИМЯНФА, pp, NAMНФА);
                 InsertInArray(LST_ИМЯИНВ, pp, "> не присвоен");
                 InsertInArray(LST_ИМЯМОЛ, pp, NAMМОЛ);
                 InsertInArray(LST_ИМЯМХЭ, pp, NAMМХЭ);
                 InsertInArray(LST_ИМЯДОП, pp, NAMДОП);
                 InsertInArray(LST_НЕТУЧН, pp, True);
                 InsertInArray(LST_ЮЗРСРТ, pp, Value);
               else
                 if СЧДЕБ:
                   LST_DEBСУМ[hh]=LST_DEBСУМ[hh]+SUM;
                   LST_DEBКОЛ[hh]=LST_DEBКОЛ[hh]+KOL;
                 else
                   LST_KREСУМ[hh]=LST_KREСУМ[hh]+SUM;
                   LST_KREКОЛ[hh]=LST_KREКОЛ[hh]+KOL;
                 fi;
               fi; -- объект найден
             fi; -- Проводка отобрана
           fi; -- transВНПР=True (Анализируем найденные признаки)
         fi; -- КОДСЧТ<>""
       fi; -- КОДСЧТ<>"" (анализ внутр.перемещений)
     end; -- while
   Finally
     CloseTextJur;
     CloseProgress;
   end; -- Try
   Try DeleteFile(ВременныйФайл); Except end;
 fi; -- len>0 (TujReport)
end;

Func НФАпоТипам_ЦенаПодходит(vvНФААМТ:Logical; vvНФА100:Logical; vvНФАБЕЗ:Logical; vvЦена:Numeric; cnstVНФА100П:Numeric; cnstVНФА_ИНВ:Numeric; ОборотНФА:Logical) :Logical;
 if ОборотНФА and vvЦена=0.00: ^True; fi; --??? возможная модернизация ОС
 if     vvНФААМТ and     vvНФА100 and     vvНФАБЕЗ: ^True;
 |  not vvНФААМТ and     vvНФА100 and     vvНФАБЕЗ: if                        (vvЦена>cnstVНФА_ИНВ and vvЦена<=cnstVНФА100П) or vvЦена<=cnstVНФА_ИНВ: ^True; fi;
 |      vvНФААМТ and not vvНФА100 and     vvНФАБЕЗ: if vvЦена>cnstVНФА100П or                                                   vvЦена<=cnstVНФА_ИНВ: ^True; fi;
 |      vvНФААМТ and     vvНФА100 and not vvНФАБЕЗ: if vvЦена>cnstVНФА100П or (vvЦена>cnstVНФА_ИНВ and vvЦена<=cnstVНФА100П)                        : ^True; fi;
 |  not vvНФААМТ and not vvНФА100 and     vvНФАБЕЗ: if                                                                          vvЦена<=cnstVНФА_ИНВ: ^True; fi;
 |  not vvНФААМТ and     vvНФА100 and not vvНФАБЕЗ: if                        (vvЦена>cnstVНФА_ИНВ and vvЦена<=cnstVНФА100П)                        : ^True; fi;
 |      vvНФААМТ and not vvНФА100 and not vvНФАБЕЗ: if vvЦена>cnstVНФА100П                                                                          : ^True; fi;
 fi;
 ^False;
end;

Func НФАпоТипам_ЦенаПодходит2(vvНФААМТ:Logical; vvНФА100:Logical; vvНФАБЕЗ:Logical; vvЦена:Numeric; cnstVНФА100П:Numeric; cnstVНФА_ИНВ:Numeric) :Logical;
 if vvЦена<>0.00:
   if     vvНФААМТ and     vvНФА100 and     vvНФАБЕЗ: ^True;
   |  not vvНФААМТ and     vvНФА100 and     vvНФАБЕЗ: if                        (vvЦена>cnstVНФА_ИНВ and vvЦена<=cnstVНФА100П) or vvЦена<=cnstVНФА_ИНВ: ^True; fi;
   |      vvНФААМТ and not vvНФА100 and     vvНФАБЕЗ: if vvЦена>cnstVНФА100П or                                                   vvЦена<=cnstVНФА_ИНВ: ^True; fi;
   |      vvНФААМТ and     vvНФА100 and not vvНФАБЕЗ: if vvЦена>cnstVНФА100П or (vvЦена>cnstVНФА_ИНВ and vvЦена<=cnstVНФА100П)                        : ^True; fi;
   |  not vvНФААМТ and not vvНФА100 and     vvНФАБЕЗ: if                                                                          vvЦена<=cnstVНФА_ИНВ: ^True; fi;
   |  not vvНФААМТ and     vvНФА100 and not vvНФАБЕЗ: if                        (vvЦена>cnstVНФА_ИНВ and vvЦена<=cnstVНФА100П)                        : ^True; fi;
   |      vvНФААМТ and not vvНФА100 and not vvНФАБЕЗ: if vvЦена>cnstVНФА100П                                                                          : ^True; fi;
   fi;
 fi;
 ^False;
end;

Func СформироватьЗначениеСортировки(ШаблонСортировки:String; Iter:Integer; UserSortValue:String) :String;
var Res, Field, Value, tmp :String;
var ii, num, xx :Integer;
 Res="";
 if ШаблонСортировки<>"":
   num=WordsCount(ШаблонСортировки, " ");
   for ii=1 to num do
     Field=ExtractWord(ii, ШаблонСортировки, " ");
     Value="";
     if Pos(Chr(183)+"1", Field)>0:
       tmp=тМОЛИМЯ[Iter]+Chr(169)+тМОЛКОД[Iter];
       xx=SearchInArray(aHdrFldSRT, tmp, True, 1);
       if xx>0: Value=Chr(183)+"1"+Format("%.10d", xx); fi;
     |  Pos(Chr(183)+"2", Field)>0:
       tmp=тМХЭИМЯ[Iter]+Chr(169)+тМХЭКОД[Iter];
       xx=SearchInArray(aHdrFldSRT, tmp, True, 1);
       if xx>0: Value=Chr(183)+"2"+Format("%.10d", xx); fi;
     |  Pos(Chr(183)+"3", Field)>0:
       tmp=тДОПИМЯ[Iter]+Chr(169)+тДОПКОД[Iter];
       xx=SearchInArray(aHdrFldSRT, tmp, True, 1);
       if xx>0: Value=Chr(183)+"3"+Format("%.10d", xx); fi;
     else
       Try Value=GetVariableS(Field+"["+Str(Iter)+"]"); Except Value=""; end;
     fi;
     if Trim(Value)="": Value=" "; fi;
     Res=Объединить(Res, Value, "#");
   od;
 fi;
 Value="";
 if Trim(UserSortValue)<>"":
   tmp=Trim(UserSortValue);
   xx=SearchInArray(aUsrFldSRT, tmp, True, 1);
   if xx>0: Value=Format("%.10d", xx); fi;
 fi;
 if Trim(Value)="": Value=" "; fi;
 Res=Объединить(Res, Value, "#");
 ^Up(Res);
end;

Func ПоискДанных_ИщемДанные(avНПОТЧ         :Date;
                            avКПОТЧ         :Date;
                            avЕстьБал       :Logical;
                            avЕстьЗаб       :Logical;
                            avMskACC101     :String;
                            avMskANA101     :String;
                            avUНФА101       :Logical;
                            avUМОЛ101       :Logical;
                            avUМХЭ101       :Logical;
                            avUДОП101       :Logical;
                            avUАНА101       :Logical;
                            avУчет106       :Logical;
                            avТолько106     :Logical;
                            avMskACC106     :String;
                            avMskANA106     :String;
                            avUНФА106       :Logical;
                            avUМОЛ106       :Logical;
                            avUМХЭ106       :Logical;
                            avUДОП106       :Logical;
                            avUАНА106       :Logical;
                            VconstНФА100П   :Numeric;
                            VconstНФА_ИНВ   :Numeric
                            ) :Logical;
var Value, КОДСЧТ, КОДНФА, КОДУЧН, КОДМОЛ, КОДМХЭ, КОДДОП, refStrНФА, refStrМОЛ, refStrМХЭ, refStrДОП, grpГРП, grpПГР, grpИМЯ :String;
var okData, Режим, Выводить, Work, flgW1, flgW2, flgW3, f1, f2, f3 :Logical;
var SUM, KOL, nSum1, nSum2, nSum3 :Numeric;
var RO, len, xx, ii, pp :Integer;
var REC :Record;
 okData=False;
 Refresh(False);
 Режим=AutoRefresh;
 ToggleAutoRefresh(False);
 ShowProgress(0, "Подготовка данных...");
 RO=OpenWorkArea("РПО_НФА", "", "");
 Try
   -- Служебная инфа
   TimeCreationRep="Время создания отчета: "+DateToString(ToDay)+" "+TimeToHMSstring(Time);
   СлужИнфоСЧТ="Отбор по счетам: "+Объединить(if(avMskACC101<>"", "("+avMskACC101+")", ""), if(avMskACC106<>"", "("+avMskACC106+")", ""), "|");
   СлужИнфоАНА="Отбор по признакам: "+ИтогоФильтрАналитики;
   СлужИнфоГРП="Отбор по группам НФА: "+if(отчГРП<>"", nmsГРП, "нет");
   -- Очистка переменных
   ОчиститьВспомМассив;
   ОчиститьLST;
   count_arrНФА=0; count_arrМОЛ=0; count_arrМХЭ=0; count_arrДОП=0;
   -- Вспомогательные данные
   INIСправочникиФильтраОтбора101(VOCКОД);
   INIСправочникиФильтраОтбора106(VOCКОД);
   -- ***
   -- Считаем ОСТАТКИ на НАЧАЛО! периода (101)
   if not (avУчет106 and avТолько106):
     ПоискДанных_ИщемОстакиНФА101(avНПОТЧ, avЕстьБал, avЕстьЗаб, avMskACC101, avMskANA101, avUНФА101, avUМОЛ101, avUМХЭ101, AVUДОП101, avUАНА101, VconstНФА100П, VconstНФА_ИНВ, if(curФтрНФА=2, True, False));
   fi;
   -- ***
   -- Считаем ОСТАТКИ на НАЧАЛО! периода (106)
   if avУчет106:
     ПоискДанных_ИщемОстаки106(avНПОТЧ, avMskACC106, avMskANA106, avUНФА106, avUМОЛ106, avUМХЭ106, AVUДОП106, avUАНА106);
   fi;
   -- ***
   -- Считаем ОБОРОТЫ за период (101)
   if not (avУчет106 and avТолько106):
     ПоискДанных_ИщемОборотНФА101(avНПОТЧ, avКПОТЧ, avЕстьБал, avЕстьЗаб, avMskACC101, avMskANA101, avUНФА101, avUМОЛ101, avUМХЭ101, AVUДОП101, avUАНА101, VconstНФА100П, VconstНФА_ИНВ, if(curФтрНФА=2, True, False));
   fi;
   -- ***
   -- Считаем ОБОРОТЫ за период (106)
   if avУчет106:
     ПоискДанных_ИщемОборот106(avНПОТЧ, avКПОТЧ, avMskACC106, avMskANA106, avUНФА106, avUМОЛ106, avUМХЭ106, AVUДОП106, avUАНА106);
   fi;
   -- **************** --
   -- * Отбор данных * --
   -- **************** --
   len=LengthOfArray(LST_UNIQUE);
   if len>0:
     if count_arrНФА>0:
        ПозицииArrayНФА=count_arrНФА;
        CloseProgress;
        ShowProgress(1, "Сортировка промежуточных данных (справочники НФА)...");
        SortSection(ПозицииArrayНФА, "arr_REFНФА", True, False);
     fi;
     if count_arrМОЛ>0:
        ПозицииArrayМОЛ=count_arrМОЛ;
        CloseProgress;
        ShowProgress(1, "Сортировка промежуточных данных (справочники МОЛ)...");
        SortSection(ПозицииArrayМОЛ, "arr_REFМОЛ", True, False);
     fi;
     if count_arrМХЭ>0:
        ПозицииArrayМХЭ=count_arrМХЭ;
        CloseProgress;
        ShowProgress(1, "Сортировка промежуточных данных (справочники МХЭ)...");
        SortSection(ПозицииArrayМХЭ, "arr_REFМХЭ", True, False);
     fi;
     if count_arrДОП>0:
        ПозицииArrayДОП=count_arrДОП;
        CloseProgress;
        ShowProgress(1, "Сортировка промежуточных данных (справочники ДОП)...");
        SortSection(ПозицииArrayДОП, "arr_REFДОП", True, False);
     fi;
     ShowProgress(len, "Расчет оборотной ведомости...");
     ОчиститьТаблицу;
     ОчиститьИтоги;
     ValidateОтчетSection;
     Value=СформироватьШаблонСортировки;
     xx=0;
     -- ********************** --
     -- * Группировка данных * --
     -- ********************** --
     for ii=1 to len do
       ProgressPos(ii);
       SUM=Abs(LST_OSTСУМ[ii])+Abs(LST_DEBСУМ[ii])+Abs(LST_DVPСУМ[ii])+Abs(LST_KREСУМ[ii])+Abs(LST_KVPСУМ[ii]);
       KOL=Abs(LST_OSTКОЛ[ii])+Abs(LST_DEBКОЛ[ii])+Abs(LST_DVPКОЛ[ii])+Abs(LST_KREКОЛ[ii])+Abs(LST_KVPКОЛ[ii]);
       if SUM<>0.00 or KOL<>0.00:
         -- Очитстка аналитики
         КОДНФА=""; КОДУЧН=""; КОДМОЛ=""; КОДМХЭ=""; КОДДОП=""; КОДСЧТ="";
         refStrНФА=""; refStrМОЛ=""; refStrМХЭ=""; refStrДОП=""; grpГРП=""; grpПГР=""; grpИМЯ="";
         REC=NIL; SUM=0.00; KOL=0.00; flgW1=False; flgW2=False; flgW3=False;
         -- ----------------------------------------------------- --
         -- refStrМОЛ#refStrМХЭ#refStrДОП#КОДСЧТ#refStrНФА#КОДУЧН --
         -- ----------------------------------------------------- --
         refStrМОЛ = Trim(ExtractWord(1, LST_UNIQUE[ii], "#")); pp=SearchInArray(arr_REFМОЛ, refStrМОЛ, True, 1); if pp>0: КОДМОЛ=arr_КОДМОЛ[pp]; else КОДМОЛ=""; fi;
         refStrМХЭ = Trim(ExtractWord(2, LST_UNIQUE[ii], "#")); pp=SearchInArray(arr_REFМХЭ, refStrМХЭ, True, 1); if pp>0: КОДМХЭ=arr_КОДМХЭ[pp]; else КОДМХЭ=""; fi;
         refStrДОП = Trim(ExtractWord(3, LST_UNIQUE[ii], "#")); pp=SearchInArray(arr_REFДОП, refStrДОП, True, 1); if pp>0: КОДДОП=arr_КОДДОП[pp]; else КОДДОП=""; fi;
         КОДСЧТ    = Trim(ExtractWord(4, LST_UNIQUE[ii], "#"));
         refStrНФА = Trim(ExtractWord(5, LST_UNIQUE[ii], "#")); pp=SearchInArray(arr_REFНФА, refStrНФА, True, 1); if pp>0: КОДНФА=arr_КОДНФА[pp]; else КОДНФА=""; fi;
         КОДУЧН    = Trim(ExtractWord(6, LST_UNIQUE[ii], "#")); if КОДУЧН=(pfxУЧН+".$$$"): КОДУЧН="> не присвоен"; fi;
         -- Пользовательская группировка НФА
         if КОДНФА<>"" and (flgГРП or отчГРП<>""):
           pp=0;
           REC=SignToRecord(КОДНФА, False);
           if REC<>NIL:
             pp=GetRecordNumber(RO, REC);
             if pp>0:
               grpГРП=КорректныеСимволыПризнака(Lo(Trim(GetFieldS(RO, pp, "ГРУППАВИД"))));
               if grpГРП="": grpГРП="_без группировки"; fi;
               grpПГР=КорректныеСимволыПризнака(Lo(Trim(GetFieldS(RO, pp, "ГРУППАКОД"))));
               grpИМЯ=УдалитьРазделительЧерта(Lo(Trim(GetFieldS(RO, pp, "ГРУППАССЫЛКА"))));
               if grpПГР=""  and grpИМЯ<>"": grpПГР=grpИМЯ;
               |  grpПГР<>"" and grpИМЯ="" : grpИМЯ=grpПГР;
               |  grpПГР=""  and grpИМЯ="" : grpПГР="_без группировки"; grpИМЯ=grpПГР;
               fi;
             fi;
           fi;
         fi;
         -- * Условия на выборку *
         Work=False;
         --1)
         if ValidSign(КОДНФА) or КОДНФА="НФА.$$$": flgW1=True; else flgW1=False; fi;
         --2)
         flgW2=СоответствуетФильтруПоГруппеНФА(отчГРП, grpГРП, grpПГР);
         --3)
         if curФтрЦен=2:
           flgW3=False;
           if not LST_НЕТУЧН[ii]:
             if LST_OSTКОЛ[ii]<>0.00: nSum1=Abs(LST_OSTСУМ[ii])/Abs(LST_OSTКОЛ[ii]); else nSum1=0.00; fi;
             if LST_DEBКОЛ[ii]<>0.00: nSum2=Abs(LST_DEBСУМ[ii])/Abs(LST_DEBКОЛ[ii]); else nSum2=0.00; fi;
             if LST_DVPКОЛ[ii]<>0.00: nSum3=Abs(LST_DVPСУМ[ii])/Abs(LST_DVPКОЛ[ii]); else nSum3=0.00; fi;
             --
             if flgОтбЦенИИли:
               if НФАпоТипам_ЦенаПодходит2(flgНФААМТ, flgНФА100, flgНФАБЕЗ, nSum1, VconstНФА100П, VconstНФА_ИНВ) and
                 (НФАпоТипам_ЦенаПодходит2(flgНФААМТ, flgНФА100, flgНФАБЕЗ, nSum2, VconstНФА100П, VconstНФА_ИНВ) or
                  НФАпоТипам_ЦенаПодходит2(flgНФААМТ, flgНФА100, flgНФАБЕЗ, nSum3, VconstНФА100П, VconstНФА_ИНВ)) : flgW3=True;
               fi;
             else
               if НФАпоТипам_ЦенаПодходит2(flgНФААМТ, flgНФА100, flgНФАБЕЗ, nSum1, VconstНФА100П, VconstНФА_ИНВ) or
                  НФАпоТипам_ЦенаПодходит2(flgНФААМТ, flgНФА100, flgНФАБЕЗ, nSum2, VconstНФА100П, VconstНФА_ИНВ) or
                  НФАпоТипам_ЦенаПодходит2(flgНФААМТ, flgНФА100, flgНФАБЕЗ, nSum3, VconstНФА100П, VconstНФА_ИНВ)  : flgW3=True;
               fi;
             fi;
           fi;
         |  curФтрЦен=3:
           flgW3=False;
           if LST_OSTКОЛ[ii]<>0.00: nSum1=Abs(LST_OSTСУМ[ii])/Abs(LST_OSTКОЛ[ii]); else nSum1=0.00; fi;
           if LST_DEBКОЛ[ii]<>0.00: nSum2=Abs(LST_DEBСУМ[ii])/Abs(LST_DEBКОЛ[ii]); else nSum2=0.00; fi;
           if LST_DVPКОЛ[ii]<>0.00: nSum3=Abs(LST_DVPСУМ[ii])/Abs(LST_DVPКОЛ[ii]); else nSum3=0.00; fi;
           --
           if flgОтбЦенИИли:
             if flgSgnЕЦ=1: if (nSum1< БМЦеныЕЦ and nSum1<>0.00) and ((nSum2< БМЦеныЕЦ and nSum2<>0.00) or (nSum3< БМЦеныЕЦ and nSum3<>0.00)) : flgW3=True; fi; -- <
             |  flgSgnЕЦ=2: if (nSum1<=БМЦеныЕЦ and nSum1<>0.00) and ((nSum2<=БМЦеныЕЦ and nSum2<>0.00) or (nSum3<=БМЦеныЕЦ and nSum3<>0.00)) : flgW3=True; fi; -- <=
             |  flgSgnЕЦ=3: if (nSum1> БМЦеныЕЦ and nSum1<>0.00) and ((nSum2> БМЦеныЕЦ and nSum2<>0.00) or (nSum3> БМЦеныЕЦ and nSum3<>0.00)) : flgW3=True; fi; -- >
             |  flgSgnЕЦ=4: if (nSum1>=БМЦеныЕЦ and nSum1<>0.00) and ((nSum2>=БМЦеныЕЦ and nSum2<>0.00) or (nSum3>=БМЦеныЕЦ and nSum3<>0.00)) : flgW3=True; fi; -- >=
             |  flgSgnЕЦ=5: if (nSum1= БМЦеныЕЦ and nSum1<>0.00) and ((nSum2= БМЦеныЕЦ and nSum2<>0.00) or (nSum3= БМЦеныЕЦ and nSum3<>0.00)) : flgW3=True; fi; -- =
             |  flgSgnЕЦ=6: if (nSum1<>БМЦеныЕЦ and nSum1<>0.00) and ((nSum2<>БМЦеныЕЦ and nSum2<>0.00) or (nSum3<>БМЦеныЕЦ and nSum3<>0.00)) : flgW3=True; fi; -- <>
             fi;
           else
             if flgSgnЕЦ=1: if (nSum1< БМЦеныЕЦ and nSum1<>0.00) or  ((nSum2< БМЦеныЕЦ and nSum2<>0.00) or (nSum3< БМЦеныЕЦ and nSum3<>0.00)) : flgW3=True; fi; -- <
             |  flgSgnЕЦ=2: if (nSum1<=БМЦеныЕЦ and nSum1<>0.00) or  ((nSum2<=БМЦеныЕЦ and nSum2<>0.00) or (nSum3<=БМЦеныЕЦ and nSum3<>0.00)) : flgW3=True; fi; -- <=
             |  flgSgnЕЦ=3: if (nSum1> БМЦеныЕЦ and nSum1<>0.00) or  ((nSum2> БМЦеныЕЦ and nSum2<>0.00) or (nSum3> БМЦеныЕЦ and nSum3<>0.00)) : flgW3=True; fi; -- >
             |  flgSgnЕЦ=4: if (nSum1>=БМЦеныЕЦ and nSum1<>0.00) or  ((nSum2>=БМЦеныЕЦ and nSum2<>0.00) or (nSum3>=БМЦеныЕЦ and nSum3<>0.00)) : flgW3=True; fi; -- >=
             |  flgSgnЕЦ=5: if (nSum1= БМЦеныЕЦ and nSum1<>0.00) or  ((nSum2= БМЦеныЕЦ and nSum2<>0.00) or (nSum3= БМЦеныЕЦ and nSum3<>0.00)) : flgW3=True; fi; -- =
             |  flgSgnЕЦ=6: if (nSum1<>БМЦеныЕЦ and nSum1<>0.00) or  ((nSum2<>БМЦеныЕЦ and nSum2<>0.00) or (nSum3<>БМЦеныЕЦ and nSum3<>0.00)) : flgW3=True; fi; -- <>
             fi;
           fi;
         |  curФтрЦен=4:
           flgW3=False;
           Выводить=True;
           --
           if Выводить:
             if flgUse_ЦНП and БМЦеныНП>0: 
               Выводить=False;
               if LST_OSTКОЛ[ii]<>0.00: nSum1=Abs(LST_OSTСУМ[ii])/Abs(LST_OSTКОЛ[ii]); else nSum1=0.00; fi;
               if flgSgnНП=1: if nSum1< БМЦеныНП: Выводить=True; fi;
               |  flgSgnНП=2: if nSum1<=БМЦеныНП: Выводить=True; fi;
               |  flgSgnНП=3: if nSum1> БМЦеныНП: Выводить=True; fi;
               |  flgSgnНП=4: if nSum1>=БМЦеныНП: Выводить=True; fi;
               |  flgSgnНП=5: if nSum1= БМЦеныНП: Выводить=True; fi;
               |  flgSgnНП=6: if nSum1<>БМЦеныНП: Выводить=True; fi;
               fi;
             fi;
           fi;
           if Выводить:
             if flgUse_ЦДО and БМЦеныДО>0: 
               Выводить=False;
               if LST_DEBКОЛ[ii]<>0.00: nSum1=Abs(LST_DEBСУМ[ii])/Abs(LST_DEBКОЛ[ii]); else nSum1=0.00; fi;
               if LST_DVPКОЛ[ii]<>0.00: nSum2=Abs(LST_DVPСУМ[ii])/Abs(LST_DVPКОЛ[ii]); else nSum2=0.00; fi;
               if flgSgnДО=1: if nSum1< БМЦеныДО or nSum2< БМЦеныДО: Выводить=True; fi;
               |  flgSgnДО=2: if nSum1<=БМЦеныДО or nSum2<=БМЦеныДО: Выводить=True; fi;
               |  flgSgnДО=3: if nSum1> БМЦеныДО or nSum2> БМЦеныДО: Выводить=True; fi;
               |  flgSgnДО=4: if nSum1>=БМЦеныДО or nSum2>=БМЦеныДО: Выводить=True; fi;
               |  flgSgnДО=5: if nSum1= БМЦеныДО or nSum2= БМЦеныДО: Выводить=True; fi;
               |  flgSgnДО=6: if nSum1<>БМЦеныДО or nSum2<>БМЦеныДО: Выводить=True; fi;
               fi;
             fi;
           fi;
           if Выводить:
             if flgUse_ЦКО and БМЦеныКО>0: 
               Выводить=False;
               if LST_KREКОЛ[ii]<>0.00: nSum1=Abs(LST_KREСУМ[ii])/Abs(LST_KREКОЛ[ii]); else nSum1=0.00; fi;
               if LST_KVPКОЛ[ii]<>0.00: nSum2=Abs(LST_KVPСУМ[ii])/Abs(LST_KVPКОЛ[ii]); else nSum2=0.00; fi;
               if flgSgnКО=1: if nSum1< БМЦеныКО or nSum2< БМЦеныКО: Выводить=True; fi;
               |  flgSgnКО=2: if nSum1<=БМЦеныКО or nSum2<=БМЦеныКО: Выводить=True; fi;
               |  flgSgnКО=3: if nSum1> БМЦеныКО or nSum2> БМЦеныКО: Выводить=True; fi;
               |  flgSgnКО=4: if nSum1>=БМЦеныКО or nSum2>=БМЦеныКО: Выводить=True; fi;
               |  flgSgnКО=5: if nSum1= БМЦеныКО or nSum2= БМЦеныКО: Выводить=True; fi;
               |  flgSgnКО=6: if nSum1<>БМЦеныКО or nSum2<>БМЦеныКО: Выводить=True; fi;
               fi;
             fi;
           fi;
           if Выводить:
             if flgUse_ЦКП and БМЦеныКП>0: 
               Выводить=False;
               nSum1=LST_OSTСУМ[ii]+(LST_DEBСУМ[ii]+LST_DVPСУМ[ii])-(LST_KREСУМ[ii]+LST_KVPСУМ[ii]);
               nSum2=LST_OSTКОЛ[ii]+(LST_DEBКОЛ[ii]+LST_DVPКОЛ[ii])-(LST_KREКОЛ[ii]+LST_KVPКОЛ[ii]);
               if nSum2<>0.00: nSum3=Abs(nSum1)/Abs(nSum2); else nSum3=0.00; fi;
               if flgSgnКП=1: if nSum3< БМЦеныКП: Выводить=True; fi;
               |  flgSgnКП=2: if nSum3<=БМЦеныКП: Выводить=True; fi;
               |  flgSgnКП=3: if nSum3> БМЦеныКП: Выводить=True; fi;
               |  flgSgnКП=4: if nSum3>=БМЦеныКП: Выводить=True; fi;
               |  flgSgnКП=5: if nSum3= БМЦеныКП: Выводить=True; fi;
               |  flgSgnКП=6: if nSum3<>БМЦеныКП: Выводить=True; fi;
               fi;
             fi;
           fi;
           flgW3=Выводить;
         |  curФтрЦен=5:
           flgW3=False;
           Выводить=True;
           nSum1=LST_DEBСУМ[ii]+LST_DVPСУМ[ii];
           nSum2=LST_KREСУМ[ii]+LST_KVPСУМ[ii];
           nSum3=LST_OSTСУМ[ii]+nSum1-nSum2;
           if Выводить:
             if flgОстНП:
               f1=False; if flgУч_М_НП: if LST_OSTСУМ[ii]<0.00: f1=True; fi; fi;
               f2=False; if flgУч_Р_НП: if LST_OSTСУМ[ii]=0.00: f2=True; fi; fi;
               f3=False; if flgУч_Б_НП: if LST_OSTСУМ[ii]>0.00: f3=True; fi; fi;
               Выводить=(f1 or f2 or f3);
             fi;
           fi;
           if Выводить:
             if flgОбДеб:
               f1=False; if flgУч_М_ОД: if nSum1<0.00: f1=True; fi; fi;
               f2=False; if flgУч_Р_ОД: if nSum1=0.00: f2=True; fi; fi;
               f3=False; if flgУч_Б_ОД: if nSum1>0.00: f3=True; fi; fi;
               Выводить=(f1 or f2 or f3);
             fi;
           fi;
           if Выводить:
             if flgОбКре:
               f1=False; if flgУч_М_ОК: if nSum2<0.00: f1=True; fi; fi;
               f2=False; if flgУч_Р_ОК: if nSum2=0.00: f2=True; fi; fi;
               f3=False; if flgУч_Б_ОК: if nSum2>0.00: f3=True; fi; fi;
               Выводить=(f1 or f2 or f3);
             fi;
           fi;
           if Выводить:
             if flgОстКП:
               f1=False; if flgУч_М_КП: if nSum3<0.00: f1=True; fi; fi;
               f2=False; if flgУч_Р_КП: if nSum3=0.00: f2=True; fi; fi;
               f3=False; if flgУч_Б_КП: if nSum3>0.00: f3=True; fi; fi;
               Выводить=(f1 or f2 or f3);
             fi;
           fi;
           --
           flgW3=Выводить;
         else
           flgW3=True;
         fi;
         -- X) суммируем
         if flgW1 and flgW2 and flgW3: Work=True ;else Work=False; fi;
         -- Собственно выборка
         if Work:
           xx=xx+1;
           тНФАКОД[xx]=КОДНФА;
           тНФАИМЯ[xx]=LST_ИМЯНФА[ii];
           if flgГРП:
             тНФАГРК[xx]=grpГРП+"$"+grpПГР;
             тНФАГРИ[xx]="Группа '"+grpГРП+"'.  Подгруппа '"+grpИМЯ+"'";
           else
             тНФАГРК[xx]=""; тНФАГРИ[xx]="";
           fi;
           if тНФАГРК[xx]="" or тНФАГРК[xx]="$": тНФАГРК[xx]="_без группировки$_без группировки"; тНФАГРИ[xx]="без группировки"; fi; -- символ "_" впереди - для удобной сортировки
           тНФАЕДИ[xx]=Lo(Unit(КОДНФА));
           тНФАУЧН[xx]=КОДУЧН;
           тНФАИНВ[xx]=LST_ИМЯИНВ[ii];
           тНФАИСТ[xx]=LST_КОДИСТ[ii];
           тНФАКБК[xx]=LST_КОДКБК[ii];
           тНФАСЧ6[xx]=LST_КОДСЧ6[ii];
           тМОЛКОД[xx]=КОДМОЛ;
           тМОЛИМЯ[xx]=LST_ИМЯМОЛ[ii];
           тМХЭКОД[xx]=КОДМХЭ;
           тМХЭИМЯ[xx]=LST_ИМЯМХЭ[ii];
           тДОПКОД[xx]=КОДДОП;
           тДОПИМЯ[xx]=LST_ИМЯДОП[ii];
           --
           -- Цифры
           тСУМОСТ[xx]=LST_OSTСУМ[ii];
           тКОЛОСТ[xx]=LST_OSTКОЛ[ii];
           --
           тСУМДПО[xx]=LST_DEBСУМ[ii];
           тКОЛДПО[xx]=LST_DEBКОЛ[ii];
           тСУМДВП[xx]=LST_DVPСУМ[ii];
           тКОЛДВП[xx]=LST_DVPКОЛ[ii];
           тСУМДЕБ[xx]=тСУМДПО[xx]+тСУМДВП[xx];
           тКОЛДЕБ[xx]=тКОЛДПО[xx]+тКОЛДВП[xx];
           --
           тСУМКРО[xx]=LST_KREСУМ[ii];
           тКОЛКРО[xx]=LST_KREКОЛ[ii];
           тСУМКВП[xx]=LST_KVPСУМ[ii];
           тКОЛКВП[xx]=LST_KVPКОЛ[ii];
           тСУМКРЕ[xx]=тСУМКРО[xx]+тСУМКВП[xx];
           тКОЛКРЕ[xx]=тКОЛКРО[xx]+тКОЛКВП[xx];
           --
           тСУМКОН[xx]=тСУМОСТ[xx]+тСУМДЕБ[xx]-тСУМКРЕ[xx];
           тКОЛКОН[xx]=тКОЛОСТ[xx]+тКОЛДЕБ[xx]-тКОЛКРЕ[xx];
           -- конец Цифр
           тНЕТУЧН[xx]=LST_НЕТУЧН[ii];
           --
           if flgНФА:
             nSum1=Abs(LST_OSTСУМ[ii])+Abs(LST_DEBСУМ[ii])+Abs(LST_DVPСУМ[ii]);
             nSum2=Abs(LST_OSTКОЛ[ii])+Abs(LST_DEBКОЛ[ii])+Abs(LST_DVPКОЛ[ii]);
             if nSum2<>0.00: nSum3=nSum1/nSum2; else nSum3=0.00; fi;
             if nSum3  > VconstНФА100П                          : тНФАТИП[xx]="1";
             |  nSum3  > VconstНФА_ИНВ and nSum3<=VconstНФА100П : тНФАТИП[xx]="2";
             |  nSum3 <= VconstНФА_ИНВ                          : тНФАТИП[xx]="3";
             else                                                 тНФАТИП[xx]="0";
             fi;
           else
             тНФАТИП[xx]="0";
           fi;
           --
           тSRTFLD[xx]=СформироватьЗначениеСортировки(Value, xx, LST_ЮЗРСРТ[ii]);
         fi; --Work=True - проводка отобрана
       fi; --SUM<>0.00 or KOL<>0.00
     od;
   else
     Message("По заданнам условиям отбора^Mданных для выборки не обнаружено!", mtInformation);
     ^False;
   fi;
   len=LengthOfArray(тSRTFLD);
   if len>0:
     okData=True;
   else
     Message("По заданнам условиям отбора^Mненулевых остатков не обнаружено!", mtInformation);
     okData=False;
   fi;
 Finally
   CloseWorkArea(RO);
   CloseProgress;
   ToggleAutoRefresh(Режим);
 end;
 ^okData;
end;

Func ПроверкаЗаполнения :Logical;
 --
 if not ПроверкаДат: ^False; fi;
 --
 if curФтрAcc<1: curФтрAcc=1; oldФтрAcc=curФтрAcc; fi;
 if curФтрИст<1: curФтрИст=1; oldФтрИст=curФтрИст; fi;
 if curБалЗаб<1: curБалЗаб=1; oldБалЗаб=curБалЗаб; fi;
 if curФтрНФА<1: curФтрНФА=1; oldФтрНФА=curФтрНФА; fi;
 if curФтрЦен<1: curФтрЦен=1; oldФтрЦен=curФтрЦен; fi;
 --
 if curФтрЦен=2:
    if not flgНФААМТ and not flgНФА100 and not flgНФАБЕЗ:
      Message("Не задан фильтр отбора НФА по типам!^M(Выбран пункт 'Выводить балансовые НФА по типам...')", mtWarning);
      Template.Object="cb_НФААМТ";
      ^False;
    fi;
 |  curФтрЦен=3:
    if БМЦеныЕЦ=0:
      Message("Не задан фильтр цены!^M(Выбран пункт ' Выводить НФА с ценой больше (меньше) чем указанная (единая цена для условий на остатки и(или) обороты)'", mtWarning);
      Template.Field="БМЦеныЕЦ";
      ^False;
    fi;
    if flgSgnЕЦ<1:
      Message("Не задан знак сравнения цены!^M(Выбран пункт ' Выводить НФА с ценой больше (меньше) чем указанная (единая цена для условий на остатки и(или) обороты)'", mtWarning);
      Template.Field="flgSgnЕЦ";
      ^False;
    fi;
 |  curФтрЦен=4:
    if not flgUse_ЦНП and not flgUse_ЦДО and not flgUse_ЦКО and not flgUse_ЦКП:
      Message("Не задан фильтр цены!^M(Выбран пункт 'Выводить НФА с ценой больше (меньше) чем указанная (различная цена для условий на остатки и обороты)'", mtWarning);
      Template.Object="rbtЦЕНАФРН";
      ^False;
    fi;
    if flgUse_ЦНП and БМЦеныНП=0: Message("Не задан фильтр цены!^M(Выбран пункт 'Учитывать цену для остатков на начало отчетного периода')", mtWarning); Template.Field="БМЦеныНП"; ^False;
    |  flgUse_ЦДО and БМЦеныДО=0: Message("Не задан фильтр цены!^M(Выбран пункт 'Учитывать цену для дебетового оборота')", mtWarning);                   Template.Field="БМЦеныДО"; ^False;
    |  flgUse_ЦКО and БМЦеныКО=0: Message("Не задан фильтр цены!^M(Выбран пункт 'Учитывать цену для кредитового оборота')", mtWarning);                  Template.Field="БМЦеныКО"; ^False;
    |  flgUse_ЦКП and БМЦеныКП=0: Message("Не задан фильтр цены!^M(Выбран пункт 'Учитывать цену для остатков на конец отчетного периода')", mtWarning);  Template.Field="БМЦеныКП"; ^False;
    fi;
    if flgUse_ЦНП and flgSgnНП<1: Message("Не задан знак сравнения цены!^M(Выбран пункт 'Учитывать цену для остатков на начало отчетного периода')", mtWarning); Template.Field="flgSgnНП"; ^False;
    |  flgUse_ЦДО and flgSgnДО<1: Message("Не задан знак сравнения цены!^M(Выбран пункт 'Учитывать цену для дебетового оборота')", mtWarning);                   Template.Field="flgSgnДО"; ^False;
    |  flgUse_ЦКО and flgSgnКО<1: Message("Не задан знак сравнения цены!^M(Выбран пункт 'Учитывать цену для кредитового оборота')", mtWarning);                  Template.Field="flgSgnКО"; ^False;
    |  flgUse_ЦКП and flgSgnКП<1: Message("Не задан знак сравнения цены!^M(Выбран пункт 'Учитывать цену для остатков на конец отчетного периода')", mtWarning);  Template.Field="flgSgnКП"; ^False;
    fi;
 |  curФтрЦен=5:
    if flgОстНП and not flgУч_М_НП and not flgУч_Р_НП and not flgУч_Б_НП:
      Message("Не задан фильтр условий на остатки'!^M(Выбран пункт 'Учитывать условие на остатки' -> 'Начало периода')", mtWarning);
      Template.Object="cb_ОстНП";
      ^False;
    fi;
    if flgОстКП and not flgУч_М_КП and not flgУч_Р_КП and not flgУч_Б_КП:
      Message("Не задан фильтр условий на остатки'!^M(Выбран пункт 'Учитывать условие на остатки' -> 'Конец периода' )", mtWarning);
      Template.Object="cb_ОстКП";
      ^False;
    fi;
    if flgОбДеб and not flgУч_М_ОД and not flgУч_Р_ОД and not flgУч_Б_ОД:
      Message("Не задан фильтр условий на обороты'!^M(Выбран пункт 'Учитывать условие на обороты' -> 'Дебетовый оборот')", mtWarning);
      Template.Object="cb_ОбДеб";
      ^False;
    fi;
    if flgОбКре and not flgУч_М_ОК and not flgУч_Р_ОК and not flgУч_Б_ОК:
      Message("Не задан фильтр условий на обороты'!^M(Выбран пункт 'Учитывать условие на обороты' -> 'Кредитовый оборот')", mtWarning);
      Template.Object="cb_ОбКре";
      ^False;
    fi;
 fi;
 ^True;
end;

Func АнализФильтраАналитики(uMaskAcc:String; ИгнорПроводкиБезНФА:Logical; Flag106:Logical) :String;
var uАНА, uДОП, uМОЛ, uМХЭ, uНФА, len_Max, len, xx, num :Integer;
var useMaskAna, Value, BindANA :String;
var OK :Logical;
 --
 useMaskAna="";
 ClearVariable(BufFlag);
 uАНА=0; uНФА=0; uДОП=0; uМОЛ=0; uМХЭ=0;
 len=Length(uMaskAcc)+7; -- 7=5+2  -5[знак()'*]  -2[{}]
 len_Max=255-len;
 len=0; xx=0;
 OK=False;
 --
 Value=отчАНА;
 if Value<>"":
   if OK: num=3; else num=2; OK=True; fi;
   xx=Length(Value)+num;
   if (len+xx)<=len_Max: len=len+xx; useMaskAna=Объединить(useMaskAna, "("+Value+")",  "&"); uАНА=+1; else uАНА=-1; fi;
 fi;
 --
 Value=отчНФА;
 if not ИгнорПроводкиБезНФА and Value="": Value="НФА.*"; fi;
 if Value<>"":
   if OK: num=3; else num=2; OK=True; fi;
   xx=Length(Value)+num;
   if (len+xx)<=len_Max: len=len+xx; useMaskAna=Объединить(useMaskAna, "("+Value+")",  "&"); uНФА=+1; else uНФА=-1; fi;
 fi;
 --
 Value=отчДОП;
 if Value<>"":
   if OK: num=3; else num=2; OK=True; fi;
   xx=Length(Value)+num;
   if (len+xx)<=len_Max: len=len+xx; useMaskAna=Объединить(useMaskAna, "("+Value+")",  "&"); uДОП=+1; else uДОП=-1; fi;
 fi;
 --
 Value=отчМОЛ;
 if Value<>"":
   if OK: num=3; else num=2; OK=True; fi;
   xx=Length(Value)+num;
   if (len+xx)<=len_Max: len=len+xx; useMaskAna=Объединить(useMaskAna, "("+Value+")",  "&"); uМОЛ=+1; else uМОЛ=-1; fi;
 fi;
 --
 Value=отчМХЭ;
 if Value<>"":
   if OK: num=3; else num=2; OK=True; fi;
   xx=Length(Value)+num;
   if (len+xx)<=len_Max: len=len+xx; useMaskAna=Объединить(useMaskAna, "("+Value+")",  "&"); uМХЭ=+1; else uМХЭ=-1; fi;
 fi;
 --
 BindANA=СправочникиСтруктурыПоМаскеСчетовПрогресс(uMaskAcc, 1.1.100, DataКП, True, True);
 if BindANA=" ": ^" "; fi; -- если был Except
 -- Проверка на привязку счетов для "неуместившейся" аналитики
 if SearchInArray(bindVOC, "НФА.*", True, 1)<1: Message("Справочник 'НФА' не привязан к выбранному фильтру по счетам учета"+if(Flag106, " ЦС.", "НФА."), mtError); ^" "; fi;
 --
 if uМОЛ<0 or flgМОЛ:
   if SearchInArray(bindVOC, "МОЛ.*", True, 1)<1:
     Message("Справочник 'МОЛ' не привязан к выбранному фильтру по счетам учета"+if(Flag106, " ЦС.", "НФА."), mtError);
     ^" ";
   fi;
 fi;
 --
 if uМХЭ<0 or flgМХЭ:
   if SearchInArray(bindVOC, "М.*", True, 1)<1:
     Message("Справочник 'М' не привязан к выбранному фильтру по счетам учета"+if(Flag106, " ЦС.", "НФА."), mtError);
     ^" ";
   fi;
 fi;
 --
 if uДОП<0 or flgДОП:
   if SearchInArray(bindVOC, VOCКОД+".*", True, 1)<1:
     Message("Длинное условие отбора аналитики.^MИспользуется свертка...^M^MСправочник '"+VOCКОД+"' не привязан к выбранному фильтру по счетам учета"+if(Flag106, " ЦС.", "НФА."), mtError);
     ^" ";
   fi;
 fi;
 --
 if uАНА<0:
   num=ВсеСправочникиДопАналитикиПривязаны(отчАНА);
   if num>0:
   |  num=0: Message("Длинное условие отбора аналитики.^MИспользуется свертка...^M^MСправочник(и) из строки 'Допол. признаки' не привязан к выбранному фильтру по счетам учета"+if(Flag106, " ЦС.", "НФА."), mtError);
             ^" ";
   |  num<0: ^" ";
   fi;
 fi;
 BufFlag[1]=if(uНФА<0, True, False);
 BufFlag[2]=if(uМОЛ<0, True, False);
 BufFlag[3]=if(uМХЭ<0, True, False);
 BufFlag[4]=if(uДОП<0, True, False);
 BufFlag[5]=if(uАНА<0, True, False);
 --
 ^Trim(useMaskAna);
end;

Proc СортировкаВедомости;
var len :Integer;
 len=LengthOfArray(тSRTFLD);
 if len>0:
   Позиции=len;
   ShowProgress(len, "Сортировка промежуточных данных (таблица)...");
   Try
     SortSection(Позиции, "тSRTFLD", True, False);
   Finally
     CloseProgress;
   end;
 fi;
end;

Proc FillСчета;
var RO, ii, num :Integer;
 ClearVariable(BufMsk);
 ClearVariable(BufStr);
 RO=OpenWorkArea("РПО_БЮДЖ_КЛАСС", "CODE", "NAME_VOC='СЧ' and (Match(CODE, '101.??') or Match(CODE, '102.??') or Match(CODE, '103.??') or Match(CODE, '105.??') or Match(CODE, '106.??'))");
 Try
   num=Records(RO);
   if num>0:
     for ii=1 to num do
       BufMsk[ii]=GetFieldS(RO, ii, "CODE");
       BufStr[ii]=GetFieldS(RO, ii, "TXT");
     od;
   fi;
 Finally
   CloseWorkArea(RO);
 end;
end;

Func ВзятьИсточникСредств_Пол(Value:String) :String;
 if Value="1": ^"[1] Бюджетная деятельность";
 |  Value="2": ^"[2] Приносящая доход деятельность (собственные доходы учреждения)";
 |  Value="3": ^"[3] Средства во временном распоряжении";
 |  Value="4": ^"[4] Субсидии на выполнение государственного (муниципального) задания";
 |  Value="5": ^"[5] Субсидии на иные цели";
 |  Value="6": ^"[6] Бюджетные инвестиции";
 |  Value="7": ^"[7] Средства по обязательному медицинскому страхованию";
 |  Value="З": ^"[З] Средства на забалансе";
 else ^"";
 fi;
end;

Func ВзятьТипНФА_Пол(Value:String; v_constНФА100П:Numeric; v_constНФА_ИНВ:Numeric) :String;
var tmp :String;
 if Value="1": tmp="НФА > " +Format("%6.0m", v_constНФА100П);                                           ^"Балансовые НФА, на которые положено ежемесячно начислять амортизацию ("+tmp+")";
 |  Value="2": tmp="НФА > " +Format("%6.0m", v_constНФА_ИНВ)+" и <= "+Format("%6.0m", v_constНФА100П);  ^"Балансовые НФА, на которые положено начислять амортизацию 100% при вводе в эксплуатацию ("+tmp+")";
 |  Value="3": tmp="НФА <= "+Format("%6.0m", v_constНФА_ИНВ);                                           ^"Балансовые НФА, которые положено списывать с учета при вводе в эксплуатацию ("+tmp+")";
 else ^"";
 fi;
end;

Proc ЗаключительныеИтогиТаблицаN1(   Value:String;
                                  vSОстНач:Numeric;
                                  vSПрхДеб:Numeric;
                                  vSВнпДеб:Numeric;
                                  vSОбоДеб:Numeric;
                                  vSРсхКре:Numeric;
                                  vSВнпКре:Numeric;
                                  vSОбоКре:Numeric;
                                  vSОстКон:Numeric);
var pp, xx :Integer;
 -- ???.?? len=06
 if Match(Value, "???.??"):
   pp=SearchInArray(иСЧТнаимен, Value, True, 1);
   if pp>0: -- накапливаем результат итогов
     xx=pp;
     иСЧТостнач[xx]=иСЧТостнач[xx]+vSОстНач;
     иСЧТпрхдеб[xx]=иСЧТпрхдеб[xx]+vSПрхДеб;
     иСЧТвнпдеб[xx]=иСЧТвнпдеб[xx]+vSВнпДеб;
     иСЧТободеб[xx]=иСЧТободеб[xx]+vSОбоДеб;
     иСЧТрсхкре[xx]=иСЧТрсхкре[xx]+vSРсхКре;
     иСЧТвнпкре[xx]=иСЧТвнпкре[xx]+vSВнпКре;
     иСЧТобокре[xx]=иСЧТобокре[xx]+vSОбоКре;
     иСЧТосткон[xx]=иСЧТосткон[xx]+vSОстКон;
   else -- новый элемент итогов
     xx=InsertInArraySort(иСЧТнаимен, Value);
     InsertInArray(иСЧТостнач, xx, vSОстНач);
     InsertInArray(иСЧТпрхдеб, xx, vSПрхДеб);
     InsertInArray(иСЧТвнпдеб, xx, vSВнпДеб);
     InsertInArray(иСЧТободеб, xx, vSОбоДеб);
     InsertInArray(иСЧТрсхкре, xx, vSРсхКре);
     InsertInArray(иСЧТвнпкре, xx, vSВнпКре);
     InsertInArray(иСЧТобокре, xx, vSОбоКре);
     InsertInArray(иСЧТосткон, xx, vSОстКон);
   fi;
 fi;
end;

Proc ЗаключительныеИтогиТаблицаN2(   Value:String;
                                  vSОстНач:Numeric;
                                  vSПрхДеб:Numeric;
                                  vSВнпДеб:Numeric;
                                  vSОбоДеб:Numeric;
                                  vSРсхКре:Numeric;
                                  vSВнпКре:Numeric;
                                  vSОбоКре:Numeric;
                                  vSОстКон:Numeric);
var pp, xx :Integer;
 -- ? len=01 (1, 2, З)
 if Match(Value, "?"):
   Value=ВзятьИсточникСредств_Пол(Value);
   pp=SearchInArray(иИСТнаимен, Value, True, 1);
   if pp>0: -- накапливаем результат итогов
     xx=pp;
     иИСТостнач[xx]=иИСТостнач[xx]+vSОстНач;
     иИСТпрхдеб[xx]=иИСТпрхдеб[xx]+vSПрхДеб;
     иИСТвнпдеб[xx]=иИСТвнпдеб[xx]+vSВнпДеб;
     иИСТободеб[xx]=иИСТободеб[xx]+vSОбоДеб;
     иИСТрсхкре[xx]=иИСТрсхкре[xx]+vSРсхКре;
     иИСТвнпкре[xx]=иИСТвнпкре[xx]+vSВнпКре;
     иИСТобокре[xx]=иИСТобокре[xx]+vSОбоКре;
     иИСТосткон[xx]=иИСТосткон[xx]+vSОстКон;
   else -- новый элемент итогов
     xx=InsertInArraySort(иИСТнаимен, Value);
     InsertInArray(иИСТостнач, xx, vSОстНач);
     InsertInArray(иИСТпрхдеб, xx, vSПрхДеб);
     InsertInArray(иИСТвнпдеб, xx, vSВнпДеб);
     InsertInArray(иИСТободеб, xx, vSОбоДеб);
     InsertInArray(иИСТрсхкре, xx, vSРсхКре);
     InsertInArray(иИСТвнпкре, xx, vSВнпКре);
     InsertInArray(иИСТобокре, xx, vSОбоКре);
     InsertInArray(иИСТосткон, xx, vSОстКон);
   fi;
 fi;
end;

Proc ЗаключительныеИтогиТаблицаN3(   Value:String;
                                  vSОстНач:Numeric;
                                  vSПрхДеб:Numeric;
                                  vSВнпДеб:Numeric;
                                  vSОбоДеб:Numeric;
                                  vSРсхКре:Numeric;
                                  vSВнпКре:Numeric;
                                  vSОбоКре:Numeric;
                                  vSОстКон:Numeric);
var pp, xx :Integer;
 -- ???.????.???????.??? len=20
 if Match(Value, "???.????.???????.???") or Value="Забаланс":
   pp=SearchInArray(иФКРнаимен, Value, True, 1);
   if pp>0: -- накапливаем результат итогов
     xx=pp;
     иФКРостнач[xx]=иФКРостнач[xx]+vSОстНач;
     иФКРпрхдеб[xx]=иФКРпрхдеб[xx]+vSПрхДеб;
     иФКРвнпдеб[xx]=иФКРвнпдеб[xx]+vSВнпДеб;
     иФКРободеб[xx]=иФКРободеб[xx]+vSОбоДеб;
     иФКРрсхкре[xx]=иФКРрсхкре[xx]+vSРсхКре;
     иФКРвнпкре[xx]=иФКРвнпкре[xx]+vSВнпКре;
     иФКРобокре[xx]=иФКРобокре[xx]+vSОбоКре;
     иФКРосткон[xx]=иФКРосткон[xx]+vSОстКон;
   else -- новый элемент итогов
     xx=InsertInArraySort(иФКРнаимен, Value);
     InsertInArray(иФКРостнач, xx, vSОстНач);
     InsertInArray(иФКРпрхдеб, xx, vSПрхДеб);
     InsertInArray(иФКРвнпдеб, xx, vSВнпДеб);
     InsertInArray(иФКРободеб, xx, vSОбоДеб);
     InsertInArray(иФКРрсхкре, xx, vSРсхКре);
     InsertInArray(иФКРвнпкре, xx, vSВнпКре);
     InsertInArray(иФКРобокре, xx, vSОбоКре);
     InsertInArray(иФКРосткон, xx, vSОстКон);
   fi;
 fi;
end;

Func ВзятьНаименованиеСинтСчета(Acc:String) :String;
var Grp, Key :String;
 if Acc<>"":
   if Match(Acc, "ЗАБ.??"): ^Trim(Name_S(Acc));
   |  Match(Acc, "10?.0?"):
     Grp=SubStr(Acc, 1, 3);
     Key=SubStr(Acc, 6, 1);
     if Grp="101":
       if Key="1": ^"Жилые помещения";
       |  Key="2": ^"Нежилые помещения";
       |  Key="3": ^"Сооружения";
       |  Key="4": ^"Машины и оборудование";
       |  Key="5": ^"Транспортные средства";
       |  Key="6": ^"Производственный и хозяйственный инвентарь";
       |  Key="7": ^"Библиотечный фонд";
       |  Key="8": ^"Прочие основные средства";
       fi;
     |  Grp="102": ^"Нематериальные активы";
     |  Grp="103":
       if Key="1": ^"Земля";
       |  Key="2": ^"Ресурсы недр";
       |  Key="3": ^"Прочие непроизведенные активы";
       fi;
     |  Grp="105":
       if Key="1": ^"Медикаменты и перевязочные средства";
       |  Key="2": ^"Продукты питания";
       |  Key="3": ^"Горюче-смазочные материалы";
       |  Key="4": ^"Строительные материалы";
       |  Key="5": ^"Мягкий инвентарь";
       |  Key="6": ^"Прочие материальные запасы";
       |  Key="7": ^"Готовая продукция";
       |  Key="8": ^"Товары";
       |  Key="9": ^"Наценка на товары";
       fi;
     fi;
   fi;
 fi;
 ^"";
end;

Func ВзятьИмяПараметраИерархическойГруппы(nameField:String; Iter:Integer; ВзятьУзелГруппы:Logical; v_constНФА100П:Numeric; v_constНФА_ИНВ:Numeric) :String;
var кодValue, имяValue :String;
var num :Integer;
 if Pos(Chr(183)+"1", nameField)>0:
   кодValue=тМОЛИМЯ[Iter];
   имяValue=тМОЛКОД[Iter];
   if имяValue<>"": имяValue="["+имяValue+"]"; fi;
 |  Pos(Chr(183)+"2", nameField)>0:
   кодValue=тМХЭИМЯ[Iter];
   имяValue=тМХЭКОД[Iter];
   if имяValue<>"": имяValue="["+имяValue+"]"; fi;
 |  Pos(Chr(183)+"3", nameField)>0:
   кодValue=тДОПИМЯ[Iter];
   имяValue=тДОПКОД[Iter];
   if имяValue<>"": имяValue="["+имяValue+"]"; fi;
 else
   Try кодValue=GetVariableS(nameField+"["+Str(if(ВзятьУзелГруппы, Iter+1, Iter))+"]"); Except кодValue=""; end;
   имяValue="";
   if кодValue<>"":
     if nameField="тНФАСЧ6":
       num=SearchInArray(BufMsk, кодValue, True, 1);
       if num>0: имяValue=BufStr[num]; else имяValue=ВзятьНаименованиеСинтСчета(кодValue); fi;
     |  nameField="тНФАКБК":
        if Match(кодValue, "???.????.???????.???"):
          имяValue=Trim(Name_S(SubStr(кодValue, 1, 9)))+" > "+Trim(Name_S(SubStr(кодValue, 1, 17)))+" > "+Trim(Name_S(кодValue+"."));
        fi;
        -- if Match(кодValue, "???.????.???????.???"): имяValue=Trim(Name_S(кодValue+".")); fi; -- короткий вариант
     |  nameField="тНФАГРК":
       if ВзятьУзелГруппы:
         Try имяValue=GetVariableS("тНФАГРИ"+"["+Str(Iter+1)+"]"); Except имяValue=""; end;
         num=Pos(".", имяValue);
         if num>0:
           имяValue=Up(SubStr(имяValue, 1, num));
           --имяValue=SubStr(имяValue, 1, num);
         else
           if Pos("без группировки", имяValue)>0: имяValue="БЕЗ ГРУППИРОВКИ"; else имяValue=""; fi;
         fi;
       else
         Try имяValue=GetVariableS("тНФАГРИ"+"["+Str(Iter)+"]"); Except имяValue=""; end;
       fi;
       if имяValue<>"": ^имяValue; fi;
     |  nameField="тНФАИСТ":
       имяValue=ВзятьИсточникСредств_Пол(кодValue);
       if имяValue<>"": ^имяValue; fi;
     |  nameField="тНФАТИП":
       имяValue=ВзятьТипНФА_Пол(кодValue, v_constНФА100П, v_constНФА_ИНВ);
       if имяValue<>"": ^имяValue; fi;
     fi;
   fi; --кодValue<>""
 fi;
 if имяValue<>"": ^(кодValue+" "+Chr(151)+" "+имяValue); else ^""; fi;
end;

Proc ПодсчетВставкаПромежуточныхИтогов(VconstНФА100П:Numeric; VconstНФА_ИНВ:Numeric);
var fldKEY1, fldKEY2, fldKEY3, fldKEY4, fldKEY5, fldKEY6, fldKEY7, fldKEY8 :String;
var valFLD1, valFLD2, valFLD3, valFLD4, valFLD5, valFLD6, valFLD7, valFLD8 :String;
var valKEY1, valKEY2, valKEY3, valKEY4, valKEY5, valKEY6, valKEY7, valKEY8 :String;
var valKГР1, valKГР2, valKГР3, valKГР4, valKГР5, valKГР6, valKГР7, valKГР8 :String;
var SumОстНач, SumПрхДеб, SumВнпДеб, SumОбоДеб, SumРсхКре, SumВнпКре, SumОбоКре, SumОстКон :Numeric;
var KolОстНач, KolПрхДеб, KolВнпДеб, KolОбоДеб, KolРсхКре, KolВнпКре, KolОбоКре, KolОстКон :Numeric;
var КОДКБК, КОДИСТ, КОДСЧТ, LnFn, Value, tmp :String;
var len, num, ii, ordГРП, kk, xx, jj, nn :Integer;
var ЕстьИерархическаяГруппировка  :Logical;

 LnFn="ъ"+Chr(183)+"ъ";
 len=LengthOfArray(тSRTFLD);
 ЕстьИерархическаяГруппировка=False;
 if len>0:
   ОчиститьИтоги;
   СортировкаВедомости;
   nn=1;
   fldKEY1=""; fldKEY2=""; fldKEY3=""; fldKEY4=""; fldKEY5=""; fldKEY6=""; fldKEY7=""; fldKEY8="";
   if Trim(Иерархия)<>"":
     num=WordsCount(Иерархия, " ");
     if not num>8:
       ClearVariable(Buf);
       ЕстьИерархическаяГруппировка=True;
       ordГРП=0;
       for ii=1 to num do
         Value=ExtractWord(ii, Иерархия, " ");
         if Value="<СЧТ>": Try PutVariableS("Buf["+Str(ii)+"]", "тНФАСЧ6");            nn=nn+1; Except end;
         |  Value="<КБК>": Try PutVariableS("Buf["+Str(ii)+"]", "тНФАКБК");            nn=nn+1; Except end;
         |  Value="<ИСТ>": Try PutVariableS("Buf["+Str(ii)+"]", "тНФАИСТ");            nn=nn+1; Except end;
         |  Value="<МОЛ>": Try PutVariableS("Buf["+Str(ii)+"]", Chr(183)+"1тМОЛИМЯ");  nn=nn+1; Except end;
         |  Value="<МХЭ>": Try PutVariableS("Buf["+Str(ii)+"]", Chr(183)+"2тМХЭИМЯ");  nn=nn+1; Except end;
         |  Value="<ДОП>": Try PutVariableS("Buf["+Str(ii)+"]", Chr(183)+"3тДОПИМЯ");  nn=nn+1; Except end;
         |  Value="<ГРП>": Try PutVariableS("Buf["+Str(ii)+"]", "тНФАГРК"); ordГРП=ii; nn=nn+1; Except end;
         |  Value="<НФА>": Try PutVariableS("Buf["+Str(ii)+"]", "тНФАТИП");            nn=nn+1; Except end;
         fi;
       od;
       fldKEY1=Buf[1]; fldKEY2=Buf[2]; fldKEY3=Buf[3]; fldKEY4=Buf[4]; fldKEY5=Buf[5]; fldKEY6=Buf[6]; fldKEY7=Buf[7]; fldKEY8=Buf[8];
     fi;
   fi;
   FillСчета;
   ShowProgress(Int(nn/2*len), "Подсчет, вставка промежуточных итогов...");
   Try
     всгОстНачСум=SumOfArray(тСУМОСТ, Позиции);
     всгПрхДебСум=SumOfArray(тСУМДПО, Позиции);
     всгВнпДебСум=SumOfArray(тСУМДВП, Позиции);
     всгОбоДебСум=SumOfArray(тСУМДЕБ, Позиции);
     всгРсхКреСум=SumOfArray(тСУМКРО, Позиции);
     всгВнпКреСум=SumOfArray(тСУМКВП, Позиции);
     всгОбоКреСум=SumOfArray(тСУМКРЕ, Позиции);
     всгОстКонСум=SumOfArray(тСУМКОН, Позиции);
     kk=1;
     ProgressPos(kk);
     while тНФАКОД[kk]<>"" do
       КОДСЧТ=тНФАСЧ6[kk]; -- ???.??                len=06
       КОДИСТ=тНФАИСТ[kk]; -- ?                     len=01 - 1, 2, З
       КОДКБК=тНФАКБК[kk]; -- ???.????.???????.???  len=20
       --
       SumОстНач=тСУМОСТ[kk];
       SumПрхДеб=тСУМДПО[kk];
       SumВнпДеб=тСУМДВП[kk];
       SumОбоДеб=тСУМДЕБ[kk];
       SumРсхКре=тСУМКРО[kk];
       SumВнпКре=тСУМКВП[kk];
       SumОбоКре=тСУМКРЕ[kk];
       SumОстКон=тСУМКОН[kk];
       --
       KolОстНач=тКОЛОСТ[kk];
       KolПрхДеб=тКОЛДПО[kk];
       KolВнпДеб=тКОЛДВП[kk];
       KolОбоДеб=тКОЛДЕБ[kk];
       KolРсхКре=тКОЛКРО[kk];
       KolВнпКре=тКОЛКВП[kk];
       KolОбоКре=тКОЛКРЕ[kk];
       KolОстКон=тКОЛКОН[kk];
       --
       -- ЗАКЛЮЧИТЕЛЬНЫЕ ИТОГИ
       ЗаключительныеИтогиТаблицаN1(КОДСЧТ, SumОстНач, SumПрхДеб, SumВнпДеб, SumОбоДеб, SumРсхКре, SumВнпКре, SumОбоКре, SumОстКон); --Заключительные итоги - таблица N1
       ЗаключительныеИтогиТаблицаN2(КОДИСТ, SumОстНач, SumПрхДеб, SumВнпДеб, SumОбоДеб, SumРсхКре, SumВнпКре, SumОбоКре, SumОстКон); --Заключительные итоги - таблица N2
       ЗаключительныеИтогиТаблицаN3(КОДКБК, SumОстНач, SumПрхДеб, SumВнпДеб, SumОбоДеб, SumРсхКре, SumВнпКре, SumОбоКре, SumОстКон); --Заключительные итоги - таблица N3
       -- ***********************
       -- * ПРОМЕЖУТОЧНЫЕ ИТОГИ *
       -- ***********************
       if ЕстьИерархическаяГруппировка:
         Value="";
         valFLD1=""; valFLD2=""; valFLD3=""; valFLD4=""; valFLD5=""; valFLD6=""; valFLD7=""; valFLD8="";
         valKEY1=""; valKEY2=""; valKEY3=""; valKEY4=""; valKEY5=""; valKEY6=""; valKEY7=""; valKEY8="";
         -- fldKEY1
         if fldKEY1<>"":
           if Pos(Chr(183)+"1", fldKEY1)>0:
             tmp=тМОЛИМЯ[kk]+Chr(169)+тМОЛКОД[kk];
             xx=SearchInArray(aHdrFldSRT, tmp, True, 1);
             if xx>0: valFLD1=Chr(183)+"1"+Format("%.10d", xx); fi;
           |  Pos(Chr(183)+"2", fldKEY1)>0:
             tmp=тМХЭИМЯ[kk]+Chr(169)+тМХЭКОД[kk];
             xx=SearchInArray(aHdrFldSRT, tmp, True, 1);
             if xx>0: valFLD1=Chr(183)+"2"+Format("%.10d", xx); fi;
           |  Pos(Chr(183)+"3", fldKEY1)>0:
             tmp=тДОПИМЯ[kk]+Chr(169)+тДОПКОД[kk];
             xx=SearchInArray(aHdrFldSRT, tmp, True, 1);
             if xx>0: valFLD1=Chr(183)+"3"+Format("%.10d", xx); fi;
           else
             Try valFLD1=GetVariableS(fldKEY1+"["+Str(kk)+"]"); Except end;
           fi;
         fi;
         -- fldKEY2
         if fldKEY2<>"":
           if Pos(Chr(183)+"1", fldKEY2)>0:
             tmp=тМОЛИМЯ[kk]+Chr(169)+тМОЛКОД[kk];
             xx=SearchInArray(aHdrFldSRT, tmp, True, 1);
             if xx>0: valFLD2=Chr(183)+"1"+Format("%.10d", xx); fi;
           |  Pos(Chr(183)+"2", fldKEY2)>0:
             tmp=тМХЭИМЯ[kk]+Chr(169)+тМХЭКОД[kk];
             xx=SearchInArray(aHdrFldSRT, tmp, True, 1);
             if xx>0: valFLD2=Chr(183)+"2"+Format("%.10d", xx); fi;
           |  Pos(Chr(183)+"3", fldKEY2)>0:
             tmp=тДОПИМЯ[kk]+Chr(169)+тДОПКОД[kk];
             xx=SearchInArray(aHdrFldSRT, tmp, True, 1);
             if xx>0: valFLD2=Chr(183)+"3"+Format("%.10d", xx); fi;
           else
             Try valFLD2=GetVariableS(fldKEY2+"["+Str(kk)+"]"); Except end;
           fi;
         fi;
         -- fldKEY3
         if fldKEY3<>"":
           if Pos(Chr(183)+"1", fldKEY3)>0:
             tmp=тМОЛИМЯ[kk]+Chr(169)+тМОЛКОД[kk];
             xx=SearchInArray(aHdrFldSRT, tmp, True, 1);
             if xx>0: valFLD3=Chr(183)+"1"+Format("%.10d", xx); fi;
           |  Pos(Chr(183)+"2", fldKEY3)>0:
             tmp=тМХЭИМЯ[kk]+Chr(169)+тМХЭКОД[kk];
             xx=SearchInArray(aHdrFldSRT, tmp, True, 1);
             if xx>0: valFLD3=Chr(183)+"2"+Format("%.10d", xx); fi;
           |  Pos(Chr(183)+"3", fldKEY3)>0:
             tmp=тДОПИМЯ[kk]+Chr(169)+тДОПКОД[kk];
             xx=SearchInArray(aHdrFldSRT, tmp, True, 1);
             if xx>0: valFLD3=Chr(183)+"3"+Format("%.10d", xx); fi;
           else
             Try valFLD3=GetVariableS(fldKEY3+"["+Str(kk)+"]"); Except end;
           fi;
         fi;
         -- fldKEY4
         if fldKEY4<>"":
           if Pos(Chr(183)+"1", fldKEY4)>0:
             tmp=тМОЛИМЯ[kk]+Chr(169)+тМОЛКОД[kk];
             xx=SearchInArray(aHdrFldSRT, tmp, True, 1);
             if xx>0: valFLD4=Chr(183)+"1"+Format("%.10d", xx); fi;
           |  Pos(Chr(183)+"2", fldKEY4)>0:
             tmp=тМХЭИМЯ[kk]+Chr(169)+тМХЭКОД[kk];
             xx=SearchInArray(aHdrFldSRT, tmp, True, 1);
             if xx>0: valFLD4=Chr(183)+"2"+Format("%.10d", xx); fi;
           |  Pos(Chr(183)+"3", fldKEY4)>0:
             tmp=тДОПИМЯ[kk]+Chr(169)+тДОПКОД[kk];
             xx=SearchInArray(aHdrFldSRT, tmp, True, 1);
             if xx>0: valFLD4=Chr(183)+"3"+Format("%.10d", xx); fi;
           else
             Try valFLD4=GetVariableS(fldKEY4+"["+Str(kk)+"]"); Except end;
           fi;
         fi;
         -- fldKEY5
         if fldKEY5<>"":
           if Pos(Chr(183)+"1", fldKEY5)>0:
             tmp=тМОЛИМЯ[kk]+Chr(169)+тМОЛКОД[kk];
             xx=SearchInArray(aHdrFldSRT, tmp, True, 1);
             if xx>0: valFLD5=Chr(183)+"1"+Format("%.10d", xx); fi;
           |  Pos(Chr(183)+"2", fldKEY5)>0:
             tmp=тМХЭИМЯ[kk]+Chr(169)+тМХЭКОД[kk];
             xx=SearchInArray(aHdrFldSRT, tmp, True, 1);
             if xx>0: valFLD5=Chr(183)+"2"+Format("%.10d", xx); fi;
           |  Pos(Chr(183)+"3", fldKEY5)>0:
             tmp=тДОПИМЯ[kk]+Chr(169)+тДОПКОД[kk];
             xx=SearchInArray(aHdrFldSRT, tmp, True, 1);
             if xx>0: valFLD5=Chr(183)+"3"+Format("%.10d", xx); fi;
           else
             Try valFLD5=GetVariableS(fldKEY5+"["+Str(kk)+"]"); Except end;
           fi;
         fi;
         -- fldKEY6
         if fldKEY6<>"":
           if Pos(Chr(183)+"1", fldKEY6)>0:
             tmp=тМОЛИМЯ[kk]+Chr(169)+тМОЛКОД[kk];
             xx=SearchInArray(aHdrFldSRT, tmp, True, 1);
             if xx>0: valFLD6=Chr(183)+"1"+Format("%.10d", xx); fi;
           |  Pos(Chr(183)+"2", fldKEY6)>0:
             tmp=тМХЭИМЯ[kk]+Chr(169)+тМХЭКОД[kk];
             xx=SearchInArray(aHdrFldSRT, tmp, True, 1);
             if xx>0: valFLD6=Chr(183)+"2"+Format("%.10d", xx); fi;
           |  Pos(Chr(183)+"3", fldKEY6)>0:
             tmp=тДОПИМЯ[kk]+Chr(169)+тДОПКОД[kk];
             xx=SearchInArray(aHdrFldSRT, tmp, True, 1);
             if xx>0: valFLD6=Chr(183)+"3"+Format("%.10d", xx); fi;
           else
             Try valFLD6=GetVariableS(fldKEY6+"["+Str(kk)+"]"); Except end;
           fi;
         fi;
         -- fldKEY7
         if fldKEY7<>"":
           if Pos(Chr(183)+"1", fldKEY7)>0:
             tmp=тМОЛИМЯ[kk]+Chr(169)+тМОЛКОД[kk];
             xx=SearchInArray(aHdrFldSRT, tmp, True, 1);
             if xx>0: valFLD7=Chr(183)+"1"+Format("%.10d", xx); fi;
           |  Pos(Chr(183)+"2", fldKEY7)>0:
             tmp=тМХЭИМЯ[kk]+Chr(169)+тМХЭКОД[kk];
             xx=SearchInArray(aHdrFldSRT, tmp, True, 1);
             if xx>0: valFLD7=Chr(183)+"2"+Format("%.10d", xx); fi;
           |  Pos(Chr(183)+"3", fldKEY7)>0:
             tmp=тДОПИМЯ[kk]+Chr(169)+тДОПКОД[kk];
             xx=SearchInArray(aHdrFldSRT, tmp, True, 1);
             if xx>0: valFLD7=Chr(183)+"3"+Format("%.10d", xx); fi;
           else
             Try valFLD7=GetVariableS(fldKEY7+"["+Str(kk)+"]"); Except end;
           fi;
         fi;
         -- fldKEY8
         if fldKEY8<>"":
           if Pos(Chr(183)+"1", fldKEY8)>0:
             tmp=тМОЛИМЯ[kk]+Chr(169)+тМОЛКОД[kk];
             xx=SearchInArray(aHdrFldSRT, tmp, True, 1);
             if xx>0: valFLD8=Chr(183)+"1"+Format("%.10d", xx); fi;
           |  Pos(Chr(183)+"2", fldKEY8)>0:
             tmp=тМХЭИМЯ[kk]+Chr(169)+тМХЭКОД[kk];
             xx=SearchInArray(aHdrFldSRT, tmp, True, 1);
             if xx>0: valFLD8=Chr(183)+"2"+Format("%.10d", xx); fi;
           |  Pos(Chr(183)+"3", fldKEY8)>0:
             tmp=тДОПИМЯ[kk]+Chr(169)+тДОПКОД[kk];
             xx=SearchInArray(aHdrFldSRT, tmp, True, 1);
             if xx>0: valFLD8=Chr(183)+"3"+Format("%.10d", xx); fi;
           else
             Try valFLD8=GetVariableS(fldKEY8+"["+Str(kk)+"]"); Except end;
           fi;
         fi;
         --Формирование строки узла иерархии { Элемент1|Элемент2|Элемент3|Элемент4|Элемент5|Элемент6|Элемент7|Элемент8 }
         if valFLD1<>"":                                                                                                                 valKEY1=Up(valFLD1+"# # # # # # # # ")+LnFn;                                                                       else valKEY1=""; fi;
         if valFLD1<>"" and valFLD2<>"":                                                                                                 valKEY2=Up(valFLD1+"#"+valFLD2+"# # # # # # # ")+LnFn;                                                             else valKEY2=""; fi;
         if valFLD1<>"" and valFLD2<>"" and valFLD3<>"":                                                                                 valKEY3=Up(valFLD1+"#"+valFLD2+"#"+valFLD3+"# # # # # # ")+LnFn;                                                   else valKEY3=""; fi;
         if valFLD1<>"" and valFLD2<>"" and valFLD3<>"" and valFLD4<>"":                                                                 valKEY4=Up(valFLD1+"#"+valFLD2+"#"+valFLD3+"#"+valFLD4+"# # # # # ")+LnFn;                                         else valKEY4=""; fi;
         if valFLD1<>"" and valFLD2<>"" and valFLD3<>"" and valFLD4<>"" and valFLD5<>"":                                                 valKEY5=Up(valFLD1+"#"+valFLD2+"#"+valFLD3+"#"+valFLD4+"#"+valFLD5+"# # # # ")+LnFn;                               else valKEY5=""; fi;
         if valFLD1<>"" and valFLD2<>"" and valFLD3<>"" and valFLD4<>"" and valFLD5<>"" and valFLD6<>"":                                 valKEY6=Up(valFLD1+"#"+valFLD2+"#"+valFLD3+"#"+valFLD4+"#"+valFLD5+"#"+valFLD6+"# # # ")+LnFn;                     else valKEY6=""; fi;
         if valFLD1<>"" and valFLD2<>"" and valFLD3<>"" and valFLD4<>"" and valFLD5<>"" and valFLD6<>"" and valFLD7<>"":                 valKEY7=Up(valFLD1+"#"+valFLD2+"#"+valFLD3+"#"+valFLD4+"#"+valFLD5+"#"+valFLD6+"#"+valFLD7+"# # ")+LnFn;           else valKEY7=""; fi;
         if valFLD1<>"" and valFLD2<>"" and valFLD3<>"" and valFLD4<>"" and valFLD5<>"" and valFLD6<>"" and valFLD7<>"" and valFLD8<>"": valKEY8=Up(valFLD1+"#"+valFLD2+"#"+valFLD3+"#"+valFLD4+"#"+valFLD5+"#"+valFLD6+"#"+valFLD7+"#"+valFLD8+"# ")+LnFn; else valKEY8=""; fi;
         --
         if ordГРП<>0:
           if ordГРП=1: valKГР1=Up(ExtractWord(1, valFLD1, "$")+"$*"+"# # # # # # # # ")+LnFn;
           |  ordГРП=2: valKГР2=Up(valFLD1+"#"+ExtractWord(1, valFLD2, "$")+"$*"+"# # # # # # # ")+LnFn;
           |  ordГРП=3: valKГР3=Up(valFLD1+"#"+valFLD2+"#"+ExtractWord(1, valFLD3, "$")+"$*"+"# # # # # # ")+LnFn;
           |  ordГРП=4: valKГР4=Up(valFLD1+"#"+valFLD2+"#"+valFLD3+"#"+ExtractWord(1, valFLD4, "$")+"$*"+"# # # # # ")+LnFn;
           |  ordГРП=5: valKГР5=Up(valFLD1+"#"+valFLD2+"#"+valFLD3+"#"+valFLD4+"#"+ExtractWord(1, valFLD5, "$")+"$*"+"# # # # ")+LnFn;
           |  ordГРП=6: valKГР6=Up(valFLD1+"#"+valFLD2+"#"+valFLD3+"#"+valFLD4+"#"+valFLD5+"#"+ExtractWord(1, valFLD6, "$")+"$*"+"# # # ")+LnFn;
           |  ordГРП=7: valKГР7=Up(valFLD1+"#"+valFLD2+"#"+valFLD3+"#"+valFLD4+"#"+valFLD5+"#"+valFLD6+"#"+ExtractWord(1, valFLD7, "$")+"$*"+"# # ")+LnFn;
           |  ordГРП=8: valKГР8=Up(valFLD1+"#"+valFLD2+"#"+valFLD3+"#"+valFLD4+"#"+valFLD5+"#"+valFLD6+"#"+valFLD7+"#"+ExtractWord(1, valFLD8, "$")+"$*"+"# ")+LnFn;
           else
             valKГР1=""; valKГР2=""; valKГР3=""; valKГР4=""; valKГР5=""; valKГР6=""; valKГР7=""; valKГР8="";
           fi;
         else
           valKГР1=""; valKГР2=""; valKГР3=""; valKГР4=""; valKГР5=""; valKГР6=""; valKГР7=""; valKГР8="";
         fi;
         --
         --ДОБАВЛЕНИЕ ГРУППЫ ИДЕТ ПЕРЕД ВЫБРАННЫМ ЭЛЕМЕНТОМ (СОРТИРОВКА)
         if valKEY1<>"" and fldKEY1<>"":
           jj=SearchInArray(тSRTFLD, valKEY1, True, 1);
           if jj>0: -- накапливаем результат по разделу
             xx=jj;
             тСУМДПО[xx]=тСУМДПО[xx]+SumПрхДеб; тСУМКРО[xx]=тСУМКРО[xx]+SumРсхКре; тСУМОСТ[xx]=тСУМОСТ[xx]+SumОстНач;
             тКОЛДПО[xx]=тКОЛДПО[xx]+KolПрхДеб; тКОЛКРО[xx]=тКОЛКРО[xx]+KolРсхКре; тКОЛОСТ[xx]=тКОЛОСТ[xx]+KolОстНач;
             тСУМДВП[xx]=тСУМДВП[xx]+SumВнпДеб; тСУМКВП[xx]=тСУМКВП[xx]+SumВнпКре; тСУМКОН[xx]=тСУМКОН[xx]+SumОстКон;
             тКОЛДВП[xx]=тКОЛДВП[xx]+KolВнпДеб; тКОЛКВП[xx]=тКОЛКВП[xx]+KolВнпКре; тКОЛКОН[xx]=тКОЛКОН[xx]+KolОстКон;
             тСУМДЕБ[xx]=тСУМДЕБ[xx]+SumОбоДеб; тСУМКРЕ[xx]=тСУМКРЕ[xx]+SumОбоКре;
             тКОЛДЕБ[xx]=тКОЛДЕБ[xx]+KolОбоДеб; тКОЛКРЕ[xx]=тКОЛКРЕ[xx]+KolОбоКре;
           else -- добавление нового узла иерархии
             xx=InsertInArraySort(тSRTFLD, valKEY1);
             Value=ВзятьИмяПараметраИерархическойГруппы(fldKEY1, xx, False, VconstНФА100П, VconstНФА_ИНВ);
             if Value="": Value=valFLD1; fi;
             --
             InsertInArray(тНФАИМЯ, xx, Value);
             --
             InsertInArray(тСУМДПО, xx, SumПрхДеб); InsertInArray(тСУМКРО, xx, SumРсхКре); InsertInArray(тСУМОСТ, xx, SumОстНач);
             InsertInArray(тКОЛДПО, xx, KolПрхДеб); InsertInArray(тКОЛКРО, xx, KolРсхКре); InsertInArray(тКОЛОСТ, xx, KolОстНач);
             InsertInArray(тСУМДВП, xx, SumВнпДеб); InsertInArray(тСУМКВП, xx, SumВнпКре); InsertInArray(тСУМКОН, xx, SumОстКон);
             InsertInArray(тКОЛДВП, xx, KolВнпДеб); InsertInArray(тКОЛКВП, xx, KolВнпКре); InsertInArray(тКОЛКОН, xx, KolОстКон);
             InsertInArray(тСУМДЕБ, xx, SumОбоДеб); InsertInArray(тСУМКРЕ, xx, SumОбоКре);
             InsertInArray(тКОЛДЕБ, xx, KolОбоДеб); InsertInArray(тКОЛКРЕ, xx, KolОбоКре);
             --
             InsertInArray(тНФАГРК, xx, ""); InsertInArray(тМОЛКОД, xx, ""); InsertInArray(тНФАИСТ, xx, "");
             InsertInArray(тНФАГРИ, xx, ""); InsertInArray(тМОЛИМЯ, xx, ""); InsertInArray(тНФАКБК, xx, "");
             InsertInArray(тНФАЕДИ, xx, ""); InsertInArray(тМХЭКОД, xx, ""); InsertInArray(тНФАСЧ6, xx, "");
             InsertInArray(тНФАУЧН, xx, ""); InsertInArray(тМХЭИМЯ, xx, ""); InsertInArray(тНФАТИП, xx, "");
             InsertInArray(тНФАИНВ, xx, ""); InsertInArray(тДОПКОД, xx, ""); InsertInArray(тНЕТУЧН, xx, False);
             InsertInArray(тНФАКОД, xx, ""); InsertInArray(тДОПИМЯ, xx, "");
             --
             kk=kk+1; -- сдвинулись на единицу в связи с добавлением нового узла иерархии
             ProgressPos(kk);
           fi;
           if ordГРП=1 and valKГР1<>"":
             jj=SearchInArray(тSRTFLD, valKГР1, True, 1);
             if jj>0: -- накапливаем результат по разделу
               xx=jj;
               тСУМДПО[xx]=тСУМДПО[xx]+SumПрхДеб; тСУМКРО[xx]=тСУМКРО[xx]+SumРсхКре; тСУМОСТ[xx]=тСУМОСТ[xx]+SumОстНач;
               тКОЛДПО[xx]=тКОЛДПО[xx]+KolПрхДеб; тКОЛКРО[xx]=тКОЛКРО[xx]+KolРсхКре; тКОЛОСТ[xx]=тКОЛОСТ[xx]+KolОстНач;
               тСУМДВП[xx]=тСУМДВП[xx]+SumВнпДеб; тСУМКВП[xx]=тСУМКВП[xx]+SumВнпКре; тСУМКОН[xx]=тСУМКОН[xx]+SumОстКон;
               тКОЛДВП[xx]=тКОЛДВП[xx]+KolВнпДеб; тКОЛКВП[xx]=тКОЛКВП[xx]+KolВнпКре; тКОЛКОН[xx]=тКОЛКОН[xx]+KolОстКон;
               тСУМДЕБ[xx]=тСУМДЕБ[xx]+SumОбоДеб; тСУМКРЕ[xx]=тСУМКРЕ[xx]+SumОбоКре;
               тКОЛДЕБ[xx]=тКОЛДЕБ[xx]+KolОбоДеб; тКОЛКРЕ[xx]=тКОЛКРЕ[xx]+KolОбоКре;
             else -- добавление нового узла иерархии
               xx=InsertInArraySort(тSRTFLD, valKГР1);
               Value=ВзятьИмяПараметраИерархическойГруппы(fldKEY1, xx, True, VconstНФА100П, VconstНФА_ИНВ);
               if Value="": Value=valFLD1; fi;
               --
               InsertInArray(тНФАИМЯ, xx, Value);
               --
               InsertInArray(тСУМДПО, xx, SumПрхДеб); InsertInArray(тСУМКРО, xx, SumРсхКре); InsertInArray(тСУМОСТ, xx, SumОстНач);
               InsertInArray(тКОЛДПО, xx, KolПрхДеб); InsertInArray(тКОЛКРО, xx, KolРсхКре); InsertInArray(тКОЛОСТ, xx, KolОстНач);
               InsertInArray(тСУМДВП, xx, SumВнпДеб); InsertInArray(тСУМКВП, xx, SumВнпКре); InsertInArray(тСУМКОН, xx, SumОстКон);
               InsertInArray(тКОЛДВП, xx, KolВнпДеб); InsertInArray(тКОЛКВП, xx, KolВнпКре); InsertInArray(тКОЛКОН, xx, KolОстКон);
               InsertInArray(тСУМДЕБ, xx, SumОбоДеб); InsertInArray(тСУМКРЕ, xx, SumОбоКре);
               InsertInArray(тКОЛДЕБ, xx, KolОбоДеб); InsertInArray(тКОЛКРЕ, xx, KolОбоКре);
               --
               InsertInArray(тНФАГРК, xx, ""); InsertInArray(тМОЛКОД, xx, ""); InsertInArray(тНФАИСТ, xx, "");
               InsertInArray(тНФАГРИ, xx, ""); InsertInArray(тМОЛИМЯ, xx, ""); InsertInArray(тНФАКБК, xx, "");
               InsertInArray(тНФАЕДИ, xx, ""); InsertInArray(тМХЭКОД, xx, ""); InsertInArray(тНФАСЧ6, xx, "");
               InsertInArray(тНФАУЧН, xx, ""); InsertInArray(тМХЭИМЯ, xx, ""); InsertInArray(тНФАТИП, xx, "");
               InsertInArray(тНФАИНВ, xx, ""); InsertInArray(тДОПКОД, xx, ""); InsertInArray(тНЕТУЧН, xx, False);
               InsertInArray(тНФАКОД, xx, ""); InsertInArray(тДОПИМЯ, xx, "");
               --
               kk=kk+1; -- сдвинулись на единицу в связи с добавлением нового узла иерархии
               ProgressPos(kk);
             fi;
           fi;
         fi; --valKEY1<>"" and fldKEY1<>""
         if valKEY2<>"" and fldKEY2<>"":
           jj=SearchInArray(тSRTFLD, valKEY2, True, 1);
           if jj>0: -- накапливаем результат по разделу
             xx=jj;
             тСУМДПО[xx]=тСУМДПО[xx]+SumПрхДеб; тСУМКРО[xx]=тСУМКРО[xx]+SumРсхКре; тСУМОСТ[xx]=тСУМОСТ[xx]+SumОстНач;
             тКОЛДПО[xx]=тКОЛДПО[xx]+KolПрхДеб; тКОЛКРО[xx]=тКОЛКРО[xx]+KolРсхКре; тКОЛОСТ[xx]=тКОЛОСТ[xx]+KolОстНач;
             тСУМДВП[xx]=тСУМДВП[xx]+SumВнпДеб; тСУМКВП[xx]=тСУМКВП[xx]+SumВнпКре; тСУМКОН[xx]=тСУМКОН[xx]+SumОстКон;
             тКОЛДВП[xx]=тКОЛДВП[xx]+KolВнпДеб; тКОЛКВП[xx]=тКОЛКВП[xx]+KolВнпКре; тКОЛКОН[xx]=тКОЛКОН[xx]+KolОстКон;
             тСУМДЕБ[xx]=тСУМДЕБ[xx]+SumОбоДеб; тСУМКРЕ[xx]=тСУМКРЕ[xx]+SumОбоКре;
             тКОЛДЕБ[xx]=тКОЛДЕБ[xx]+KolОбоДеб; тКОЛКРЕ[xx]=тКОЛКРЕ[xx]+KolОбоКре;
           else -- добавление нового узла иерархии
             xx=InsertInArraySort(тSRTFLD, valKEY2);
             Value=ВзятьИмяПараметраИерархическойГруппы(fldKEY2, xx, False, VconstНФА100П, VconstНФА_ИНВ);
             if Value="": Value=valFLD2; fi;
             --
             InsertInArray(тНФАИМЯ, xx, Value);
             --
             InsertInArray(тСУМДПО, xx, SumПрхДеб); InsertInArray(тСУМКРО, xx, SumРсхКре); InsertInArray(тСУМОСТ, xx, SumОстНач);
             InsertInArray(тКОЛДПО, xx, KolПрхДеб); InsertInArray(тКОЛКРО, xx, KolРсхКре); InsertInArray(тКОЛОСТ, xx, KolОстНач);
             InsertInArray(тСУМДВП, xx, SumВнпДеб); InsertInArray(тСУМКВП, xx, SumВнпКре); InsertInArray(тСУМКОН, xx, SumОстКон);
             InsertInArray(тКОЛДВП, xx, KolВнпДеб); InsertInArray(тКОЛКВП, xx, KolВнпКре); InsertInArray(тКОЛКОН, xx, KolОстКон);
             InsertInArray(тСУМДЕБ, xx, SumОбоДеб); InsertInArray(тСУМКРЕ, xx, SumОбоКре);
             InsertInArray(тКОЛДЕБ, xx, KolОбоДеб); InsertInArray(тКОЛКРЕ, xx, KolОбоКре);
             --
             InsertInArray(тНФАГРК, xx, ""); InsertInArray(тМОЛКОД, xx, ""); InsertInArray(тНФАИСТ, xx, "");
             InsertInArray(тНФАГРИ, xx, ""); InsertInArray(тМОЛИМЯ, xx, ""); InsertInArray(тНФАКБК, xx, "");
             InsertInArray(тНФАЕДИ, xx, ""); InsertInArray(тМХЭКОД, xx, ""); InsertInArray(тНФАСЧ6, xx, "");
             InsertInArray(тНФАУЧН, xx, ""); InsertInArray(тМХЭИМЯ, xx, ""); InsertInArray(тНФАТИП, xx, "");
             InsertInArray(тНФАИНВ, xx, ""); InsertInArray(тДОПКОД, xx, ""); InsertInArray(тНЕТУЧН, xx, False);
             InsertInArray(тНФАКОД, xx, ""); InsertInArray(тДОПИМЯ, xx, "");
             --
             kk=kk+1; -- сдвинулись на единицу в связи с добавлением нового узла иерархии
             ProgressPos(kk);
           fi;
           if ordГРП=2 and valKГР2<>"":
             jj=SearchInArray(тSRTFLD, valKГР2, True, 1);
             if jj>0: -- накапливаем результат по разделу
               xx=jj;
               тСУМДПО[xx]=тСУМДПО[xx]+SumПрхДеб; тСУМКРО[xx]=тСУМКРО[xx]+SumРсхКре; тСУМОСТ[xx]=тСУМОСТ[xx]+SumОстНач;
               тКОЛДПО[xx]=тКОЛДПО[xx]+KolПрхДеб; тКОЛКРО[xx]=тКОЛКРО[xx]+KolРсхКре; тКОЛОСТ[xx]=тКОЛОСТ[xx]+KolОстНач;
               тСУМДВП[xx]=тСУМДВП[xx]+SumВнпДеб; тСУМКВП[xx]=тСУМКВП[xx]+SumВнпКре; тСУМКОН[xx]=тСУМКОН[xx]+SumОстКон;
               тКОЛДВП[xx]=тКОЛДВП[xx]+KolВнпДеб; тКОЛКВП[xx]=тКОЛКВП[xx]+KolВнпКре; тКОЛКОН[xx]=тКОЛКОН[xx]+KolОстКон;
               тСУМДЕБ[xx]=тСУМДЕБ[xx]+SumОбоДеб; тСУМКРЕ[xx]=тСУМКРЕ[xx]+SumОбоКре;
               тКОЛДЕБ[xx]=тКОЛДЕБ[xx]+KolОбоДеб; тКОЛКРЕ[xx]=тКОЛКРЕ[xx]+KolОбоКре;
             else -- добавление нового узла иерархии
               xx=InsertInArraySort(тSRTFLD, valKГР2);
               Value=ВзятьИмяПараметраИерархическойГруппы(fldKEY2, xx, True, VconstНФА100П, VconstНФА_ИНВ);
               if Value="": Value=valFLD2; fi;
               --
               InsertInArray(тНФАИМЯ, xx, Value);
               --
               InsertInArray(тСУМДПО, xx, SumПрхДеб); InsertInArray(тСУМКРО, xx, SumРсхКре); InsertInArray(тСУМОСТ, xx, SumОстНач);
               InsertInArray(тКОЛДПО, xx, KolПрхДеб); InsertInArray(тКОЛКРО, xx, KolРсхКре); InsertInArray(тКОЛОСТ, xx, KolОстНач);
               InsertInArray(тСУМДВП, xx, SumВнпДеб); InsertInArray(тСУМКВП, xx, SumВнпКре); InsertInArray(тСУМКОН, xx, SumОстКон);
               InsertInArray(тКОЛДВП, xx, KolВнпДеб); InsertInArray(тКОЛКВП, xx, KolВнпКре); InsertInArray(тКОЛКОН, xx, KolОстКон);
               InsertInArray(тСУМДЕБ, xx, SumОбоДеб); InsertInArray(тСУМКРЕ, xx, SumОбоКре);
               InsertInArray(тКОЛДЕБ, xx, KolОбоДеб); InsertInArray(тКОЛКРЕ, xx, KolОбоКре);
               --
               InsertInArray(тНФАГРК, xx, ""); InsertInArray(тМОЛКОД, xx, ""); InsertInArray(тНФАИСТ, xx, "");
               InsertInArray(тНФАГРИ, xx, ""); InsertInArray(тМОЛИМЯ, xx, ""); InsertInArray(тНФАКБК, xx, "");
               InsertInArray(тНФАЕДИ, xx, ""); InsertInArray(тМХЭКОД, xx, ""); InsertInArray(тНФАСЧ6, xx, "");
               InsertInArray(тНФАУЧН, xx, ""); InsertInArray(тМХЭИМЯ, xx, ""); InsertInArray(тНФАТИП, xx, "");
               InsertInArray(тНФАИНВ, xx, ""); InsertInArray(тДОПКОД, xx, ""); InsertInArray(тНЕТУЧН, xx, False);
               InsertInArray(тНФАКОД, xx, ""); InsertInArray(тДОПИМЯ, xx, "");
               --
               kk=kk+1; -- сдвинулись на единицу в связи с добавлением нового узла иерархии
               ProgressPos(kk);
             fi;
           fi;
         fi; --valKEY2<>"" and fldKEY2<>""
         if valKEY3<>"" and fldKEY3<>"":
           jj=SearchInArray(тSRTFLD, valKEY3, True, 1);
           if jj>0: -- накапливаем результат по разделу
             xx=jj;
             тСУМДПО[xx]=тСУМДПО[xx]+SumПрхДеб; тСУМКРО[xx]=тСУМКРО[xx]+SumРсхКре; тСУМОСТ[xx]=тСУМОСТ[xx]+SumОстНач;
             тКОЛДПО[xx]=тКОЛДПО[xx]+KolПрхДеб; тКОЛКРО[xx]=тКОЛКРО[xx]+KolРсхКре; тКОЛОСТ[xx]=тКОЛОСТ[xx]+KolОстНач;
             тСУМДВП[xx]=тСУМДВП[xx]+SumВнпДеб; тСУМКВП[xx]=тСУМКВП[xx]+SumВнпКре; тСУМКОН[xx]=тСУМКОН[xx]+SumОстКон;
             тКОЛДВП[xx]=тКОЛДВП[xx]+KolВнпДеб; тКОЛКВП[xx]=тКОЛКВП[xx]+KolВнпКре; тКОЛКОН[xx]=тКОЛКОН[xx]+KolОстКон;
             тСУМДЕБ[xx]=тСУМДЕБ[xx]+SumОбоДеб; тСУМКРЕ[xx]=тСУМКРЕ[xx]+SumОбоКре;
             тКОЛДЕБ[xx]=тКОЛДЕБ[xx]+KolОбоДеб; тКОЛКРЕ[xx]=тКОЛКРЕ[xx]+KolОбоКре;
           else -- добавление нового узла иерархии
             xx=InsertInArraySort(тSRTFLD, valKEY3);
             Value=ВзятьИмяПараметраИерархическойГруппы(fldKEY3, xx, False, VconstНФА100П, VconstНФА_ИНВ);
             if Value="": Value=valFLD3; fi;
             --
             InsertInArray(тНФАИМЯ, xx, Value);
             --
             InsertInArray(тСУМДПО, xx, SumПрхДеб); InsertInArray(тСУМКРО, xx, SumРсхКре); InsertInArray(тСУМОСТ, xx, SumОстНач);
             InsertInArray(тКОЛДПО, xx, KolПрхДеб); InsertInArray(тКОЛКРО, xx, KolРсхКре); InsertInArray(тКОЛОСТ, xx, KolОстНач);
             InsertInArray(тСУМДВП, xx, SumВнпДеб); InsertInArray(тСУМКВП, xx, SumВнпКре); InsertInArray(тСУМКОН, xx, SumОстКон);
             InsertInArray(тКОЛДВП, xx, KolВнпДеб); InsertInArray(тКОЛКВП, xx, KolВнпКре); InsertInArray(тКОЛКОН, xx, KolОстКон);
             InsertInArray(тСУМДЕБ, xx, SumОбоДеб); InsertInArray(тСУМКРЕ, xx, SumОбоКре);
             InsertInArray(тКОЛДЕБ, xx, KolОбоДеб); InsertInArray(тКОЛКРЕ, xx, KolОбоКре);
             --
             InsertInArray(тНФАГРК, xx, ""); InsertInArray(тМОЛКОД, xx, ""); InsertInArray(тНФАИСТ, xx, "");
             InsertInArray(тНФАГРИ, xx, ""); InsertInArray(тМОЛИМЯ, xx, ""); InsertInArray(тНФАКБК, xx, "");
             InsertInArray(тНФАЕДИ, xx, ""); InsertInArray(тМХЭКОД, xx, ""); InsertInArray(тНФАСЧ6, xx, "");
             InsertInArray(тНФАУЧН, xx, ""); InsertInArray(тМХЭИМЯ, xx, ""); InsertInArray(тНФАТИП, xx, "");
             InsertInArray(тНФАИНВ, xx, ""); InsertInArray(тДОПКОД, xx, ""); InsertInArray(тНЕТУЧН, xx, False);
             InsertInArray(тНФАКОД, xx, ""); InsertInArray(тДОПИМЯ, xx, "");
             --
             kk=kk+1; -- сдвинулись на единицу в связи с добавлением нового узла иерархии
             ProgressPos(kk);
           fi;
           if ordГРП=3 and valKГР3<>"":
             jj=SearchInArray(тSRTFLD, valKГР3, True, 1);
             if jj>0: -- накапливаем результат по разделу
               xx=jj;
               тСУМДПО[xx]=тСУМДПО[xx]+SumПрхДеб; тСУМКРО[xx]=тСУМКРО[xx]+SumРсхКре; тСУМОСТ[xx]=тСУМОСТ[xx]+SumОстНач;
               тКОЛДПО[xx]=тКОЛДПО[xx]+KolПрхДеб; тКОЛКРО[xx]=тКОЛКРО[xx]+KolРсхКре; тКОЛОСТ[xx]=тКОЛОСТ[xx]+KolОстНач;
               тСУМДВП[xx]=тСУМДВП[xx]+SumВнпДеб; тСУМКВП[xx]=тСУМКВП[xx]+SumВнпКре; тСУМКОН[xx]=тСУМКОН[xx]+SumОстКон;
               тКОЛДВП[xx]=тКОЛДВП[xx]+KolВнпДеб; тКОЛКВП[xx]=тКОЛКВП[xx]+KolВнпКре; тКОЛКОН[xx]=тКОЛКОН[xx]+KolОстКон;
               тСУМДЕБ[xx]=тСУМДЕБ[xx]+SumОбоДеб; тСУМКРЕ[xx]=тСУМКРЕ[xx]+SumОбоКре;
               тКОЛДЕБ[xx]=тКОЛДЕБ[xx]+KolОбоДеб; тКОЛКРЕ[xx]=тКОЛКРЕ[xx]+KolОбоКре;
             else -- добавление нового узла иерархии
               xx=InsertInArraySort(тSRTFLD, valKГР3);
               Value=ВзятьИмяПараметраИерархическойГруппы(fldKEY3, xx, True, VconstНФА100П, VconstНФА_ИНВ);
               if Value="": Value=valFLD3; fi;
               --
               InsertInArray(тНФАИМЯ, xx, Value);
               --
               InsertInArray(тСУМДПО, xx, SumПрхДеб); InsertInArray(тСУМКРО, xx, SumРсхКре); InsertInArray(тСУМОСТ, xx, SumОстНач);
               InsertInArray(тКОЛДПО, xx, KolПрхДеб); InsertInArray(тКОЛКРО, xx, KolРсхКре); InsertInArray(тКОЛОСТ, xx, KolОстНач);
               InsertInArray(тСУМДВП, xx, SumВнпДеб); InsertInArray(тСУМКВП, xx, SumВнпКре); InsertInArray(тСУМКОН, xx, SumОстКон);
               InsertInArray(тКОЛДВП, xx, KolВнпДеб); InsertInArray(тКОЛКВП, xx, KolВнпКре); InsertInArray(тКОЛКОН, xx, KolОстКон);
               InsertInArray(тСУМДЕБ, xx, SumОбоДеб); InsertInArray(тСУМКРЕ, xx, SumОбоКре);
               InsertInArray(тКОЛДЕБ, xx, KolОбоДеб); InsertInArray(тКОЛКРЕ, xx, KolОбоКре);
               --
               InsertInArray(тНФАГРК, xx, ""); InsertInArray(тМОЛКОД, xx, ""); InsertInArray(тНФАИСТ, xx, "");
               InsertInArray(тНФАГРИ, xx, ""); InsertInArray(тМОЛИМЯ, xx, ""); InsertInArray(тНФАКБК, xx, "");
               InsertInArray(тНФАЕДИ, xx, ""); InsertInArray(тМХЭКОД, xx, ""); InsertInArray(тНФАСЧ6, xx, "");
               InsertInArray(тНФАУЧН, xx, ""); InsertInArray(тМХЭИМЯ, xx, ""); InsertInArray(тНФАТИП, xx, "");
               InsertInArray(тНФАИНВ, xx, ""); InsertInArray(тДОПКОД, xx, ""); InsertInArray(тНЕТУЧН, xx, False);
               InsertInArray(тНФАКОД, xx, ""); InsertInArray(тДОПИМЯ, xx, "");
               --
               kk=kk+1; -- сдвинулись на единицу в связи с добавлением нового узла иерархии
               ProgressPos(kk);
             fi;
           fi;
         fi; --valKEY3<>"" and fldKEY3<>""
         if valKEY4<>"" and fldKEY4<>"":
           jj=SearchInArray(тSRTFLD, valKEY4, True, 1);
           if jj>0: -- накапливаем результат по разделу
             xx=jj;
             тСУМДПО[xx]=тСУМДПО[xx]+SumПрхДеб; тСУМКРО[xx]=тСУМКРО[xx]+SumРсхКре; тСУМОСТ[xx]=тСУМОСТ[xx]+SumОстНач;
             тКОЛДПО[xx]=тКОЛДПО[xx]+KolПрхДеб; тКОЛКРО[xx]=тКОЛКРО[xx]+KolРсхКре; тКОЛОСТ[xx]=тКОЛОСТ[xx]+KolОстНач;
             тСУМДВП[xx]=тСУМДВП[xx]+SumВнпДеб; тСУМКВП[xx]=тСУМКВП[xx]+SumВнпКре; тСУМКОН[xx]=тСУМКОН[xx]+SumОстКон;
             тКОЛДВП[xx]=тКОЛДВП[xx]+KolВнпДеб; тКОЛКВП[xx]=тКОЛКВП[xx]+KolВнпКре; тКОЛКОН[xx]=тКОЛКОН[xx]+KolОстКон;
             тСУМДЕБ[xx]=тСУМДЕБ[xx]+SumОбоДеб; тСУМКРЕ[xx]=тСУМКРЕ[xx]+SumОбоКре;
             тКОЛДЕБ[xx]=тКОЛДЕБ[xx]+KolОбоДеб; тКОЛКРЕ[xx]=тКОЛКРЕ[xx]+KolОбоКре;
           else -- добавление нового узла иерархии
             xx=InsertInArraySort(тSRTFLD, valKEY4);
             Value=ВзятьИмяПараметраИерархическойГруппы(fldKEY4, xx, False, VconstНФА100П, VconstНФА_ИНВ);
             if Value="": Value=valFLD4; fi;
             --
             InsertInArray(тНФАИМЯ, xx, Value);
             --
             InsertInArray(тСУМДПО, xx, SumПрхДеб); InsertInArray(тСУМКРО, xx, SumРсхКре); InsertInArray(тСУМОСТ, xx, SumОстНач);
             InsertInArray(тКОЛДПО, xx, KolПрхДеб); InsertInArray(тКОЛКРО, xx, KolРсхКре); InsertInArray(тКОЛОСТ, xx, KolОстНач);
             InsertInArray(тСУМДВП, xx, SumВнпДеб); InsertInArray(тСУМКВП, xx, SumВнпКре); InsertInArray(тСУМКОН, xx, SumОстКон);
             InsertInArray(тКОЛДВП, xx, KolВнпДеб); InsertInArray(тКОЛКВП, xx, KolВнпКре); InsertInArray(тКОЛКОН, xx, KolОстКон);
             InsertInArray(тСУМДЕБ, xx, SumОбоДеб); InsertInArray(тСУМКРЕ, xx, SumОбоКре);
             InsertInArray(тКОЛДЕБ, xx, KolОбоДеб); InsertInArray(тКОЛКРЕ, xx, KolОбоКре);
             --
             InsertInArray(тНФАГРК, xx, ""); InsertInArray(тМОЛКОД, xx, ""); InsertInArray(тНФАИСТ, xx, "");
             InsertInArray(тНФАГРИ, xx, ""); InsertInArray(тМОЛИМЯ, xx, ""); InsertInArray(тНФАКБК, xx, "");
             InsertInArray(тНФАЕДИ, xx, ""); InsertInArray(тМХЭКОД, xx, ""); InsertInArray(тНФАСЧ6, xx, "");
             InsertInArray(тНФАУЧН, xx, ""); InsertInArray(тМХЭИМЯ, xx, ""); InsertInArray(тНФАТИП, xx, "");
             InsertInArray(тНФАИНВ, xx, ""); InsertInArray(тДОПКОД, xx, ""); InsertInArray(тНЕТУЧН, xx, False);
             InsertInArray(тНФАКОД, xx, ""); InsertInArray(тДОПИМЯ, xx, "");
             --
             kk=kk+1; -- сдвинулись на единицу в связи с добавлением нового узла иерархии
             ProgressPos(kk);
           fi;
           if ordГРП=4 and valKГР4<>"":
             jj=SearchInArray(тSRTFLD, valKГР4, True, 1);
             if jj>0: -- накапливаем результат по разделу
               xx=jj;
               тСУМДПО[xx]=тСУМДПО[xx]+SumПрхДеб; тСУМКРО[xx]=тСУМКРО[xx]+SumРсхКре; тСУМОСТ[xx]=тСУМОСТ[xx]+SumОстНач;
               тКОЛДПО[xx]=тКОЛДПО[xx]+KolПрхДеб; тКОЛКРО[xx]=тКОЛКРО[xx]+KolРсхКре; тКОЛОСТ[xx]=тКОЛОСТ[xx]+KolОстНач;
               тСУМДВП[xx]=тСУМДВП[xx]+SumВнпДеб; тСУМКВП[xx]=тСУМКВП[xx]+SumВнпКре; тСУМКОН[xx]=тСУМКОН[xx]+SumОстКон;
               тКОЛДВП[xx]=тКОЛДВП[xx]+KolВнпДеб; тКОЛКВП[xx]=тКОЛКВП[xx]+KolВнпКре; тКОЛКОН[xx]=тКОЛКОН[xx]+KolОстКон;
               тСУМДЕБ[xx]=тСУМДЕБ[xx]+SumОбоДеб; тСУМКРЕ[xx]=тСУМКРЕ[xx]+SumОбоКре;
               тКОЛДЕБ[xx]=тКОЛДЕБ[xx]+KolОбоДеб; тКОЛКРЕ[xx]=тКОЛКРЕ[xx]+KolОбоКре;
             else -- добавление нового узла иерархии
               xx=InsertInArraySort(тSRTFLD, valKГР4);
               Value=ВзятьИмяПараметраИерархическойГруппы(fldKEY4, xx, True, VconstНФА100П, VconstНФА_ИНВ);
               if Value="": Value=valFLD4; fi;
               --
               InsertInArray(тНФАИМЯ, xx, Value);
               --
               InsertInArray(тСУМДПО, xx, SumПрхДеб); InsertInArray(тСУМКРО, xx, SumРсхКре); InsertInArray(тСУМОСТ, xx, SumОстНач);
               InsertInArray(тКОЛДПО, xx, KolПрхДеб); InsertInArray(тКОЛКРО, xx, KolРсхКре); InsertInArray(тКОЛОСТ, xx, KolОстНач);
               InsertInArray(тСУМДВП, xx, SumВнпДеб); InsertInArray(тСУМКВП, xx, SumВнпКре); InsertInArray(тСУМКОН, xx, SumОстКон);
               InsertInArray(тКОЛДВП, xx, KolВнпДеб); InsertInArray(тКОЛКВП, xx, KolВнпКре); InsertInArray(тКОЛКОН, xx, KolОстКон);
               InsertInArray(тСУМДЕБ, xx, SumОбоДеб); InsertInArray(тСУМКРЕ, xx, SumОбоКре);
               InsertInArray(тКОЛДЕБ, xx, KolОбоДеб); InsertInArray(тКОЛКРЕ, xx, KolОбоКре);
               --
               InsertInArray(тНФАГРК, xx, ""); InsertInArray(тМОЛКОД, xx, ""); InsertInArray(тНФАИСТ, xx, "");
               InsertInArray(тНФАГРИ, xx, ""); InsertInArray(тМОЛИМЯ, xx, ""); InsertInArray(тНФАКБК, xx, "");
               InsertInArray(тНФАЕДИ, xx, ""); InsertInArray(тМХЭКОД, xx, ""); InsertInArray(тНФАСЧ6, xx, "");
               InsertInArray(тНФАУЧН, xx, ""); InsertInArray(тМХЭИМЯ, xx, ""); InsertInArray(тНФАТИП, xx, "");
               InsertInArray(тНФАИНВ, xx, ""); InsertInArray(тДОПКОД, xx, ""); InsertInArray(тНЕТУЧН, xx, False);
               InsertInArray(тНФАКОД, xx, ""); InsertInArray(тДОПИМЯ, xx, "");
               --
               kk=kk+1; -- сдвинулись на единицу в связи с добавлением нового узла иерархии
               ProgressPos(kk);
             fi;
           fi;
         fi; --valKEY4<>"" and fldKEY4<>""
         if valKEY5<>"" and fldKEY5<>"":
           jj=SearchInArray(тSRTFLD, valKEY5, True, 1);
           if jj>0: -- накапливаем результат по разделу
             xx=jj;
             тСУМДПО[xx]=тСУМДПО[xx]+SumПрхДеб; тСУМКРО[xx]=тСУМКРО[xx]+SumРсхКре; тСУМОСТ[xx]=тСУМОСТ[xx]+SumОстНач;
             тКОЛДПО[xx]=тКОЛДПО[xx]+KolПрхДеб; тКОЛКРО[xx]=тКОЛКРО[xx]+KolРсхКре; тКОЛОСТ[xx]=тКОЛОСТ[xx]+KolОстНач;
             тСУМДВП[xx]=тСУМДВП[xx]+SumВнпДеб; тСУМКВП[xx]=тСУМКВП[xx]+SumВнпКре; тСУМКОН[xx]=тСУМКОН[xx]+SumОстКон;
             тКОЛДВП[xx]=тКОЛДВП[xx]+KolВнпДеб; тКОЛКВП[xx]=тКОЛКВП[xx]+KolВнпКре; тКОЛКОН[xx]=тКОЛКОН[xx]+KolОстКон;
             тСУМДЕБ[xx]=тСУМДЕБ[xx]+SumОбоДеб; тСУМКРЕ[xx]=тСУМКРЕ[xx]+SumОбоКре;
             тКОЛДЕБ[xx]=тКОЛДЕБ[xx]+KolОбоДеб; тКОЛКРЕ[xx]=тКОЛКРЕ[xx]+KolОбоКре;
           else -- добавление нового узла иерархии
             xx=InsertInArraySort(тSRTFLD, valKEY5);
             Value=ВзятьИмяПараметраИерархическойГруппы(fldKEY5, xx, False, VconstНФА100П, VconstНФА_ИНВ);
             if Value="": Value=valFLD5; fi;
             --
             InsertInArray(тНФАИМЯ, xx, Value);
             --
             InsertInArray(тСУМДПО, xx, SumПрхДеб); InsertInArray(тСУМКРО, xx, SumРсхКре); InsertInArray(тСУМОСТ, xx, SumОстНач);
             InsertInArray(тКОЛДПО, xx, KolПрхДеб); InsertInArray(тКОЛКРО, xx, KolРсхКре); InsertInArray(тКОЛОСТ, xx, KolОстНач);
             InsertInArray(тСУМДВП, xx, SumВнпДеб); InsertInArray(тСУМКВП, xx, SumВнпКре); InsertInArray(тСУМКОН, xx, SumОстКон);
             InsertInArray(тКОЛДВП, xx, KolВнпДеб); InsertInArray(тКОЛКВП, xx, KolВнпКре); InsertInArray(тКОЛКОН, xx, KolОстКон);
             InsertInArray(тСУМДЕБ, xx, SumОбоДеб); InsertInArray(тСУМКРЕ, xx, SumОбоКре);
             InsertInArray(тКОЛДЕБ, xx, KolОбоДеб); InsertInArray(тКОЛКРЕ, xx, KolОбоКре);
             --
             InsertInArray(тНФАГРК, xx, ""); InsertInArray(тМОЛКОД, xx, ""); InsertInArray(тНФАИСТ, xx, "");
             InsertInArray(тНФАГРИ, xx, ""); InsertInArray(тМОЛИМЯ, xx, ""); InsertInArray(тНФАКБК, xx, "");
             InsertInArray(тНФАЕДИ, xx, ""); InsertInArray(тМХЭКОД, xx, ""); InsertInArray(тНФАСЧ6, xx, "");
             InsertInArray(тНФАУЧН, xx, ""); InsertInArray(тМХЭИМЯ, xx, ""); InsertInArray(тНФАТИП, xx, "");
             InsertInArray(тНФАИНВ, xx, ""); InsertInArray(тДОПКОД, xx, ""); InsertInArray(тНЕТУЧН, xx, False);
             InsertInArray(тНФАКОД, xx, ""); InsertInArray(тДОПИМЯ, xx, "");
             --
             kk=kk+1; -- сдвинулись на единицу в связи с добавлением нового узла иерархии
             ProgressPos(kk);
           fi;
           if ordГРП=5 and valKГР5<>"":
             jj=SearchInArray(тSRTFLD, valKГР5, True, 1);
             if jj>0: -- накапливаем результат по разделу
               xx=jj;
               тСУМДПО[xx]=тСУМДПО[xx]+SumПрхДеб; тСУМКРО[xx]=тСУМКРО[xx]+SumРсхКре; тСУМОСТ[xx]=тСУМОСТ[xx]+SumОстНач;
               тКОЛДПО[xx]=тКОЛДПО[xx]+KolПрхДеб; тКОЛКРО[xx]=тКОЛКРО[xx]+KolРсхКре; тКОЛОСТ[xx]=тКОЛОСТ[xx]+KolОстНач;
               тСУМДВП[xx]=тСУМДВП[xx]+SumВнпДеб; тСУМКВП[xx]=тСУМКВП[xx]+SumВнпКре; тСУМКОН[xx]=тСУМКОН[xx]+SumОстКон;
               тКОЛДВП[xx]=тКОЛДВП[xx]+KolВнпДеб; тКОЛКВП[xx]=тКОЛКВП[xx]+KolВнпКре; тКОЛКОН[xx]=тКОЛКОН[xx]+KolОстКон;
               тСУМДЕБ[xx]=тСУМДЕБ[xx]+SumОбоДеб; тСУМКРЕ[xx]=тСУМКРЕ[xx]+SumОбоКре;
               тКОЛДЕБ[xx]=тКОЛДЕБ[xx]+KolОбоДеб; тКОЛКРЕ[xx]=тКОЛКРЕ[xx]+KolОбоКре;
             else -- добавление нового узла иерархии
               xx=InsertInArraySort(тSRTFLD, valKГР5);
               Value=ВзятьИмяПараметраИерархическойГруппы(fldKEY5, xx, True, VconstНФА100П, VconstНФА_ИНВ);
               if Value="": Value=valFLD5; fi;
               --
               InsertInArray(тНФАИМЯ, xx, Value);
               --
               InsertInArray(тСУМДПО, xx, SumПрхДеб); InsertInArray(тСУМКРО, xx, SumРсхКре); InsertInArray(тСУМОСТ, xx, SumОстНач);
               InsertInArray(тКОЛДПО, xx, KolПрхДеб); InsertInArray(тКОЛКРО, xx, KolРсхКре); InsertInArray(тКОЛОСТ, xx, KolОстНач);
               InsertInArray(тСУМДВП, xx, SumВнпДеб); InsertInArray(тСУМКВП, xx, SumВнпКре); InsertInArray(тСУМКОН, xx, SumОстКон);
               InsertInArray(тКОЛДВП, xx, KolВнпДеб); InsertInArray(тКОЛКВП, xx, KolВнпКре); InsertInArray(тКОЛКОН, xx, KolОстКон);
               InsertInArray(тСУМДЕБ, xx, SumОбоДеб); InsertInArray(тСУМКРЕ, xx, SumОбоКре);
               InsertInArray(тКОЛДЕБ, xx, KolОбоДеб); InsertInArray(тКОЛКРЕ, xx, KolОбоКре);
               --
               InsertInArray(тНФАГРК, xx, ""); InsertInArray(тМОЛКОД, xx, ""); InsertInArray(тНФАИСТ, xx, "");
               InsertInArray(тНФАГРИ, xx, ""); InsertInArray(тМОЛИМЯ, xx, ""); InsertInArray(тНФАКБК, xx, "");
               InsertInArray(тНФАЕДИ, xx, ""); InsertInArray(тМХЭКОД, xx, ""); InsertInArray(тНФАСЧ6, xx, "");
               InsertInArray(тНФАУЧН, xx, ""); InsertInArray(тМХЭИМЯ, xx, ""); InsertInArray(тНФАТИП, xx, "");
               InsertInArray(тНФАИНВ, xx, ""); InsertInArray(тДОПКОД, xx, ""); InsertInArray(тНЕТУЧН, xx, False);
               InsertInArray(тНФАКОД, xx, ""); InsertInArray(тДОПИМЯ, xx, "");
               --
               kk=kk+1; -- сдвинулись на единицу в связи с добавлением нового узла иерархии
               ProgressPos(kk);
             fi;
           fi;
         fi; --valKEY5<>"" and fldKEY5<>""
         if valKEY6<>"" and fldKEY6<>"":
           jj=SearchInArray(тSRTFLD, valKEY6, True, 1);
           if jj>0: -- накапливаем результат по разделу
             xx=jj;
             тСУМДПО[xx]=тСУМДПО[xx]+SumПрхДеб; тСУМКРО[xx]=тСУМКРО[xx]+SumРсхКре; тСУМОСТ[xx]=тСУМОСТ[xx]+SumОстНач;
             тКОЛДПО[xx]=тКОЛДПО[xx]+KolПрхДеб; тКОЛКРО[xx]=тКОЛКРО[xx]+KolРсхКре; тКОЛОСТ[xx]=тКОЛОСТ[xx]+KolОстНач;
             тСУМДВП[xx]=тСУМДВП[xx]+SumВнпДеб; тСУМКВП[xx]=тСУМКВП[xx]+SumВнпКре; тСУМКОН[xx]=тСУМКОН[xx]+SumОстКон;
             тКОЛДВП[xx]=тКОЛДВП[xx]+KolВнпДеб; тКОЛКВП[xx]=тКОЛКВП[xx]+KolВнпКре; тКОЛКОН[xx]=тКОЛКОН[xx]+KolОстКон;
             тСУМДЕБ[xx]=тСУМДЕБ[xx]+SumОбоДеб; тСУМКРЕ[xx]=тСУМКРЕ[xx]+SumОбоКре;
             тКОЛДЕБ[xx]=тКОЛДЕБ[xx]+KolОбоДеб; тКОЛКРЕ[xx]=тКОЛКРЕ[xx]+KolОбоКре;
           else -- добавление нового узла иерархии
             xx=InsertInArraySort(тSRTFLD, valKEY6);
             Value=ВзятьИмяПараметраИерархическойГруппы(fldKEY6, xx, False, VconstНФА100П, VconstНФА_ИНВ);
             if Value="": Value=valFLD6; fi;
             --
             InsertInArray(тНФАИМЯ, xx, Value);
             --
             InsertInArray(тСУМДПО, xx, SumПрхДеб); InsertInArray(тСУМКРО, xx, SumРсхКре); InsertInArray(тСУМОСТ, xx, SumОстНач);
             InsertInArray(тКОЛДПО, xx, KolПрхДеб); InsertInArray(тКОЛКРО, xx, KolРсхКре); InsertInArray(тКОЛОСТ, xx, KolОстНач);
             InsertInArray(тСУМДВП, xx, SumВнпДеб); InsertInArray(тСУМКВП, xx, SumВнпКре); InsertInArray(тСУМКОН, xx, SumОстКон);
             InsertInArray(тКОЛДВП, xx, KolВнпДеб); InsertInArray(тКОЛКВП, xx, KolВнпКре); InsertInArray(тКОЛКОН, xx, KolОстКон);
             InsertInArray(тСУМДЕБ, xx, SumОбоДеб); InsertInArray(тСУМКРЕ, xx, SumОбоКре);
             InsertInArray(тКОЛДЕБ, xx, KolОбоДеб); InsertInArray(тКОЛКРЕ, xx, KolОбоКре);
             --
             InsertInArray(тНФАГРК, xx, ""); InsertInArray(тМОЛКОД, xx, ""); InsertInArray(тНФАИСТ, xx, "");
             InsertInArray(тНФАГРИ, xx, ""); InsertInArray(тМОЛИМЯ, xx, ""); InsertInArray(тНФАКБК, xx, "");
             InsertInArray(тНФАЕДИ, xx, ""); InsertInArray(тМХЭКОД, xx, ""); InsertInArray(тНФАСЧ6, xx, "");
             InsertInArray(тНФАУЧН, xx, ""); InsertInArray(тМХЭИМЯ, xx, ""); InsertInArray(тНФАТИП, xx, "");
             InsertInArray(тНФАИНВ, xx, ""); InsertInArray(тДОПКОД, xx, ""); InsertInArray(тНЕТУЧН, xx, False);
             InsertInArray(тНФАКОД, xx, ""); InsertInArray(тДОПИМЯ, xx, "");
             --
             kk=kk+1; -- сдвинулись на единицу в связи с добавлением нового узла иерархии
             ProgressPos(kk);
           fi;
           if ordГРП=6 and valKГР6<>"":
             jj=SearchInArray(тSRTFLD, valKГР6, True, 1);
             if jj>0: -- накапливаем результат по разделу
               xx=jj;
               тСУМДПО[xx]=тСУМДПО[xx]+SumПрхДеб; тСУМКРО[xx]=тСУМКРО[xx]+SumРсхКре; тСУМОСТ[xx]=тСУМОСТ[xx]+SumОстНач;
               тКОЛДПО[xx]=тКОЛДПО[xx]+KolПрхДеб; тКОЛКРО[xx]=тКОЛКРО[xx]+KolРсхКре; тКОЛОСТ[xx]=тКОЛОСТ[xx]+KolОстНач;
               тСУМДВП[xx]=тСУМДВП[xx]+SumВнпДеб; тСУМКВП[xx]=тСУМКВП[xx]+SumВнпКре; тСУМКОН[xx]=тСУМКОН[xx]+SumОстКон;
               тКОЛДВП[xx]=тКОЛДВП[xx]+KolВнпДеб; тКОЛКВП[xx]=тКОЛКВП[xx]+KolВнпКре; тКОЛКОН[xx]=тКОЛКОН[xx]+KolОстКон;
               тСУМДЕБ[xx]=тСУМДЕБ[xx]+SumОбоДеб; тСУМКРЕ[xx]=тСУМКРЕ[xx]+SumОбоКре;
               тКОЛДЕБ[xx]=тКОЛДЕБ[xx]+KolОбоДеб; тКОЛКРЕ[xx]=тКОЛКРЕ[xx]+KolОбоКре;
             else -- добавление нового узла иерархии
               xx=InsertInArraySort(тSRTFLD, valKГР6);
               Value=ВзятьИмяПараметраИерархическойГруппы(fldKEY6, xx, True, VconstНФА100П, VconstНФА_ИНВ);
               if Value="": Value=valFLD6; fi;
               --
               InsertInArray(тНФАИМЯ, xx, Value);
               --
               InsertInArray(тСУМДПО, xx, SumПрхДеб); InsertInArray(тСУМКРО, xx, SumРсхКре); InsertInArray(тСУМОСТ, xx, SumОстНач);
               InsertInArray(тКОЛДПО, xx, KolПрхДеб); InsertInArray(тКОЛКРО, xx, KolРсхКре); InsertInArray(тКОЛОСТ, xx, KolОстНач);
               InsertInArray(тСУМДВП, xx, SumВнпДеб); InsertInArray(тСУМКВП, xx, SumВнпКре); InsertInArray(тСУМКОН, xx, SumОстКон);
               InsertInArray(тКОЛДВП, xx, KolВнпДеб); InsertInArray(тКОЛКВП, xx, KolВнпКре); InsertInArray(тКОЛКОН, xx, KolОстКон);
               InsertInArray(тСУМДЕБ, xx, SumОбоДеб); InsertInArray(тСУМКРЕ, xx, SumОбоКре);
               InsertInArray(тКОЛДЕБ, xx, KolОбоДеб); InsertInArray(тКОЛКРЕ, xx, KolОбоКре);
               --
               InsertInArray(тНФАГРК, xx, ""); InsertInArray(тМОЛКОД, xx, ""); InsertInArray(тНФАИСТ, xx, "");
               InsertInArray(тНФАГРИ, xx, ""); InsertInArray(тМОЛИМЯ, xx, ""); InsertInArray(тНФАКБК, xx, "");
               InsertInArray(тНФАЕДИ, xx, ""); InsertInArray(тМХЭКОД, xx, ""); InsertInArray(тНФАСЧ6, xx, "");
               InsertInArray(тНФАУЧН, xx, ""); InsertInArray(тМХЭИМЯ, xx, ""); InsertInArray(тНФАТИП, xx, "");
               InsertInArray(тНФАИНВ, xx, ""); InsertInArray(тДОПКОД, xx, ""); InsertInArray(тНЕТУЧН, xx, False);
               InsertInArray(тНФАКОД, xx, ""); InsertInArray(тДОПИМЯ, xx, "");
               --
               kk=kk+1; -- сдвинулись на единицу в связи с добавлением нового узла иерархии
               ProgressPos(kk);
             fi;
           fi;
         fi; --valKEY6<>"" and fldKEY6<>""
         if valKEY7<>"" and fldKEY7<>"":
           jj=SearchInArray(тSRTFLD, valKEY7, True, 1);
           if jj>0: -- накапливаем результат по разделу
             xx=jj;
             тСУМДПО[xx]=тСУМДПО[xx]+SumПрхДеб; тСУМКРО[xx]=тСУМКРО[xx]+SumРсхКре; тСУМОСТ[xx]=тСУМОСТ[xx]+SumОстНач;
             тКОЛДПО[xx]=тКОЛДПО[xx]+KolПрхДеб; тКОЛКРО[xx]=тКОЛКРО[xx]+KolРсхКре; тКОЛОСТ[xx]=тКОЛОСТ[xx]+KolОстНач;
             тСУМДВП[xx]=тСУМДВП[xx]+SumВнпДеб; тСУМКВП[xx]=тСУМКВП[xx]+SumВнпКре; тСУМКОН[xx]=тСУМКОН[xx]+SumОстКон;
             тКОЛДВП[xx]=тКОЛДВП[xx]+KolВнпДеб; тКОЛКВП[xx]=тКОЛКВП[xx]+KolВнпКре; тКОЛКОН[xx]=тКОЛКОН[xx]+KolОстКон;
             тСУМДЕБ[xx]=тСУМДЕБ[xx]+SumОбоДеб; тСУМКРЕ[xx]=тСУМКРЕ[xx]+SumОбоКре;
             тКОЛДЕБ[xx]=тКОЛДЕБ[xx]+KolОбоДеб; тКОЛКРЕ[xx]=тКОЛКРЕ[xx]+KolОбоКре;
           else -- добавление нового узла иерархии
             xx=InsertInArraySort(тSRTFLD, valKEY7);
             Value=ВзятьИмяПараметраИерархическойГруппы(fldKEY7, xx, False, VconstНФА100П, VconstНФА_ИНВ);
             if Value="": Value=valFLD7; fi;
             --
             InsertInArray(тНФАИМЯ, xx, Value);
             --
             InsertInArray(тСУМДПО, xx, SumПрхДеб); InsertInArray(тСУМКРО, xx, SumРсхКре); InsertInArray(тСУМОСТ, xx, SumОстНач);
             InsertInArray(тКОЛДПО, xx, KolПрхДеб); InsertInArray(тКОЛКРО, xx, KolРсхКре); InsertInArray(тКОЛОСТ, xx, KolОстНач);
             InsertInArray(тСУМДВП, xx, SumВнпДеб); InsertInArray(тСУМКВП, xx, SumВнпКре); InsertInArray(тСУМКОН, xx, SumОстКон);
             InsertInArray(тКОЛДВП, xx, KolВнпДеб); InsertInArray(тКОЛКВП, xx, KolВнпКре); InsertInArray(тКОЛКОН, xx, KolОстКон);
             InsertInArray(тСУМДЕБ, xx, SumОбоДеб); InsertInArray(тСУМКРЕ, xx, SumОбоКре);
             InsertInArray(тКОЛДЕБ, xx, KolОбоДеб); InsertInArray(тКОЛКРЕ, xx, KolОбоКре);
             --
             InsertInArray(тНФАГРК, xx, ""); InsertInArray(тМОЛКОД, xx, ""); InsertInArray(тНФАИСТ, xx, "");
             InsertInArray(тНФАГРИ, xx, ""); InsertInArray(тМОЛИМЯ, xx, ""); InsertInArray(тНФАКБК, xx, "");
             InsertInArray(тНФАЕДИ, xx, ""); InsertInArray(тМХЭКОД, xx, ""); InsertInArray(тНФАСЧ6, xx, "");
             InsertInArray(тНФАУЧН, xx, ""); InsertInArray(тМХЭИМЯ, xx, ""); InsertInArray(тНФАТИП, xx, "");
             InsertInArray(тНФАИНВ, xx, ""); InsertInArray(тДОПКОД, xx, ""); InsertInArray(тНЕТУЧН, xx, False);
             InsertInArray(тНФАКОД, xx, ""); InsertInArray(тДОПИМЯ, xx, "");
             --
             kk=kk+1; -- сдвинулись на единицу в связи с добавлением нового узла иерархии
             ProgressPos(kk);
           fi;
           if ordГРП=7 and valKГР7<>"":
             jj=SearchInArray(тSRTFLD, valKГР7, True, 1);
             if jj>0: -- накапливаем результат по разделу
               xx=jj;
               тСУМДПО[xx]=тСУМДПО[xx]+SumПрхДеб; тСУМКРО[xx]=тСУМКРО[xx]+SumРсхКре; тСУМОСТ[xx]=тСУМОСТ[xx]+SumОстНач;
               тКОЛДПО[xx]=тКОЛДПО[xx]+KolПрхДеб; тКОЛКРО[xx]=тКОЛКРО[xx]+KolРсхКре; тКОЛОСТ[xx]=тКОЛОСТ[xx]+KolОстНач;
               тСУМДВП[xx]=тСУМДВП[xx]+SumВнпДеб; тСУМКВП[xx]=тСУМКВП[xx]+SumВнпКре; тСУМКОН[xx]=тСУМКОН[xx]+SumОстКон;
               тКОЛДВП[xx]=тКОЛДВП[xx]+KolВнпДеб; тКОЛКВП[xx]=тКОЛКВП[xx]+KolВнпКре; тКОЛКОН[xx]=тКОЛКОН[xx]+KolОстКон;
               тСУМДЕБ[xx]=тСУМДЕБ[xx]+SumОбоДеб; тСУМКРЕ[xx]=тСУМКРЕ[xx]+SumОбоКре;
               тКОЛДЕБ[xx]=тКОЛДЕБ[xx]+KolОбоДеб; тКОЛКРЕ[xx]=тКОЛКРЕ[xx]+KolОбоКре;
             else -- добавление нового узла иерархии
               xx=InsertInArraySort(тSRTFLD, valKГР7);
               Value=ВзятьИмяПараметраИерархическойГруппы(fldKEY7, xx, True, VconstНФА100П, VconstНФА_ИНВ);
               if Value="": Value=valFLD7; fi;
               --
               InsertInArray(тНФАИМЯ, xx, Value);
               --
               InsertInArray(тСУМДПО, xx, SumПрхДеб); InsertInArray(тСУМКРО, xx, SumРсхКре); InsertInArray(тСУМОСТ, xx, SumОстНач);
               InsertInArray(тКОЛДПО, xx, KolПрхДеб); InsertInArray(тКОЛКРО, xx, KolРсхКре); InsertInArray(тКОЛОСТ, xx, KolОстНач);
               InsertInArray(тСУМДВП, xx, SumВнпДеб); InsertInArray(тСУМКВП, xx, SumВнпКре); InsertInArray(тСУМКОН, xx, SumОстКон);
               InsertInArray(тКОЛДВП, xx, KolВнпДеб); InsertInArray(тКОЛКВП, xx, KolВнпКре); InsertInArray(тКОЛКОН, xx, KolОстКон);
               InsertInArray(тСУМДЕБ, xx, SumОбоДеб); InsertInArray(тСУМКРЕ, xx, SumОбоКре);
               InsertInArray(тКОЛДЕБ, xx, KolОбоДеб); InsertInArray(тКОЛКРЕ, xx, KolОбоКре);
               --
               InsertInArray(тНФАГРК, xx, ""); InsertInArray(тМОЛКОД, xx, ""); InsertInArray(тНФАИСТ, xx, "");
               InsertInArray(тНФАГРИ, xx, ""); InsertInArray(тМОЛИМЯ, xx, ""); InsertInArray(тНФАКБК, xx, "");
               InsertInArray(тНФАЕДИ, xx, ""); InsertInArray(тМХЭКОД, xx, ""); InsertInArray(тНФАСЧ6, xx, "");
               InsertInArray(тНФАУЧН, xx, ""); InsertInArray(тМХЭИМЯ, xx, ""); InsertInArray(тНФАТИП, xx, "");
               InsertInArray(тНФАИНВ, xx, ""); InsertInArray(тДОПКОД, xx, ""); InsertInArray(тНЕТУЧН, xx, False);
               InsertInArray(тНФАКОД, xx, ""); InsertInArray(тДОПИМЯ, xx, "");
               --
               kk=kk+1; -- сдвинулись на единицу в связи с добавлением нового узла иерархии
               ProgressPos(kk);
             fi;
           fi;
         fi; --valKEY7<>"" and fldKEY7<>""
         if valKEY8<>"" and fldKEY8<>"":
           jj=SearchInArray(тSRTFLD, valKEY8, True, 1);
           if jj>0: -- накапливаем результат по разделу
             xx=jj;
             тСУМДПО[xx]=тСУМДПО[xx]+SumПрхДеб; тСУМКРО[xx]=тСУМКРО[xx]+SumРсхКре; тСУМОСТ[xx]=тСУМОСТ[xx]+SumОстНач;
             тКОЛДПО[xx]=тКОЛДПО[xx]+KolПрхДеб; тКОЛКРО[xx]=тКОЛКРО[xx]+KolРсхКре; тКОЛОСТ[xx]=тКОЛОСТ[xx]+KolОстНач;
             тСУМДВП[xx]=тСУМДВП[xx]+SumВнпДеб; тСУМКВП[xx]=тСУМКВП[xx]+SumВнпКре; тСУМКОН[xx]=тСУМКОН[xx]+SumОстКон;
             тКОЛДВП[xx]=тКОЛДВП[xx]+KolВнпДеб; тКОЛКВП[xx]=тКОЛКВП[xx]+KolВнпКре; тКОЛКОН[xx]=тКОЛКОН[xx]+KolОстКон;
             тСУМДЕБ[xx]=тСУМДЕБ[xx]+SumОбоДеб; тСУМКРЕ[xx]=тСУМКРЕ[xx]+SumОбоКре;
             тКОЛДЕБ[xx]=тКОЛДЕБ[xx]+KolОбоДеб; тКОЛКРЕ[xx]=тКОЛКРЕ[xx]+KolОбоКре;
           else -- добавление нового узла иерархии
             xx=InsertInArraySort(тSRTFLD, valKEY8);
             Value=ВзятьИмяПараметраИерархическойГруппы(fldKEY8, xx, False, VconstНФА100П, VconstНФА_ИНВ);
             if Value="": Value=valFLD8; fi;
             --
             InsertInArray(тНФАИМЯ, xx, Value);
             --
             InsertInArray(тСУМДПО, xx, SumПрхДеб); InsertInArray(тСУМКРО, xx, SumРсхКре); InsertInArray(тСУМОСТ, xx, SumОстНач);
             InsertInArray(тКОЛДПО, xx, KolПрхДеб); InsertInArray(тКОЛКРО, xx, KolРсхКре); InsertInArray(тКОЛОСТ, xx, KolОстНач);
             InsertInArray(тСУМДВП, xx, SumВнпДеб); InsertInArray(тСУМКВП, xx, SumВнпКре); InsertInArray(тСУМКОН, xx, SumОстКон);
             InsertInArray(тКОЛДВП, xx, KolВнпДеб); InsertInArray(тКОЛКВП, xx, KolВнпКре); InsertInArray(тКОЛКОН, xx, KolОстКон);
             InsertInArray(тСУМДЕБ, xx, SumОбоДеб); InsertInArray(тСУМКРЕ, xx, SumОбоКре);
             InsertInArray(тКОЛДЕБ, xx, KolОбоДеб); InsertInArray(тКОЛКРЕ, xx, KolОбоКре);
             --
             InsertInArray(тНФАГРК, xx, ""); InsertInArray(тМОЛКОД, xx, ""); InsertInArray(тНФАИСТ, xx, "");
             InsertInArray(тНФАГРИ, xx, ""); InsertInArray(тМОЛИМЯ, xx, ""); InsertInArray(тНФАКБК, xx, "");
             InsertInArray(тНФАЕДИ, xx, ""); InsertInArray(тМХЭКОД, xx, ""); InsertInArray(тНФАСЧ6, xx, "");
             InsertInArray(тНФАУЧН, xx, ""); InsertInArray(тМХЭИМЯ, xx, ""); InsertInArray(тНФАТИП, xx, "");
             InsertInArray(тНФАИНВ, xx, ""); InsertInArray(тДОПКОД, xx, ""); InsertInArray(тНЕТУЧН, xx, False);
             InsertInArray(тНФАКОД, xx, ""); InsertInArray(тДОПИМЯ, xx, "");
             --
             kk=kk+1; -- сдвинулись на единицу в связи с добавлением нового узла иерархии
             ProgressPos(kk);
           fi;
           if ordГРП=8 and valKГР8<>"":
             jj=SearchInArray(тSRTFLD, valKГР8, True, 1);
             if jj>0: -- накапливаем результат по разделу
               xx=jj;
               тСУМДПО[xx]=тСУМДПО[xx]+SumПрхДеб; тСУМКРО[xx]=тСУМКРО[xx]+SumРсхКре; тСУМОСТ[xx]=тСУМОСТ[xx]+SumОстНач;
               тКОЛДПО[xx]=тКОЛДПО[xx]+KolПрхДеб; тКОЛКРО[xx]=тКОЛКРО[xx]+KolРсхКре; тКОЛОСТ[xx]=тКОЛОСТ[xx]+KolОстНач;
               тСУМДВП[xx]=тСУМДВП[xx]+SumВнпДеб; тСУМКВП[xx]=тСУМКВП[xx]+SumВнпКре; тСУМКОН[xx]=тСУМКОН[xx]+SumОстКон;
               тКОЛДВП[xx]=тКОЛДВП[xx]+KolВнпДеб; тКОЛКВП[xx]=тКОЛКВП[xx]+KolВнпКре; тКОЛКОН[xx]=тКОЛКОН[xx]+KolОстКон;
               тСУМДЕБ[xx]=тСУМДЕБ[xx]+SumОбоДеб; тСУМКРЕ[xx]=тСУМКРЕ[xx]+SumОбоКре;
               тКОЛДЕБ[xx]=тКОЛДЕБ[xx]+KolОбоДеб; тКОЛКРЕ[xx]=тКОЛКРЕ[xx]+KolОбоКре;
             else -- добавление нового узла иерархии
               xx=InsertInArraySort(тSRTFLD, valKГР8);
               Value=ВзятьИмяПараметраИерархическойГруппы(fldKEY8, xx, True, VconstНФА100П, VconstНФА_ИНВ);
               if Value="": Value=valFLD8; fi;
               --
               InsertInArray(тНФАИМЯ, xx, Value);
               --
               InsertInArray(тСУМДПО, xx, SumПрхДеб); InsertInArray(тСУМКРО, xx, SumРсхКре); InsertInArray(тСУМОСТ, xx, SumОстНач);
               InsertInArray(тКОЛДПО, xx, KolПрхДеб); InsertInArray(тКОЛКРО, xx, KolРсхКре); InsertInArray(тКОЛОСТ, xx, KolОстНач);
               InsertInArray(тСУМДВП, xx, SumВнпДеб); InsertInArray(тСУМКВП, xx, SumВнпКре); InsertInArray(тСУМКОН, xx, SumОстКон);
               InsertInArray(тКОЛДВП, xx, KolВнпДеб); InsertInArray(тКОЛКВП, xx, KolВнпКре); InsertInArray(тКОЛКОН, xx, KolОстКон);
               InsertInArray(тСУМДЕБ, xx, SumОбоДеб); InsertInArray(тСУМКРЕ, xx, SumОбоКре);
               InsertInArray(тКОЛДЕБ, xx, KolОбоДеб); InsertInArray(тКОЛКРЕ, xx, KolОбоКре);
               --
               InsertInArray(тНФАГРК, xx, ""); InsertInArray(тМОЛКОД, xx, ""); InsertInArray(тНФАИСТ, xx, "");
               InsertInArray(тНФАГРИ, xx, ""); InsertInArray(тМОЛИМЯ, xx, ""); InsertInArray(тНФАКБК, xx, "");
               InsertInArray(тНФАЕДИ, xx, ""); InsertInArray(тМХЭКОД, xx, ""); InsertInArray(тНФАСЧ6, xx, "");
               InsertInArray(тНФАУЧН, xx, ""); InsertInArray(тМХЭИМЯ, xx, ""); InsertInArray(тНФАТИП, xx, "");
               InsertInArray(тНФАИНВ, xx, ""); InsertInArray(тДОПКОД, xx, ""); InsertInArray(тНЕТУЧН, xx, False);
               InsertInArray(тНФАКОД, xx, ""); InsertInArray(тДОПИМЯ, xx, "");
               --
               kk=kk+1; -- сдвинулись на единицу в связи с добавлением нового узла иерархии
               ProgressPos(kk);
             fi;
           fi;
         fi; --valKEY8<>"" and fldKEY8<>""
       fi; -- ЕстьИерархическаяГруппировка
       kk=kk+1; -- переход на следующий элемент
       ProgressPos(kk);
     end; -- while
     -- Итоги по колонкам в 'итоговых таблицах'
     -- таблица N1
     СтрокиТ1 = LengthOfArray(иСЧТнаимен);
     вСЧТостнач = SumOfArray(иСЧТостнач, СтрокиТ1);
     вСЧТпрхдеб = SumOfArray(иСЧТпрхдеб, СтрокиТ1);
     вСЧТвнпдеб = SumOfArray(иСЧТвнпдеб, СтрокиТ1);
     вСЧТободеб = SumOfArray(иСЧТободеб, СтрокиТ1);
     вСЧТрсхкре = SumOfArray(иСЧТрсхкре, СтрокиТ1);
     вСЧТвнпкре = SumOfArray(иСЧТвнпкре, СтрокиТ1);
     вСЧТобокре = SumOfArray(иСЧТобокре, СтрокиТ1);
     вСЧТосткон = SumOfArray(иСЧТосткон, СтрокиТ1);
     -- таблица N2
     СтрокиТ2 = LengthOfArray(иИСТнаимен);
     вИСТостнач = SumOfArray(иИСТостнач, СтрокиТ2);
     вИСТпрхдеб = SumOfArray(иИСТпрхдеб, СтрокиТ2);
     вИСТвнпдеб = SumOfArray(иИСТвнпдеб, СтрокиТ2);
     вИСТободеб = SumOfArray(иИСТободеб, СтрокиТ2);
     вИСТрсхкре = SumOfArray(иИСТрсхкре, СтрокиТ2);
     вИСТвнпкре = SumOfArray(иИСТвнпкре, СтрокиТ2);
     вИСТобокре = SumOfArray(иИСТобокре, СтрокиТ2);
     вИСТосткон = SumOfArray(иИСТосткон, СтрокиТ2);
     -- таблица N3
     СтрокиТ3 = LengthOfArray(иФКРнаимен);
     вФКРостнач = SumOfArray(иФКРостнач, СтрокиТ3);
     вФКРпрхдеб = SumOfArray(иФКРпрхдеб, СтрокиТ3);
     вФКРвнпдеб = SumOfArray(иФКРвнпдеб, СтрокиТ3);
     вФКРободеб = SumOfArray(иФКРободеб, СтрокиТ3);
     вФКРрсхкре = SumOfArray(иФКРрсхкре, СтрокиТ3);
     вФКРвнпкре = SumOfArray(иФКРвнпкре, СтрокиТ3);
     вФКРобокре = SumOfArray(иФКРобокре, СтрокиТ3);
     вФКРосткон = SumOfArray(иФКРосткон, СтрокиТ3);
   Finally
     CloseProgress;
   end;
 fi;
end;

Func КоличествоТочно_Текстом(tchKOL:Numeric) :String;
 ^Format("%8."+Str(РАБ.НФА.FUNC_LIB.LENM(tchKOL))+"N", tchKOL);
end;

Proc СформироватьСтрокуПромежуточныхИтогов(Row:Integer; MskSort:String; цвH1:Integer; цвH2:Integer; цвH3:Integer; цвH4:Integer; цвH5:Integer; цвH6:Integer; цвH7:Integer; цвH8:Integer; iiTable:Integer);
var LnFn, valKey1, valKey2, valKey3, valKey4, valKey5, valKey6, valKey7, valKey8, valKey9, strHeader, Цифры :String;
var OffsetCol, RepConst, Style, SizeFont, ColorB, ColorF, Height, KolStrok :Integer;

 LnFn="ъ"+Chr(183)+"ъ";
 OffsetCol=1;
 RepConst=3;
 valKey1=Trim(ExtractWord(1, MskSort, "#"));
 valKey2=Trim(ExtractWord(2, MskSort, "#"));
 valKey3=Trim(ExtractWord(3, MskSort, "#"));
 valKey4=Trim(ExtractWord(4, MskSort, "#"));
 valKey5=Trim(ExtractWord(5, MskSort, "#"));
 valKey6=Trim(ExtractWord(6, MskSort, "#"));
 valKey7=Trim(ExtractWord(7, MskSort, "#"));
 valKey8=Trim(ExtractWord(8, MskSort, "#"));
 valKey9=Trim(ExtractWord(9, MskSort, "#"));

 if valKey1<>""  and valKey2=""  and valKey3=""  and valKey4=""  and valKey5=""  and valKey6=""  and valKey7=""  and valKey8=""  and (valKey9=LnFn or valKey9=""): strHeader=                        тНФАИМЯ[Row]; Style=fsBold; SizeFont=9; ColorB=цвH1; ColorF=coBlack;
 |  valKey1<>""  and valKey2<>"" and valKey3=""  and valKey4=""  and valKey5=""  and valKey6=""  and valKey7=""  and valKey8=""  and (valKey9=LnFn or valKey9=""): strHeader=RepStr(" ", 1*RepConst)+тНФАИМЯ[Row]; Style=fsBold; SizeFont=9; ColorB=цвH2; ColorF=coBlack;
 |  valKey1<>""  and valKey2<>"" and valKey3<>"" and valKey4=""  and valKey5=""  and valKey6=""  and valKey7=""  and valKey8=""  and (valKey9=LnFn or valKey9=""): strHeader=RepStr(" ", 2*RepConst)+тНФАИМЯ[Row]; Style=fsBold; SizeFont=9; ColorB=цвH3; ColorF=coBlack;
 |  valKey1<>""  and valKey2<>"" and valKey3<>"" and valKey4<>"" and valKey5=""  and valKey6=""  and valKey7=""  and valKey8=""  and (valKey9=LnFn or valKey9=""): strHeader=RepStr(" ", 3*RepConst)+тНФАИМЯ[Row]; Style=fsBold; SizeFont=9; ColorB=цвH4; ColorF=coBlack;
 |  valKey1<>""  and valKey2<>"" and valKey3<>"" and valKey4<>"" and valKey5<>"" and valKey6=""  and valKey7=""  and valKey8=""  and (valKey9=LnFn or valKey9=""): strHeader=RepStr(" ", 4*RepConst)+тНФАИМЯ[Row]; Style=fsBold; SizeFont=9; ColorB=цвH5; ColorF=coBlack;
 |  valKey1<>""  and valKey2<>"" and valKey3<>"" and valKey4<>"" and valKey5<>"" and valKey6<>"" and valKey7=""  and valKey8=""  and (valKey9=LnFn or valKey9=""): strHeader=RepStr(" ", 5*RepConst)+тНФАИМЯ[Row]; Style=fsBold; SizeFont=9; ColorB=цвH6; ColorF=coBlack;
 |  valKey1<>""  and valKey2<>"" and valKey3<>"" and valKey4<>"" and valKey5<>"" and valKey6<>"" and valKey7<>"" and valKey8=""  and (valKey9=LnFn or valKey9=""): strHeader=RepStr(" ", 6*RepConst)+тНФАИМЯ[Row]; Style=fsBold; SizeFont=9; ColorB=цвH7; ColorF=coBlack;
 |  valKey1<>""  and valKey2<>"" and valKey3<>"" and valKey4<>"" and valKey5<>"" and valKey6<>"" and valKey7<>"" and valKey8<>"" and (valKey9=LnFn or valKey9=""): strHeader=RepStr(" ", 7*RepConst)+тНФАИМЯ[Row]; Style=fsBold; SizeFont=9; ColorB=цвH8; ColorF=coBlack;
 else strHeader=""; Style=0; SizeFont=8; ColorB=coTransparent; ColorF=coBlack;
 fi;

 СекцWorkДТ.CellLinks(OffsetCol+1, iiTable-1, OffsetCol+12, iiTable-1);
 СекцWorkДТ.CellLinks(OffsetCol+1, iiTable  , OffsetCol+04, iiTable  );

 Height=asInteger(СекцWorkДТ.Row(iiTable-1, RowHeight, ""));
 if Round(Height/50, 0)>1: Height=50; fi;
 KolStrok=asInteger(СекцWorkДТ.Cell(iiTable-1, OffsetCol+01, CellLinesCount, strHeader));
 if KolStrok>1: СекцWorkДТ.Row(iiTable-1, RowHeight, Height*KolStrok); else СекцWorkДТ.Row(iiTable-1, RowHeight, Height); fi;

 СекцWorkДТ.Cell(iiTable-1, OffsetCol+01, CellFontStyle, Style);
 СекцWorkДТ.Cell(iiTable-1, OffsetCol+01, CellFontSize,  SizeFont);
 СекцWorkДТ.Cell(iiTable-1, OffsetCol+01, CellFontColor, ColorF);
 СекцWorkДТ.Cell(iiTable-1, OffsetCol+01, CellBgColor,   ColorB);
 СекцWorkДТ.Cell(iiTable-1, OffsetCol+01, CellAlignment, 0);
 СекцWorkДТ.Cell(iiTable-1, OffsetCol+01, CellBorder, "1,1,1,0");
 СекцWorkДТ.Cell(iiTable-1, OffsetCol+01, CellWrap, True);
 СекцWorkДТ.Cell(iiTable-1, OffsetCol+01, CellContents, strHeader);

 СекцWorkДТ.Cell(iiTable, OffsetCol+01, CellFontStyle, Style);
 СекцWorkДТ.Cell(iiTable, OffsetCol+01, CellFontSize,  SizeFont);
 СекцWorkДТ.Cell(iiTable, OffsetCol+01, CellFontColor, ColorF);
 СекцWorkДТ.Cell(iiTable, OffsetCol+01, CellBgColor,   ColorB);
 СекцWorkДТ.Cell(iiTable, OffsetCol+01, CellAlignment, 0);
 СекцWorkДТ.Cell(iiTable, OffsetCol+01, CellBorder, "1,0,1,1");
 СекцWorkДТ.Cell(iiTable, OffsetCol+01, CellWrap, True);
 СекцWorkДТ.Cell(iiTable, OffsetCol+01, CellContents, "");

 Цифры=Trim(КоличествоТочно_Текстом(тКОЛОСТ[Row]))+Chr(13)+Trim(Format("%17.2N", тСУМОСТ[Row]));
 СекцWorkДТ.Cell(iiTable, OffsetCol+05, CellFontStyle, Style);
 СекцWorkДТ.Cell(iiTable, OffsetCol+05, CellFontSize,  8);
 СекцWorkДТ.Cell(iiTable, OffsetCol+05, CellFontColor, ColorF);
 СекцWorkДТ.Cell(iiTable, OffsetCol+05, CellBgColor,   ColorB);
 СекцWorkДТ.Cell(iiTable, OffsetCol+05, CellAlignment, 1);
 СекцWorkДТ.Cell(iiTable, OffsetCol+05, CellBorder, "1,1,1,1");
 СекцWorkДТ.Cell(iiTable, OffsetCol+05, CellWrap, True);
 СекцWorkДТ.Cell(iiTable, OffsetCol+05, CellContents, Цифры+" ");

 Цифры=Trim(КоличествоТочно_Текстом(тКОЛДПО[Row]))+Chr(13)+Trim(Format("%17.2N", тСУМДПО[Row]));
 СекцWorkДТ.Cell(iiTable, OffsetCol+06, CellFontStyle, Style);
 СекцWorkДТ.Cell(iiTable, OffsetCol+06, CellFontSize,  8);
 СекцWorkДТ.Cell(iiTable, OffsetCol+06, CellFontColor, ColorF);
 СекцWorkДТ.Cell(iiTable, OffsetCol+06, CellBgColor,   ColorB);
 СекцWorkДТ.Cell(iiTable, OffsetCol+06, CellAlignment, 1);
 СекцWorkДТ.Cell(iiTable, OffsetCol+06, CellBorder, "1,1,1,1");
 СекцWorkДТ.Cell(iiTable, OffsetCol+06, CellWrap, True);
 СекцWorkДТ.Cell(iiTable, OffsetCol+06, CellContents, Цифры+" ");

 Цифры=Trim(КоличествоТочно_Текстом(тКОЛДВП[Row]))+Chr(13)+Trim(Format("%17.2N", тСУМДВП[Row]));
 СекцWorkДТ.Cell(iiTable, OffsetCol+07, CellFontStyle, Style);
 СекцWorkДТ.Cell(iiTable, OffsetCol+07, CellFontSize,  8);
 СекцWorkДТ.Cell(iiTable, OffsetCol+07, CellFontColor, ColorF);
 СекцWorkДТ.Cell(iiTable, OffsetCol+07, CellBgColor,   ColorB);
 СекцWorkДТ.Cell(iiTable, OffsetCol+07, CellAlignment, 1);
 СекцWorkДТ.Cell(iiTable, OffsetCol+07, CellBorder, "1,1,1,1");
 СекцWorkДТ.Cell(iiTable, OffsetCol+07, CellWrap, True);
 СекцWorkДТ.Cell(iiTable, OffsetCol+07, CellContents, Цифры+" ");

 Цифры=Trim(КоличествоТочно_Текстом(тКОЛДЕБ[Row]))+Chr(13)+Trim(Format("%17.2N", тСУМДЕБ[Row]));
 СекцWorkДТ.Cell(iiTable, OffsetCol+08, CellFontStyle, Style);
 СекцWorkДТ.Cell(iiTable, OffsetCol+08, CellFontSize,  8);
 СекцWorkДТ.Cell(iiTable, OffsetCol+08, CellFontColor, ColorF);
 СекцWorkДТ.Cell(iiTable, OffsetCol+08, CellBgColor,   ColorB);
 СекцWorkДТ.Cell(iiTable, OffsetCol+08, CellAlignment, 1);
 СекцWorkДТ.Cell(iiTable, OffsetCol+08, CellBorder, "1,1,1,1");
 СекцWorkДТ.Cell(iiTable, OffsetCol+08, CellWrap, True);
 СекцWorkДТ.Cell(iiTable, OffsetCol+08, CellContents, Цифры+" ");

 Цифры=Trim(КоличествоТочно_Текстом(тКОЛКРО[Row]))+Chr(13)+Trim(Format("%17.2N", тСУМКРО[Row]));
 СекцWorkДТ.Cell(iiTable, OffsetCol+09, CellFontStyle, Style);
 СекцWorkДТ.Cell(iiTable, OffsetCol+09, CellFontSize,  8);
 СекцWorkДТ.Cell(iiTable, OffsetCol+09, CellFontColor, ColorF);
 СекцWorkДТ.Cell(iiTable, OffsetCol+09, CellBgColor,   ColorB);
 СекцWorkДТ.Cell(iiTable, OffsetCol+09, CellAlignment, 1);
 СекцWorkДТ.Cell(iiTable, OffsetCol+09, CellBorder, "1,1,1,1");
 СекцWorkДТ.Cell(iiTable, OffsetCol+09, CellWrap, True);
 СекцWorkДТ.Cell(iiTable, OffsetCol+09, CellContents, Цифры+" ");

 Цифры=Trim(КоличествоТочно_Текстом(тКОЛКВП[Row]))+Chr(13)+Trim(Format("%17.2N", тСУМКВП[Row]));
 СекцWorkДТ.Cell(iiTable, OffsetCol+10, CellFontStyle, Style);
 СекцWorkДТ.Cell(iiTable, OffsetCol+10, CellFontSize,  8);
 СекцWorkДТ.Cell(iiTable, OffsetCol+10, CellFontColor, ColorF);
 СекцWorkДТ.Cell(iiTable, OffsetCol+10, CellBgColor,   ColorB);
 СекцWorkДТ.Cell(iiTable, OffsetCol+10, CellAlignment, 1);
 СекцWorkДТ.Cell(iiTable, OffsetCol+10, CellBorder, "1,1,1,1");
 СекцWorkДТ.Cell(iiTable, OffsetCol+10, CellWrap, True);
 СекцWorkДТ.Cell(iiTable, OffsetCol+10, CellContents, Цифры+" ");

 Цифры=Trim(КоличествоТочно_Текстом(тКОЛКРЕ[Row]))+Chr(13)+Trim(Format("%17.2N", тСУМКРЕ[Row]));
 СекцWorkДТ.Cell(iiTable, OffsetCol+11, CellFontStyle, Style);
 СекцWorkДТ.Cell(iiTable, OffsetCol+11, CellFontSize,  8);
 СекцWorkДТ.Cell(iiTable, OffsetCol+11, CellFontColor, ColorF);
 СекцWorkДТ.Cell(iiTable, OffsetCol+11, CellBgColor,   ColorB);
 СекцWorkДТ.Cell(iiTable, OffsetCol+11, CellAlignment, 1);
 СекцWorkДТ.Cell(iiTable, OffsetCol+11, CellBorder, "1,1,1,1");
 СекцWorkДТ.Cell(iiTable, OffsetCol+11, CellWrap, True);
 СекцWorkДТ.Cell(iiTable, OffsetCol+11, CellContents, Цифры+" ");

 Цифры=Trim(КоличествоТочно_Текстом(тКОЛКОН[Row]))+Chr(13)+Trim(Format("%17.2N", тСУМКОН[Row]));
 СекцWorkДТ.Cell(iiTable, OffsetCol+12, CellFontStyle, Style);
 СекцWorkДТ.Cell(iiTable, OffsetCol+12, CellFontSize,  8);
 СекцWorkДТ.Cell(iiTable, OffsetCol+12, CellFontColor, ColorF);
 СекцWorkДТ.Cell(iiTable, OffsetCol+12, CellBgColor,   ColorB);
 СекцWorkДТ.Cell(iiTable, OffsetCol+12, CellAlignment, 1);
 СекцWorkДТ.Cell(iiTable, OffsetCol+12, CellBorder, "1,1,1,1");
 СекцWorkДТ.Cell(iiTable, OffsetCol+12, CellWrap, True);
 СекцWorkДТ.Cell(iiTable, OffsetCol+12, CellContents, Цифры+" ");

end;

Proc СформироватьСтрокуДанных(Row:Integer; Iter:Integer; iiTable:Integer);
var OffsetCol, Height, KolStrok, KolStrok1, KolStrok2, KolStrok3 :Integer;
var Value, tmp1, tmp2, Цифры :String;

 OffsetCol=1;
 Height=asInteger(СекцWorkДТ.Row(iiTable, RowHeight, ""));
 if Round(Height/50, 0)>1: Height=50; fi;

 if flgТолькоИмя: Value=тНФАИМЯ[Row]; else Value=тНФАКОД[Row]+Chr(13)+тНФАИМЯ[Row]; fi;
 KolStrok1=asInteger(СекцWorkДТ.Cell(iiTable, OffsetCol+02, CellLinesCount, Value));

 tmp1=тНФАИНВ[Row]; if tmp1="> не присвоен": tmp1=""; fi;
 if flgТолькоИнв: tmp2=""; else tmp2=тНФАУЧН[Row]; if tmp2="> не присвоен": tmp2=""; fi; fi;
 Value=tmp1+if(tmp2<>"", Chr(13), "")+tmp2;
 KolStrok2=asInteger(СекцWorkДТ.Cell(iiTable, OffsetCol+03, CellLinesCount, Value));

 Value=тНФАЕДИ[Row];
 KolStrok3=asInteger(СекцWorkДТ.Cell(iiTable, OffsetCol+04, CellLinesCount, Value));

 KolStrok=Max(KolStrok1, KolStrok2, KolStrok3);
 if KolStrok>1: СекцWorkДТ.Row(iiTable, RowHeight, Height*KolStrok); else СекцWorkДТ.Row(iiTable, RowHeight, Height); fi;

 СекцWorkДТ.Cell(iiTable, OffsetCol+01, CellFontStyle , 0);
 СекцWorkДТ.Cell(iiTable, OffsetCol+01, CellFontSize  , 7);
 СекцWorkДТ.Cell(iiTable, OffsetCol+01, CellFontColor , coBlack);
 СекцWorkДТ.Cell(iiTable, OffsetCol+01, CellBgColor   , coTransparent);
 СекцWorkДТ.Cell(iiTable, OffsetCol+01, CellAlignment , 2);
 СекцWorkДТ.Cell(iiTable, OffsetCol+01, CellBorder    , "1,1,1,1");
 СекцWorkДТ.Cell(iiTable, OffsetCol+01, CellWrap      , True);
 СекцWorkДТ.Cell(iiTable, OffsetCol+01, CellContents  , Str(Iter));

 СекцWorkДТ.Cell(iiTable, OffsetCol+02, CellFontStyle , 0);
 СекцWorkДТ.Cell(iiTable, OffsetCol+02, CellFontSize  , 8);
 СекцWorkДТ.Cell(iiTable, OffsetCol+02, CellFontColor , coBlack);
 СекцWorkДТ.Cell(iiTable, OffsetCol+02, CellBgColor   , coTransparent);
 СекцWorkДТ.Cell(iiTable, OffsetCol+02, CellAlignment , 0);
 СекцWorkДТ.Cell(iiTable, OffsetCol+02, CellBorder    , "1,1,1,1");
 СекцWorkДТ.Cell(iiTable, OffsetCol+02, CellWrap      , True);
 СекцWorkДТ.Cell(iiTable, OffsetCol+02, CellContents  , if(flgТолькоИмя, тНФАИМЯ[Row], тНФАКОД[Row]+Chr(13)+тНФАИМЯ[Row]));

 СекцWorkДТ.Cell(iiTable, OffsetCol+03, CellFontStyle , 0);
 СекцWorkДТ.Cell(iiTable, OffsetCol+03, CellFontSize  , 8);
 СекцWorkДТ.Cell(iiTable, OffsetCol+03, CellFontColor , coBlack);
 СекцWorkДТ.Cell(iiTable, OffsetCol+03, CellBgColor   , coTransparent);
 СекцWorkДТ.Cell(iiTable, OffsetCol+03, CellAlignment , 2);
 СекцWorkДТ.Cell(iiTable, OffsetCol+03, CellBorder    , "1,1,1,1");
 СекцWorkДТ.Cell(iiTable, OffsetCol+03, CellWrap      , True);
 СекцWorkДТ.Cell(iiTable, OffsetCol+03, CellContents  , tmp1+if(tmp2<>"", Chr(13), "")+tmp2); -- Инвентырный и другие номера

 СекцWorkДТ.Cell(iiTable, OffsetCol+04, CellFontStyle , 0);
 СекцWorkДТ.Cell(iiTable, OffsetCol+04, CellFontSize  , 8);
 СекцWorkДТ.Cell(iiTable, OffsetCol+04, CellFontColor , coBlack);
 СекцWorkДТ.Cell(iiTable, OffsetCol+04, CellBgColor   , coTransparent);
 СекцWorkДТ.Cell(iiTable, OffsetCol+04, CellAlignment , 2);
 СекцWorkДТ.Cell(iiTable, OffsetCol+04, CellBorder    , "1,1,1,1");
 СекцWorkДТ.Cell(iiTable, OffsetCol+04, CellWrap      , True);
 СекцWorkДТ.Cell(iiTable, OffsetCol+04, CellContents  , тНФАЕДИ[Row]);

 Цифры=Trim(КоличествоТочно_Текстом(тКОЛОСТ[Row]))+Chr(13)+Trim(Format("%17.2N", тСУМОСТ[Row]));
 СекцWorkДТ.Cell(iiTable, OffsetCol+05, CellFontStyle , 0);
 СекцWorkДТ.Cell(iiTable, OffsetCol+05, CellFontSize  , 8);
 СекцWorkДТ.Cell(iiTable, OffsetCol+05, CellFontColor , coNavy);
 СекцWorkДТ.Cell(iiTable, OffsetCol+05, CellBgColor   , coWhite);
 СекцWorkДТ.Cell(iiTable, OffsetCol+05, CellAlignment , 1);
 СекцWorkДТ.Cell(iiTable, OffsetCol+05, CellBorder    , "1,1,1,1");
 СекцWorkДТ.Cell(iiTable, OffsetCol+05, CellWrap      , True);
 СекцWorkДТ.Cell(iiTable, OffsetCol+05, CellContents  , Цифры+" ");

 Цифры=Trim(КоличествоТочно_Текстом(тКОЛДПО[Row]))+Chr(13)+Trim(Format("%17.2N", тСУМДПО[Row]));
 СекцWorkДТ.Cell(iiTable, OffsetCol+06, CellFontStyle , 0);
 СекцWorkДТ.Cell(iiTable, OffsetCol+06, CellFontSize  , 8);
 СекцWorkДТ.Cell(iiTable, OffsetCol+06, CellFontColor , coBlack);
 СекцWorkДТ.Cell(iiTable, OffsetCol+06, CellBgColor   , coTransparent);
 СекцWorkДТ.Cell(iiTable, OffsetCol+06, CellAlignment , 1);
 СекцWorkДТ.Cell(iiTable, OffsetCol+06, CellBorder    , "1,1,1,1");
 СекцWorkДТ.Cell(iiTable, OffsetCol+06, CellWrap      , True);
 СекцWorkДТ.Cell(iiTable, OffsetCol+06, CellContents  , Цифры+" ");

 Цифры=Trim(КоличествоТочно_Текстом(тКОЛДВП[Row]))+Chr(13)+Trim(Format("%17.2N", тСУМДВП[Row]));
 СекцWorkДТ.Cell(iiTable, OffsetCol+07, CellFontStyle , 0);
 СекцWorkДТ.Cell(iiTable, OffsetCol+07, CellFontSize  , 8);
 СекцWorkДТ.Cell(iiTable, OffsetCol+07, CellFontColor , coBlack);
 СекцWorkДТ.Cell(iiTable, OffsetCol+07, CellBgColor   , coTransparent);
 СекцWorkДТ.Cell(iiTable, OffsetCol+07, CellAlignment , 1);
 СекцWorkДТ.Cell(iiTable, OffsetCol+07, CellBorder    , "1,1,1,1");
 СекцWorkДТ.Cell(iiTable, OffsetCol+07, CellWrap      , True);
 СекцWorkДТ.Cell(iiTable, OffsetCol+07, CellContents  , Цифры+" ");

 Цифры=Trim(КоличествоТочно_Текстом(тКОЛДЕБ[Row]))+Chr(13)+Trim(Format("%17.2N", тСУМДЕБ[Row]));
 СекцWorkДТ.Cell(iiTable, OffsetCol+08, CellFontStyle , 0);
 СекцWorkДТ.Cell(iiTable, OffsetCol+08, CellFontSize  , 8);
 СекцWorkДТ.Cell(iiTable, OffsetCol+08, CellFontColor , coBlack);
 СекцWorkДТ.Cell(iiTable, OffsetCol+08, CellBgColor   , coWhite );
 СекцWorkДТ.Cell(iiTable, OffsetCol+08, CellAlignment , 1);
 СекцWorkДТ.Cell(iiTable, OffsetCol+08, CellBorder    , "1,1,1,1");
 СекцWorkДТ.Cell(iiTable, OffsetCol+08, CellWrap      , True);
 СекцWorkДТ.Cell(iiTable, OffsetCol+08, CellContents  , Цифры+" ");

 Цифры=Trim(КоличествоТочно_Текстом(тКОЛКРО[Row]))+Chr(13)+Trim(Format("%17.2N", тСУМКРО[Row]));
 СекцWorkДТ.Cell(iiTable, OffsetCol+09, CellFontStyle , 0);
 СекцWorkДТ.Cell(iiTable, OffsetCol+09, CellFontSize  , 8);
 СекцWorkДТ.Cell(iiTable, OffsetCol+09, CellFontColor , coBlack);
 СекцWorkДТ.Cell(iiTable, OffsetCol+09, CellBgColor   , coTransparent);
 СекцWorkДТ.Cell(iiTable, OffsetCol+09, CellAlignment , 1);
 СекцWorkДТ.Cell(iiTable, OffsetCol+09, CellBorder    , "1,1,1,1");
 СекцWorkДТ.Cell(iiTable, OffsetCol+09, CellWrap      , True);
 СекцWorkДТ.Cell(iiTable, OffsetCol+09, CellContents  , Цифры+" ");

 Цифры=Trim(КоличествоТочно_Текстом(тКОЛКВП[Row]))+Chr(13)+Trim(Format("%17.2N", тСУМКВП[Row]));
 СекцWorkДТ.Cell(iiTable, OffsetCol+10, CellFontStyle , 0);
 СекцWorkДТ.Cell(iiTable, OffsetCol+10, CellFontSize  , 8);
 СекцWorkДТ.Cell(iiTable, OffsetCol+10, CellFontColor , coBlack);
 СекцWorkДТ.Cell(iiTable, OffsetCol+10, CellBgColor   , coTransparent);
 СекцWorkДТ.Cell(iiTable, OffsetCol+10, CellAlignment , 1);
 СекцWorkДТ.Cell(iiTable, OffsetCol+10, CellBorder    , "1,1,1,1");
 СекцWorkДТ.Cell(iiTable, OffsetCol+10, CellWrap      , True);
 СекцWorkДТ.Cell(iiTable, OffsetCol+10, CellContents  , Цифры+" ");

 Цифры=Trim(КоличествоТочно_Текстом(тКОЛКРЕ[Row]))+Chr(13)+Trim(Format("%17.2N", тСУМКРЕ[Row]));
 СекцWorkДТ.Cell(iiTable, OffsetCol+11, CellFontStyle , 0);
 СекцWorkДТ.Cell(iiTable, OffsetCol+11, CellFontSize  , 8);
 СекцWorkДТ.Cell(iiTable, OffsetCol+11, CellFontColor , coBlack);
 СекцWorkДТ.Cell(iiTable, OffsetCol+11, CellBgColor   , coWhite);
 СекцWorkДТ.Cell(iiTable, OffsetCol+11, CellAlignment , 1);
 СекцWorkДТ.Cell(iiTable, OffsetCol+11, CellBorder    , "1,1,1,1");
 СекцWorkДТ.Cell(iiTable, OffsetCol+11, CellWrap      , True);
 СекцWorkДТ.Cell(iiTable, OffsetCol+11, CellContents  , Цифры+" ");

 Цифры=Trim(КоличествоТочно_Текстом(тКОЛКОН[Row]))+Chr(13)+Trim(Format("%17.2N", тСУМКОН[Row]));
 СекцWorkДТ.Cell(iiTable, OffsetCol+12, CellFontStyle , 0);
 СекцWorkДТ.Cell(iiTable, OffsetCol+12, CellFontSize  , 8);
 СекцWorkДТ.Cell(iiTable, OffsetCol+12, CellFontColor , coNavy);
 СекцWorkДТ.Cell(iiTable, OffsetCol+12, CellBgColor   , coWhite);
 СекцWorkДТ.Cell(iiTable, OffsetCol+12, CellAlignment , 1);
 СекцWorkДТ.Cell(iiTable, OffsetCol+12, CellBorder    , "1,1,1,1");
 СекцWorkДТ.Cell(iiTable, OffsetCol+12, CellWrap      , True);
 СекцWorkДТ.Cell(iiTable, OffsetCol+12, CellContents  , Цифры+" ");

end;

Proc ФиксироватьШапку(Фиксировать:Logical);
var xx, yy :Integer;
 if Позиции>0:
   xx=asInteger(СекцWorkЗТ.Column(2, ColLeft, ""));
   yy=asInteger(СекцWorkЗТ.Row(4, RowTop, ""));
   if xx>0 and yy>0: if Фиксировать: Template.Freeze(xx, yy); else Template.Freeze(0, 0); fi; fi;
 fi;
end;

Proc ПостроениеОтчета;
var Режим :Logical;
var ColorH1, ColorH2, ColorH3, ColorH4, ColorH5, ColorH6, ColorH7, ColorH8, len, ii, Iter :Integer;

 len=LengthOfArray(тSRTFLD);
 if len>0:
   Позиции=len;
   Режим=AutoRefresh;
   ToggleAutoRefresh(False);
   ShowProgress(len, "Формирование оборотно-сальдовой ведомости НФА...");
   Try
     ФормированиеЦветовЗаголовков(intСхемаЦветов);
     ColorH1=BufInt[1];
     ColorH2=BufInt[2];
     ColorH3=BufInt[3];
     ColorH4=BufInt[4];
     ColorH5=BufInt[5];
     ColorH6=BufInt[6];
     ColorH7=BufInt[7];
     ColorH8=BufInt[8];
     --
     ДляПостроения=0;
     Iter=0;
     СекцWorkДТ.RowsCount=2*len;
     --
     ValidateВедомостьSection(True);
     ValidateИтогиSection(True);
     --
     if curФтрНФА<>3:
       for ii=1 to len do
         ProgressPos(ii);
         if тНФАКОД[ii]="": -- значит заголовок
           ДляПостроения=ДляПостроения+2;
           СформироватьСтрокуПромежуточныхИтогов(ii, тSRTFLD[ii], ColorH1, ColorH2, ColorH3, ColorH4, ColorH5, ColorH6, ColorH7, ColorH8, ДляПостроения);
         else
           ДляПостроения=ДляПостроения+1;
           Iter=Iter+1;
           СформироватьСтрокуДанных(ii, Iter, ДляПостроения);
         fi;
       od;
     else
       --только промежуточные итоги
       for ii=1 to len do
         ProgressPos(ii);
         if тНФАКОД[ii]="": -- значит заголовок
           ДляПостроения=ДляПостроения+2;
           СформироватьСтрокуПромежуточныхИтогов(ii, тSRTFLD[ii], ColorH1, ColorH2, ColorH3, ColorH4, ColorH5, ColorH6, ColorH7, ColorH8, ДляПостроения);
         fi;
       od;
     fi;
     СекцWorkДТ.RowsCount=ДляПостроения;
     --
   Finally
     CloseProgress;
     ToggleAutoRefresh(Режим);
   end;
 fi;
 --
 ValidateОтчетSection;

end;

Proc РасчетСпискаНФА;
var Work, ftrАНА101, ftrДОП101, ftrМОЛ101, ftrМХЭ101, ftrНФА101, ftrАНА106, ftrДОП106, ftrМОЛ106, ftrМХЭ106, ftrНФА106 :Logical;
var MaskAcc101, MaskAna101, MaskAcc106, MaskAna106 :String;
var chislo, WorkConstНФА100П, WorkConstНФА_ИНВ :Numeric;
var vvЕстьБал, vvЕстьЗаб :Logical;
var начало, num :Integer;
 начало=Time;
 -- Проверка заполнения
 if not ПроверкаЗаполнения: Exit; fi;
 отчАНА=Trim(отчАНА);
 отчНФА=Trim(отчНФА);
 отчДОП=Trim(отчДОП);
 отчМОЛ=Trim(отчМОЛ);
 отчМХЭ=Trim(отчМХЭ);
 отчГРП=Trim(отчГРП);
 --
 MaskAcc101=""; MaskAna101=""; ftrАНА101=False; ftrДОП101=False; ftrМОЛ101=False; ftrМХЭ101=False; ftrНФА101=False;
 MaskAcc106=""; MaskAna106=""; ftrАНА106=False; ftrДОП106=False; ftrМОЛ106=False; ftrМХЭ106=False; ftrНФА106=False;
 -- Константы НФА
 Try chislo=Com_Var("ОС_100"  , DataКП-1); Except chislo=0.00; end;
 if not chislo>0: if (DataКП-1)>=1.1.2011: chislo=40000; else chislo=20000; fi; fi;
 WorkConstНФА100П=chislo;
 Try chislo=Com_Var("ОС_РАСХ" , DataКП-1); Except chislo=0.00; end;
 if not chislo>0: if (DataКП-1)>=1.1.2009: chislo=3000;  else chislo=1000;  fi; fi;
 WorkConstНФА_ИНВ=chislo;
 --
 vvЕстьБал=if(curБалЗаб=1 or curБалЗаб=2, True, False);
 vvЕстьЗаб=if(curБалЗаб=1 or curБалЗаб=3, True, False);
 --
 if not (flgУчет106xURep and flgУчет106xOnly):
   MaskAcc101=ИтоговаяМаскаСчета(curФтрИст, отчСЧТ, отчКБК, vvЕстьБал, vvЕстьЗаб);
   Work=False;
   if Abs(Turn("+("+MaskAcc101+"){~НФА.*}", 1.1.100, DataКП))>0 or Abs(Turn("-("+MaskAcc101+"){~НФА.*}", 1.1.100, DataКП))>0:
      num=Enquiry("Выберите действие...", "Обнаружены проводки^Mна "+отчСЧТ+" счетах^Mнепомеченные справочником НФА!", "Проводки в отчет;Отмена;Игнорировать", mtError);
      if num=1:
        Report(PlanVar("НФА")+"\ОТЧЕТЫ\НФАОТЧ2007.lst"+"|Непомеченные_НФА", 1.1.100, DataКП, MaskAcc101, "~НФА.*");
        Exit;
      |  num=3: Work=True;
      else Exit;
      fi;
   fi;
   -- Анализ фильтров по аналитике для 101 счетов
   MaskAna101=АнализФильтраАналитики(MaskAcc101, Work, False);
   if MaskAna101=" ": Exit; fi;
   ftrНФА101 = BufFlag[1];
   ftrМОЛ101 = BufFlag[2];
   ftrМХЭ101 = BufFlag[3];
   ftrДОП101 = BufFlag[4];
   ftrАНА101 = BufFlag[5];
 fi;
 if flgУчет106xURep:
   MaskAcc106=ИтоговаяМаскаСчетаЦС(curФтрИст, отчКБК, curФтрAcc);
   -- Анализ фильтров по аналитике для 106 счетов
   MaskAna106=АнализФильтраАналитики(MaskAcc106, False, True);
   if MaskAna106=" ": Exit; fi;
   ftrНФА106 = BufFlag[1];
   ftrМОЛ106 = BufFlag[2];
   ftrМХЭ106 = BufFlag[3];
   ftrДОП106 = BufFlag[4];
   ftrАНА106 = BufFlag[5];
 fi;
 -- ОСНОВНОЙ БЛОК
 Work=False;
 -- Поиск данных
 Work=ПоискДанных_ИщемДанные(DataНП, DataКП, vvЕстьБал, vvЕстьЗаб, MaskAcc101, MaskAna101, ftrНФА101, ftrМОЛ101, ftrМХЭ101, ftrДОП101, ftrАНА101, flgУчет106xURep, flgУчет106xOnly, MaskAcc106, MaskAna106, ftrНФА106, ftrМОЛ106, ftrМХЭ106, ftrДОП106, ftrАНА106, WorkConstНФА100П, WorkConstНФА_ИНВ);
 SetFLGСлужИнф;
 -- Построение отчета
 if Work:
   ПодсчетВставкаПромежуточныхИтогов(WorkConstНФА100П, WorkConstНФА_ИНВ);
   ПостроениеОтчета;
   if Позиции>0: Message("Расчет завершен!^MВремя работы - "+TimeToHMSstring(Time-начало), mtInformation); fi;
 fi;
end;

Proc ВыбратьUserПолеСортировки;
var ii, num :Integer;
var prevМСК, prevИМЯ, newМСК, newИМЯ :String;
var SaveValue :Logical;
 SaveValue=False;
 ii=0;
 prevМСК=fldСОРТкод;
 prevИМЯ=fldСОРТимя;
 ClearVariable(BufMsk);
 ClearVariable(BufStr);
 ii=ii+1; BufMsk[ii]="тНФАКОД"; BufStr[ii]="... коду НФА";
 ii=ii+1; BufMsk[ii]="тНФАИМЯ"; BufStr[ii]="... наименованию НФА";
 ii=ii+1; BufMsk[ii]="тНФАИНВ"; BufStr[ii]="... инвентарному номеру НФА";
 ii=ii+1; BufMsk[ii]="тНФАУЧН"; BufStr[ii]="... учетному номеру НФА";
 --
 ii=SearchInArray(BufMsk, prevИМЯ, False, 1);
 if not ii>0: ii=1; fi;
 num=Alternate("Сортировать по...", BufStr, -1, ii, 12);
 if num=0: Exit; fi;
 newМСК=BufMsk[num];
 newИМЯ=BufStr[num];
 if newМСК<>prevМСК: if not ОтменитьИзмененияУсловийОтчета: SaveValue=True; fi; fi;
 if SaveValue:
   fldСОРТкод=newМСК;
   fldСОРТимя=newИМЯ;
 fi;
end;

2-- События клеток
Func Field_onEnter(Field:String; Iter:Integer): Logical; -- на входе в клетку
 if Template_OnClear: ^False; fi;
 Flag_onEnter=False;
 if Field="DataНП"         : OldDateНП=DataНП; Flag_onEnter=True; ^True;
 |  Field="DataКП"         : OldDateКП=DataКП; Flag_onEnter=True; ^True;
 |  Field="отчАНА"         : OldОтчАНА=отчАНА; Flag_onEnter=True; ^True;
 |  Field="ОтчПрд_"        : Даты_ВыборДаты(False); ^False;
 |  Field="flgСЧТ_"        : ФлагиПараметровДетализации(Field, False); ^False;
 |  Field="flgКБК_"        : ФлагиПараметровДетализации(Field, False); ^False;
 |  Field="flgИСТ_"        : ФлагиПараметровДетализации(Field, False); ^False;
 |  Field="flgМОЛ_"        : ФлагиПараметровДетализации(Field, False); ^False;
 |  Field="flgМХЭ_"        : ФлагиПараметровДетализации(Field, False); ^False;
 |  Field="flgГРП_"        : ФлагиПараметровДетализации(Field, False); ^False;
 |  Field="flgДОП_"        : ФлагиПараметровДетализации(Field, False); ^False;
 |  Field="flgНФА_"        : ФлагиПараметровДетализации(Field, False); ^False;
 |  Field="VOCКОД_"        : ВыборДопСправочника(False); ^False;
 |  Field="отчСЧТ_"        : Счета_ВыборВидаНФАonEnter(curФтрAcc); ^False;
 |  Field="отчКБК_"        : КБК_ВыбратьФильтрКБК(False); ^False;
 |  Field="отчГРП_"        : ГруппыНФА_ВыбратьФильтрГруппыНФА(False); ^False;
 |  Field="отчМОЛ_"        : Аналитика_ВыбратьФильтрАналитики(Field, False); ^False;
 |  Field="отчМХЭ_"        : Аналитика_ВыбратьФильтрАналитики(Field, False); ^False;
 |  Field="отчДОП_"        : Аналитика_ВыбратьФильтрАналитики(Field, False); ^False;
 |  Field="отчНФА_"        : Аналитика_ВыбратьФильтрАналитики(Field, False); ^False;
 |  Field="flgПечСлужИнф"  : flgПечСлужИнф  = not flgПечСлужИнф; SetFLGСлужИнф; ^False;
 |  Field="intСхемаЦветов" : intСхемаЦветов = ВыбратьСхемуЦветовИерархическихЗаголовков(intСхемаЦветов); ПрименитьЦвета; ^False;
 |  Field="flgОтбЦенИИли"  : flgОтбЦенИИли  = not flgОтбЦенИИли; ^False;
 |  Field="intРежимСохр_"  : intРежимСохр   = ВыбратьРежимСохранения(intРежимСохр); ^False;
 |  Field="flgЧиститьАна"  : flgЧиститьАна  = not flgЧиститьАна; ^False;
 |  Field="flgТолькоИнв"   : flgТолькоИнв   = not flgТолькоИнв ; ^False;
 |  Field="flgТолькоИмя"   : flgТолькоИмя   = not flgТолькоИмя ; ^False;
 |  Field="flgРсчИтгТаб1"  : flgРсчИтгТаб1  = not flgРсчИтгТаб1; ВнешнийВид_ИтоговыеТаблицы(flgРсчИтгТаб1, flgРсчИтгТаб2, flgРсчИтгТаб3, flgПечНовСтр); ^False;
 |  Field="flgРсчИтгТаб2"  : flgРсчИтгТаб2  = not flgРсчИтгТаб2; ВнешнийВид_ИтоговыеТаблицы(flgРсчИтгТаб1, flgРсчИтгТаб2, flgРсчИтгТаб3, flgПечНовСтр); ^False;
 |  Field="flgРсчИтгТаб3"  : flgРсчИтгТаб3  = not flgРсчИтгТаб3; ВнешнийВид_ИтоговыеТаблицы(flgРсчИтгТаб1, flgРсчИтгТаб2, flgРсчИтгТаб3, flgПечНовСтр); ^False;
 |  Field="flgПечНовСтр"   : flgПечНовСтр   = not flgПечНовСтр;  ВнешнийВид_ИтоговыеТаблицы(flgРсчИтгТаб1, flgРсчИтгТаб2, flgРсчИтгТаб3, flgПечНовСтр); ^False;
 |  Field="flgВыдСчтНФА"   : flgВыдСчтНФА   = not flgВыдСчтНФА ; ^False;
 |  Field="ИзмГрп_"        : ИзменитьПорядокГрупп(Иерархия); ^False;
 |  Field="УЧР_ИМЯ"        : ВзятьРеквизиты(УЧР_REC, False); ^False;
 |  Field="УЧР_ОКПО"       : ВзятьРеквизиты(УЧР_REC, False); ^False;
 |  Field="ПОД_ИМЯ"        : ПО_Выбор(ПОД_КОД); ^False;
 |  Field="ПОД_КОД"        : ПО_Выбор(ПОД_КОД); ^False;
 |  Field="fldСОРТимя_"    : ВыбратьUserПолеСортировки; ^False;
 |  Field="flgФиксШапка_"  : flgФиксШапка = not flgФиксШапка; ФиксироватьШапку(flgФиксШапка); ^False;
 |  Field="flgSgnЕЦ_"      : ЗнакСравненияЦен(Field); ^False;
 |  Field="flgSgnНП_"      : ЗнакСравненияЦен(Field); ^False;
 |  Field="flgSgnДО_"      : ЗнакСравненияЦен(Field); ^False;
 |  Field="flgSgnКО_"      : ЗнакСравненияЦен(Field); ^False;
 |  Field="flgSgnКП_"      : ЗнакСравненияЦен(Field); ^False;
 |  Field="БМЦеныЕЦ"       : OldЦена=БМЦеныЕЦ; Flag_onEnter=True; ^True;
 |  Field="БМЦеныНП"       : OldЦена=БМЦеныНП; Flag_onEnter=True; ^True;
 |  Field="БМЦеныДО"       : OldЦена=БМЦеныДО; Flag_onEnter=True; ^True;
 |  Field="БМЦеныКО"       : OldЦена=БМЦеныКО; Flag_onEnter=True; ^True;
 |  Field="БМЦеныКП"       : OldЦена=БМЦеныКП; Flag_onEnter=True; ^True;
 fi;
 ^True;
end;

Proc Field_onExit(Field:String; Iter:Integer); -- на выходе из клетки
 if Template_OnClear: Exit; fi;
 if Field="DataНП"         : if DataНП<>OldDateНП: if ОтменитьИзмененияУсловийОтчета: DataНП=OldDateНП; fi; fi;
 |  Field="DataКП"         : if DataКП<>OldDateКП: if ОтменитьИзмененияУсловийОтчета: DataКП=OldDateКП; fi; fi;
 |  Field="отчАНА"         : if (Flag_onEnter and отчАНА<>OldОтчАНА) or (not Flag_onEnter and отчАНА="" and OldОтчАНА<>""): if ОтменитьИзмененияУсловийОтчета: отчАНА=OldОтчАНА; fi; fi;
 |  Field="ОтчПрд_"        : Даты_ВыборДаты(True);
 |  Field="flgСЧТ_"        : ФлагиПараметровДетализации(Field, True);
 |  Field="flgКБК_"        : ФлагиПараметровДетализации(Field, True);
 |  Field="flgИСТ_"        : ФлагиПараметровДетализации(Field, True);
 |  Field="flgМОЛ_"        : ФлагиПараметровДетализации(Field, True);
 |  Field="flgМХЭ_"        : ФлагиПараметровДетализации(Field, True);
 |  Field="flgГРП_"        : ФлагиПараметровДетализации(Field, True);
 |  Field="flgДОП_"        : ФлагиПараметровДетализации(Field, True);
 |  Field="flgНФА_"        : ФлагиПараметровДетализации(Field, True);
 |  Field="VOCКОД_"        : ВыборДопСправочника(True);
 |  Field="отчСЧТ_"        : Счета_ВыборВидаНФАonEnter(curФтрAcc);
 |  Field="отчКБК_"        : КБК_ВыбратьФильтрКБК(True);
 |  Field="отчГРП_"        : ГруппыНФА_ВыбратьФильтрГруппыНФА(True);
 |  Field="отчМОЛ_"        : Аналитика_ВыбратьФильтрАналитики(Field, True);
 |  Field="отчМХЭ_"        : Аналитика_ВыбратьФильтрАналитики(Field, True);
 |  Field="отчДОП_"        : Аналитика_ВыбратьФильтрАналитики(Field, True);
 |  Field="отчНФА_"        : Аналитика_ВыбратьФильтрАналитики(Field, True);
 |  Field="ИспФИО"         : if ИспФИО="": ИспДол=""; ИспREC=NIL; fi;
 |  Field="flgПечСлужИнф"  : SetFLGСлужИнф;
 |  Field="intСхемаЦветов" : if intСхемаЦветов=0: ПрименитьЦвета; fi;
 |  Field="УЧР_ИМЯ"        : if УЧР_ИМЯ=""  :  УЧР_ОКПО=""; fi;
 |  Field="УЧР_ОКПО"       : if УЧР_ОКПО="" :  УЧР_ИМЯ="";  fi;
 |  Field="ПОД_ИМЯ"        : if ПОД_ИМЯ=""  :  ПОД_КОД="";  fi;
 |  Field="ПОД_КОД"        : if ПОД_КОД=""  :  ПОД_ИМЯ="";  fi;
 |  Field="БМЦеныЕЦ"       : if (Flag_onEnter and БМЦеныЕЦ<>OldЦена) or (not Flag_onEnter and БМЦеныЕЦ=0 and OldЦена<>0): if ОтменитьИзмененияУсловийОтчета: БМЦеныЕЦ=OldЦена; fi; fi;
 |  Field="БМЦеныНП"       : if (Flag_onEnter and БМЦеныНП<>OldЦена) or (not Flag_onEnter and БМЦеныНП=0 and OldЦена<>0): if ОтменитьИзмененияУсловийОтчета: БМЦеныНП=OldЦена; fi; fi;
 |  Field="БМЦеныДО"       : if (Flag_onEnter and БМЦеныДО<>OldЦена) or (not Flag_onEnter and БМЦеныДО=0 and OldЦена<>0): if ОтменитьИзмененияУсловийОтчета: БМЦеныДО=OldЦена; fi; fi;
 |  Field="БМЦеныКО"       : if (Flag_onEnter and БМЦеныКО<>OldЦена) or (not Flag_onEnter and БМЦеныКО=0 and OldЦена<>0): if ОтменитьИзмененияУсловийОтчета: БМЦеныКО=OldЦена; fi; fi;
 |  Field="БМЦеныКП"       : if (Flag_onEnter and БМЦеныКП<>OldЦена) or (not Flag_onEnter and БМЦеныКП=0 and OldЦена<>0): if ОтменитьИзмененияУсловийОтчета: БМЦеныКП=OldЦена; fi; fi;
 fi;
 Flag_onEnter=False;
 OldЦена=0;
 ValidateОтчетSection;
end;

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

Func Сотрудники_onLookup(Sect:String; Row:Integer; Col:Integer; Cur:String): String;
var REC :Record;
var FieldName, СТРФИО, СТРДОЛ, tmp1, tmp2 :String;
 Template.HideEditor(False);
 if not AutoRefresh: RefreshAna; fi;
 FieldName=asString(Template.Field);
 REC=OpenCardFile("СОТРУДНИКИ", "", ИспREC, crdRecordOnly);
 if REC=NIL: ^Cur; fi;
 tmp1=GetCardFieldS("СОТРУДНИКИ", REC, "ИНИЦИАЛЫ");
 tmp2=GetCardFieldS("СОТРУДНИКИ", REC, "ФАМИЛИЯ");
 СТРФИО=if(tmp2="", GetCardFieldS("СОТРУДНИКИ", REC, "ФИОТ"), tmp2+" "+if(tmp1<>"..", tmp1, ""));
 Try СТРДОЛ=GetCardFieldS("СОТРУДНИКИ", REC, "ДОЛЖНОСТЬ.ДОЛЖ"); Except СТРДОЛ=""; end;
 if FieldName="ИСПФИО": ИСПФИО=СТРФИО; ИСПДОЛ=СТРДОЛ;
 |  FieldName="ИСПДОЛ": ИСПФИО=СТРФИО; ИСПДОЛ=СТРДОЛ;
 fi;
 ^"";
end;

Func ДопАналитика_OnLookup(Sect:String; Row:Integer; Col:Integer; Cur:String): String;
var StoreANA, Value :String;
 Template.HideEditor(False);
 if Template_OnClear: ^Cur; fi;
 StoreANA=отчАНА;
 Value=Up(AnaElection("*", False, False, StoreANA));
 if Value="": ^Cur; fi;
 if отчАНА="": 
   отчАНА=Value;
 else 
   if Pos(Value, Up(отчАНА))=0:
     отчАНА=Объединить(отчАНА, Value, Оператор);
     if Length(отчАНА)>253:
       Message("Строка доп. аналитики не может быть больше 253 символов.^MВыбор отменен!", mtWarning);
       отчАНА=StoreANA;
       OldОтчАНА=отчАНА;
       ^Cur;
     fi;
   fi;
 fi;
 if отчАНА<>StoreANA: if ОтменитьИзмененияУсловийОтчета: отчАНА=StoreANA; fi; ValidateОтчетSection; fi;
 OldОтчАНА=отчАНА;
 ^Cur;
end;

Func Field_OnValidateS(Field:String; Iter:Integer; Value:String) :Logical;
var Res :Numeric;
 if Field="отчАНА":
   if Length(Value)>253: Message("Строка доп. аналитики не может быть больше 253 символов!", mtWarning); ^False; fi;
   Try Res=Saldo("{"+Value+"}", 1.1.100); Except Raise; ^False; end;
 fi;
 ^True;
end;

Func Field_OnValidateI(Field:String; Iter:Integer; Value:Integer) :Logical;
 if Value<0.00: Message('Нельзя вводить отрицательное число!', mtError); ^False; fi;
 ^True;
end;

2-- События объектов
Proc Флаги_onChange(Sender:String);
var Flag, Old, Work :Logical;
var nameVar :String;
var ОбъектИмя :Object;
 if Template_OnClear: Exit; fi;
 Work=False;
 if FindObject(Sender, ОбъектИмя): Work=True; fi;
 if Work:
   nameVar="flg"+SubStr(Sender, 4, Length(Sender)-3); -- вычисляем имя переменной - 3=cb_
   Flag=GetVariableL(nameVar); -- текущий статус;
   Old = not Flag; -- предыдущий статус
   if ОтменитьИзмененияУсловийОтчета: Flag=Old; fi;
   PutVariableL(nameVar, Flag);
   ОбъектИмя.State=Flag;
   if Flag<>Old:
     if Sender="cb_УчетОст"      : РазрешенУчетУсловийОстатков(flgУчетОст);
     |  Sender="cb_ОстНП"        : РазрешенУчетОстатковНачало(flgОстНП);
     |  Sender="cb_ОстКП"        : РазрешенУчетОстатков_Конец(flgОстКП);
     |  Sender="cb_УчетОбо"      : РазрешенУчетУсловийОборотов(flgУчетОбо);
     |  Sender="cb_ОбДеб"        : РазрешенУчетОборотов_Дебета(flgОбДеб);
     |  Sender="cb_ОбКре"        : РазрешенУчетОборотовКредита(flgОбКре);
     |  Sender="cb_Use_ЦНП"      : ВнешнийВид_ФтрПоСумме_cbЦНП(flgUse_ЦНП);
     |  Sender="cb_Use_ЦДО"      : ВнешнийВид_ФтрПоСумме_cbЦДО(flgUse_ЦДО);
     |  Sender="cb_Use_ЦКО"      : ВнешнийВид_ФтрПоСумме_cbЦКО(flgUse_ЦКО);
     |  Sender="cb_Use_ЦКП"      : ВнешнийВид_ФтрПоСумме_cbЦКП(flgUse_ЦКП);
     |  Sender="cb_Учет106xURep" : ВнешнийВид_Есть106(flgУчет106xURep, curБалЗаб, False);
     |  Sender="cb_Учет106xOnly" : ВнешнийВид_ЕстьТолько106(flgУчет106xOnly);
     fi;
   fi;
   ValidateОтчетSection;
 fi;
end;

Proc ФлагиСчетов_onChange(Sender:String);
var curFlag, oldFlag :Integer;
 if Template_OnClear: Exit; fi;
 curFlag=curФтрAcc; -- текущий статус
 oldFlag=oldФтрAcc; -- предыдущий статус
 if ОтменитьИзмененияУсловийОтчета: curFlag=oldFlag; fi;
 curФтрAcc=curFlag;
 if curFlag<>oldFlag:
   if curFlag=2: флагиACC="11111111100000000";
   |  curFlag=3: флагиACC="00000000011111111";
   else          флагиACC="11111111111111111";
   fi;
   Счета_ВнешнийВид;
   ВнешнийВид_ФильтрКБК(curБалЗаб);
   ВнешнийВид_ФильтрПоСуммеПроверить(curФтрЦен, curFlag, curБалЗаб, flgУчет106xURep, curФтрНФА, False);
   ОчиститьУсловияОтбора(True, True, flgЧиститьАна);
   oldФтрAcc=curFlag;
   ValidateОтчетSection;
 fi;
end;

Proc ФлагиИСТ_onChange(Sender:String);
var curFlag, oldFlag :Integer;
 if Template_OnClear: Exit; fi;
 curFlag=curФтрИст; -- текущий статус
 oldFlag=oldФтрИст; -- предыдущий статус
 if ОтменитьИзмененияУсловийОтчета: curFlag=oldFlag; fi;
 curФтрИст=curFlag;
 if curFlag<>oldFlag: 
   ОчиститьУсловияОтбора(True, False, flgЧиститьАна);
   oldФтрИст=curFlag;
   ValidateОтчетSection;
 fi;
end;  

Proc ФлагиБАЛЗАБ_onChange(Sender:String);
var curFlag, oldFlag :Integer;
 if Template_OnClear: Exit; fi;
 curFlag=curБалЗаб; -- текущий статус
 oldFlag=oldБалЗаб; -- предыдущий статус
 if ОтменитьИзмененияУсловийОтчета: curFlag=oldFlag; fi;
 curБалЗаб=curFlag;
 if curFlag<>oldFlag: 
   ВнешнийВид_ФильтрКБК(curБалЗаб);
   ВнешнийВид_Есть106(flgУчет106xURep, curБалЗаб, False); -- ВнешнийВид_ФильтрПоСуммеПроверить проверяется в составе ВнешнийВид_Есть106
   ОчиститьУсловияОтбора(True, False, flgЧиститьАна);
   oldБалЗаб=curFlag;
   ValidateОтчетSection;
 fi;
end;  

Proc ФлагиНФА_onChange(Sender:String);
var curFlag, oldFlag :Integer;
 if Template_OnClear: Exit; fi;
 curFlag=curФтрНФА; -- текущий статус
 oldFlag=oldФтрНФА; -- предыдущий статус
 if ОтменитьИзмененияУсловийОтчета: curFlag=oldFlag; fi;
 curФтрНФА=curFlag;
 if curFlag<>oldFlag: 
   ВнешнийВид_ФильтрПоСуммеПроверить(curФтрЦен, curФтрAcc, curБалЗаб, flgУчет106xURep, curFlag, True);
   ОчиститьУсловияОтбора(False, False, flgЧиститьАна);
   oldФтрНФА=curFlag;
   ValidateОтчетSection;
 fi;
end;  

Proc ФлагиЦены_onChange(Sender:String);
var curFlag, oldFlag :Integer;
 if Template_OnClear: Exit; fi;
 curFlag=curФтрЦен; -- текущий статус
 oldFlag=oldФтрЦен; -- предыдущий статус
 if ОтменитьИзмененияУсловийОтчета: curFlag=oldFlag; fi;
 curФтрЦен=curFlag;
 if curFlag<>oldFlag: 
   ВнешнийВид_ФильтрПоСуммеПроверить(curFlag, curФтрAcc, curБалЗаб, flgУчет106xURep, curФтрНФА, True);
   --ОчиститьУсловияОтбора(False, False, flgЧиститьАна); -- пока отменим очистку аналитики
   oldФтрЦен=curFlag;
   ValidateОтчетSection;
 fi;
end;  

Proc СвернутьПараметры_onChange(Sender:String);
 if Template_OnClear: Exit; fi;
 flgФиксШапка=False;
 ФиксироватьШапку(flgФиксШапка);
 ValidateSection(flgСкрытьПарОтч, False);
end;

Proc cb_НстрВнВидОтч_OnChange(Sender:String);
 flgФиксШапка=False;
 ФиксироватьШапку(flgФиксШапка);
 ValidateSection(flgНстрВнВидОтч, True);
 ПрименитьЦвета;
end;

Func TimeToHMSstring_adv(valTime:Integer; valSep:String) :String;
var ihh, imm, icc :Integer;
var shh, smm, scc :String;
 shh=''; smm=''; scc='';
 ihh=Int(Trunc(valTime/3600));
 imm=Int(Trunc((valTime-ihh*3600)/60));
 icc=valTime-ihh*3600-imm*60;
 shh=Format("%.2d", ihh);
 smm=Format("%.2d", imm);
 scc=Format("%.2d", icc);
 ^(shh+valSep+smm+valSep+scc);
end;

Proc ЗаписатьЯчейкуКОЛИЧЕСТВОЧисло(objSheet:AutoObject; X:Integer; Y:Integer; tbValue:Numeric; locDS:String; locTS:String);
var xlsRange :AutoObject;
var Digit :Integer;
 xlsRange=AsAutoObject(objSheet.Cells[X,Y]);
 Digit=РАБ.НФА.FUNC_LIB.LENM(tbValue);
 Try
   xlsRange.NumberFormat = "#"+locTS+"##0"+if(Digit>0, locDS+RepStr("0", Digit), "");
   xlsRange.Value2 = tbValue;
 Finally
   ClearVariable(xlsRange);
 end;
end;

Proc ЭкспортСтрокиПромежуточногоИтога(refSheet:AutoObject; Row:Integer; MskSort:String; цвH1:Integer; цвH2:Integer; цвH3:Integer; цвH4:Integer; цвH5:Integer; цвH6:Integer; цвH7:Integer; цвH8:Integer; locDS:String; locTS:String; RowTbl:Integer);
var valKey1, valKey2, valKey3, valKey4, valKey5, valKey6, valKey7, valKey8, valKey9, strHeader, LnFn :String;
var ColorCell, lvlIndent :Integer;

 LnFn="ъ"+Chr(183)+"ъ";

 valKey1=Trim(ExtractWord(1, MskSort, "#"));
 valKey2=Trim(ExtractWord(2, MskSort, "#"));
 valKey3=Trim(ExtractWord(3, MskSort, "#"));
 valKey4=Trim(ExtractWord(4, MskSort, "#"));
 valKey5=Trim(ExtractWord(5, MskSort, "#"));
 valKey6=Trim(ExtractWord(6, MskSort, "#"));
 valKey7=Trim(ExtractWord(7, MskSort, "#"));
 valKey8=Trim(ExtractWord(8, MskSort, "#"));
 valKey9=Trim(ExtractWord(9, MskSort, "#"));

 strHeader=тНФАИМЯ[Row];

 if valKey1<>""  and valKey2=""  and valKey3=""  and valKey4=""  and valKey5=""  and valKey6=""  and valKey7=""  and valKey8=""  and (valKey9=LnFn or valKey9=""): lvlIndent=0; ColorCell=цвH1;
 |  valKey1<>""  and valKey2<>"" and valKey3=""  and valKey4=""  and valKey5=""  and valKey6=""  and valKey7=""  and valKey8=""  and (valKey9=LnFn or valKey9=""): lvlIndent=1; ColorCell=цвH2;
 |  valKey1<>""  and valKey2<>"" and valKey3<>"" and valKey4=""  and valKey5=""  and valKey6=""  and valKey7=""  and valKey8=""  and (valKey9=LnFn or valKey9=""): lvlIndent=2; ColorCell=цвH3;
 |  valKey1<>""  and valKey2<>"" and valKey3<>"" and valKey4<>"" and valKey5=""  and valKey6=""  and valKey7=""  and valKey8=""  and (valKey9=LnFn or valKey9=""): lvlIndent=3; ColorCell=цвH4;
 |  valKey1<>""  and valKey2<>"" and valKey3<>"" and valKey4<>"" and valKey5<>"" and valKey6=""  and valKey7=""  and valKey8=""  and (valKey9=LnFn or valKey9=""): lvlIndent=4; ColorCell=цвH5;
 |  valKey1<>""  and valKey2<>"" and valKey3<>"" and valKey4<>"" and valKey5<>"" and valKey6<>"" and valKey7=""  and valKey8=""  and (valKey9=LnFn or valKey9=""): lvlIndent=5; ColorCell=цвH6;
 |  valKey1<>""  and valKey2<>"" and valKey3<>"" and valKey4<>"" and valKey5<>"" and valKey6<>"" and valKey7<>"" and valKey8=""  and (valKey9=LnFn or valKey9=""): lvlIndent=6; ColorCell=цвH7;
 |  valKey1<>""  and valKey2<>"" and valKey3<>"" and valKey4<>"" and valKey5<>"" and valKey6<>"" and valKey7<>"" and valKey8<>"" and (valKey9=LnFn or valKey9=""): lvlIndent=7; ColorCell=цвH8;
 else lvlIndent=0; ColorCell=0;
 fi;

 РАБ.EXCEL.ЗаписатьЯчейкуТекст(refSheet, RowTbl-2, 1, strHeader);
 РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(refSheet, RowTbl-2, 1, RowTbl-2, 12);
 РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(refSheet, RowTbl-1, 1, RowTbl-0, 04);
 РАБ.EXCEL.ФорматироватьЯчейку(refSheet, RowTbl-2, 1, РАБ.EXCEL.xlLeft, lvlIndent, РАБ.EXCEL.xlTop, True, "Arial", 9, 0, True, True, False, ColorCell, False);
 РАБ.EXCEL.ФорматироватьЯчейку(refSheet, RowTbl-1, 1, РАБ.EXCEL.xlLeft, lvlIndent, РАБ.EXCEL.xlTop, True, "Arial", 9, 0, True, True, False, ColorCell, False);

 if тКОЛОСТ[Row]<>0.00: ЗаписатьЯчейкуКОЛИЧЕСТВОЧисло(refSheet, RowTbl-1, 05, тКОЛОСТ[Row], locDS, locTS); fi;
 if тСУМОСТ[Row]<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(refSheet, RowTbl-0, 05, тСУМОСТ[Row], locDS, locTS); fi;
 РАБ.EXCEL.ФорматироватьЯчейку(refSheet, RowTbl-1, 05, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, True, False, ColorCell, False);
 РАБ.EXCEL.ФорматироватьЯчейку(refSheet, RowTbl-0, 05, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, True, False, ColorCell, False);

 if тКОЛДПО[Row]<>0.00: ЗаписатьЯчейкуКОЛИЧЕСТВОЧисло(refSheet, RowTbl-1, 06, тКОЛДПО[Row], locDS, locTS); fi;
 if тСУМДПО[Row]<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(refSheet, RowTbl-0, 06, тСУМДПО[Row], locDS, locTS); fi;
 РАБ.EXCEL.ФорматироватьЯчейку(refSheet, RowTbl-1, 06, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, True, False, ColorCell, False);
 РАБ.EXCEL.ФорматироватьЯчейку(refSheet, RowTbl-0, 06, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, True, False, ColorCell, False);

 if тКОЛДВП[Row]<>0.00: ЗаписатьЯчейкуКОЛИЧЕСТВОЧисло(refSheet, RowTbl-1, 07, тКОЛДВП[Row], locDS, locTS); fi;
 if тСУМДВП[Row]<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(refSheet, RowTbl-0, 07, тСУМДВП[Row], locDS, locTS); fi;
 РАБ.EXCEL.ФорматироватьЯчейку(refSheet, RowTbl-1, 07, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, True, False, ColorCell, False);
 РАБ.EXCEL.ФорматироватьЯчейку(refSheet, RowTbl-0, 07, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, True, False, ColorCell, False);

 if тКОЛДЕБ[Row]<>0.00: ЗаписатьЯчейкуКОЛИЧЕСТВОЧисло(refSheet, RowTbl-1, 08, тКОЛДЕБ[Row], locDS, locTS); fi;
 if тСУМДЕБ[Row]<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(refSheet, RowTbl-0, 08, тСУМДЕБ[Row], locDS, locTS); fi;
 РАБ.EXCEL.ФорматироватьЯчейку(refSheet, RowTbl-1, 08, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, True, False, ColorCell, False);
 РАБ.EXCEL.ФорматироватьЯчейку(refSheet, RowTbl-0, 08, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, True, False, ColorCell, False);

 if тКОЛКРО[Row]<>0.00: ЗаписатьЯчейкуКОЛИЧЕСТВОЧисло(refSheet, RowTbl-1, 09, тКОЛКРО[Row], locDS, locTS); fi;
 if тСУМКРО[Row]<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(refSheet, RowTbl-0, 09, тСУМКРО[Row], locDS, locTS); fi;
 РАБ.EXCEL.ФорматироватьЯчейку(refSheet, RowTbl-1, 09, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, True, False, ColorCell, False);
 РАБ.EXCEL.ФорматироватьЯчейку(refSheet, RowTbl-0, 09, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, True, False, ColorCell, False);

 if тКОЛКВП[Row]<>0.00: ЗаписатьЯчейкуКОЛИЧЕСТВОЧисло(refSheet, RowTbl-1, 10, тКОЛКВП[Row], locDS, locTS); fi;
 if тСУМКВП[Row]<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(refSheet, RowTbl-0, 10, тСУМКВП[Row], locDS, locTS); fi;
 РАБ.EXCEL.ФорматироватьЯчейку(refSheet, RowTbl-1, 10, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, True, False, ColorCell, False);
 РАБ.EXCEL.ФорматироватьЯчейку(refSheet, RowTbl-0, 10, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, True, False, ColorCell, False);

 if тКОЛКРЕ[Row]<>0.00: ЗаписатьЯчейкуКОЛИЧЕСТВОЧисло(refSheet, RowTbl-1, 11, тКОЛКРЕ[Row], locDS, locTS); fi;
 if тСУМКРЕ[Row]<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(refSheet, RowTbl-0, 11, тСУМКРЕ[Row], locDS, locTS); fi;
 РАБ.EXCEL.ФорматироватьЯчейку(refSheet, RowTbl-1, 11, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, True, False, ColorCell, False);
 РАБ.EXCEL.ФорматироватьЯчейку(refSheet, RowTbl-0, 11, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, True, False, ColorCell, False);

 if тКОЛКОН[Row]<>0.00: ЗаписатьЯчейкуКОЛИЧЕСТВОЧисло(refSheet, RowTbl-1, 12, тКОЛКОН[Row], locDS, locTS); fi;
 if тСУМКОН[Row]<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(refSheet, RowTbl-0, 12, тСУМКОН[Row], locDS, locTS); fi;
 РАБ.EXCEL.ФорматироватьЯчейку(refSheet, RowTbl-1, 12, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, True, False, ColorCell, False);
 РАБ.EXCEL.ФорматироватьЯчейку(refSheet, RowTbl-0, 12, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, True, False, ColorCell, False);

 РАБ.EXCEL.УстановитьВсеГраницыДиапазонаИвнутри(refSheet, RowTbl-2, 01, RowTbl, 12, True, False, True, True, False, False, False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);
 РАБ.EXCEL.УстановитьВсеГраницыДиапазонаИвнутри(refSheet, RowTbl-1, 05, RowTbl, 12, True, True,  True, True, True,  False, False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);

end;

Proc ЭкспортСтрокиДанных(refSheet:AutoObject; Row:Integer; Iter:Integer; locDS:String; locTS:String; RowTbl:Integer);
var tmp1, tmp2 :String;

 РАБ.EXCEL.ЗаписатьЯчейкуТекст(refSheet, RowTbl-1, 1, Str(Iter));
 РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(refSheet, RowTbl-1, 1, RowTbl, 1);
 РАБ.EXCEL.ФорматироватьЯчейку(refSheet, RowTbl-1, 1, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, 0, True);
 РАБ.EXCEL.ПовернутьТекст(refSheet, RowTbl-1, 1, 90, False);

 if flgТолькоИмя:
   РАБ.EXCEL.ЗаписатьЯчейкуТекст(refSheet, RowTbl-1, 2, тНФАИМЯ[Row]);
   РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(refSheet, RowTbl-1, 2, RowTbl, 2);
   РАБ.EXCEL.ФорматироватьЯчейку(refSheet, RowTbl-1, 2, РАБ.EXCEL.xlLeft, 0, РАБ.EXCEL.xlTop, True, "Arial", 8, 0, True, False, False, 0, True);
 else
   РАБ.EXCEL.ЗаписатьЯчейкуТекст(refSheet, RowTbl-1, 2, тНФАКОД[Row]);
   РАБ.EXCEL.ЗаписатьЯчейкуТекст(refSheet, RowTbl-0, 2, тНФАИМЯ[Row]);
   РАБ.EXCEL.ФорматироватьЯчейку(refSheet, RowTbl-1, 2, РАБ.EXCEL.xlLeft, 0, РАБ.EXCEL.xlTop, True, "Arial", 8, 0, True, False, False, 0, True);
   РАБ.EXCEL.ФорматироватьЯчейку(refSheet, RowTbl-0, 2, РАБ.EXCEL.xlLeft, 0, РАБ.EXCEL.xlTop, True, "Arial", 8, 0, True, False, False, 0, True);
 fi;

 tmp1=тНФАИНВ[Row]; if tmp1="> не присвоен": tmp1=""; fi;
 if flgТолькоИнв: tmp2=""; else tmp2=тНФАУЧН[Row]; if tmp2="> не присвоен": tmp2=""; fi; fi;

 РАБ.EXCEL.ЗаписатьЯчейкуТекст(refSheet, RowTbl-1, 3, tmp1);
 РАБ.EXCEL.ЗаписатьЯчейкуТекст(refSheet, RowTbl-0, 3, tmp2);
 РАБ.EXCEL.ФорматироватьЯчейку(refSheet, RowTbl-1, 3, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlTop, True, "Arial", 8, 0, True, False, False, 0, True);
 РАБ.EXCEL.ФорматироватьЯчейку(refSheet, RowTbl-0, 3, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlTop, True, "Arial", 8, 0, True, False, False, 0, True);

 РАБ.EXCEL.ЗаписатьЯчейкуТекст(refSheet, RowTbl-1, 4, тНФАЕДИ[Row]);
 РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(refSheet, RowTbl-1, 4, RowTbl, 4);
 РАБ.EXCEL.ФорматироватьЯчейку(refSheet, RowTbl-1, 4, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlTop, True, "Arial", 8, 0, True, False, False, 0, True);

 if тКОЛОСТ[Row]<>0.00: ЗаписатьЯчейкуКОЛИЧЕСТВОЧисло(refSheet, RowTbl-1, 05, тКОЛОСТ[Row], locDS, locTS); fi;
 if тСУМОСТ[Row]<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(refSheet, RowTbl-0, 05, тСУМОСТ[Row], locDS, locTS); fi;
 РАБ.EXCEL.ФорматироватьЯчейку(refSheet, RowTbl-1, 05, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, Цвет(255, 0, 0), False, False, False, 0, True);
 РАБ.EXCEL.ФорматироватьЯчейку(refSheet, RowTbl-0, 05, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, Цвет(255, 0, 0), False, False, False, 0, True);

 if тКОЛДПО[Row]<>0.00: ЗаписатьЯчейкуКОЛИЧЕСТВОЧисло(refSheet, RowTbl-1, 06, тКОЛДПО[Row], locDS, locTS); fi;
 if тСУМДПО[Row]<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(refSheet, RowTbl-0, 06, тСУМДПО[Row], locDS, locTS); fi;
 РАБ.EXCEL.ФорматироватьЯчейку(refSheet, RowTbl-1, 06, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, 0, True);
 РАБ.EXCEL.ФорматироватьЯчейку(refSheet, RowTbl-0, 06, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, 0, True);

 if тКОЛДВП[Row]<>0.00: ЗаписатьЯчейкуКОЛИЧЕСТВОЧисло(refSheet, RowTbl-1, 07, тКОЛДВП[Row], locDS, locTS); fi;
 if тСУМДВП[Row]<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(refSheet, RowTbl-0, 07, тСУМДВП[Row], locDS, locTS); fi;
 РАБ.EXCEL.ФорматироватьЯчейку(refSheet, RowTbl-1, 07, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, 0, True);
 РАБ.EXCEL.ФорматироватьЯчейку(refSheet, RowTbl-0, 07, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, 0, True);

 if тКОЛДЕБ[Row]<>0.00: ЗаписатьЯчейкуКОЛИЧЕСТВОЧисло(refSheet, RowTbl-1, 08, тКОЛДЕБ[Row], locDS, locTS); fi;
 if тСУМДЕБ[Row]<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(refSheet, RowTbl-0, 08, тСУМДЕБ[Row], locDS, locTS); fi;
 РАБ.EXCEL.ФорматироватьЯчейку(refSheet, RowTbl-1, 08, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, Цвет(0, 0, 128), False, False, False, 0, True);
 РАБ.EXCEL.ФорматироватьЯчейку(refSheet, RowTbl-0, 08, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, Цвет(0, 0, 128), False, False, False, 0, True);

 if тКОЛКРО[Row]<>0.00: ЗаписатьЯчейкуКОЛИЧЕСТВОЧисло(refSheet, RowTbl-1, 09, тКОЛКРО[Row], locDS, locTS); fi;
 if тСУМКРО[Row]<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(refSheet, RowTbl-0, 09, тСУМКРО[Row], locDS, locTS); fi;
 РАБ.EXCEL.ФорматироватьЯчейку(refSheet, RowTbl-1, 09, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, 0, True);
 РАБ.EXCEL.ФорматироватьЯчейку(refSheet, RowTbl-0, 09, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, 0, True);

 if тКОЛКВП[Row]<>0.00: ЗаписатьЯчейкуКОЛИЧЕСТВОЧисло(refSheet, RowTbl-1, 10, тКОЛКВП[Row], locDS, locTS); fi;
 if тСУМКВП[Row]<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(refSheet, RowTbl-0, 10, тСУМКВП[Row], locDS, locTS); fi;
 РАБ.EXCEL.ФорматироватьЯчейку(refSheet, RowTbl-1, 10, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, 0, True);
 РАБ.EXCEL.ФорматироватьЯчейку(refSheet, RowTbl-0, 10, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, 0, True);

 if тКОЛКРЕ[Row]<>0.00: ЗаписатьЯчейкуКОЛИЧЕСТВОЧисло(refSheet, RowTbl-1, 11, тКОЛКРЕ[Row], locDS, locTS); fi;
 if тСУМКРЕ[Row]<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(refSheet, RowTbl-0, 11, тСУМКРЕ[Row], locDS, locTS); fi;
 РАБ.EXCEL.ФорматироватьЯчейку(refSheet, RowTbl-1, 11, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, Цвет(0, 0, 128), False, False, False, 0, True);
 РАБ.EXCEL.ФорматироватьЯчейку(refSheet, RowTbl-0, 11, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, Цвет(0, 0, 128), False, False, False, 0, True);

 if тКОЛКОН[Row]<>0.00: ЗаписатьЯчейкуКОЛИЧЕСТВОЧисло(refSheet, RowTbl-1, 12, тКОЛКОН[Row], locDS, locTS); fi;
 if тСУМКОН[Row]<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(refSheet, RowTbl-0, 12, тСУМКОН[Row], locDS, locTS); fi;
 РАБ.EXCEL.ФорматироватьЯчейку(refSheet, RowTbl-1, 12, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, Цвет(255, 0, 0), False, False, False, 0, True);
 РАБ.EXCEL.ФорматироватьЯчейку(refSheet, RowTbl-0, 12, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, Цвет(255, 0, 0), False, False, False, 0, True);

 РАБ.EXCEL.УстановитьВсеГраницыДиапазонаИвнутри(refSheet, RowTbl-1, 01, RowTbl, 12, True, True,  True, True, True,  False, False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);

end;

Proc ЭкспортВедомости_Excel;
var xlsApp, xlsBooks, xlsBook, xlsSheets, xlsSheet, xlsRng :AutoObject;
var начало, maxIterCount, kol, max_kol, offsetRow, len, ii, Iter, IterCount, IterSave :Integer;
var ColorH1, ColorH2, ColorH3, ColorH4, ColorH5, ColorH6, ColorH7, ColorH8 :Integer;
var localTS, localDS, xlNameFile, xlNameFolder, ExcelVersion :String;
var NoError, rusExcel, ExportWork :Logical;
 NoError=True;
 maxIterCount=300;
 kol=0;
 if ChooseFolder(xlNameFolder, "Выберите папку для сохранения файла экспорта...")=cmOK:
   начало=Time;
   xlNameFile=xlNameFolder+"ExpXLS_SaldoNFA_"+Format("%.4d", Year(ToDay))+Format("%.2d", Mon(ToDay))+Format("%.2d", Day(ToDay))+"_"+TimeToHMSstring_adv(Time, "")+".xls";   if ExistFile(xlNameFile): DeleteFile(xlNameFile); fi;
   if ExistFile(xlNameFile+"x"): DeleteFile(xlNameFile+"x"); fi; -- для версий Офиса 2007 или старше
   ФормированиеЦветовЗаголовков(intСхемаЦветов);
   ColorH1=BufInt[1];
   ColorH2=BufInt[2];
   ColorH3=BufInt[3];
   ColorH4=BufInt[4];
   ColorH5=BufInt[5];
   ColorH6=BufInt[6];
   ColorH7=BufInt[7];
   ColorH8=BufInt[8];
   -- 1 ЛИСТ - шапка
   if NoError:
     xlsApp=CreateAutoObject('Excel.Application');
     Try
       ExcelVersion=asString(xlsApp.Version);
       if Int(ExcelVersion)>=12 or ExcelVersion="12.0": xlNameFile=xlNameFile+"x"; fi;
       ShowProgress(0, "Подготовка...");
       Try
         xlsApp.EnableEvents=False;   -- отключить события
         xlsApp.AutomationSecurity=3; -- отключить макросы
         --
         rusExcel=РАБ.EXCEL.РусскийExcel(xlsApp);
         localDS=asString(xlsApp.International[РАБ.EXCEL.xlDecimalSeparator]);
         localTS=asString(xlsApp.International[РАБ.EXCEL.xlThousandsSeparator]);
         --
         xlsBooks=AsAutoObject(xlsApp.Workbooks); -- получить объект Workbooks
         Try
           xlsBook=AsAutoObject(xlsBooks.Add); -- добавить книгу
           Try
             Try
               xlsSheets=AsAutoObject(xlsBook.Sheets);
               Try
                 max_kol=asInteger(xlsSheets.Count);
                 if max_kol<2:
                   len=2-max_kol;
                   Try
                     for ii=1 to len do Try xlsSheet=AsAutoObject(xlsSheets.Add); Finally ClearVariable(xlsSheet); end; od;
                   Except
                     ClearVariable(xlsSheet);
                     Raise;
                   end;
                 fi;
                 kol=kol+1;
                 xlsSheet=AsAutoObject(xlsBook.Worksheets[kol]);
                 Try
                   xlsSheet.Name = "Оборотка НФА "+Chr(151)+" таблица";
                   ShowProgress(27, "Формируем титул...");
                   offsetRow=0;
                   ProgressPos(01);
                   РАБ.EXCEL.УстановитьШиринуСтолбцаСимвол(xlsSheet, 01, 04.0);
                   РАБ.EXCEL.УстановитьШиринуСтолбцаСимвол(xlsSheet, 02, 30.0);
                   РАБ.EXCEL.УстановитьШиринуСтолбцаСимвол(xlsSheet, 03, 10.0);
                   РАБ.EXCEL.УстановитьШиринуСтолбцаСимвол(xlsSheet, 04, 06.0);
                   РАБ.EXCEL.УстановитьШиринуСтолбцаСимвол(xlsSheet, 05, 12.0);
                   РАБ.EXCEL.УстановитьШиринуСтолбцаСимвол(xlsSheet, 06, 12.0);
                   РАБ.EXCEL.УстановитьШиринуСтолбцаСимвол(xlsSheet, 07, 12.0);
                   РАБ.EXCEL.УстановитьШиринуСтолбцаСимвол(xlsSheet, 08, 12.0);
                   РАБ.EXCEL.УстановитьШиринуСтолбцаСимвол(xlsSheet, 09, 12.0);
                   РАБ.EXCEL.УстановитьШиринуСтолбцаСимвол(xlsSheet, 10, 12.0);
                   РАБ.EXCEL.УстановитьШиринуСтолбцаСимвол(xlsSheet, 11, 12.0);
                   РАБ.EXCEL.УстановитьШиринуСтолбцаСимвол(xlsSheet, 12, 12.0);
                   ProgressPos(02);
                   if flgПечСлужИнф:
                     offsetRow=offsetRow+1;
                     РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow, 01, СлужИнфоСЧТ);
                     РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetRow, 1, offsetRow, 12);
                     РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 01, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 7, 0, True, False, False, 0, True);
                     offsetRow=offsetRow+1;
                     РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow, 01, СлужИнфоАНА);
                     РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetRow, 1, offsetRow, 12);
                     РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 01, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 7, 0, True, False, False, 0, True);
                     offsetRow=offsetRow+1;
                     РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow, 01, СлужИнфоГРП);
                     РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetRow, 1, offsetRow, 12);
                     РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 01, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 7, 0, True, False, False, 0, True);
                   fi;
                   ProgressPos(03);
                   offsetRow=offsetRow+1;
                   РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow, 01, "ОБОРОТНО-САЛЬДОВАЯ ВЕДОМОСТЬ НФА");
                   РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetRow, 01, offsetRow, 12);
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 01, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, True, "Courier New", 16, 0, True, True,  False, 0, True);
                   ProgressPos(04);
                   offsetRow=offsetRow+1;
                   --РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow, 01, TimeCreationRep);
                   РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetRow, 01, offsetRow, 02);
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 01, РАБ.EXCEL.xlLeft,   0, РАБ.EXCEL.xlCenter, True, "Arial", 07, 0, True, False, False, 0, True);
                   РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow, 03, отчПерТит);
                   РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetRow, 03, offsetRow, 09);
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 03, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, True, "Arial", 11, 0, True, False, True, 0, True);
                   РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow, 12, "КОДЫ");
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 12, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, True, "Arial", 10, 0, True, False, False, 0, True);
                   ProgressPos(05);
                   offsetRow=offsetRow+1;
                   РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow, 10, "Форма по ОКУД");
                   РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetRow, 10, offsetRow, 11);
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 10, РАБ.EXCEL.xlRight,  1, РАБ.EXCEL.xlCenter, True, "Arial", 08, 0, True, False, False, 0, True);
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 12, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, True, "Courier New", 10, 0, True, False, False, 0, True);
                   ProgressPos(06);
                   offsetRow=offsetRow+1;
                   РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow, 01, "Учреждение");
                   РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetRow, 01, offsetRow, 02);
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 01, РАБ.EXCEL.xlLeft,  0,  РАБ.EXCEL.xlCenter, True, "Arial", 09, 0, True, False, False, 0, True);
                   РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow, 03, УЧР_ИМЯ);
                   РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetRow, 03, offsetRow, 10);
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 03, РАБ.EXCEL.xlLeft,  0,  РАБ.EXCEL.xlCenter, True, "Arial", 09, 0, True, True,  False, 0, True);
                   РАБ.EXCEL.УстановитьВсеГраницыДиапазонаИвнутри(xlsSheet, offsetRow, 03, offsetRow, 10, False, False, False, True, False, False, False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);
                   РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow, 11, "по ОКПО");
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 11, РАБ.EXCEL.xlRight,  1, РАБ.EXCEL.xlCenter, True, "Arial", 08, 0, True, False, False, 0, True);
                   РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow, 12, УЧР_ОКПО);
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 12, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, True, "Arial", 08, 0, True, False, False, 0, True);
                   ProgressPos(07);
                   offsetRow=offsetRow+1;
                   РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow, 01, "Структурное подразделение");
                   РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetRow, 01, offsetRow, 02);
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 01, РАБ.EXCEL.xlLeft,  0,  РАБ.EXCEL.xlCenter, True, "Arial", 09, 0, True, False, False, 0, True);
                   РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow, 03, ПОД_ИМЯ);
                   РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetRow, 03, offsetRow, 10);
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 03, РАБ.EXCEL.xlLeft,  0,  РАБ.EXCEL.xlCenter, True, "Arial", 09, 0, True, True,  False, 0, True);
                   РАБ.EXCEL.УстановитьВсеГраницыДиапазонаИвнутри(xlsSheet, offsetRow, 03, offsetRow, 10, False, False, False, True, False, False, False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 11, РАБ.EXCEL.xlRight,  1, РАБ.EXCEL.xlCenter, True, "Arial", 08, 0, True, False, False, 0, True);
                   РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow, 12, ПОД_КОД);
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 12, РАБ.EXCEL.xlRight,  0, РАБ.EXCEL.xlCenter, True, "Arial", 08, 0, True, False, False, 0, True);
                   ProgressPos(08);
                   РАБ.EXCEL.УстановитьВсеГраницыДиапазонаИвнутри(xlsSheet, offsetRow-3, 12, offsetRow, 12, True,  True,  True,  True, True,  True,  False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);
                   РАБ.EXCEL.УстановитьВсеГраницыДиапазонаИвнутри(xlsSheet, offsetRow-2, 12, offsetRow, 12, True,  True,  True,  True, False, False, False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlMedium);
                   --
                   offsetRow=offsetRow+2;
                   ProgressPos(09);
                   РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow,   01, "№ п/п");
                   РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetRow, 01, offsetRow+3, 01);
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow,   01, РАБ.EXCEL.xlCenter,  0,  РАБ.EXCEL.xlCenter, True, "Arial", 09, 0, True, True,  False, Цвет(192, 192, 192), False);
                   РАБ.EXCEL.ПовернутьТекст(xlsSheet, offsetRow, 01, 90, False);
                   ProgressPos(10);
                   РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow,   02, Chr(10)+"Объект"+Chr(10)+"нефинансовых активов"+Chr(10)+"(код / наименование)");
                   РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetRow, 02, offsetRow+3, 02);
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow,   02, РАБ.EXCEL.xlCenter,  0,  РАБ.EXCEL.xlCenter, True, "Arial", 09, 0, True, True,  False, Цвет(192, 192, 192), False);
                   ProgressPos(11);
                   РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow,   03, "Инвен-"+Chr(10)+"тарный"+Chr(10)+"(учетный)"+Chr(10)+"номер");
                   РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetRow, 03, offsetRow+3, 03);
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow,   03, РАБ.EXCEL.xlCenter,  0,  РАБ.EXCEL.xlCenter, True, "Arial", 09, 0, True, False, False, Цвет(192, 192, 192), False);
                   ProgressPos(12);
                   РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow,   04, "ед."+Chr(10)+"изм.");
                   РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetRow, 04, offsetRow+3, 04);
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow,   04, РАБ.EXCEL.xlCenter,  0,  РАБ.EXCEL.xlCenter, True, "Arial", 09, 0, True, False, False, Цвет(192, 192, 192), False);
                   ProgressPos(13);
                   РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow,   05, "ОСТАТОК"+Chr(10)+"на"+Chr(10)+"начало"+Chr(10)+"периода");
                   РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetRow, 05, offsetRow+2, 05);
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow,   05, РАБ.EXCEL.xlCenter,  0,  РАБ.EXCEL.xlCenter, True, "Arial", 09, 0, True, True,  False, Цвет(192, 192, 192), False);
                   РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow+3, 05, "количество/сумма");
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow+3, 05, РАБ.EXCEL.xlCenter,  0,  РАБ.EXCEL.xlCenter, True, "Arial", 07, 0, True, False, False, Цвет(192, 192, 192), False);
                   ProgressPos(14);
                   РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow,   06, "Оборот за период");
                   РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetRow, 06, offsetRow, 11);
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow,   06, РАБ.EXCEL.xlCenter,  0,  РАБ.EXCEL.xlCenter, True, "Arial", 09, 0, True, False, False, Цвет(192, 192, 192), False);
                   ProgressPos(15);
                   РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow+1, 06, "Приход НФА");
                   РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetRow+1, 06, offsetRow+1, 08);
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow+1, 06, РАБ.EXCEL.xlCenter,  0,  РАБ.EXCEL.xlCenter, True, "Arial", 09, 0, True, False, False, Цвет(192, 192, 192), False);
                   ProgressPos(16);
                   РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow+2, 06, "принято"+Chr(10)+"к учету");
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow+2, 06, РАБ.EXCEL.xlCenter,  0,  РАБ.EXCEL.xlCenter, True, "Arial", 09, 0, True, False, False, Цвет(192, 192, 192), False);
                   РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow+3, 06, "количество/сумма");
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow+3, 06, РАБ.EXCEL.xlCenter,  0,  РАБ.EXCEL.xlCenter, True, "Arial", 07, 0, True, False, False, Цвет(192, 192, 192), False);
                   ProgressPos(17);
                   РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow+2, 07, "из внутр."+Chr(10)+"перемещ.");
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow+2, 07, РАБ.EXCEL.xlCenter,  0,  РАБ.EXCEL.xlCenter, True, "Arial", 09, 0, True, False, False, Цвет(192, 192, 192), False);
                   РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow+3, 07, "количество/сумма");
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow+3, 07, РАБ.EXCEL.xlCenter,  0,  РАБ.EXCEL.xlCenter, True, "Arial", 07, 0, True, False, False, Цвет(192, 192, 192), False);
                   ProgressPos(18);
                   РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow+2, 08, "приход"+Chr(10)+"ВСЕГО");
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow+2, 08, РАБ.EXCEL.xlCenter,  0,  РАБ.EXCEL.xlCenter, True, "Arial", 09, 0, True, True,  False, Цвет(192, 192, 192), False);
                   РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow+3, 08, "количество/сумма");
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow+3, 08, РАБ.EXCEL.xlCenter,  0,  РАБ.EXCEL.xlCenter, True, "Arial", 07, 0, True, False, False, Цвет(192, 192, 192), False);
                   ProgressPos(19);
                   РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow+1, 09, "Расход НФА");
                   РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetRow+1, 09, offsetRow+1, 11);
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow+1, 09, РАБ.EXCEL.xlCenter,  0,  РАБ.EXCEL.xlCenter, True, "Arial", 09, 0, True, False, False, Цвет(192, 192, 192), False);
                   ProgressPos(20);
                   РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow+2, 09, "снято"+Chr(10)+"с учета");
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow+2, 09, РАБ.EXCEL.xlCenter,  0,  РАБ.EXCEL.xlCenter, True, "Arial", 09, 0, True, False, False, Цвет(192, 192, 192), False);
                   РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow+3, 09, "количество/сумма");
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow+3, 09, РАБ.EXCEL.xlCenter,  0,  РАБ.EXCEL.xlCenter, True, "Arial", 07, 0, True, False, False, Цвет(192, 192, 192), False);
                   ProgressPos(21);
                   РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow+2, 10, "на внутр."+Chr(10)+"перемещ.");
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow+2, 10, РАБ.EXCEL.xlCenter,  0,  РАБ.EXCEL.xlCenter, True, "Arial", 09, 0, True, False, False, Цвет(192, 192, 192), False);
                   РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow+3, 10, "количество/сумма");
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow+3, 10, РАБ.EXCEL.xlCenter,  0,  РАБ.EXCEL.xlCenter, True, "Arial", 07, 0, True, False, False, Цвет(192, 192, 192), False);
                   ProgressPos(22);
                   РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow+2, 11, "расход"+Chr(10)+"ВСЕГО");
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow+2, 11, РАБ.EXCEL.xlCenter,  0,  РАБ.EXCEL.xlCenter, True, "Arial", 09, 0, True, True,  False, Цвет(192, 192, 192), False);
                   РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow+3, 11, "количество/сумма");
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow+3, 11, РАБ.EXCEL.xlCenter,  0,  РАБ.EXCEL.xlCenter, True, "Arial", 07, 0, True, False, False, Цвет(192, 192, 192), False);
                   ProgressPos(23);
                   РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow,   12, "ОСТАТОК"+Chr(10)+"на"+Chr(10)+"конец"+Chr(10)+"периода");
                   РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetRow, 12, offsetRow+2, 12);
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow,   12, РАБ.EXCEL.xlCenter,  0,  РАБ.EXCEL.xlCenter, True, "Arial", 09, 0, True, True,  False, Цвет(192, 192, 192), False);
                   РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow+3, 12, "количество/сумма");
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow+3, 12, РАБ.EXCEL.xlCenter,  0,  РАБ.EXCEL.xlCenter, True, "Arial", 07, 0, True, False, False, Цвет(192, 192, 192), False);
                   ProgressPos(24);
                   РАБ.EXCEL.УстановитьВсеГраницыДиапазонаИвнутри(xlsSheet,  offsetRow, 1, offsetRow+3, 12, True,  True,  True,  True,  True ,  True ,  False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);
                   РАБ.EXCEL.УстановитьВсеГраницыДиапазонаИвнутри(xlsSheet,  offsetRow, 5, offsetRow+3, 12, True,  True,  True,  True,  False,  False,  False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlMedium);
                   ProgressPos(25);
                   xlsRng=AsAutoObject(xlsSheet.Rows["1:"+Str(offsetRow+3)]);
                   Try xlsRng.AutoFit; Finally ClearVariable(xlsRng); end;
                   ProgressPos(26);
                   РАБ.EXCEL.PrintSetup_ЧБ_Поля10(xlsApp, xlsSheet, False, offsetRow, offsetRow+3, 0, 0, True, False, True, 90);
                   РАБ.EXCEL.PrintSetup_Колонтитулы(xlsSheet, rusExcel, TimeCreationRep);
                   --
                   NoError=True;
                 Finally
                   ClearVariable(xlsSheet);
                 end;
               Finally
                 ClearVariable(xlsSheets);
               end;
             Except
               NoError=False;
               xlsBook.Close(False); -- закрыть книгу без сохранения
             end;
           Finally
             xlsBook.Close(True, xlNameFile);
             ClearVariable(xlsBook); -- освободить объект книги
           end;
         Finally
           ClearVariable(xlsBooks); -- освободить объект книг
         end;
       Finally
         ClearVariable(xlsApp); -- освободить объект Excel
         CloseProgress;
       end;
     Except
       NoError=False;
       ClearVariable(xlsRng);
       ClearVariable(xlsSheet);
       ClearVariable(xlsSheets);
       ClearVariable(xlsBook);
       ClearVariable(xlsBooks);
       ClearVariable(xlsApp);
     end;
   fi; --NoError
   -- 1 ЛИСТ - таблица
   len=LengthOfArray(тSRTFLD);
   if NoError and len>0:
     ShowProgress(len, "Формируем таблицу...");
     Try
       Iter=0;
       IterCount=0;
       IterSave=1;
       ExportWork=True;
       offsetRow=offsetRow+3;
       while ExportWork do
         if NoError:
           xlsApp=CreateAutoObject('Excel.Application');
           Try
             Try
               xlsApp.EnableEvents=False;   -- отключить события
               xlsApp.AutomationSecurity=3; -- отключить макросы
               xlsBooks=AsAutoObject(xlsApp.Workbooks); -- получить объект Workbooks
               Try
                 xlsBook=AsAutoObject(xlsBooks.Open(xlNameFile));
                 Try
                   Try
                     xlsSheet=AsAutoObject(xlsBook.Worksheets["Оборотка НФА "+Chr(151)+" таблица"]);
                     Try
                       for ii=IterSave to len do
                         ProgressPos(ii);
                         if тНФАКОД[ii]="": -- значит заголовок
                           offsetRow=offsetRow+3;
                           ЭкспортСтрокиПромежуточногоИтога(xlsSheet, ii, тSRTFLD[ii], ColorH1, ColorH2, ColorH3, ColorH4, ColorH5, ColorH6, ColorH7, ColorH8, localDS, localTS, offsetRow);
                         else
                           if curФтрНФА<>3:
                             Iter=Iter+1;
                             offsetRow=offsetRow+2;
                             ЭкспортСтрокиДанных(xlsSheet, ii, Iter, localDS, localTS, offsetRow);
                           fi;
                         fi;
                         IterCount=IterCount+1;
                         if IterCount>=maxIterCount: IterSave=IterSave+IterCount; IterCount=0; Break; fi;
                       od;
                       NoError=True;
                     Finally
                       ClearVariable(xlsSheet);
                     end;
                   Except
                     NoError=False;
                     ExportWork=False;
                     xlsBook.Close(False); -- закрыть книгу без сохранения
                   end;
                 Finally
                   xlsBook.Save;
                   xlsBook.Close(False); -- закрыть книгу без сохранения
                   ClearVariable(xlsBook); -- освободить объект книги
                 end;
               Finally
                 ClearVariable(xlsBooks); -- освободить объект книг
               end;
             Finally
               ClearVariable(xlsApp); -- освободить объект Excel
             end;
           Except
             NoError=False;
             ExportWork=False;
             ClearVariable(xlsRng);
             ClearVariable(xlsSheet);
             ClearVariable(xlsSheets);
             ClearVariable(xlsBook);
             ClearVariable(xlsBooks);
             ClearVariable(xlsApp);
           end;
           if ii>=len: ExportWork=False; fi;
         else
           ExportWork=False;
         fi;
       end; -- while
     Finally
      CloseProgress;
     end;
   fi; --NoError
   if NoError:
     ShowProgress(14, "Оборотка НФА - заключительные строки...");
     Try
       xlsApp=CreateAutoObject('Excel.Application');
       Try
         Try
           xlsApp.EnableEvents=False;   -- отключить события
           xlsApp.AutomationSecurity=3; -- отключить макросы
           xlsBooks=AsAutoObject(xlsApp.Workbooks); -- получить объект Workbooks
           Try
             xlsBook=AsAutoObject(xlsBooks.Open(xlNameFile));
             Try
               Try
                 xlsSheet=AsAutoObject(xlsBook.Worksheets["Оборотка НФА "+Chr(151)+" таблица"]);
                 Try
                   ProgressPos(01);
                   offsetRow=offsetRow+1;
                   РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow, 01, "И Т О Г О :");
                   РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetRow, 01, offsetRow, 04);
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 01, РАБ.EXCEL.xlRight, 1,  РАБ.EXCEL.xlCenter, True, "Arial", 09, 0, True, True, True,  Цвет(192, 192, 192), False);
                   ProgressPos(02);
                   if всгОстНачСум<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 05, всгОстНачСум, localDS, localTS); fi;
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 05, РАБ.EXCEL.xlRight, 0,  РАБ.EXCEL.xlCenter, True, "Arial", 08, 0, True, True, False, Цвет(192, 192, 192), False);
                   ProgressPos(03);
                   if всгПрхДебСум<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 06, всгПрхДебСум, localDS, localTS); fi;
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 06, РАБ.EXCEL.xlRight, 0,  РАБ.EXCEL.xlCenter, True, "Arial", 08, 0, True, True, False, Цвет(192, 192, 192), False);
                   ProgressPos(04);
                   if всгВнпДебСум<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 07, всгВнпДебСум, localDS, localTS); fi;
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 07, РАБ.EXCEL.xlRight, 0,  РАБ.EXCEL.xlCenter, True, "Arial", 08, 0, True, True, False, Цвет(192, 192, 192), False);
                   ProgressPos(05);
                   if всгОбоДебСум<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 08, всгОбоДебСум, localDS, localTS); fi;
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 08, РАБ.EXCEL.xlRight, 0,  РАБ.EXCEL.xlCenter, True, "Arial", 08, 0, True, True, False, Цвет(192, 192, 192), False);
                   ProgressPos(06);
                   if всгРсхКреСум<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 09, всгРсхКреСум, localDS, localTS); fi;
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 09, РАБ.EXCEL.xlRight, 0,  РАБ.EXCEL.xlCenter, True, "Arial", 08, 0, True, True, False, Цвет(192, 192, 192), False);
                   ProgressPos(07);
                   if всгВнпКреСум<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 10, всгВнпКреСум, localDS, localTS); fi;
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 10, РАБ.EXCEL.xlRight, 0,  РАБ.EXCEL.xlCenter, True, "Arial", 08, 0, True, True, False, Цвет(192, 192, 192), False);
                   ProgressPos(08);
                   if всгОбоКреСум<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 11, всгОбоКреСум, localDS, localTS); fi;
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 11, РАБ.EXCEL.xlRight, 0,  РАБ.EXCEL.xlCenter, True, "Arial", 08, 0, True, True, False, Цвет(192, 192, 192), False);
                   ProgressPos(09);
                   if всгОстКонСум<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 12, всгОстКонСум, localDS, localTS); fi;
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 12, РАБ.EXCEL.xlRight, 0,  РАБ.EXCEL.xlCenter, True, "Arial", 08, 0, True, True, False, Цвет(192, 192, 192), False);
                   ProgressPos(10);
                   РАБ.EXCEL.УстановитьВсеГраницыДиапазонаИвнутри(xlsSheet,  offsetRow, 1, offsetRow, 12, True,  True,  True,  True,  True ,  True ,  False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);
                   ProgressPos(11);
                   offsetRow=offsetRow+2;
                   РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow, 02, "Исполнитель:");
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 02, РАБ.EXCEL.xlCenter, 0,  РАБ.EXCEL.xlCenter, True, "Arial", 09, 0, True, False, False, 0, True);
                   РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow, 03, ИспДол);
                   РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetRow, 03, offsetRow, 05);
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 03, РАБ.EXCEL.xlCenter, 0,  РАБ.EXCEL.xlCenter, True, "Arial", 08, 0, True, False, False, 0, True);
                   РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetRow, 07, offsetRow, 08);
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 07, РАБ.EXCEL.xlCenter, 0,  РАБ.EXCEL.xlCenter, True, "Arial", 08, 0, True, False, False, 0, True);
                   РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow, 10, ИспФИО);
                   РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetRow, 10, offsetRow, 12);
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 10, РАБ.EXCEL.xlCenter, 0,  РАБ.EXCEL.xlCenter, True, "Arial", 08, 0, True, False, False, 0, True);
                   ProgressPos(12);
                   РАБ.EXCEL.УстановитьВсеГраницыДиапазонаИвнутри(xlsSheet, offsetRow, 03, offsetRow, 05, False, False, False, True, False, False, False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);
                   РАБ.EXCEL.УстановитьВсеГраницыДиапазонаИвнутри(xlsSheet, offsetRow, 07, offsetRow, 08, False, False, False, True, False, False, False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);
                   РАБ.EXCEL.УстановитьВсеГраницыДиапазонаИвнутри(xlsSheet, offsetRow, 10, offsetRow, 12, False, False, False, True, False, False, False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);
                   ProgressPos(13);
                   offsetRow=offsetRow+1;
                   РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow, 03, "(подпись)");
                   РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetRow, 03, offsetRow, 05);
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 03, РАБ.EXCEL.xlCenter,  0,  РАБ.EXCEL.xlCenter, True, "Arial", 08, 0, True, False, False, 0, True);
                   РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow, 07, "(расшифровка подписи)");
                   РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetRow, 07, offsetRow, 08);
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 07, РАБ.EXCEL.xlCenter,  0,  РАБ.EXCEL.xlCenter, True, "Arial", 08, 0, True, False, False, 0, True);
                   РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow, 10, "(Ф.И.О. исполнителя)");
                   РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetRow, 10, offsetRow, 12);
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 10, РАБ.EXCEL.xlCenter,  0,  РАБ.EXCEL.xlCenter, True, "Arial", 08, 0, True, False, False, 0, True);
                   РАБ.EXCEL.НадстрочноеНачертаниеДиапазона(xlsSheet, offsetRow, 03, offsetRow, 05, True);
                   РАБ.EXCEL.НадстрочноеНачертаниеДиапазона(xlsSheet, offsetRow, 07, offsetRow, 08, True);
                   РАБ.EXCEL.НадстрочноеНачертаниеДиапазона(xlsSheet, offsetRow, 10, offsetRow, 12, True);
                   ProgressPos(14);
                   offsetRow=offsetRow+1;
                   РАБ.EXCEL.ЗаписатьЯчейкуДатуКавычки(xlsSheet, offsetRow, 02, rusExcel, ДатИсп, if(ДатИсп>1.1.1800, False, True));
                   РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetRow, 02, offsetRow, 04);
                   РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 02, РАБ.EXCEL.xlCenter,  0,  РАБ.EXCEL.xlCenter, True, "Arial", 08, 0, True, False, False, 0, True);
                   РАБ.EXCEL.УстановитьВсеГраницыДиапазонаИвнутри(xlsSheet,  offsetRow, 02, offsetRow, 04, False, False, False, True, False, False, False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);
                   --
                   NoError=True;
                 Finally
                   ClearVariable(xlsSheet);
                 end;
               Except
                 NoError=False;
                 xlsBook.Close(False); -- закрыть книгу без сохранения
               end;
             Finally
               xlsBook.Save;
               xlsBook.Close(False); -- закрыть книгу без сохранения
               ClearVariable(xlsBook); -- освободить объект книги
             end;
           Finally
             ClearVariable(xlsBooks); -- освободить объект книг
           end;
         Finally
           ClearVariable(xlsApp); -- освободить объект Excel
         end;
       Except
         NoError=False;
         ExportWork=False;
         ClearVariable(xlsRng);
         ClearVariable(xlsSheet);
         ClearVariable(xlsSheets);
         ClearVariable(xlsBook);
         ClearVariable(xlsBooks);
         ClearVariable(xlsApp);
       end;
     Finally
      CloseProgress;
     end;
   fi; --NoError
   ExportWork=False; -- если "да" - то лист сводных таблиц уже создан
   offsetRow=0;
   if NoError:
     if flgРсчИтгТаб1 and СтрокиТ1>0:
       ShowProgress((25+СтрокиТ1), "Оборотка НФА - экспорт свод 1...");
       Try
         xlsApp=CreateAutoObject('Excel.Application');
         Try
           Try
             xlsApp.EnableEvents=False;   -- отключить события
             xlsApp.AutomationSecurity=3; -- отключить макросы
             xlsBooks=AsAutoObject(xlsApp.Workbooks); -- получить объект Workbooks
             Try
               xlsBook=AsAutoObject(xlsBooks.Open(xlNameFile));
               Try
                 Try
                   Try
                     if ExportWork:
                       ProgressPos(01);
                       xlsSheet=AsAutoObject(xlsBook.Worksheets["Оборотка НФА "+Chr(151)+" свод"]);
                     else
                       ProgressPos(01);
                       kol=kol+1;
                       xlsSheet=AsAutoObject(xlsBook.Worksheets[kol]);
                       xlsSheet.Name = "Оборотка НФА "+Chr(151)+" свод";
                       РАБ.EXCEL.УстановитьШиринуСтолбцаСимвол(xlsSheet, 01, 27.0);
                       РАБ.EXCEL.УстановитьШиринуСтолбцаСимвол(xlsSheet, 02, 14.0);
                       РАБ.EXCEL.УстановитьШиринуСтолбцаСимвол(xlsSheet, 03, 13.0);
                       РАБ.EXCEL.УстановитьШиринуСтолбцаСимвол(xlsSheet, 04, 13.0);
                       РАБ.EXCEL.УстановитьШиринуСтолбцаСимвол(xlsSheet, 05, 13.0);
                       РАБ.EXCEL.УстановитьШиринуСтолбцаСимвол(xlsSheet, 06, 13.0);
                       РАБ.EXCEL.УстановитьШиринуСтолбцаСимвол(xlsSheet, 07, 13.0);
                       РАБ.EXCEL.УстановитьШиринуСтолбцаСимвол(xlsSheet, 08, 13.0);
                       РАБ.EXCEL.УстановитьШиринуСтолбцаСимвол(xlsSheet, 09, 14.0);
                       --
                       РАБ.EXCEL.PrintSetup_ЧБ_Поля10(xlsApp, xlsSheet, False, 0, 0, 0, 0, True, False, True, 100);
                       РАБ.EXCEL.PrintSetup_Колонтитулы(xlsSheet, rusExcel, TimeCreationRep);
                       ExportWork=True;
                     fi;
                     Try
                       ProgressPos(02);
                       offsetRow=offsetRow+if(offsetRow>0, 2, 1);
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow, 01, "Итоговая таблица №1 к оборотно-сальдовой ведомости НФА (по синтетическим счетам)");
                       РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetRow, 01, offsetRow, 09);
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 01, РАБ.EXCEL.xlLeft, 1, РАБ.EXCEL.xlCenter, True, "Arial", 10, 0, True, False,  True, Цвет(192, 192, 192), False);
                       if offsetRow>1 and flgПечНовСтр:  РАБ.EXCEL.РазрывСтраницы(xlsSheet, offsetRow); fi;
                       offsetRow=offsetRow+1;
                       ProgressPos(03);
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow  , 01, "Синтетический"+Chr(10)+"счет");
                       РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetRow, 01, offsetRow+1, 01);
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow  , 01, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, True, "Arial", 09, 0, True, True,  False, Цвет(192, 192, 192), False);
                       ProgressPos(04);
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow  , 02, "ОСТАТОК на"+Chr(10)+"начало периода");
                       РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetRow, 02, offsetRow+1, 02);
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow  , 02, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, True, "Arial", 09, 0, True, True,  False, Цвет(192, 192, 192), False);
                       ProgressPos(05);
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow  , 03, "Оборот за период: приход НФА");
                       РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetRow, 03, offsetRow, 05);
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow  , 03, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, True, "Arial", 09, 0, True, False, False, Цвет(192, 192, 192), False);
                       ProgressPos(06);
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow+1, 03, "принято к учету");
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow+1, 03, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, True, "Arial", 08, 0, True, False, False, Цвет(192, 192, 192), False);
                       ProgressPos(07);
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow+1, 04, "из внутр.перемещ.");
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow+1, 04, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, True, "Arial", 08, 0, True, False, False, Цвет(192, 192, 192), False);
                       ProgressPos(08);
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow+1, 05, "приход ВСЕГО");
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow+1, 05, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, True, "Arial", 08, 0, True, True,  False, Цвет(192, 192, 192), False);
                       ProgressPos(09);
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow  , 06, "Оборот за период: расход НФА");
                       РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetRow, 06, offsetRow, 08);
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow  , 06, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, True, "Arial", 09, 0, True, False, False, Цвет(192, 192, 192), False);
                       ProgressPos(10);
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow+1, 06, "снято с учета");
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow+1, 06, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, True, "Arial", 08, 0, True, False, False, Цвет(192, 192, 192), False);
                       ProgressPos(11);
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow+1, 07, "на внутр.перемещ.");
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow+1, 07, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, True, "Arial", 08, 0, True, False, False, Цвет(192, 192, 192), False);
                       ProgressPos(12);
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow+1, 08, "расход  ВСЕГО");
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow+1, 08, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, True, "Arial", 08, 0, True, True,  False, Цвет(192, 192, 192), False);
                       ProgressPos(13);
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow  , 09, "ОСТАТОК на"+Chr(10)+"конец периода");
                       РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetRow, 09, offsetRow+1, 09);
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow  , 09, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, True, "Arial", 09, 0, True, True, False, Цвет(192, 192, 192), False);
                       ProgressPos(14);
                       РАБ.EXCEL.УстановитьВсеГраницыДиапазонаИвнутри(xlsSheet, offsetRow, 01, offsetRow+1, 09, True, True, True, True, True, True, False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);
                       offsetRow=offsetRow+1;
                       --
                       for ii=1 to СтрокиТ1 do
                         ProgressPos(14+ii);
                         offsetRow=offsetRow+1;

                         РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow, 1, иСЧТнаимен[ii]);
                         РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 1, РАБ.EXCEL.xlLeft, 0, РАБ.EXCEL.xlTop, True, "Arial", 8, 0, True, True, False, 0, True);

                         if иСЧТостнач[ii]<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 2, иСЧТостнач[ii], localDS, localTS); fi;
                         РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 2, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, Цвет(255, 0, 0), False, False, False, 0, True);

                         if иСЧТпрхдеб[ii]<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 3, иСЧТпрхдеб[ii], localDS, localTS); fi;
                         РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 3, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, 0, True);

                         if иСЧТвнпдеб[ii]<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 4, иСЧТвнпдеб[ii], localDS, localTS); fi;
                         РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 4, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, 0, True);

                         if иСЧТободеб[ii]<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 5, иСЧТободеб[ii], localDS, localTS); fi;
                         РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 5, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, Цвет(0, 0, 128), False, False, False, 0, True);

                         if иСЧТрсхкре[ii]<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 6, иСЧТрсхкре[ii], localDS, localTS); fi;
                         РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 6, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, 0, True);

                         if иСЧТвнпкре[ii]<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 7, иСЧТвнпкре[ii], localDS, localTS); fi;
                         РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 7, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, 0, True);

                         if иСЧТобокре[ii]<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 8, иСЧТобокре[ii], localDS, localTS); fi;
                         РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 8, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, Цвет(0, 0, 128), False, False, False, 0, True);

                         if иСЧТосткон[ii]<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 9, иСЧТосткон[ii], localDS, localTS); fi;
                         РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 9, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, Цвет(255, 0, 0), False, False, False, 0, True);

                         РАБ.EXCEL.УстановитьВсеГраницыДиапазонаИвнутри(xlsSheet, offsetRow, 1, offsetRow, 9, True, True, True, True, True, True, False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);

                       od;
                       --
                       offsetRow=offsetRow+1;
                       ProgressPos(ii+15);
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow, 1, "И Т О Г О :");
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 1, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, РАБ.EXCEL.xlColorWhite, False, True , False, Цвет(128, 128, 128), False);
                       ProgressPos(ii+16);
                       if вСЧТостнач<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 2, вСЧТостнач, localDS, localTS); fi;
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 2, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, РАБ.EXCEL.xlColorWhite, False, False, False, Цвет(128, 128, 128), False);
                       ProgressPos(ii+17);
                       if вСЧТпрхдеб<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 3, вСЧТпрхдеб, localDS, localTS); fi;
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 3, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, РАБ.EXCEL.xlColorWhite, False, False, False, Цвет(128, 128, 128), False);
                       ProgressPos(ii+18);
                       if вСЧТвнпдеб<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 4, вСЧТвнпдеб, localDS, localTS); fi;
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 4, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, РАБ.EXCEL.xlColorWhite, False, False, False, Цвет(128, 128, 128), False);
                       ProgressPos(ii+19);
                       if вСЧТободеб<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 5, вСЧТободеб, localDS, localTS); fi;
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 5, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, РАБ.EXCEL.xlColorWhite, False, False, False, Цвет(128, 128, 128), False);
                       ProgressPos(ii+20);
                       if вСЧТрсхкре<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 6, вСЧТрсхкре, localDS, localTS); fi;
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 6, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, РАБ.EXCEL.xlColorWhite, False, False, False, Цвет(128, 128, 128), False);
                       ProgressPos(ii+21);
                       if вСЧТвнпкре<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 7, вСЧТвнпкре, localDS, localTS); fi;
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 7, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, РАБ.EXCEL.xlColorWhite, False, False, False, Цвет(128, 128, 128), False);
                       ProgressPos(ii+22);
                       if вСЧТобокре<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 8, вСЧТобокре, localDS, localTS); fi;
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 8, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, РАБ.EXCEL.xlColorWhite, False, False, False, Цвет(128, 128, 128), False);
                       ProgressPos(ii+23);
                       if вСЧТосткон<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 9, вСЧТосткон, localDS, localTS); fi;
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 9, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, РАБ.EXCEL.xlColorWhite, False, False, False, Цвет(128, 128, 128), False);
                       ProgressPos(ii+24);
                       РАБ.EXCEL.УстановитьВсеГраницыДиапазонаИвнутри(xlsSheet, offsetRow, 1, offsetRow, 9, True, True, True, True, True, True, False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);
                       --
                       NoError=True;
                     Finally
                       ClearVariable(xlsSheet);
                     end;
                   Finally
                     ClearVariable(xlsSheet);
                   end;
                 Except
                   NoError=False;
                   xlsBook.Close(False); -- закрыть книгу без сохранения
                 end;
               Finally
                 xlsBook.Save;
                 xlsBook.Close(False); -- закрыть книгу без сохранения
                 ClearVariable(xlsBook); -- освободить объект книги
               end;
             Finally
               ClearVariable(xlsBooks); -- освободить объект книг
             end;
           Finally
             ClearVariable(xlsApp); -- освободить объект Excel
           end;
         Except
           NoError=False;
           ClearVariable(xlsRng);
           ClearVariable(xlsSheet);
           ClearVariable(xlsSheets);
           ClearVariable(xlsBook);
           ClearVariable(xlsBooks);
           ClearVariable(xlsApp);
         end;
       Finally
        CloseProgress;
       end;
     fi;
   fi;
   if NoError:
     if flgРсчИтгТаб2 and СтрокиТ2>0:
       ShowProgress((25+СтрокиТ2), "Оборотка НФА - экспорт свод 2...");
       Try
         xlsApp=CreateAutoObject('Excel.Application');
         Try
           Try
             xlsApp.EnableEvents=False;   -- отключить события
             xlsApp.AutomationSecurity=3; -- отключить макросы
             xlsBooks=AsAutoObject(xlsApp.Workbooks); -- получить объект Workbooks
             Try
               xlsBook=AsAutoObject(xlsBooks.Open(xlNameFile));
               Try
                 Try
                   Try
                     if ExportWork:
                       ProgressPos(01);
                       xlsSheet=AsAutoObject(xlsBook.Worksheets["Оборотка НФА "+Chr(151)+" свод"]);
                     else
                       ProgressPos(01);
                       kol=kol+1;
                       xlsSheet=AsAutoObject(xlsBook.Worksheets[kol]);
                       xlsSheet.Name = "Оборотка НФА "+Chr(151)+" свод";
                       РАБ.EXCEL.УстановитьШиринуСтолбцаСимвол(xlsSheet, 01, 27.0);
                       РАБ.EXCEL.УстановитьШиринуСтолбцаСимвол(xlsSheet, 02, 14.0);
                       РАБ.EXCEL.УстановитьШиринуСтолбцаСимвол(xlsSheet, 03, 13.0);
                       РАБ.EXCEL.УстановитьШиринуСтолбцаСимвол(xlsSheet, 04, 13.0);
                       РАБ.EXCEL.УстановитьШиринуСтолбцаСимвол(xlsSheet, 05, 13.0);
                       РАБ.EXCEL.УстановитьШиринуСтолбцаСимвол(xlsSheet, 06, 13.0);
                       РАБ.EXCEL.УстановитьШиринуСтолбцаСимвол(xlsSheet, 07, 13.0);
                       РАБ.EXCEL.УстановитьШиринуСтолбцаСимвол(xlsSheet, 08, 13.0);
                       РАБ.EXCEL.УстановитьШиринуСтолбцаСимвол(xlsSheet, 09, 14.0);
                       --
                       РАБ.EXCEL.PrintSetup_ЧБ_Поля10(xlsApp, xlsSheet, False, 0, 0, 0, 0, True, False, True, 100);
                       РАБ.EXCEL.PrintSetup_Колонтитулы(xlsSheet, rusExcel, TimeCreationRep);
                       ExportWork=True;
                     fi;
                     Try
                       ProgressPos(02);
                       offsetRow=offsetRow+if(offsetRow>0, 2, 1);
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow, 01, "Итоговая таблица №2 к оборотно-сальдовой ведомости НФА (по видам финансового обеспечения)");
                       РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetRow, 01, offsetRow, 09);
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 01, РАБ.EXCEL.xlLeft, 1, РАБ.EXCEL.xlCenter, True, "Arial", 10, 0, True, False,  True, Цвет(192, 192, 192), False);
                       if offsetRow>1 and flgПечНовСтр:  РАБ.EXCEL.РазрывСтраницы(xlsSheet, offsetRow); fi;
                       offsetRow=offsetRow+1;
                       ProgressPos(03);
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow  , 01, "Синтетический"+Chr(10)+"счет");
                       РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetRow, 01, offsetRow+1, 01);
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow  , 01, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, True, "Arial", 09, 0, True, True,  False, Цвет(192, 192, 192), False);
                       ProgressPos(04);
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow  , 02, "ОСТАТОК на"+Chr(10)+"начало периода");
                       РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetRow, 02, offsetRow+1, 02);
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow  , 02, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, True, "Arial", 09, 0, True, True,  False, Цвет(192, 192, 192), False);
                       ProgressPos(05);
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow  , 03, "Оборот за период: приход НФА");
                       РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetRow, 03, offsetRow, 05);
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow  , 03, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, True, "Arial", 09, 0, True, False, False, Цвет(192, 192, 192), False);
                       ProgressPos(06);
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow+1, 03, "принято к учету");
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow+1, 03, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, True, "Arial", 08, 0, True, False, False, Цвет(192, 192, 192), False);
                       ProgressPos(07);
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow+1, 04, "из внутр.перемещ.");
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow+1, 04, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, True, "Arial", 08, 0, True, False, False, Цвет(192, 192, 192), False);
                       ProgressPos(08);
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow+1, 05, "приход ВСЕГО");
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow+1, 05, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, True, "Arial", 08, 0, True, True,  False, Цвет(192, 192, 192), False);
                       ProgressPos(09);
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow  , 06, "Оборот за период: расход НФА");
                       РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetRow, 06, offsetRow, 08);
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow  , 06, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, True, "Arial", 09, 0, True, False, False, Цвет(192, 192, 192), False);
                       ProgressPos(10);
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow+1, 06, "снято с учета");
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow+1, 06, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, True, "Arial", 08, 0, True, False, False, Цвет(192, 192, 192), False);
                       ProgressPos(11);
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow+1, 07, "на внутр.перемещ.");
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow+1, 07, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, True, "Arial", 08, 0, True, False, False, Цвет(192, 192, 192), False);
                       ProgressPos(12);
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow+1, 08, "расход  ВСЕГО");
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow+1, 08, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, True, "Arial", 08, 0, True, True,  False, Цвет(192, 192, 192), False);
                       ProgressPos(13);
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow  , 09, "ОСТАТОК на"+Chr(10)+"конец периода");
                       РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetRow, 09, offsetRow+1, 09);
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow  , 09, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, True, "Arial", 09, 0, True, True, False, Цвет(192, 192, 192), False);
                       ProgressPos(14);
                       РАБ.EXCEL.УстановитьВсеГраницыДиапазонаИвнутри(xlsSheet, offsetRow, 01, offsetRow+1, 09, True, True, True, True, True, True, False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);
                       offsetRow=offsetRow+1;
                       --
                       for ii=1 to СтрокиТ2 do
                         ProgressPos(14+ii);
                         offsetRow=offsetRow+1;

                         РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow, 1, иИСТнаимен[ii]);
                         РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 1, РАБ.EXCEL.xlLeft, 0, РАБ.EXCEL.xlTop, True, "Arial", 8, 0, True, True, False, 0, True);

                         if иИСТостнач[ii]<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 2, иИСТостнач[ii], localDS, localTS); fi;
                         РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 2, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, Цвет(255, 0, 0), False, False, False, 0, True);

                         if иИСТпрхдеб[ii]<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 3, иИСТпрхдеб[ii], localDS, localTS); fi;
                         РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 3, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, 0, True);

                         if иИСТвнпдеб[ii]<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 4, иИСТвнпдеб[ii], localDS, localTS); fi;
                         РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 4, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, 0, True);

                         if иИСТободеб[ii]<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 5, иИСТободеб[ii], localDS, localTS); fi;
                         РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 5, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, Цвет(0, 0, 128), False, False, False, 0, True);

                         if иИСТрсхкре[ii]<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 6, иИСТрсхкре[ii], localDS, localTS); fi;
                         РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 6, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, 0, True);

                         if иИСТвнпкре[ii]<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 7, иИСТвнпкре[ii], localDS, localTS); fi;
                         РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 7, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, 0, True);

                         if иИСТобокре[ii]<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 8, иИСТобокре[ii], localDS, localTS); fi;
                         РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 8, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, Цвет(0, 0, 128), False, False, False, 0, True);

                         if иИСТосткон[ii]<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 9, иИСТосткон[ii], localDS, localTS); fi;
                         РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 9, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, Цвет(255, 0, 0), False, False, False, 0, True);

                         РАБ.EXCEL.УстановитьВсеГраницыДиапазонаИвнутри(xlsSheet, offsetRow, 1, offsetRow, 9, True, True, True, True, True, True, False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);

                       od;
                       --
                       offsetRow=offsetRow+1;
                       ProgressPos(ii+15);
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow, 1, "И Т О Г О :");
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 1, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, РАБ.EXCEL.xlColorWhite, False, True , False, Цвет(128, 128, 128), False);
                       ProgressPos(ii+16);
                       if вИСТостнач<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 2, вИСТостнач, localDS, localTS); fi;
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 2, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, РАБ.EXCEL.xlColorWhite, False, False, False, Цвет(128, 128, 128), False);
                       ProgressPos(ii+17);
                       if вИСТпрхдеб<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 3, вИСТпрхдеб, localDS, localTS); fi;
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 3, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, РАБ.EXCEL.xlColorWhite, False, False, False, Цвет(128, 128, 128), False);
                       ProgressPos(ii+18);
                       if вИСТвнпдеб<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 4, вИСТвнпдеб, localDS, localTS); fi;
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 4, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, РАБ.EXCEL.xlColorWhite, False, False, False, Цвет(128, 128, 128), False);
                       ProgressPos(ii+19);
                       if вИСТободеб<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 5, вИСТободеб, localDS, localTS); fi;
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 5, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, РАБ.EXCEL.xlColorWhite, False, False, False, Цвет(128, 128, 128), False);
                       ProgressPos(ii+20);
                       if вИСТрсхкре<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 6, вИСТрсхкре, localDS, localTS); fi;
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 6, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, РАБ.EXCEL.xlColorWhite, False, False, False, Цвет(128, 128, 128), False);
                       ProgressPos(ii+21);
                       if вИСТвнпкре<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 7, вИСТвнпкре, localDS, localTS); fi;
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 7, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, РАБ.EXCEL.xlColorWhite, False, False, False, Цвет(128, 128, 128), False);
                       ProgressPos(ii+22);
                       if вИСТобокре<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 8, вИСТобокре, localDS, localTS); fi;
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 8, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, РАБ.EXCEL.xlColorWhite, False, False, False, Цвет(128, 128, 128), False);
                       ProgressPos(ii+23);
                       if вИСТосткон<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 9, вИСТосткон, localDS, localTS); fi;
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 9, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, РАБ.EXCEL.xlColorWhite, False, False, False, Цвет(128, 128, 128), False);
                       ProgressPos(ii+24);
                       РАБ.EXCEL.УстановитьВсеГраницыДиапазонаИвнутри(xlsSheet, offsetRow, 1, offsetRow, 9, True, True, True, True, True, True, False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);
                       --
                       NoError=True;
                     Finally
                       ClearVariable(xlsSheet);
                     end;
                   Finally
                     ClearVariable(xlsSheet);
                   end;
                 Except
                   NoError=False;
                   xlsBook.Close(False); -- закрыть книгу без сохранения
                 end;
               Finally
                 xlsBook.Save;
                 xlsBook.Close(False); -- закрыть книгу без сохранения
                 ClearVariable(xlsBook); -- освободить объект книги
               end;
             Finally
               ClearVariable(xlsBooks); -- освободить объект книг
             end;
           Finally
             ClearVariable(xlsApp); -- освободить объект Excel
           end;
         Except
           NoError=False;
           ClearVariable(xlsRng);
           ClearVariable(xlsSheet);
           ClearVariable(xlsSheets);
           ClearVariable(xlsBook);
           ClearVariable(xlsBooks);
           ClearVariable(xlsApp);
         end;
       Finally
        CloseProgress;
       end;
     fi;
   fi;
   if NoError:
     if flgРсчИтгТаб3 and СтрокиТ3>0:
       ShowProgress((25+СтрокиТ3), "Оборотка НФА - экспорт свод 3...");
       Try
         xlsApp=CreateAutoObject('Excel.Application');
         Try
           Try
             xlsApp.EnableEvents=False;   -- отключить события
             xlsApp.AutomationSecurity=3; -- отключить макросы
             xlsBooks=AsAutoObject(xlsApp.Workbooks); -- получить объект Workbooks
             Try
               xlsBook=AsAutoObject(xlsBooks.Open(xlNameFile));
               Try
                 Try
                   Try
                     if ExportWork:
                       ProgressPos(01);
                       xlsSheet=AsAutoObject(xlsBook.Worksheets["Оборотка НФА "+Chr(151)+" свод"]);
                     else
                       ProgressPos(01);
                       kol=kol+1;
                       xlsSheet=AsAutoObject(xlsBook.Worksheets[kol]);
                       xlsSheet.Name = "Оборотка НФА "+Chr(151)+" свод";
                       РАБ.EXCEL.УстановитьШиринуСтолбцаСимвол(xlsSheet, 01, 27.0);
                       РАБ.EXCEL.УстановитьШиринуСтолбцаСимвол(xlsSheet, 02, 14.0);
                       РАБ.EXCEL.УстановитьШиринуСтолбцаСимвол(xlsSheet, 03, 13.0);
                       РАБ.EXCEL.УстановитьШиринуСтолбцаСимвол(xlsSheet, 04, 13.0);
                       РАБ.EXCEL.УстановитьШиринуСтолбцаСимвол(xlsSheet, 05, 13.0);
                       РАБ.EXCEL.УстановитьШиринуСтолбцаСимвол(xlsSheet, 06, 13.0);
                       РАБ.EXCEL.УстановитьШиринуСтолбцаСимвол(xlsSheet, 07, 13.0);
                       РАБ.EXCEL.УстановитьШиринуСтолбцаСимвол(xlsSheet, 08, 13.0);
                       РАБ.EXCEL.УстановитьШиринуСтолбцаСимвол(xlsSheet, 09, 14.0);
                       --
                       РАБ.EXCEL.PrintSetup_ЧБ_Поля10(xlsApp, xlsSheet, False, 0, 0, 0, 0, True, False, True, 100);
                       РАБ.EXCEL.PrintSetup_Колонтитулы(xlsSheet, rusExcel, TimeCreationRep);
                       ExportWork=True;
                     fi;
                     Try
                       ProgressPos(02);
                       offsetRow=offsetRow+if(offsetRow>0, 2, 1);
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow, 01, "Итоговая таблица №3 к оборотно-сальдовой ведомости НФА (по ФКР)");
                       РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetRow, 01, offsetRow, 09);
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 01, РАБ.EXCEL.xlLeft, 1, РАБ.EXCEL.xlCenter, True, "Arial", 10, 0, True, False,  True, Цвет(192, 192, 192), False);
                       if offsetRow>1 and flgПечНовСтр:  РАБ.EXCEL.РазрывСтраницы(xlsSheet, offsetRow); fi;
                       offsetRow=offsetRow+1;
                       ProgressPos(03);
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow  , 01, "Синтетический"+Chr(10)+"счет");
                       РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetRow, 01, offsetRow+1, 01);
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow  , 01, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, True, "Arial", 09, 0, True, True,  False, Цвет(192, 192, 192), False);
                       ProgressPos(04);
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow  , 02, "ОСТАТОК на"+Chr(10)+"начало периода");
                       РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetRow, 02, offsetRow+1, 02);
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow  , 02, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, True, "Arial", 09, 0, True, True,  False, Цвет(192, 192, 192), False);
                       ProgressPos(05);
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow  , 03, "Оборот за период: приход НФА");
                       РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetRow, 03, offsetRow, 05);
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow  , 03, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, True, "Arial", 09, 0, True, False, False, Цвет(192, 192, 192), False);
                       ProgressPos(06);
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow+1, 03, "принято к учету");
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow+1, 03, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, True, "Arial", 08, 0, True, False, False, Цвет(192, 192, 192), False);
                       ProgressPos(07);
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow+1, 04, "из внутр.перемещ.");
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow+1, 04, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, True, "Arial", 08, 0, True, False, False, Цвет(192, 192, 192), False);
                       ProgressPos(08);
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow+1, 05, "приход ВСЕГО");
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow+1, 05, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, True, "Arial", 08, 0, True, True,  False, Цвет(192, 192, 192), False);
                       ProgressPos(09);
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow  , 06, "Оборот за период: расход НФА");
                       РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetRow, 06, offsetRow, 08);
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow  , 06, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, True, "Arial", 09, 0, True, False, False, Цвет(192, 192, 192), False);
                       ProgressPos(10);
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow+1, 06, "снято с учета");
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow+1, 06, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, True, "Arial", 08, 0, True, False, False, Цвет(192, 192, 192), False);
                       ProgressPos(11);
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow+1, 07, "на внутр.перемещ.");
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow+1, 07, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, True, "Arial", 08, 0, True, False, False, Цвет(192, 192, 192), False);
                       ProgressPos(12);
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow+1, 08, "расход  ВСЕГО");
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow+1, 08, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, True, "Arial", 08, 0, True, True,  False, Цвет(192, 192, 192), False);
                       ProgressPos(13);
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow  , 09, "ОСТАТОК на"+Chr(10)+"конец периода");
                       РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetRow, 09, offsetRow+1, 09);
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow  , 09, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, True, "Arial", 09, 0, True, True, False, Цвет(192, 192, 192), False);
                       ProgressPos(14);
                       РАБ.EXCEL.УстановитьВсеГраницыДиапазонаИвнутри(xlsSheet, offsetRow, 01, offsetRow+1, 09, True, True, True, True, True, True, False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);
                       offsetRow=offsetRow+1;
                       --
                       for ii=1 to СтрокиТ3 do
                         ProgressPos(14+ii);
                         offsetRow=offsetRow+1;

                         РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow, 1, иФКРнаимен[ii]);
                         РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 1, РАБ.EXCEL.xlLeft, 0, РАБ.EXCEL.xlTop, True, "Arial", 8, 0, True, True, False, 0, True);

                         if иФКРостнач[ii]<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 2, иФКРостнач[ii], localDS, localTS); fi;
                         РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 2, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, Цвет(255, 0, 0), False, False, False, 0, True);

                         if иФКРпрхдеб[ii]<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 3, иФКРпрхдеб[ii], localDS, localTS); fi;
                         РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 3, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, 0, True);

                         if иФКРвнпдеб[ii]<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 4, иФКРвнпдеб[ii], localDS, localTS); fi;
                         РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 4, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, 0, True);

                         if иФКРободеб[ii]<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 5, иФКРободеб[ii], localDS, localTS); fi;
                         РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 5, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, Цвет(0, 0, 128), False, False, False, 0, True);

                         if иФКРрсхкре[ii]<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 6, иФКРрсхкре[ii], localDS, localTS); fi;
                         РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 6, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, 0, True);

                         if иФКРвнпкре[ii]<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 7, иФКРвнпкре[ii], localDS, localTS); fi;
                         РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 7, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, 0, True);

                         if иФКРобокре[ii]<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 8, иФКРобокре[ii], localDS, localTS); fi;
                         РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 8, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, Цвет(0, 0, 128), False, False, False, 0, True);

                         if иФКРосткон[ii]<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 9, иФКРосткон[ii], localDS, localTS); fi;
                         РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 9, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, Цвет(255, 0, 0), False, False, False, 0, True);

                         РАБ.EXCEL.УстановитьВсеГраницыДиапазонаИвнутри(xlsSheet, offsetRow, 1, offsetRow, 9, True, True, True, True, True, True, False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);

                       od;
                       --
                       offsetRow=offsetRow+1;
                       ProgressPos(ii+15);
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetRow, 1, "И Т О Г О :");
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 1, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, РАБ.EXCEL.xlColorWhite, False, True , False, Цвет(128, 128, 128), False);
                       ProgressPos(ii+16);
                       if вФКРостнач<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 2, вФКРостнач, localDS, localTS); fi;
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 2, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, РАБ.EXCEL.xlColorWhite, False, False, False, Цвет(128, 128, 128), False);
                       ProgressPos(ii+17);
                       if вФКРпрхдеб<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 3, вФКРпрхдеб, localDS, localTS); fi;
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 3, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, РАБ.EXCEL.xlColorWhite, False, False, False, Цвет(128, 128, 128), False);
                       ProgressPos(ii+18);
                       if вФКРвнпдеб<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 4, вФКРвнпдеб, localDS, localTS); fi;
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 4, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, РАБ.EXCEL.xlColorWhite, False, False, False, Цвет(128, 128, 128), False);
                       ProgressPos(ii+19);
                       if вФКРободеб<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 5, вФКРободеб, localDS, localTS); fi;
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 5, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, РАБ.EXCEL.xlColorWhite, False, False, False, Цвет(128, 128, 128), False);
                       ProgressPos(ii+20);
                       if вФКРрсхкре<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 6, вФКРрсхкре, localDS, localTS); fi;
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 6, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, РАБ.EXCEL.xlColorWhite, False, False, False, Цвет(128, 128, 128), False);
                       ProgressPos(ii+21);
                       if вФКРвнпкре<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 7, вФКРвнпкре, localDS, localTS); fi;
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 7, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, РАБ.EXCEL.xlColorWhite, False, False, False, Цвет(128, 128, 128), False);
                       ProgressPos(ii+22);
                       if вФКРобокре<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 8, вФКРобокре, localDS, localTS); fi;
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 8, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, РАБ.EXCEL.xlColorWhite, False, False, False, Цвет(128, 128, 128), False);
                       ProgressPos(ii+23);
                       if вФКРосткон<>0.00: РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, offsetRow, 9, вФКРосткон, localDS, localTS); fi;
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetRow, 9, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, РАБ.EXCEL.xlColorWhite, False, False, False, Цвет(128, 128, 128), False);
                       ProgressPos(ii+24);
                       РАБ.EXCEL.УстановитьВсеГраницыДиапазонаИвнутри(xlsSheet, offsetRow, 1, offsetRow, 9, True, True, True, True, True, True, False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);
                       --
                       NoError=True;
                     Finally
                       ClearVariable(xlsSheet);
                     end;
                   Finally
                     ClearVariable(xlsSheet);
                   end;
                 Except
                   NoError=False;
                   xlsBook.Close(False); -- закрыть книгу без сохранения
                 end;
               Finally
                 xlsBook.Save;
                 xlsBook.Close(False); -- закрыть книгу без сохранения
                 ClearVariable(xlsBook); -- освободить объект книги
               end;
             Finally
               ClearVariable(xlsBooks); -- освободить объект книг
             end;
           Finally
             ClearVariable(xlsApp); -- освободить объект Excel
           end;
         Except
           NoError=False;
           ClearVariable(xlsRng);
           ClearVariable(xlsSheet);
           ClearVariable(xlsSheets);
           ClearVariable(xlsBook);
           ClearVariable(xlsBooks);
           ClearVariable(xlsApp);
         end;
       Finally
        CloseProgress;
       end;
     fi;
   fi;
   --
   if NoError:
     len=EnqOkCancel("Экспорт завершен!^MВремя работы - "+TimeToHMSstring_adv(Time-начало, ":")+Chr(13)+"Открыть файл экспорта?", mtInformation);
     if len=cmOK:
       xlsApp=CreateAutoObject('Excel.Application');
       Try
         Try
           xlsApp.EnableEvents=False;   -- отключить события
           xlsApp.AutomationSecurity=3; -- отключить макросы
           xlsBooks=AsAutoObject(xlsApp.Workbooks); -- получить объект Workbooks
           Try
             xlsBook=AsAutoObject(xlsBooks.Open(xlNameFile));
             Try
               xlsApp.Visible=True;  -- сделать видимым Excel
             Finally
               ClearVariable(xlsBook); -- освободить объект книги
             end;
           Finally
             ClearVariable(xlsBooks); -- освободить объект книг
           end;
         Finally
           ClearVariable(xlsApp);
         end;
       Except
         ClearVariable(xlsApp);
       end;
     fi;
   fi;
 fi; -- ChooseFolder
end;

Proc btnOnClick(Sender:String); -- объекты при нажатии
 if Sender="btn_Exit"  : Close;
 |  Sender="btn_Calc"  : РасчетСпискаНФА;
 |  Sender="btnExcel"  : ЭкспортВедомости_Excel;
 fi;
end;

2-- События шаблона
Proc Template_OnOpen(Create:Logical); -- при открытии шаблона
 РАБ.НАСТР_ПЕЧАТЬ.Cfg(PlanVar("НФА")+"\Настройки\", "ТББ_STD_Album10_num_100.cfg"); -- стандартная настройка !(возможно надо будет заменить)
end;

Proc Template_AfterOpen(Create:Logical); -- после открытия шаблона
var num :Integer;
 Очистить;
 Инициализация;
 flgСкрытьПарОтч=False;
 flgНстрВнВидОтч=False;
 flgФиксШапка=False;
 ФиксироватьШапку(flgФиксШапка);
 flgClear=GetGuid;
 if Позиции>0:
    num=EnqOkCancel("Обнаружены данные предыдущего расчета!^MСформировать ведомость?", mtConfirmation);
    if num=cmOk:  ПостроениеОтчета; else ОчисткаОтчета; fi;
 else
    ОчисткаОтчета;
 fi;
 Template.Field="Фокус";
end;

Proc Template_OnClose(Destroy:Logical); -- при закрытии шаблона
var num :Integer;
 Очистить;
 flgClear="";
 if intРежимСохр=1:
   if Позиции>0:
      num=Enquiry("Выберите действие...", "Очистить ведомость (быстрее будет открываться бланк)^Mили сохранить данные для дальнейшего просмотра?", "Очистить;Сохранить", mtConfirmation);
      if num=1: ОчисткаОтчета; fi;
   fi;
 |  intРежимСохр>1: ОчисткаОтчета;
 fi;
end;

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