БЛАНКСШАБЛОНОМ[29.12.2007] "Оборотная ведомость по синтетическим счетам";
-- Разработка бланка: ТБ.БЮДЖЕТ
-- Первый релиз: 11.01.2010
--
-- Объекты
cb_Бюджет:Object; Bevel1:Object; btnРасчет :Object; cb_НстрВнВидОтч:Object; rbtMskAcc1:Object; rbtMskAcc3:Object;
cb_внБюдж:Object; Bevel2:Object; btnExcel  :Object; cb_РучВводСчета:Object; rbtMskAcc2:Object; rbtMskAcc4:Object;
cb_ЗабалС:Object; Bevel3:Object; btnClose  :Object; cb_ИтогПоУровню:Object; lblVersion: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;

-- Секции
СекцШапка :Object; СекцТитул1 :Object;
СекцГрупп :Object; СекцТитул2 :Object;
СекцСчета :Object; СекцТитул3 :Object;
СекцАнлтк :Object; СекцВнВид  :Object;
СекцОтДат :Object;
--
СекцWorkЗТ :Object;  -- Основная таблица (ведомость) - строка заголовков
СекцWorkДТ :Object;  -- Основная таблица (ведомость) - строки данных
СекцWorkИТ :Object;  -- Основная таблица (ведомость) - строка итогов
СекцWorkHT :Object;  -- Основная таблица (скрытые данные)
Позиции    :Integer; -- строки ведомости

--
-- Переменные
var АвтоРасчет   :Logical;  --Автоматически расчитывать ведомость при открытии
var btnName_menu :String='Оборотная ведомость по синтетическим счетам';
var infoVersion  :String="Версия отчета: 1.11.1010";
var Flag_onEnter :Logical;
var ИзмПрд       :String;
var ИзмПрд_      :String=ИзмПрд;
var Фокус        :String="";
var Расшифр[]    :String;
TimeCreationRep  :String;
СлужИнфоСЧТ      :String;
СлужИнфоКБК      :String;
СлужИнфоАНА      :String;
var OldСчтРуч    :String;   -- для запоминания и возвратов (счета ручного ввода)
var OldОтчАНА    :String;   -- для запоминания и возвратов (дополнительная аналитика)
var OldDateНП    :Date;     -- для запоминания и возвратов
var OldDateКП    :Date;     -- для запоминания и возвратов
flgClear         :String;   -- контроль очистки бланков
MskAccUse        :Integer;
var MskAccOld    :Integer;
УЧР_ИМЯ          :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;
итгНП:Numeric; B_итгНП:Numeric; Z_итгНП:Numeric; V_итгНП:Numeric;
итгОД:Numeric; B_итгОД:Numeric; Z_итгОД:Numeric; V_итгОД:Numeric;
итгОК:Numeric; B_итгОК:Numeric; Z_итгОК:Numeric; V_итгОК:Numeric;
итгКП:Numeric; B_итгКП:Numeric; Z_итгКП:Numeric; V_итгКП:Numeric;
--
flgРежимСЧТ      :Integer=[0];
flgРежимСЧТ_     :Integer=flgРежимСЧТ;
flgПечСлужИнф    :Logical=[True];
flgСлужИнф       :Logical;
flgСчета00и00Z   :Logical=[True];
flgРазрешИмена   :Logical=[True];
flgНетЗАБНФА     :Logical=[True];
flgНет500ОТЧ     :Logical=[True];

flgСхемаЦветов   :Integer;
ПоправкаExcel    :Integer;
ПоправкаExcel_   :Integer=ПоправкаExcel;
--
flgНстрВнВидОтч  :Logical=[False];
flgРучВводСчета  :Logical=[False];
flgИтогПоУровню  :Logical=[False];
flgВыборСЧТ      :Logical=[False];
flgБюджет        :Logical=[True];
flgвнБюдж        :Logical=[False];
flgЗабалС        :Logical=[False];
--
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ИСТ     :Logical; -- вывод в отчет источника средств (False - без вывода; True - иерархично)
flgКБК     :Logical; -- вывод в отчет КБК               (False - без вывода; True - иерархично)
отчСЧТ     :String;  -- Фильтр по счету
usrСЧТ     :String;
отчКБК     :String;  -- Фильтр по КБК (может быть маской)
valКБК     :String;  -- Фильтр по КБК (полное значение - для возвратов в меню)
var usrСЧТ_:String=usrСЧТ;
var отчКБК_:String=отчКБК;

    vocКОД1:String;      vocКОД2:String;      vocКОД3:String;
    vocИМЯ1:String;      vocИМЯ2:String;      vocИМЯ3:String;
    анаКОД1:String;      анаКОД2:String;      анаКОД3:String;
    анаИМЯ1:String;      анаИМЯ2:String;      анаИМЯ3:String;
отчАНА     :String;  -- Фильтр по дополнительной аналитике
--
var flgИСТ_:Logical=flgИСТ; var vocКОД1_:String=vocКОД1; var vocКОД2_:String=vocКОД2; var vocКОД3_:String=vocКОД3;
var flgКБК_:Logical=flgКБК; var анаКОД1_:String=анаКОД1; var анаКОД2_:String=анаКОД2; var анаКОД3_:String=анаКОД3;
--
Иерархия    :String;  -- строка формирования порядка полей иерархической группировки
var ГРП[]   :String;  -- группы для возможного создания иерархии отчета
var USE[]   :Logical; -- вид отчета группы для возможного создания иерархии отчета (False - без вывода; True - иерархично)
--
StoreKeyИФД :Integer;
StoreСчет   :String;
BufAcc[]    :String;
SrhAcc[]    :String;
--
var Buf[]      :String;
var BufInt[]   :Integer;
var aAna[]     :String;
var BufStr[]   :String;
var BufMsk[]   :String;

var bindVOC[]  :String;  -- Привязанный справочник
var bindINT[]  :Integer; -- Количество привязок

var AccCode[]  :String;
var AccStr3[]  :String;
var AccStr5[]  :String;
var AccStr8[]  :String;
var AccTmpC[]  :String;
var AccTmpT[]  :String;

var LST_UNQSTR[] :String;
var LST_СЧТОТЧ[] :String;
var LST_ИСТСЧТ[] :String;
var LST_КБКСЧТ[] :String;
var LST_СТРУКТ[] :Logical;
var LST_СЧТЗАБ[] :Logical;
var LST_НАЧОСТ[] :Numeric;
var LST_ДЕБОБО[] :Numeric;
var LST_КРЕОБО[] :Numeric;

-- Основная ведомость - рабочие массивы
тSRTFLD[]    :String;
тСЧТОТЧ[]    :String;
тСЧТОТ5[]    :String;
тСЧТОТ3[]    :String;
тИСТСЧТ[]    :String;
тКБКСЧТ[]    :String;
тСТРУКТ[]    :Logical;
тСЧТЗАБ[]    :Logical;
тСУМ_НП[]    :Numeric;
тСУМ_ОД[]    :Numeric;
тСУМ_ОК[]    :Numeric;
тСУМ_КП[]    :Numeric;
тСУБИТГ[]    :String;
тVALH01[]    :String;
тVALH02[]    :String;
тVALH03[]    :String;
тVALH04[]    :String;
тVALDAT[]    :String;
тNAMH01[]    :String;
тNAMH02[]    :String;
тNAMH03[]    :String;
тNAMH04[]    :String;
тNAMDAT[]    :String;

-2- Общие процедуры и функции

Proc Очистить;
 ClearVariable(ГРП);
 ClearVariable(USE);
 ClearVariable(Buf);
 ClearVariable(BufInt);
 ClearVariable(aAna);
 ClearVariable(BufStr);
 ClearVariable(BufMsk);
 --
 ClearVariable(bindVOC);
 ClearVariable(bindINT);
 --
 ClearVariable(AccCode);
 ClearVariable(AccStr3);
 ClearVariable(AccStr5);
 ClearVariable(AccStr8);
 --
 ClearVariable(AccTmpC);
 ClearVariable(AccTmpT);
end;

Proc ОчиститьОформлениеЗаголовков;
var OffsetCol, ii, Height, KolStrok :Integer;
var Value :String;

 OffsetCol=1;

 СекцWorkЗТ.RowsCount=1;
 СекцWorkЗТ.Row(1, RowVisible, False);
 СекцWorkЗТ.CellLinks(OffsetCol+1, 1, -1, -1);
 for ii=1 to 9 do
   Секц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);
   СекцWorkЗТ.Cell(1, OffsetCol+ii,  CellContents, "", True);
 od;
 СекцWorkЗТ.Row(1, RowVisible, True);

 СекцWorkЗТ.RowsCount=3;

 for ii=1 to 5 do
   СекцWorkЗТ.Cell(2, OffsetCol+ii,  CellContents, "", True);
   СекцWorkЗТ.Cell(2, OffsetCol+ii,  CellFontStyle, 0);
   СекцWorkЗТ.Cell(2, OffsetCol+ii,  CellFontSize,  8);
   СекцWorkЗТ.Cell(2, OffsetCol+ii,  CellFontColor, coBlack);
   СекцWorkЗТ.Cell(2, OffsetCol+ii,  CellBgColor,   coLtGray);
   СекцWorkЗТ.Cell(2, OffsetCol+ii,  CellAlignment, 2);
   СекцWorkЗТ.Cell(2, OffsetCol+ii,  CellBorder, "1,1,1,1");
   СекцWorkЗТ.Cell(2, OffsetCol+ii,  CellWrap, True);
   СекцWorkЗТ.CellLinks(OffsetCol+ii, 2, OffsetCol+ii, 3);
 od;

 СекцWorkЗТ.Cell(2, 07,  CellFontStyle, fsBold);
 СекцWorkЗТ.Cell(2, 07,  CellFontSize,  8);
 СекцWorkЗТ.Cell(2, 07,  CellFontColor, coBlack);
 СекцWorkЗТ.Cell(2, 07,  CellBgColor,   coLtGray);
 СекцWorkЗТ.Cell(2, 07,  CellAlignment, 2);
 СекцWorkЗТ.Cell(2, 07,  CellBorder, "1,1,1,0");
 СекцWorkЗТ.Cell(2, 07,  CellWrap, True);
 СекцWorkЗТ.Cell(2, 07,  CellContents, ЗагОстНП);

 Value="(остаток на"+Chr(13)+"начало"+Chr(13)+"периода)";
 Height=asInteger(СекцWorkЗТ.Row(3, RowHeight, ""));
 if Round(Height/50, 0)>1: Height=50; fi;
 KolStrok=asInteger(СекцWorkЗТ.Cell(3, 07, CellLinesCount, Value));

 СекцWorkЗТ.Cell(3, 07,  CellFontStyle, 0);
 СекцWorkЗТ.Cell(3, 07,  CellFontSize,  8);
 СекцWorkЗТ.Cell(3, 07,  CellFontColor, coBlack);
 СекцWorkЗТ.Cell(3, 07,  CellBgColor,   coLtGray);
 СекцWorkЗТ.Cell(3, 07,  CellAlignment, 2);
 СекцWorkЗТ.Cell(3, 07,  CellBorder, "1,0,1,1");
 СекцWorkЗТ.Cell(3, 07,  CellWrap, True);
 СекцWorkЗТ.Cell(3, 07,  CellContents, Value);

 if KolStrok>1: СекцWorkЗТ.Row(3, RowHeight, Height*KolStrok); else СекцWorkЗТ.Row(3, RowHeight, Height); fi;

 СекцWorkЗТ.Cell(2, 08,  CellFontStyle, fsBold);
 СекцWorkЗТ.Cell(2, 08,  CellFontSize,  8);
 СекцWorkЗТ.Cell(2, 08,  CellFontColor, coBlack);
 СекцWorkЗТ.Cell(2, 08,  CellBgColor,   coLtGray);
 СекцWorkЗТ.Cell(2, 08,  CellAlignment, 2);
 СекцWorkЗТ.Cell(2, 08,  CellBorder, "1,1,1,1");
 СекцWorkЗТ.Cell(2, 08,  CellWrap, True);
 СекцWorkЗТ.Cell(2, 08,  CellContents, ЗагОборот);

 Value="оборот"+Chr(13)+"по ДЕБЕТУ";
 СекцWorkЗТ.Cell(3, 08,  CellFontStyle, 0);
 СекцWorkЗТ.Cell(3, 08,  CellFontSize,  8);
 СекцWorkЗТ.Cell(3, 08,  CellFontColor, coBlack);
 СекцWorkЗТ.Cell(3, 08,  CellBgColor,   coLtGray);
 СекцWorkЗТ.Cell(3, 08,  CellAlignment, 2);
 СекцWorkЗТ.Cell(3, 08,  CellBorder, "1,1,1,1");
 СекцWorkЗТ.Cell(3, 08,  CellWrap, True);
 СекцWorkЗТ.Cell(3, 08,  CellContents, Value);

 Value="оборот"+Chr(13)+"по КРЕДИТУ";
 СекцWorkЗТ.Cell(3, 09,  CellFontStyle, 0);
 СекцWorkЗТ.Cell(3, 09,  CellFontSize,  8);
 СекцWorkЗТ.Cell(3, 09,  CellFontColor, coBlack);
 СекцWorkЗТ.Cell(3, 09,  CellBgColor,   coLtGray);
 СекцWorkЗТ.Cell(3, 09,  CellAlignment, 2);
 СекцWorkЗТ.Cell(3, 09,  CellBorder, "1,1,1,1");
 СекцWorkЗТ.Cell(3, 09,  CellWrap, True);
 СекцWorkЗТ.Cell(3, 09,  CellContents, Value);

 СекцWorkЗТ.CellLinks(8, 2, 9, 2);

 СекцWorkЗТ.Cell(2, 10,  CellFontStyle, fsBold);
 СекцWorkЗТ.Cell(2, 10,  CellFontSize,  8);
 СекцWorkЗТ.Cell(2, 10,  CellFontColor, coBlack);
 СекцWorkЗТ.Cell(2, 10,  CellBgColor,   coLtGray);
 СекцWorkЗТ.Cell(2, 10,  CellAlignment, 2);
 СекцWorkЗТ.Cell(2, 10,  CellBorder, "1,1,1,0");
 СекцWorkЗТ.Cell(2, 10,  CellWrap, True);
 СекцWorkЗТ.Cell(2, 10,  CellContents, ЗагОстКП);

 Value="(остаток на"+Chr(13)+"конец"+Chr(13)+"периода)";
 СекцWorkЗТ.Cell(3, 10,  CellFontStyle, 0);
 СекцWorkЗТ.Cell(3, 10,  CellFontSize,  8);
 СекцWorkЗТ.Cell(3, 10,  CellFontColor, coBlack);
 СекцWorkЗТ.Cell(3, 10,  CellBgColor,   coLtGray);
 СекцWorkЗТ.Cell(3, 10,  CellAlignment, 2);
 СекцWorkЗТ.Cell(3, 10,  CellBorder, "1,0,1,1");
 СекцWorkЗТ.Cell(3, 10,  CellWrap, True);
 СекцWorkЗТ.Cell(3, 10,  CellContents, Value);

 СекцWorkЗТ.Row(1, RowVisible, False);

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 9 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ДТ.Cell(1, 12, CellFieldType, cftStaticText);
 СекцWorkДТ.Cell(1, 12, CellContents, "", True);
 СекцWorkДТ.Cell(1, 12, CellFontStyle, 0);
 СекцWorkДТ.Cell(1, 12, CellFontSize,  8);
 СекцWorkДТ.Cell(1, 12, CellFontColor, coBlack);
 СекцWorkДТ.Cell(1, 12, CellBgColor,   coTransparent);
 СекцWorkДТ.Cell(1, 12, CellAlignment, 2);
 СекцWorkДТ.Cell(1, 12, CellBorder, "1,1,1,1");
 СекцWorkДТ.Cell(1, 12, CellWrap, False);
 СекцWorkДТ.Cell(1, 12, CellEventonClick, "");
 СекцWorkДТ.Cell(1, 12, CellEventonEnter, "");
 --
 СекцWorkДТ.Row(1, RowVisible, True);
end;

Proc ОчиститьОформление;
 ОчиститьОформлениеСтрокиДанных;
 ОчиститьОформлениеЗаголовков;
 ClearVariable(Расшифр);
end;

Proc ОчиститьLST;
 ClearVariable(LST_UNQSTR);
 ClearVariable(LST_СЧТОТЧ);
 ClearVariable(LST_ИСТСЧТ);
 ClearVariable(LST_КБКСЧТ);
 ClearVariable(LST_СТРУКТ);
 ClearVariable(LST_СЧТЗАБ);
 ClearVariable(LST_НАЧОСТ);
 ClearVariable(LST_ДЕБОБО);
 ClearVariable(LST_КРЕОБО);
end;

Proc ОчиститьТаблицу;
 ClearVariable(Позиции);
 ClearVariable(тSRTFLD);
 ClearVariable(тСЧТОТЧ);
 ClearVariable(тСЧТОТ5);
 ClearVariable(тСЧТОТ3);
 ClearVariable(тИСТСЧТ);
 ClearVariable(тКБКСЧТ);
 ClearVariable(тСТРУКТ);
 ClearVariable(тСЧТЗАБ);
 ClearVariable(тСУМ_НП);
 ClearVariable(тСУМ_ОД);
 ClearVariable(тСУМ_ОК);
 ClearVariable(тСУМ_КП);
 ClearVariable(тСУБИТГ);
 ClearVariable(тVALH01);
 ClearVariable(тVALH02);
 ClearVariable(тVALH03);
 ClearVariable(тVALH04);
 ClearVariable(тVALDAT);
 ClearVariable(тNAMH01);
 ClearVariable(тNAMH02);
 ClearVariable(тNAMH03);
 ClearVariable(тNAMH04);
 ClearVariable(тNAMDAT);
 ClearVariable(итгНП);
 ClearVariable(итгОД);
 ClearVariable(итгОК);
 ClearVariable(итгКП);
 ClearVariable(B_итгНП);
 ClearVariable(B_итгОД);
 ClearVariable(B_итгОК);
 ClearVariable(B_итгКП);
 ClearVariable(Z_итгНП);
 ClearVariable(Z_итгОД);
 ClearVariable(Z_итгОК);
 ClearVariable(Z_итгКП);
 ClearVariable(V_итгНП);
 ClearVariable(V_итгОД);
 ClearVariable(V_итгОК);
 ClearVariable(V_итгКП);
 ОчиститьОформление;
end;

Proc ОчиститьАналитикуОтбора;
 usrСЧТ="";
 отчСЧТ="";
 отчКБК="";
 valКБК="";
end;

Proc SetFLGСлужИнф;
var Flag :Logical;
 Flag=False;
 if flgПечСлужИнф and (Length(СлужИнфоСЧТ)>0 or Length(СлужИнфоАНА)>0 or Length(СлужИнфоКБК)>0): Flag=True; fi;
 flgСлужИнф=Flag;
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;

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;

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 ОтчетныйПериодВТекст(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;
   btnExcel.Enabled=FF;
 ИменаПериодовЗаголовков;
end;

Proc ValidateОтчетSection;
 -- Основная таблица
 ValidateВедомостьSection(False);
 -- Дополнительные итоги
 -- ... пока нет :)
end;

Proc ОчисткаОтчета;
 Очистить;
 ОчиститьТаблицу;
 ValidateОтчетSection;
 TimeCreationRep="";
 ClearVariable(СлужИнфоСЧТ);
 ClearVariable(СлужИнфоАНА);
 ClearVariable(СлужИнфоКБК);
 SetFLGСлужИнф;
end;

Proc ValidateSection(СкрытьУсловия:Logical);
var Flag :Logical;
 ShowProgress(1, "Работаем...");
 Try
   Flag = not СкрытьУсловия;
   --
   if not Flag: flgНстрВнВидОтч=False; cb_НстрВнВидОтч.State=False; fi;
   --
   СекцШапка.Visible=Flag; СекцТитул1.Visible=Flag;
   СекцГрупп.Visible=Flag; СекцТитул2.Visible=Flag;
   СекцСчета.Visible=Flag; СекцТитул3.Visible=Flag;
   СекцАнлтк.Visible=Flag;  СекцВнВид.Visible=Flag;
   СекцОтДат.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;
   --
   cb_Бюджет.Visible=Flag; Bevel1.Visible=Flag; cb_НстрВнВидОтч.Visible=Flag;  btnРасчет.Visible=Flag;
   cb_внБюдж.Visible=Flag; Bevel2.Visible=Flag; cb_РучВводСчета.Visible=Flag; lblVersion.Visible=Flag;
   cb_ЗабалС.Visible=Flag; Bevel3.Visible=Flag; cb_ИтогПоУровню.Visible=Flag;
   --
   rbtMskAcc1.Visible=Flag; rbtMskAcc2.Visible=Flag; rbtMskAcc3.Visible=Flag; rbtMskAcc4.Visible=Flag;
   --
   ValidateОтчетSection;
   --
 Finally
   CloseProgress;
 end;
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 УдалитьСловоИзНабора_Диалог(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; SepSet:String) :String;
var num, ii, nn :Integer;
var Val1, Val2, tmp :String;
 ClearVariable(Buf);
 ClearVariable(BufStr);
 num=WordsCount(НаборСчетов, SepSet);
 if num<2: ^""; fi;
 for ii=1 to num do
   Val1=ExtractWord(ii, НаборСчетов, SepSet);
   tmp=SubStr(Val1, 1, 1);
   if tmp="<" or tmp=">" or tmp="^": Val2=SubStr(Val1, 2, Length(Val1)-1); else Val2=Val1; fi;
      Buf[ii+1]=Val2;
   BufStr[ii+1]=Val1;
 od;
 Buf[1]="Удалить все"; BufStr[1]="Удалить все";
 nn=Alternate("Удаление...", Buf, -1, 1, 12);
 if nn=0: ^НаборСчетов; fi;
 НаборСчетов="";
 if nn=1: ^НаборСчетов; fi;
 num=num+1;
 for ii=2 to num do if not ii=nn: НаборСчетов=НаборСчетов+SepSet+BufStr[ii]; fi; od;
 НаборСчетов=Trim(SubStr(НаборСчетов, Length(SepSet)+1, 255));
 ^НаборСчетов;
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 Оператор :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;

Func ГруппаТекст(nameField:String) :String;
 if 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] = True;
 ГРП[02] = "ИСТ";   USE[02] = flgИСТ;
 ГРП[03] = "КБК";   USE[03] = 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 ПорядокГрупп_ОтобразитьГруппыТаблицы;
var num, kk, ii :Integer;
 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;
 else
    num=1;
    СекцГрупп.Cell(num+1, 5, CellContents, "", True);
    СекцГрупп.Cell(num+1, 6, CellContents, "нет групп для разбиения на таблицы");
 fi;
 kk=3-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;

Func ВозможныСубитогиСчетов :Logical;
 if Pos("СЧТ", Up(Иерархия))>0 and MskAccUse>0: ^True; else ^False; fi;
end;

Proc ОтображениеСубитоговСчета;
var Work :Logical;
 Work=ВозможныСубитогиСчетов;
 if not Work: flgИтогПоУровню=False; fi;
 cb_ИтогПоУровню.Enabled=Work;
end;

Proc ПорядокГрупп_ПеречитатьГруппы;
 ПорядокГрупп_СобратьГруппы;
 ПорядокГрупп_ОтобразитьГруппыТаблицы;
 ОтображениеСубитоговСчета;
end;

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

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

Proc ВозможностьДопАналитики;
var цвFont, цвBack :Integer;
var ТЧ :Logical;
 -- Проверять координаты !!!
 if Name_A(vocКОД1+".")=" ": цвFont=coBlack; цвBack=coTransparent; ТЧ=True; else цвFont=coWhite; цвBack=coTeal; ТЧ=False; fi;
 СекцАнлтк.Cell(02, 4, CellFontColor, цвFont); СекцАнлтк.Cell(02, 4, CellBgColor, цвBack); СекцАнлтк.Cell(02, 4, CellReadOnly, ТЧ);
 if Name_A(vocКОД2+".")=" ": цвFont=coBlack; цвBack=coTransparent; ТЧ=True; else цвFont=coWhite; цвBack=coTeal; ТЧ=False; fi;
 СекцАнлтк.Cell(05, 4, CellFontColor, цвFont); СекцАнлтк.Cell(05, 4, CellBgColor, цвBack); СекцАнлтк.Cell(05, 4, CellReadOnly, ТЧ);
 if Name_A(vocКОД3+".")=" ": цвFont=coBlack; цвBack=coTransparent; ТЧ=True; else цвFont=coWhite; цвBack=coTeal; ТЧ=False; fi;
 СекцАнлтк.Cell(08, 4, CellFontColor, цвFont); СекцАнлтк.Cell(08, 4, CellBgColor, цвBack); СекцАнлтк.Cell(08, 4, CellReadOnly, ТЧ);
end;

Proc ВыбратьДопСправочник(refField:String; OnExit:Logical);
var FieldКОД, FieldИМЯ, StoreКОД, StoreИМЯ, NewКОД, NewИМЯ, QUA, ANA, Элемент :String;
var SaveValue :Logical;
var pp, kk, ii :Integer;
 SaveValue=False;
 ClearVariable(Buf);
 --
 FieldКОД=Up(SubStr(refField, 1, Length(refField)-1));
 QUA=SubStr(FieldКОД, Length(FieldКОД), 1); -- номер текущего справочника
 FieldИМЯ="VOCИМЯ"+QUA;
 --
 StoreКОД=GetVariableS(FieldКОД);
 StoreИМЯ=GetVariableS(FieldИМЯ);
 --
 if OnExit:
   NewКОД="";
   NewИМЯ="";
 else
   kk=Int(QUA);
   for ii=1 to 3 do ANA=Trim(GetVariableS("VOCКОД"+Str(ii))); if ANA<>"" and ii<>kk: AddInArray(Buf, True, False, ANA); fi; od;
   ANA=AnaElection("*.*", True, False, StoreКОД);
   if ANA<>"":   -- ...если что-то выбрали
     kk=SearchInArray(Buf, ANA, True, 1);
     if kk=-1:
       Элемент=Trim(Name_A(ANA+".")); -- берем комментарий справочника
       pp=Pos("--", Элемент);
       while pp>0 do
         Элемент=SubStr(Элемент, pp+2, Length(Элемент)-pp);
         pp=Pos("--", Элемент);
       od;
       NewКОД=ANA;
       NewИМЯ=ANA+" - "+Trim(Элемент);
     else
       Message("Повторный выбор справочника ["+ANA+"]!", mtError);
       NewКОД=StoreКОД;
       NewИМЯ=StoreИМЯ;
     fi;
   else
     NewКОД=StoreКОД;
     NewИМЯ=StoreИМЯ;
   fi;
 fi;
 --
 if NewКОД<>StoreКОД: if not ОтменитьИзмененияУсловийОтчета: SaveValue=True; fi; fi;
 if SaveValue:
   PutVariableS(FieldКОД, NewКОД);
   PutVariableS(FieldИМЯ, NewИМЯ);
   if NewКОД="":
     PutVariableS("АНАКОД"+QUA, "");
     PutVariableS("АНАИМЯ"+QUA, "");
   fi;
   ВозможностьДопАналитики;
 fi;
end;

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

Func Аналитика_ВыборПризнака(VOC:String; StoreANA:String) :String;
var Value :String;
 Value="";
 RefreshAna;
 Value=AnaElection(VOC+".*", False, True, StoreANA);
 if 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));
 --
 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=""    : ^"";
 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 Match(FieldАНА, "анаКОД?"): Try ValueСПР=GetVariableS("vocКОД"+SubStr(FieldАНА, 7, 1)); Except ValueСПР=""; end; else ValueСПР=""; fi;
 if ValueСПР="": Message("Ошибка! Не удалось распознать справочник.", mtError); Exit; fi;
 FieldИМЯ="анаИМЯ"+SubStr(FieldАНА, 7, 1);
 --
 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;

-- ****
-- *Вариант с выбором маски отображаемого счета НАЧАЛО
-- ****
-- *
-- *StoreРежимСчета :Integer;
-- *
-- *Func Счета_ВыборкаСчетовПоРежиму(ЕстьБюджет:Logical; ЕстьВнеБюджет:Logical; ЕстьЗабаланс:Logical; РежимСчета:Integer; FlagUpd:Logical) :Logical;
-- *var ИФД, MaskAcc, Value, tmp1, tmp2 :String;
-- *var KeyИФД, RO1, RO2, num, len, ii, kk :Integer;
-- *var Дерево, ЕстьНаименования, fAddB, fAddZ :Logical;
-- * --
-- * * if   ЕстьБюджет and     ЕстьВнеБюджет: ИФД="?";
-- * |      ЕстьБюджет and not ЕстьВнеБюджет: ИФД="1";
-- * |  not ЕстьБюджет and     ЕстьВнеБюджет: ИФД="2";
-- * else ИФД="";
-- * fi;
-- * if ИФД="" and not ЕстьЗабаланс:
-- *   Message("Не выбран источник средств:^Mбюджетные, внебюджетные или забалансовые счета!", mtWarning);
-- *   Template.Object="cb_Бюджет";
-- * fi;
-- * --
-- * KeyИФД=0;
-- * if ЕстьБюджет    : KeyИФД=KeyИФД+1;   fi;
-- * if ЕстьВнеБюджет : KeyИФД=KeyИФД+10;  fi;
-- * if ЕстьЗабаланс  : KeyИФД=KeyИФД+100; fi;
-- * if not FlagUpd: if KeyИФД=0 or KeyИФД<>StoreKeyИФД or РежимСчета<>StoreРежимСчета or BufAcc[1]="": FlagUpd=True; fi; fi;
-- * if not FlagUpd: ^True; fi;
-- * FlagUpd=False;
-- * --
-- * ShowProgress(0, "Подготовка...");
-- * RO1=OpenWorkArea("РПО_БЮДЖ_КЛАСС","CODE","NAME_VOC='СЧ' and Match(CODE,'???.??.???')");
-- * RO2=OpenWorkArea("РПО_БЮДЖ_КЛАСС","CODE","1=0");
-- * Try
-- *   ProgressPos(01);
-- *   num=Records(RO1);
-- *   if num=0: Message("Выполните обновление справочников БК и повторите выбор!", mtWarning); OpenBlank("РАБ.ВСПОМ.ИМПОРТ_СПРАВ",True); ^False; fi;
-- *   --
-- *   ClearVariable(BufMsk);
-- *   ClearVariable(BufStr);
-- *   if РежимСчета=2 or РежимСчета=3:
-- *     ShowProgress(num, "Считывание наименований счетов...");
-- *     for ii=1 to num do
-- *       ProgressPos(ii);
-- *       BufMsk[ii]=GetFieldS(RO1, ii, "CODE");
-- *       BufStr[ii]=GetFieldS(RO1, ii, "TXT");
-- *     od;
-- *   fi;
-- *   --
-- *   ShowProgress(10, "Поиск счетов...");
-- *   ProgressPos(01);
-- *   ClearVariable(Buf);
-- *   ClearVariable(BufAcc);
-- *   if ИФД<>"":
-- *     -- Добавляем балансовые (и забалансовые) счета на основе КР
-- *     ProgressPos(02);
-- *     MaskAcc="???.????.???????.???."+ИФД+".???.??.???"+if(ЕстьЗабаланс, "", "&~*."+ИФД+".ЗАБ.??.???");
-- *     if РежимСчета=3: num=GetGroupAccounts(MaskAcc, Buf, 6, 7, 8);
-- *     |  РежимСчета=2: num=GetGroupAccounts(MaskAcc, Buf, 6, 7, 8);
-- *     |  РежимСчета=1: num=GetGroupAccounts(MaskAcc, Buf, 6, 7);
-- *     else             num=GetGroupAccounts(MaskAcc, Buf, 6);
-- *     fi;
-- *     if num>0:
-- *       if РежимСчета=3: for ii=1 to num do if not НужноДетализироватьСчет(Buf[ii]): Buf[ii]=SubStr(Buf[ii], 1, 6)+".???"; fi; od; fi;
-- *       CopyArray(Buf, BufAcc, 1, LengthOfArray(BufAcc)+1);
-- *     fi;
-- *     -- Добавляем балансовые (и забалансовые) счета на основе КД
-- *     ProgressPos(03);
-- *     MaskAcc="???.?.??.?????.??.????."  +ИФД+".???.??.???"  + if(ЕстьЗабаланс, "", "&~*."+ИФД+".ЗАБ.??.???");
-- *     if РежимСчета=3: num=GetGroupAccounts(MaskAcc, Buf, 8, 9, 10);
-- *     |  РежимСчета=2: num=GetGroupAccounts(MaskAcc, Buf, 8, 9, 10);
-- *     |  РежимСчета=1: num=GetGroupAccounts(MaskAcc, Buf, 8, 9);
-- *     else             num=GetGroupAccounts(MaskAcc, Buf, 8);
-- *     fi;
-- *     if num>0:
-- *       if РежимСчета=3: for ii=1 to num do if not НужноДетализироватьСчет(Buf[ii]): Buf[ii]=SubStr(Buf[ii], 1, 6)+".???"; fi; od; fi;
-- *       CopyArray(Buf, BufAcc, 1, LengthOfArray(BufAcc)+1);
-- *     fi;
-- *     -- Добавляем балансовые (и забалансовые) счета на основе КИФД
-- *     ProgressPos(04);
-- *     MaskAcc="???.??.??.??.??.??.????." +ИФД+".???.??.???" + if(ЕстьЗабаланс, "", "&~*."+ИФД+".ЗАБ.??.???");
-- *     if РежимСчета=3: num=GetGroupAccounts(MaskAcc, Buf, 9, 10, 11);
-- *     |  РежимСчета=2: num=GetGroupAccounts(MaskAcc, Buf, 9, 10, 11);
-- *     |  РежимСчета=1: num=GetGroupAccounts(MaskAcc, Buf, 9, 10);
-- *     else             num=GetGroupAccounts(MaskAcc, Buf, 9);
-- *     fi;
-- *     if num>0:
-- *       if РежимСчета=3: for ii=1 to num do if not НужноДетализироватьСчет(Buf[ii]): Buf[ii]=SubStr(Buf[ii], 1, 6)+".???"; fi; od; fi;
-- *       CopyArray(Buf, BufAcc, 1, LengthOfArray(BufAcc)+1);
-- *     fi;
-- *   fi; -- по структуре БК
-- *   len=LengthOfArray(BufAcc);
-- *   if ЕстьЗабаланс:
-- *     -- Добавляем забалансовые счета по структуре ЗАБ.??.???.??
-- *     ProgressPos(05);
-- *     num=GetGroupAccounts("ЗАБ.??.???.??", Buf, 3, 4);
-- *     if num>0:
-- *       for ii=1 to num do
-- *         if not AccIsBalance(Buf[ii]):
-- *           len=len+1;
-- *           if РежимСчета=3: BufAcc[len]=Buf[ii]+".ЗАБ";
-- *           |  РежимСчета=2: BufAcc[len]=Buf[ii]+".ЗАБ";
-- *           |  РежимСчета=1: BufAcc[len]=Buf[ii];
-- *           else             BufAcc[len]=SubStr(Buf[ii], 1, 3);
-- *           fi;
-- *         fi;
-- *       od;
-- *     fi;
-- *     -- Добавляем забалансовые счета по структуре ЗАБ.*
-- *     ProgressPos(06);
-- *     MaskAcc="ЗАБ.*&~(ЗАБ.??.???.??|ЗАБ.НФА.*)";
-- *     num=GetGroupAccounts(MaskAcc, Buf, 1, 2);
-- *     if num>0:
-- *       for ii=1 to num do if not AccIsBalance(Buf[ii]): len=len+1; BufAcc[len]="$z$."+Buf[ii]; fi; od;
-- *       num=GetGroupAccounts(MaskAcc, Buf, 1, 2, 3);
-- *       if num>0:
-- *         for ii=1 to num do if not AccIsBalance(Buf[ii]): len=len+1; BufAcc[len]="$z$."+Buf[ii]; fi; od;
-- *         num=GetGroupAccounts(MaskAcc, Buf, 1, 2, 3, 4);
-- *         if num>0:
-- *           for ii=1 to num do if not AccIsBalance(Buf[ii]): len=len+1; BufAcc[len]="$z$."+Buf[ii]; fi; od;
-- *         fi;
-- *       fi;
-- *     fi;
-- *   fi; -- ЕстьЗабаланс
-- *   -- Добавляем балансовые (и забалансовые) счета вне структуры бюджетного счета
-- *   ProgressPos(07);
-- *   MaskAcc="*&~(???.??.??.??.??.??.????.?.???.??.???|???.?.??.?????.??.????.?.???.??.???|???.????.???????.???.?.???.??.???|ЗАБ.*)";
-- *   num=GetGroupAccounts(MaskAcc, Buf, 1);
-- *   if num>0:
-- *     for ii=1 to num do
-- *       if     AccIsBalance(Buf[ii]) and ИФД<>"":      len=len+1; BufAcc[len]="$b$."+Buf[ii];
-- *       |  not AccIsBalance(Buf[ii]) and ЕстьЗабаланс: len=len+1; BufAcc[len]="$z$."+Buf[ii];
-- *       fi;
-- *     od;
-- *     num=GetGroupAccounts(MaskAcc, Buf, 1, 2);
-- *     if num>0:
-- *       for ii=1 to num do
-- *         if     AccIsBalance(Buf[ii]) and ИФД<>"":      len=len+1; BufAcc[len]="$b$."+Buf[ii];
-- *         |  not AccIsBalance(Buf[ii]) and ЕстьЗабаланс: len=len+1; BufAcc[len]="$z$."+Buf[ii];
-- *         fi;
-- *       od;
-- *       num=GetGroupAccounts(MaskAcc, Buf, 1, 2, 3);
-- *       if num>0:
-- *         for ii=1 to num do
-- *           if     AccIsBalance(Buf[ii]) and ИФД<>"":      len=len+1; BufAcc[len]="$b$."+Buf[ii];
-- *           |  not AccIsBalance(Buf[ii]) and ЕстьЗабаланс: len=len+1; BufAcc[len]="$z$."+Buf[ii];
-- *           fi;
-- *         od;
-- *         num=GetGroupAccounts(MaskAcc, Buf, 1, 2, 3, 4);
-- *         if num>0:
-- *           for ii=1 to num do
-- *             if     AccIsBalance(Buf[ii]) and ИФД<>"":      len=len+1; BufAcc[len]="$b$."+Buf[ii];
-- *             |  not AccIsBalance(Buf[ii]) and ЕстьЗабаланс: len=len+1; BufAcc[len]="$z$."+Buf[ii];
-- *             fi;
-- *           od;
-- *         fi;
-- *       fi;
-- *     fi;
-- *   fi;
-- *   -- Убираем двойные счета
-- *   ProgressPos(08);
-- *   len=LengthOfArray(BufAcc);
-- *   if len>0:
-- *     CopyArray(BufAcc, Buf);
-- *     ClearVariable(BufAcc);
-- *     for ii=1 to len do AddInArray(BufAcc, True, False, Buf[ii]); od;
-- *   else
-- *     Message("Нет счетов соотвествующих структуре учета!^MПроверьте план счетов!", mtError);
-- *     ^False;
-- *   fi;
-- *   -- Создаем иерархию счетов
-- *   ProgressPos(09);
-- *   if len>10: Дерево=True; else Дерево=False; fi;
-- *   --???.??.???
-- *   --1234567890
-- *   if Дерево:
-- *     -- Создаем создаем иерархию счетов
-- *     fAddB=False; fAddZ=False;
-- *     ii=1;
-- *     while not BufAcc[ii]="" do
-- *       tmp1=""; tmp2="";
-- *       MaskAcc=SubStr(BufAcc[ii], 1, 3);
-- *       if MaskAcc="$b$": fAddB=True; fi;
-- *       if MaskAcc="$z$": fAddZ=True; fi;
-- *       if MaskAcc="$b$" or MaskAcc="$z$":
-- *         Value=Trim(SubStr(BufAcc[ii], 5, 255));
-- *         num=WordsCount(Value, ".");
-- *         if num>1:
-- *           for kk=1 to num-1 do
-- *             tmp1=ExtractWords(1, kk, Value, ".")+".";
-- *             if tmp1<>"": if SearchInArray(BufAcc, MaskAcc+"."+tmp1, True)=-1: InsertInArraySort(BufAcc, MaskAcc+"."+tmp1); ii=ii+1; fi; fi; --Добавление группы идет перед выбранным элементом (сортировка)
-- *           od;
-- *         fi;
-- *       else
-- *         Value=BufAcc[ii];
-- *         if РежимСчета=3 and Match(Value, "???.??.???"): tmp1=SubStr(Value, 1, 4); tmp2=SubStr(Value, 1, 7);
-- *         |  РежимСчета=2 and Match(Value, "???.??.???"): tmp1=SubStr(Value, 1, 4); tmp2=SubStr(Value, 1, 7);
-- *         |  РежимСчета=1 and Match(Value, "???.??"):     tmp1=SubStr(Value, 1, 4); tmp2="";
-- *         else tmp1=""; tmp2="";
-- *         fi;
-- *         if tmp1<>"": if SearchInArray(BufAcc, tmp1, True)=-1: InsertInArraySort(BufAcc, tmp1); ii=ii+1; fi; fi; --Добавление группы идет перед выбранным элементом (сортировка)
-- *         if tmp2<>"": if SearchInArray(BufAcc, tmp2, True)=-1: InsertInArraySort(BufAcc, tmp2); ii=ii+1; fi; fi; --Добавление группы идет перед выбранным элементом (сортировка)
-- *       fi;
-- *       ii=ii+1;
-- *     od;
-- *   fi;
-- *   -- Создаем описания счетов
-- *   ProgressPos(10);
-- *   SetFilter(RO1, "NAME_VOC='СЧ' and Match(CODE,'???.??')");
-- *   SetFilter(RO2, "NAME_VOC='СЧ' and Match(CODE,'???')");
-- *   len=LengthOfArray(BufAcc);
-- *   if len>0:
-- *     if Records(RO1)>0 and Records(RO2)>0: ЕстьНаименования=True; else ЕстьНаименования=False; fi;
-- *     for ii=1 to len do
-- *       num=Length(BufAcc[ii]);
-- *       if SubStr(BufAcc[ii], num, 1)=".":
-- *         tmp1=SubStr(BufAcc[ii], 1, 3);
-- *         if tmp1="$b$" or tmp1="$z$":
-- *           Value=SubStr(BufAcc[ii], 5, num-4);
-- *           BufAcc[ii]=BufAcc[ii]+" --"+Trim(Name_S(Value));
-- *         else
-- *           Value=SubStr(BufAcc[ii], 1, num-1);
-- *           if num=4:
-- *             if ЕстьНаименования: kk=Search(RO2, 1, Value); else kk=0; fi;
-- *             if kk>0:
-- *               BufAcc[ii]=BufAcc[ii]+" --"+GetFieldS(RO2, kk, "TXT");
-- *             else
-- *               BufAcc[ii]=BufAcc[ii]+" --"+Trim(Name_S(BufAcc[ii]));
-- *             fi;
-- *           |  num=7:
-- *             if ЕстьНаименования: kk=Search(RO1, 1, Value); else kk=0; fi;
-- *             if kk>0:
-- *               BufAcc[ii]=BufAcc[ii]+" --"+GetFieldS(RO1, kk, "TXT");
-- *             else
-- *               BufAcc[ii]=BufAcc[ii]+" --"+Trim(Name_S(BufAcc[ii]));
-- *             fi;
-- *           else
-- *             BufAcc[ii]=BufAcc[ii]+" --"+Trim(Name_S(BufAcc[ii]));
-- *           fi;
-- *         fi;
-- *       else
-- *         tmp1=SubStr(BufAcc[ii], 1, 3);
-- *         if tmp1="$b$" or tmp1="$z$":
-- *           Value=SubStr(BufAcc[ii], 5, num-4);
-- *           BufAcc[ii]=BufAcc[ii]+" --"+Trim(Name_S(Value));
-- *         else
-- *           kk=0;
-- *           if РежимСчета=3 and Match(BufAcc[ii], "???.??.???"): kk=SearchInArray(BufMsk, BufAcc[ii], True);
-- *           |  РежимСчета=2 and Match(BufAcc[ii], "???.??.???"): kk=SearchInArray(BufMsk, BufAcc[ii], True);
-- *           |  РежимСчета=1 and Match(BufAcc[ii], "???.??"):     kk=Search(RO1, 1, BufAcc[ii]);
-- *           else                                                 kk=Search(RO2, 1, BufAcc[ii]);
-- *           fi;
-- *           if kk>0:
-- *             if РежимСчета=3 and Match(BufAcc[ii], "???.??.???"): BufAcc[ii]=BufMsk[kk]+" --"+BufStr[kk];
-- *             |  РежимСчета=2 and Match(BufAcc[ii], "???.??.???"): BufAcc[ii]=BufMsk[kk]+" --"+BufStr[kk];
-- *             |  РежимСчета=1 and Match(BufAcc[ii], "???.??"):     BufAcc[ii]=BufAcc[ii]+" --"+GetFieldS(RO1, kk, "TXT");
-- *             else                                                 BufAcc[ii]=BufAcc[ii]+" --"+GetFieldS(RO2, kk, "TXT");
-- *             fi;
-- *           else
-- *             BufAcc[ii]=BufAcc[ii]+" --"+Trim(Name_S(BufAcc[ii]));
-- *           fi;
-- *         fi;
-- *       fi;
-- *     od;
-- *     if fAddB: InsertInArraySort(BufAcc, "$b$. --Балансовые__ счета вне структуры '???.??.???'"); fi;
-- *     if fAddZ: InsertInArraySort(BufAcc, "$z$. --Забалансовые счета вне структуры '???.??.???'"); fi;
-- *     InsertInArray(BufAcc, 1, "* --Обновить список");
-- *   fi;
-- *   --
-- * Finally
-- *   CloseWorkArea(RO2);
-- *   CloseWorkArea(RO1);
-- *   CloseProgress;
-- * end;
-- * StoreKeyИФД=KeyИФД;
-- * StoreРежимСчета=РежимСчета;
-- * ^True;
-- *end;
-- *
-- *Func Счета_ВыборкаСчетов_Простой(ЕстьБюджет:Logical; ЕстьВнеБюджет:Logical; ЕстьЗабаланс:Logical; РежимСчета:Integer; FlagUpd:Logical) :Logical;
-- *var ИФД, MaskAcc, Value, tmp1, tmp2 :String;
-- *var KeyИФД, RO1, RO2, num, len, ii, kk :Integer;
-- *var Дерево, ЕстьНаименования, fAddB, fAddZ :Logical;
-- * --
-- * if     ЕстьБюджет and     ЕстьВнеБюджет: ИФД="?";
-- * |      ЕстьБюджет and not ЕстьВнеБюджет: ИФД="1";
-- * |  not ЕстьБюджет and     ЕстьВнеБюджет: ИФД="2";
-- * else ИФД="";
-- * fi;
-- * if ИФД="" and not ЕстьЗабаланс:
-- *   Message("Не выбран источник средств:^Mбюджетные, внебюджетные или забалансовые счета!", mtWarning);
-- *   Template.Object="cb_Бюджет";
-- * fi;
-- * --
-- * KeyИФД=0;
-- * if ЕстьБюджет    : KeyИФД=KeyИФД+1;   fi;
-- * if ЕстьВнеБюджет : KeyИФД=KeyИФД+10;  fi;
-- * if ЕстьЗабаланс  : KeyИФД=KeyИФД+100; fi;
-- * if not FlagUpd: if KeyИФД=0 or KeyИФД<>StoreKeyИФД or РежимСчета<>StoreРежимСчета or BufAcc[1]="": FlagUpd=True; fi; fi;
-- * if not FlagUpd: ^True; fi;
-- * FlagUpd=False;
-- * --
-- * ShowProgress(0, "Подготовка...");
-- * RO1=OpenWorkArea("РПО_БЮДЖ_КЛАСС","CODE","NAME_VOC='СЧ' and Match(CODE,'???.??.???')");
-- * RO2=OpenWorkArea("РПО_БЮДЖ_КЛАСС","CODE","1=0");
-- * Try
-- *   ProgressPos(01);
-- *   num=Records(RO1);
-- *   if num=0: Message("Выполните обновление справочников БК и повторите выбор!", mtWarning); OpenBlank("РАБ.ВСПОМ.ИМПОРТ_СПРАВ",True); ^False; fi;
-- *   --
-- *   ClearVariable(BufMsk);
-- *   ClearVariable(BufStr);
-- *   ShowProgress(num, "Считывание наименований счетов...");
-- *   for ii=1 to num do
-- *     ProgressPos(ii);
-- *     BufMsk[ii]=GetFieldS(RO1, ii, "CODE");
-- *     BufStr[ii]=GetFieldS(RO1, ii, "TXT");
-- *   od;
-- *   --
-- *   ShowProgress(10, "Поиск счетов...");
-- *   ProgressPos(01);
-- *   ClearVariable(Buf);
-- *   ClearVariable(BufAcc);
-- *   if ИФД<>"":
-- *     -- Добавляем балансовые (и забалансовые) счета на основе КР
-- *     ProgressPos(02);
-- *     MaskAcc="???.????.???????.???."+ИФД+".???.??.???"+if(ЕстьЗабаланс, "", "&~*."+ИФД+".ЗАБ.??.???");
-- *     num=GetGroupAccounts(MaskAcc, Buf, 6, 7, 8);
-- *     if num>0: CopyArray(Buf, BufAcc, 1, LengthOfArray(BufAcc)+1); fi;
-- *     -- Добавляем балансовые (и забалансовые) счета на основе КД
-- *     ProgressPos(03);
-- *     MaskAcc="???.?.??.?????.??.????."  +ИФД+".???.??.???"  + if(ЕстьЗабаланс, "", "&~*."+ИФД+".ЗАБ.??.???");
-- *     num=GetGroupAccounts(MaskAcc, Buf, 8, 9, 10);
-- *     if num>0: CopyArray(Buf, BufAcc, 1, LengthOfArray(BufAcc)+1); fi;
-- *     -- Добавляем балансовые (и забалансовые) счета на основе КИФД
-- *     ProgressPos(04);
-- *     MaskAcc="???.??.??.??.??.??.????." +ИФД+".???.??.???" + if(ЕстьЗабаланс, "", "&~*."+ИФД+".ЗАБ.??.???");
-- *     num=GetGroupAccounts(MaskAcc, Buf, 9, 10, 11);
-- *     if num>0: CopyArray(Buf, BufAcc, 1, LengthOfArray(BufAcc)+1); fi;
-- *   fi; -- по структуре БК
-- *   len=LengthOfArray(BufAcc);
-- *   if ЕстьЗабаланс:
-- *     -- Добавляем забалансовые счета по структуре ЗАБ.??.???.??
-- *     ProgressPos(05);
-- *     num=GetGroupAccounts("ЗАБ.??.???.??", Buf, 3, 4);
-- *     if num>0: for ii=1 to num do if not AccIsBalance(Buf[ii]): len=len+1; BufAcc[len]=Buf[ii]+".ЗАБ"; fi; od; fi;
-- *     -- Добавляем забалансовые счета по структуре ЗАБ.*
-- *     ProgressPos(06);
-- *     MaskAcc="ЗАБ.*&~(ЗАБ.??.???.??|ЗАБ.НФА.*)";
-- *     num=GetGroupAccounts(MaskAcc, Buf, 1, 2);
-- *     if num>0:
-- *       for ii=1 to num do if not AccIsBalance(Buf[ii]): len=len+1; BufAcc[len]="$z$."+Buf[ii]; fi; od;
-- *       num=GetGroupAccounts(MaskAcc, Buf, 1, 2, 3);
-- *       if num>0:
-- *         for ii=1 to num do if not AccIsBalance(Buf[ii]): len=len+1; BufAcc[len]="$z$."+Buf[ii]; fi; od;
-- *         num=GetGroupAccounts(MaskAcc, Buf, 1, 2, 3, 4);
-- *         if num>0:
-- *           for ii=1 to num do if not AccIsBalance(Buf[ii]): len=len+1; BufAcc[len]="$z$."+Buf[ii]; fi; od;
-- *         fi;
-- *       fi;
-- *     fi;
-- *   fi; -- ЕстьЗабаланс
-- *   -- Добавляем балансовые (и забалансовые) счета вне структуры бюджетного счета
-- *   ProgressPos(07);
-- *   MaskAcc="*&~(???.??.??.??.??.??.????.?.???.??.???|???.?.??.?????.??.????.?.???.??.???|???.????.???????.???.?.???.??.???|ЗАБ.*)";
-- *   num=GetGroupAccounts(MaskAcc, Buf, 1);
-- *   if num>0:
-- *     for ii=1 to num do
-- *       if     AccIsBalance(Buf[ii]) and ИФД<>"":      len=len+1; BufAcc[len]="$b$."+Buf[ii];
-- *       |  not AccIsBalance(Buf[ii]) and ЕстьЗабаланс: len=len+1; BufAcc[len]="$z$."+Buf[ii];
-- *       fi;
-- *     od;
-- *     num=GetGroupAccounts(MaskAcc, Buf, 1, 2);
-- *     if num>0:
-- *       for ii=1 to num do
-- *         if     AccIsBalance(Buf[ii]) and ИФД<>"":      len=len+1; BufAcc[len]="$b$."+Buf[ii];
-- *         |  not AccIsBalance(Buf[ii]) and ЕстьЗабаланс: len=len+1; BufAcc[len]="$z$."+Buf[ii];
-- *         fi;
-- *       od;
-- *       num=GetGroupAccounts(MaskAcc, Buf, 1, 2, 3);
-- *       if num>0:
-- *         for ii=1 to num do
-- *           if     AccIsBalance(Buf[ii]) and ИФД<>"":      len=len+1; BufAcc[len]="$b$."+Buf[ii];
-- *           |  not AccIsBalance(Buf[ii]) and ЕстьЗабаланс: len=len+1; BufAcc[len]="$z$."+Buf[ii];
-- *           fi;
-- *         od;
-- *         num=GetGroupAccounts(MaskAcc, Buf, 1, 2, 3, 4);
-- *         if num>0:
-- *           for ii=1 to num do
-- *             if     AccIsBalance(Buf[ii]) and ИФД<>"":      len=len+1; BufAcc[len]="$b$."+Buf[ii];
-- *             |  not AccIsBalance(Buf[ii]) and ЕстьЗабаланс: len=len+1; BufAcc[len]="$z$."+Buf[ii];
-- *             fi;
-- *           od;
-- *         fi;
-- *       fi;
-- *     fi;
-- *   fi;
-- *   -- Убираем двойные счета
-- *   ProgressPos(08);
-- *   len=LengthOfArray(BufAcc);
-- *   if len>0:
-- *     CopyArray(BufAcc, Buf);
-- *     ClearVariable(BufAcc);
-- *     for ii=1 to len do AddInArray(BufAcc, True, False, Buf[ii]); od;
-- *   else
-- *     Message("Нет счетов соотвествующих структуре учета!^MПроверьте план счетов!", mtError);
-- *     ^False;
-- *   fi;
-- *   -- Создаем иерархию счетов
-- *   ProgressPos(09);
-- *   if len>10: Дерево=True; else Дерево=False; fi;
-- *   --???.??.???
-- *   --1234567890
-- *   if Дерево:
-- *     -- Создаем создаем иерархию счетов
-- *     fAddB=False; fAddZ=False;
-- *     ii=1;
-- *     while not BufAcc[ii]="" do
-- *       tmp1=""; tmp2="";
-- *       MaskAcc=SubStr(BufAcc[ii], 1, 3);
-- *       if MaskAcc="$b$": fAddB=True; fi;
-- *       if MaskAcc="$z$": fAddZ=True; fi;
-- *       if MaskAcc="$b$" or MaskAcc="$z$":
-- *         Value=Trim(SubStr(BufAcc[ii], 5, 255));
-- *         num=WordsCount(Value, ".");
-- *         if num>1:
-- *           for kk=1 to num-1 do
-- *             tmp1=ExtractWords(1, kk, Value, ".")+".";
-- *             if tmp1<>"": if SearchInArray(BufAcc, MaskAcc+"."+tmp1, True)=-1: InsertInArraySort(BufAcc, MaskAcc+"."+tmp1); ii=ii+1; fi; fi; --Добавление группы идет перед выбранным элементом (сортировка)
-- *           od;
-- *         fi;
-- *       else
-- *         Value=BufAcc[ii];
-- *         if Match(Value, "???.??.???"): tmp1=SubStr(Value, 1, 4); tmp2=SubStr(Value, 1, 7); else tmp1=""; tmp2=""; fi;
-- *         if tmp1<>"": if SearchInArray(BufAcc, tmp1, True)=-1: InsertInArraySort(BufAcc, tmp1); ii=ii+1; fi; fi; --Добавление группы идет перед выбранным элементом (сортировка)
-- *         if tmp2<>"": if SearchInArray(BufAcc, tmp2, True)=-1: InsertInArraySort(BufAcc, tmp2); ii=ii+1; fi; fi; --Добавление группы идет перед выбранным элементом (сортировка)
-- *       fi;
-- *       ii=ii+1;
-- *     od;
-- *   fi;
-- *   -- Создаем описания счетов
-- *   ProgressPos(10);
-- *   SetFilter(RO1, "NAME_VOC='СЧ' and Match(CODE,'???.??')");
-- *   SetFilter(RO2, "NAME_VOC='СЧ' and Match(CODE,'???')");
-- *   len=LengthOfArray(BufAcc);
-- *   if len>0:
-- *     if Records(RO1)>0 and Records(RO2)>0: ЕстьНаименования=True; else ЕстьНаименования=False; fi;
-- *     for ii=1 to len do
-- *       num=Length(BufAcc[ii]);
-- *       if SubStr(BufAcc[ii], num, 1)=".":
-- *         tmp1=SubStr(BufAcc[ii], 1, 3);
-- *         if tmp1="$b$" or tmp1="$z$":
-- *           Value=SubStr(BufAcc[ii], 5, num-4);
-- *           BufAcc[ii]=BufAcc[ii]+" --"+Trim(Name_S(Value));
-- *         else
-- *           Value=SubStr(BufAcc[ii], 1, num-1);
-- *           if num=4:
-- *             if ЕстьНаименования: kk=Search(RO2, 1, Value); else kk=0; fi;
-- *             if kk>0:
-- *               BufAcc[ii]=BufAcc[ii]+" --"+GetFieldS(RO2, kk, "TXT");
-- *             else
-- *               BufAcc[ii]=BufAcc[ii]+" --"+Trim(Name_S(BufAcc[ii]));
-- *             fi;
-- *           |  num=7:
-- *             if ЕстьНаименования: kk=Search(RO1, 1, Value); else kk=0; fi;
-- *             if kk>0:
-- *               BufAcc[ii]=BufAcc[ii]+" --"+GetFieldS(RO1, kk, "TXT");
-- *             else
-- *               BufAcc[ii]=BufAcc[ii]+" --"+Trim(Name_S(BufAcc[ii]));
-- *             fi;
-- *           else
-- *             BufAcc[ii]=BufAcc[ii]+" --"+Trim(Name_S(BufAcc[ii]));
-- *           fi;
-- *         fi;
-- *       else
-- *         tmp1=SubStr(BufAcc[ii], 1, 3);
-- *         if tmp1="$b$" or tmp1="$z$":
-- *           Value=SubStr(BufAcc[ii], 5, num-4);
-- *           BufAcc[ii]=BufAcc[ii]+" --"+Trim(Name_S(Value));
-- *         else
-- *           if Match(BufAcc[ii], "???.??.???"): kk=SearchInArray(BufMsk, BufAcc[ii], True); else kk=0; fi;
-- *           if kk>0: BufAcc[ii]=BufMsk[kk]+" --"+BufStr[kk]; else BufAcc[ii]=BufAcc[ii]+" --"+Trim(Name_S(BufAcc[ii])); fi;
-- *         fi;
-- *       fi;
-- *     od;
-- *     if fAddB: InsertInArraySort(BufAcc, "$b$. --Балансовые__ счета вне структуры '???.??.???'"); fi;
-- *     if fAddZ: InsertInArraySort(BufAcc, "$z$. --Забалансовые счета вне структуры '???.??.???'"); fi;
-- *     InsertInArray(BufAcc, 1, "* --Обновить список");
-- *   fi;
-- *   --
-- * Finally
-- *   CloseWorkArea(RO2);
-- *   CloseWorkArea(RO1);
-- *   CloseProgress;
-- * end;
-- * StoreKeyИФД=KeyИФД;
-- * ^True;
-- *end;
-- *
-- *Func Счета_ВыбратьСчет(ЕстьБюджет:Logical; ЕстьВнеБюджет:Logical; ЕстьЗабаланс:Logical; РежимСчета:Integer; StoreValue:String) :String;
-- *var pp, num, len :Integer;
-- *var Ret, Value, tmp :String;
-- *var OK, Дерево :Logical;
-- * Ret="";
-- * num=1;
-- * if РежимСчета>0:
-- *   OK=Счета_ВыборкаСчетовПоРежиму(ЕстьБюджет, ЕстьВнеБюджет, ЕстьЗабаланс, РежимСчета, False);
-- * else
-- *   OK=Счета_ВыборкаСчетов_Простой(ЕстьБюджет, ЕстьВнеБюджет, ЕстьЗабаланс, РежимСчета, False);
-- * fi;
-- * if not OK: ^""; fi;
-- * if Pos("|", StoreValue)>0:
-- *   Value="";
-- * else
-- *   pp=Length(StoreValue);
-- *   if Pos("*", StoreValue)=pp and pp>2:
-- *     Value=SubStr(StoreValue, 1, pp-1);
-- *   else
-- *     Value=if(ValidSign(StoreValue), StoreValue, "");
-- *   fi;
-- * fi;
-- * if Trim(Value)="": Value=Trim(StoreСчет); fi;
-- * while num=1 do
-- *   pp=SearchInArray(BufAcc, Value);
-- *   len=LengthOfArray(BufAcc);
-- *   if len>10: Дерево=True; else Дерево=False; fi;
-- *   num=AlternateTree("Выбор счета...", BufAcc, -1, pp, 12, if(Дерево, ".", " "), "Код счета", "Наименование счета", if(Дерево, 15, 20), True);
-- *   if num=0: ^""; fi;
-- *   if num=1:
-- *     if РежимСчета>0:
-- *       OK=Счета_ВыборкаСчетовПоРежиму(ЕстьБюджет, ЕстьВнеБюджет, ЕстьЗабаланс, РежимСчета, True);
-- *     else
-- *       OK=Счета_ВыборкаСчетов_Простой(ЕстьБюджет, ЕстьВнеБюджет, ЕстьЗабаланс, РежимСчета, True);
-- *     fi;
-- *     if not OK: ^""; fi;
-- *   fi;
-- * od;
-- * Ret=BufAcc[num];
-- * pp=Pos(" --", Ret);
-- * if pp>1:
-- *   Value=SubStr(Ret, 1, pp-1);
-- *   tmp=SubStr(Value, 1, 3);
-- *   if tmp="$b$" or tmp="$z$":
-- *     Value=SubStr(Value, 5, Length(Value)-4);
-- *     if SubStr(Value, Length(Value), 1)=".": Ret=Value+"*"; else Ret=Value; fi;
-- *   else
-- *     if Match(Value, "???.??.???"): if SubStr(Value, 8, 3)="ЗАБ": Ret="*."+SubStr(Value, 1, 6)+"*"; else Ret="*."+Value; fi;
-- *     |  Match(Value, "???.??."):    Ret="*."+SubStr(Value, 1, 6)+"*";
-- *     |  Match(Value, "???."):       Ret="*."+SubStr(Value, 1, 3)+".??*";
-- *     fi;
-- *   fi;
-- *   StoreСчет=Ret;
-- * fi;
-- * ^Ret;
-- *end;
-- *
-- ****
-- *Вариант с выбором маски отображаемого счета КОНЕЦ
-- ****

Func НужноДетализироватьСчет(Acc:String) :Logical;
 if Match(Acc, "210.02.???"): ^True;
 |  Match(Acc, "210.04.???"): ^True;
 |  Match(Acc, "304.04.???"): ^True;
 |  Match(Acc, "304.05.???"): ^True;
 |  Match(Acc, "307.00.???"): ^True;
 |  Match(Acc, "401.10.???"): ^True;
 |  Match(Acc, "401.20.???"): ^True;
 |  Match(Acc, "401.40.???"): ^True;
 |  Match(Acc, "401.50.???"): ^True;
 |  Match(Acc, "402.10.???"): ^True;
 |  Match(Acc, "402.20.???"): ^True;
 |  Match(Acc, "501.??.???"): ^True;
 |  Match(Acc, "502.??.???"): ^True;
 |  Match(Acc, "503.??.???"): ^True;
 |  Match(Acc, "504.??.???"): ^True;
 |  Match(Acc, "506.??.???"): ^True;
 fi;
 ^False;
end;

Func Счета_ВыборкаСчетов_Единый(ЕстьБюджет:Logical; ЕстьВнеБюджет:Logical; ЕстьЗабаланс:Logical; FlagUpd:Logical) :Logical;
var ИФД, MaskAcc, Value, tmp1, tmp2 :String;
var KeyИФД, RO1, RO2, RO3, num, len, ii, kk :Integer;
var Дерево, ЕстьНаименования, fAddB, fAddZ :Logical;
 --
 if     ЕстьБюджет and     ЕстьВнеБюджет: ИФД="?";
 |      ЕстьБюджет and not ЕстьВнеБюджет: ИФД="1";
 |  not ЕстьБюджет and     ЕстьВнеБюджет: ИФД="2";
 else ИФД="";
 fi;
 if ИФД="" and not ЕстьЗабаланс:
   Message("Не выбран источник средств:^Mбюджетные, внебюджетные или забалансовые счета!", mtWarning);
   Template.Object="cb_Бюджет";
 fi;
 --
 KeyИФД=0;
 if ЕстьБюджет    : KeyИФД=KeyИФД+1;   fi;
 if ЕстьВнеБюджет : KeyИФД=KeyИФД+10;  fi;
 if ЕстьЗабаланс  : KeyИФД=KeyИФД+100; fi;
 --
 if not FlagUpd: if KeyИФД=0 or KeyИФД<>StoreKeyИФД or BufAcc[1]="": FlagUpd=True; fi; fi;
 if not FlagUpd: ^True; fi;
 FlagUpd=False;
 --
 ShowProgress(0, "Подготовка...");
 RO1=OpenWorkArea("РПО_БЮДЖ_КЛАСС","CODE","NAME_VOC='СЧ' and Match(CODE,'???.??.???')");
 RO2=OpenWorkArea("РПО_БЮДЖ_КЛАСС","CODE","NAME_VOC='СЧ' and Match(CODE,'???.??')");
 RO3=OpenWorkArea("РПО_БЮДЖ_КЛАСС","CODE","NAME_VOC='СЧ' and Match(CODE,'???')");
 Try
   ProgressPos(01);
   num=Records(RO1);
   if num=0: Message("Выполните обновление справочников БК и повторите выбор!", mtWarning); OpenBlank("РАБ.ВСПОМ.ИМПОРТ_СПРАВ",True); ^False; fi;
   if Records(RO1)>0 and Records(RO2)>0 and Records(RO3)>0: ЕстьНаименования=True; else ЕстьНаименования=False; fi;
   --
   ShowProgress(10, "Поиск счетов...");
   ProgressPos(01);
   ClearVariable(Buf);
   ClearVariable(BufAcc);
   ClearVariable(SrhAcc);
   ClearVariable(AccTmpC);
   ClearVariable(AccTmpT);
   AccTmpC[01]="101.01"; AccTmpT[01]="Забалансовые НФА. Жилые помещения.";
   AccTmpC[02]="101.02"; AccTmpT[02]="Забалансовые НФА. Нежилые помещения.";
   AccTmpC[03]="101.03"; AccTmpT[03]="Забалансовые НФА. Сооружения.";
   AccTmpC[04]="101.04"; AccTmpT[04]="Забалансовые НФА. Машины и оборудование.";
   AccTmpC[05]="101.05"; AccTmpT[05]="Забалансовые НФА. Транспортные средства.";
   AccTmpC[06]="101.06"; AccTmpT[06]="Забалансовые НФА. Производственный и хозяйственный инвентарь.";
   AccTmpC[07]="101.07"; AccTmpT[07]="Забалансовые НФА. Библиотечный фонд.";
   AccTmpC[08]="101.08"; AccTmpT[08]="Забалансовые НФА. Прочие основные средства.";
   AccTmpC[09]="102.00"; AccTmpT[09]="Забалансовые НФА. Нематериальные активы.";
   AccTmpC[10]="105.01"; AccTmpT[10]="Забалансовые НФА. Медикаменты и перевязочные средства.";
   AccTmpC[11]="105.02"; AccTmpT[11]="Забалансовые НФА. Продукты питания.";
   AccTmpC[12]="105.03"; AccTmpT[12]="Забалансовые НФА. Горюче-смазочные материалы.";
   AccTmpC[13]="105.04"; AccTmpT[13]="Забалансовые НФА. Строительные материалы.";
   AccTmpC[14]="105.05"; AccTmpT[14]="Забалансовые НФА. Мягкий инвентарь.";
   AccTmpC[15]="105.06"; AccTmpT[15]="Забалансовые НФА. Прочие материальные запасы.";
   AccTmpC[16]="105.07"; AccTmpT[16]="Забалансовые НФА. Готовая продукция.";
   AccTmpC[17]="105.08"; AccTmpT[17]="Забалансовые НФА. Товары.";
   if ИФД<>"":
     -- Добавляем балансовые (и забалансовые) счета на основе КР
     ProgressPos(02);
     MaskAcc="???.????.???????.???."+ИФД+".???.??.???"+if(ЕстьЗабаланс, "", "&~*."+ИФД+".ЗАБ.??.???");
     num=GetGroupAccounts(MaskAcc, Buf, 6, 7, 8);
     if num>0: CopyArray(Buf, BufAcc, 1, LengthOfArray(BufAcc)+1); fi;
     -- Добавляем балансовые (и забалансовые) счета на основе КД
     ProgressPos(03);
     MaskAcc="???.?.??.?????.??.????."  +ИФД+".???.??.???"  + if(ЕстьЗабаланс, "", "&~*."+ИФД+".ЗАБ.??.???");
     num=GetGroupAccounts(MaskAcc, Buf, 8, 9, 10);
     if num>0: CopyArray(Buf, BufAcc, 1, LengthOfArray(BufAcc)+1); fi;
     -- Добавляем балансовые (и забалансовые) счета на основе КИФД
     ProgressPos(04);
     MaskAcc="???.??.??.??.??.??.????." +ИФД+".???.??.???" + if(ЕстьЗабаланс, "", "&~*."+ИФД+".ЗАБ.??.???");
     num=GetGroupAccounts(MaskAcc, Buf, 9, 10, 11);
     if num>0: CopyArray(Buf, BufAcc, 1, LengthOfArray(BufAcc)+1); fi;
   fi; -- по структуре БК
   len=LengthOfArray(BufAcc);
   if ЕстьЗабаланс:
     -- Добавляем забалансовые счета по структуре ЗАБ.??.???.??
     ProgressPos(05);
     num=GetGroupAccounts("ЗАБ.??.???.??", Buf, 2, 3, 4);
     if num>0: for ii=1 to num do if not AccIsBalance(Buf[ii]): len=len+1; BufAcc[len]=SubStr(Buf[ii], 4, 6)+"."+SubStr(Buf[ii], 1, 2)+"Z"; fi; od; fi;
     -- Добавляем забалансовые счета по структуре ЗАБ.*
     ProgressPos(06);
     MaskAcc="ЗАБ.*&~(ЗАБ.??.???.??|ЗАБ.НФА.*)";
     num=GetGroupAccounts(MaskAcc, Buf, 1, 2);
     if num>0:
       for ii=1 to num do if not AccIsBalance(Buf[ii]): len=len+1; BufAcc[len]="$z$."+Buf[ii]; fi; od;
       num=GetGroupAccounts(MaskAcc, Buf, 1, 2, 3);
       if num>0:
         for ii=1 to num do if not AccIsBalance(Buf[ii]): len=len+1; BufAcc[len]="$z$."+Buf[ii]; fi; od;
         num=GetGroupAccounts(MaskAcc, Buf, 1, 2, 3, 4);
         if num>0:
           for ii=1 to num do if not AccIsBalance(Buf[ii]): len=len+1; BufAcc[len]="$z$."+Buf[ii]; fi; od;
         fi;
       fi;
     fi;
   fi; -- ЕстьЗабаланс
   if ИФД="?" or ЕстьЗабаланс:
     -- Добавляем балансовые (и забалансовые) счета вне структуры бюджетного счета
     ProgressPos(07);
     MaskAcc="*&~(???.??.??.??.??.??.????.?.???.??.???|???.?.??.?????.??.????.?.???.??.???|???.????.???????.???.?.???.??.???|ЗАБ.*)";
     num=GetGroupAccounts(MaskAcc, Buf, 1);
     if num>0:
       for ii=1 to num do
         if     AccIsBalance(Buf[ii]) and ИФД="?":      len=len+1; BufAcc[len]="$b$."+Buf[ii]; fi;
         if not AccIsBalance(Buf[ii]) and ЕстьЗабаланс: len=len+1; BufAcc[len]="$z$."+Buf[ii]; fi;
       od;
       num=GetGroupAccounts(MaskAcc, Buf, 1, 2);
       if num>0:
         for ii=1 to num do
           if     AccIsBalance(Buf[ii]) and ИФД="?":      len=len+1; BufAcc[len]="$b$."+Buf[ii]; fi;
           if not AccIsBalance(Buf[ii]) and ЕстьЗабаланс: len=len+1; BufAcc[len]="$z$."+Buf[ii]; fi;
         od;
         num=GetGroupAccounts(MaskAcc, Buf, 1, 2, 3);
         if num>0:
           for ii=1 to num do
             if     AccIsBalance(Buf[ii]) and ИФД="?":      len=len+1; BufAcc[len]="$b$."+Buf[ii]; fi;
             if not AccIsBalance(Buf[ii]) and ЕстьЗабаланс: len=len+1; BufAcc[len]="$z$."+Buf[ii]; fi;
           od;
           num=GetGroupAccounts(MaskAcc, Buf, 1, 2, 3, 4);
           if num>0:
             for ii=1 to num do
               if     AccIsBalance(Buf[ii]) and ИФД="?":      len=len+1; BufAcc[len]="$b$."+Buf[ii]; fi;
               if not AccIsBalance(Buf[ii]) and ЕстьЗабаланс: len=len+1; BufAcc[len]="$z$."+Buf[ii]; fi;
             od;
           fi;
         fi;
       fi;
     fi;
   fi;
   -- Убираем двойные счета
   ProgressPos(08);
   len=LengthOfArray(BufAcc);
   if len>0:
     CopyArray(BufAcc, Buf);
     ClearVariable(BufAcc);
     for ii=1 to len do AddInArray(BufAcc, True, False, Buf[ii]); od;
   else
     Message("Нет счетов соотвествующих структуре учета!^MПроверьте план счетов!", mtError);
     ^False;
   fi;
   -- Создаем иерархию счетов
   ProgressPos(09);
   if len>10: Дерево=True; else Дерево=False; fi;
   --???.??.???
   --1234567890
   if Дерево:
     -- Создаем создаем иерархию счетов
     fAddB=False; fAddZ=False;
     ii=1;
     while not BufAcc[ii]="" do
       tmp1=""; tmp2="";
       MaskAcc=SubStr(BufAcc[ii], 1, 3);
       if MaskAcc="$b$": fAddB=True; fi;
       if MaskAcc="$z$": fAddZ=True; fi;
       if MaskAcc="$b$" or MaskAcc="$z$":
         Value=Trim(SubStr(BufAcc[ii], 5, 255));
         num=WordsCount(Value, ".");
         if num>1:
           for kk=1 to num-1 do
             tmp1=ExtractWords(1, kk, Value, ".")+".";
             if tmp1<>"": if SearchInArray(BufAcc, MaskAcc+"."+tmp1, True)=-1: InsertInArraySort(BufAcc, MaskAcc+"."+tmp1); ii=ii+1; fi; fi; --Добавление группы идет перед выбранным элементом (сортировка)
           od;
         fi;
       else
         Value=BufAcc[ii];
         if Match(Value, "???.??.???"): tmp1=SubStr(Value, 1, 4); tmp2=SubStr(Value, 1, 7); else tmp1=""; tmp2=""; fi;
         if tmp1<>"": if SearchInArray(BufAcc, tmp1, True)=-1: InsertInArraySort(BufAcc, tmp1); ii=ii+1; fi; fi; --Добавление группы идет перед выбранным элементом (сортировка)
         if tmp2<>"": if SearchInArray(BufAcc, tmp2, True)=-1: InsertInArraySort(BufAcc, tmp2); ii=ii+1; fi; fi; --Добавление группы идет перед выбранным элементом (сортировка)
       fi;
       ii=ii+1;
     od;
   fi;
   -- Создаем описания счетов
   ProgressPos(10);
   len=LengthOfArray(BufAcc);
   if len>0:
     ShowProgress(len, "Обработка наименований счетов...");
     CopyArray(BufAcc, SrhAcc);
     for ii=1 to len do
       ProgressPos(ii);
       num=Length(BufAcc[ii]);
       if SubStr(BufAcc[ii], num, 1)=".":
         tmp1=SubStr(BufAcc[ii], 1, 3);
         if tmp1="$b$" or tmp1="$z$":
           Value=SubStr(BufAcc[ii], 5, num-4);
           BufAcc[ii]=BufAcc[ii]+" --"+Trim(Name_S(Value));
         else
           Value=SubStr(BufAcc[ii], 1, num-1);
           if num=4:
             if ЕстьНаименования: kk=Search(RO3, 1, Value); else kk=0; fi;
             if kk>0:
               BufAcc[ii]=BufAcc[ii]+" --"+GetFieldS(RO3, kk, "TXT");
             else
               BufAcc[ii]=BufAcc[ii]+" --"+Trim(Name_S(BufAcc[ii]));
             fi;
           |  num=7:
             if ЕстьНаименования: kk=Search(RO2, 1, Value); else kk=0; fi;
             if kk>0:
               BufAcc[ii]=BufAcc[ii]+" --"+GetFieldS(RO2, kk, "TXT");
             else
               if ЕстьНаименования and (Match(Value, "101.0?") or Match(Value, "105.0?")): kk=SearchInArray(AccTmpC, Value, True, 1); else kk=0; fi;
               if kk>0: BufAcc[ii]=BufAcc[ii]+" --"+AccTmpT[kk]; else BufAcc[ii]=BufAcc[ii]+" --"+Trim(Name_S(BufAcc[ii])); fi;
             fi;
           else
             BufAcc[ii]=BufAcc[ii]+" --"+Trim(Name_S(BufAcc[ii]));
           fi;
         fi;
       else
         tmp1=SubStr(BufAcc[ii], 1, 3);
         if tmp1="$b$" or tmp1="$z$":
           Value=SubStr(BufAcc[ii], 5, num-4);
           BufAcc[ii]=BufAcc[ii]+" --"+Trim(Name_S(Value));
         else
           if Match(BufAcc[ii], "???.??.???") and ЕстьНаименования: kk=Search(RO1, 1, BufAcc[ii]); else kk=0; fi;
           if kk>0: 
             BufAcc[ii]=BufAcc[ii]+" --"+GetFieldS(RO1, kk, "TXT");
           else
             if ЕстьНаименования and (Match(BufAcc[ii], "101.0?.??Z") or Match(BufAcc[ii], "105.0?.??Z")):
               tmp1=SubStr(BufAcc[ii], 1, 6);
               kk=SearchInArray(AccTmpC, tmp1, True, 1);
             else
               kk=0;
             fi;
             if kk>0:
               BufAcc[ii]=BufAcc[ii]+" --"+Trim(Name_S("ЗАБ."+SubStr(BufAcc[ii], 8, 2)+"."))+". "+AccTmpT[kk];
             else
               BufAcc[ii]=BufAcc[ii]+" --"+Trim(Name_S(BufAcc[ii]));
             fi;
           fi;
         fi;
       fi;
     od;
     if fAddB: num=InsertInArraySort(BufAcc, "$b$. --Балансовые__ счета вне структуры '???.??.???'"); InsertInArray(SrhAcc, num, "$b$"); fi;
     if fAddZ: num=InsertInArraySort(BufAcc, "$z$. --Забалансовые счета вне структуры '???.??.???'"); InsertInArray(SrhAcc, num, "$z$"); fi;
     InsertInArray(BufAcc, 1, "* --Обновить список");
     InsertInArray(SrhAcc, 1, "*");
   fi;
   --
 Finally
   CloseWorkArea(RO3);
   CloseWorkArea(RO2);
   CloseWorkArea(RO1);
   CloseProgress;
 end;
 StoreKeyИФД=KeyИФД;
 ^True;
end;

Func Счета_ВыбратьСчет(ЕстьБюджет:Logical; ЕстьВнеБюджет:Logical; ЕстьЗабаланс:Logical; StoreValue:String) :String;
var pp, num, len :Integer;
var Value, tmp, strSearch, h1, h2, h3 :String;
var OK, Work, Дерево :Logical;
 --
 OK=Счета_ВыборкаСчетов_Единый(ЕстьБюджет, ЕстьВнеБюджет, ЕстьЗабаланс, False);
 if not OK: ^""; fi;
 strSearch="";
 if Trim(StoreValue)<>"":
   tmp=SubStr(StoreValue, 1, 1);
   if tmp=">":
     Value=SubStr(StoreValue, 2, Length(StoreValue)-1);
     pp=Length(Value);
     if Pos("*", Value)=pp and pp>2: strSearch="$b$."+SubStr(Value, 1, pp-1); else strSearch=if(Name_S(Value)<>" ", "$b$."+Value, ""); fi;
   |  tmp="<":
     Value=SubStr(StoreValue, 2, Length(StoreValue)-1);
     pp=Length(Value);
     if Pos("*", Value)=pp and pp>2: strSearch="$z$."+SubStr(Value, 1, pp-1); else strSearch=if(Name_S(Value)<>" ", "$z$."+Value, ""); fi;
   |  tmp="^":
     Value=SubStr(StoreValue, 2, Length(StoreValue)-1);
     if Match(Value, "???.??.???"):
       h1=ExtractWord(1, Value, ".");
       h2=ExtractWord(2, Value, ".");
       h3=ExtractWord(3, Value, ".");
       if h1<>"???" and h2 ="??" and h3 ="???": strSearch=SubStr(Value, 1, 4);
       |  h1<>"???" and h2<>"??" and h3 ="???": strSearch=SubStr(Value, 1, 7);
       |  h1<>"???" and h2<>"??" and h3<>"???": strSearch=Value;
       fi;
     fi;
   fi;
 fi;
 Work=True;
 while Work do
   pp=SearchInArray(SrhAcc, if(Trim(strSearch)<>"", strSearch, StoreСчет));
   if not pp>0: pp=1; fi;
   len=LengthOfArray(BufAcc);
   if len>10: Дерево=True; else Дерево=False; fi;
   num=AlternateTree("Выбор счета... (клик по колонке 'Наименование счета' - выбор группы)", BufAcc, 50, pp, 12, if(Дерево, ".", " "), "Код счета", "Наименование счета", if(Дерево, 15, 20), True);
   if num<1:
     Work=False;
     ^"";
   |  num=1:
     OK=Счета_ВыборкаСчетов_Единый(ЕстьБюджет, ЕстьВнеБюджет, ЕстьЗабаланс, True);
     if not OK: Work=False; ^""; fi;
   |  num>1:
     if SrhAcc[num]<>"$b$" and SrhAcc[num]<>"$z$": Work=False; fi;
   fi;
 od;
 StoreСчет=SrhAcc[num];
 pp=Pos(" --", BufAcc[num]);
 if pp>1: Value=SubStr(BufAcc[num], 1, pp-1); else Value=BufAcc[num]; fi;
 tmp=SubStr(Value, 1, 3);
 if tmp="$b$": ^(">"+SubStr(Value, 5, Length(Value)-4))+if(SubStr(Value, Length(Value), 1)=".", "*", "");
 |  tmp="$z$": ^("<"+SubStr(Value, 5, Length(Value)-4))+if(SubStr(Value, Length(Value), 1)=".", "*", "");
 else
   if Match(Value, "???.??.???"): ^("^"+Value);
   |  Match(Value, "???.??."):    ^("^"+Value+"???");
   |  Match(Value, "???."):       ^("^"+Value+"??.???");
   else ^"";
   fi;
 fi;
end;

Func Счета_ВыборГрупповогоСчета(ЕстьБюджет:Logical; ЕстьВнеБюджет:Logical; ЕстьЗабаланс:Logical; StoreСЧТ:String; Sep:String; МаскаЗначение:Logical) :String;
var ANA, sWork, wrd, curValue, newValue, h1, h2, h3, tmp1, tmp2, vspm1, vspm2 :String;
var ВыбранаМаска, flg1, flg2 :Logical;
var ii, num1, num2, nn :Integer;
 --
 ВыбранаМаска=False;
 curValue=Up(StoreСЧТ);
 if Pos(Sep, curValue)>0: wrd=""; else wrd=StoreСЧТ; fi;
 --
 newValue=Up(Счета_ВыбратьСчет(ЕстьБюджет, ЕстьВнеБюджет, ЕстьЗабаланс, wrd));
 if newValue="": ^StoreСЧТ; fi;
 if curValue="": ^newValue; fi;
 --
 nn=Length(newValue);
 wrd=SubStr(newValue, nn, 1);
 if wrd="*": -- маска по неструктурированным счетам
   ВыбранаМаска=True;
   sWork=SubStr(newValue, 1, nn-2);
 |  wrd="?": -- маска по структурированным счетам
   ВыбранаМаска=True;
   ANA=SubStr(newValue, 2, nn-1);
   if Match(ANA, "???.??.???"):
     h1=ExtractWord(1, ANA, ".");
     h2=ExtractWord(2, ANA, ".");
     h3=ExtractWord(3, ANA, ".");
     if h1<>"???" and h2 ="??" and h3 ="???": sWork="^"+h1+".";
     |  h1<>"???" and h2<>"??" and h3 ="???": sWork="^"+h1+"."+h2;
     |  h1<>"???" and h2<>"??" and h3<>"???": sWork="^"+h1+"."+h2+"."+h3;
     fi;
   fi;
 else -- не маска (полный счет)
   sWork=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 or 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=ВхожденийНет(sWork, 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
       wrd=SubStr(BufMsk[ii], Length(BufMsk[ii]), 1);
       if wrd="*": flg1=Match(newValue+".", BufMsk[ii]);
       |  wrd="?": flg1=Match(newValue, BufMsk[ii]);
       fi;
       if not flg1:
         InsertInArraySort(Buf, BufMsk[ii]);
       else
         tmp1=SubStr(newValue, 1, 1);
         tmp2=SubStr(BufMsk[ii], 1, 1);
         if tmp1="<" or tmp1=">" or tmp1="^": vspm1=SubStr(newValue,   2, Length(newValue)  -1); else vspm1=newValue;   fi;
         if tmp2="<" or tmp2=">" or tmp2="^": vspm2=SubStr(BufMsk[ii], 2, Length(BufMsk[ii])-1); else vspm2=BufMsk[ii]; fi;
         if МаскаЗначение:
           nn=Enquiry("Выберите действие...", "Значение '"+vspm1+"' соответствует маске '"+vspm2+"'!", "Заменить маску на значение;Сохранить маску, значение опустить;Вставить значение и сохранить маску", mtConfirmation);
           if nn=2: InsertInArraySort(Buf, BufMsk[ii]); newValue="";
           |  nn=3: InsertInArraySort(Buf, BufMsk[ii]);
           fi;
         else
           nn=Enquiry("Выберите действие...", "Значение '"+vspm1+"' соответствует маске '"+vspm2+"'!", "Заменить маску на значение;Сохранить маску, значение опустить", mtConfirmation);
           if nn=2: InsertInArraySort(Buf, BufMsk[ii]); newValue=""; fi;
         fi;
       fi;
     od;
   fi;
   if num2>0:
     CopyArray(BufStr, Buf, 1, LengthOfArray(Buf)+1);
     SortArray(Buf, True);
   fi;
   if newValue<>"":
     num1=SearchInArray(Buf, newValue, True, 1);
     if num1=-1: InsertInArraySort(Buf, newValue); fi;
   fi;
 fi;
 num1=LengthOfArray(Buf);
 ANA="";
 SortArray(Buf, True);
 if num1>0:
   for ii=1 to num1 do
     ANA=Объединить(ANA, Buf[ii], Sep);
     if Length(ANA)>250:
       Message("Строка фильтра счета не может быть больше 250 символов.^MВыбор отменен!", mtWarning);
       ^StoreСЧТ;
     fi;
   od;
 fi;
 ^ANA;
end;

Proc Счета_РазрешенЗабаланс(flgЗабаланс:Logical);
var цвFont, цвBack :Integer;
var ТЧ :Logical;
 if flgЗабаланс or (not flgБюджет and not flgвнБюдж):
   цвFont=coBlack; цвBack=coTransparent; ТЧ=True;
 else
   цвFont=coWhite; цвBack=coTeal;        ТЧ=False;
 fi;
 if ТЧ: отчКБК=""; valКБК=""; fi;
 СекцСчета.Cell(4, 4, CellFontColor, цвFont); СекцСчета.Cell(4, 4, CellBgColor, цвBack); СекцСчета.Cell(4, 4, CellReadOnly, ТЧ);
 -- Проверять координаты !!!
end;

Proc Счета_ВнешнийВид;
var Flag :Logical;
 Flag = flgРучВводСчета;
 -- Проверять координаты !!!
 СекцСчета.Row(2, RowVisible, not Flag);
 СекцСчета.Row(3, RowVisible, Flag);
 Счета_РазрешенЗабаланс(flgЗабалС);
end;

Func Счета_FormatСЧТ(srcСчета:String; Sep:String; РучнойВвод:Logical) :String;
var ii, num :Integer;
var Res, Value, tmp :String;
 if РучнойВвод: ^srcСчета; fi;
 Res="";
 num=WordsCount(srcСчета, Sep);
 if num>0:
   for ii=1 to num do
     Value=ExtractWord(ii, srcСчета, Sep);
     tmp=SubStr(Value, 1, 1);
     if tmp="<" or tmp=">" or tmp="^": Value=SubStr(Value, 2, Length(Value)-1); fi;
     Res=Res+" "+Sep+" "+Value;
   od;
 fi;
 Res=Trim(Res);
 if SubStr(Res, 1, 1)=Sep: Res=Trim(SubStr(Res, 2, Length(Res)-1)); fi;
 ^Res;
end;

Func Счета_ПеревестиНаРучной(srcСчета:String; Sep:String) :String;
var ii, num :Integer;
var Res, Value, tmp :String;
 Res="";
 num=WordsCount(srcСчета, Sep);
 if num>0:
   for ii=1 to num do
     Value=ExtractWord(ii, srcСчета, Sep);
     tmp=SubStr(Value, 1, 1);
     if tmp="<":
       Value=SubStr(Value, 2, Length(Value)-1);
     |  tmp=">":
       Value=SubStr(Value, 2, Length(Value)-1);
     |  tmp="^":
       Value="*."+SubStr(Value, 2, Length(Value)-1);
       if Match(Value, "*.101.??.??Z") or Match(Value, "*.105.??.??Z"): Value="ЗАБ."+SubStr(Value, 10, 2)+"."+SubStr(Value, 3, 6); fi;
     else Value="";
     fi;
     if Value<>"": Res=Res+Sep+Value; fi;
   od;
 fi;
 if SubStr(Res, 1, 1)=Sep: Res=Trim(SubStr(Res, 2, Length(Res)-1)); fi;
 ^Res;
end;

Proc Счета_ВыбратьФильтрСчета(OnExit:Logical);
var StoreСЧТ, NewСЧТ :String;
var SaveValue :Logical;
 SaveValue=False;
 StoreСЧТ=отчСЧТ;
 --
 if OnExit:
   NewСЧТ=УдалитьСчетИзНабора_Диалог(StoreСЧТ, "|");
 else
   NewСЧТ=Счета_ВыборГрупповогоСчета(flgБюджет, flgвнБюдж, flgЗабалС, StoreСЧТ, "|", False);
 fi;
 --
 if NewСЧТ<>StoreСЧТ: if not ОтменитьИзмененияУсловийОтчета: SaveValue=True; fi; fi;
 if SaveValue: 
    отчСЧТ=NewСЧТ;
    usrСЧТ=Счета_FormatСЧТ(NewСЧТ, "|", False);
    отчКБК="";
    valКБК="";
 fi;
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 ЕстьСимволыЛогическогоОтбора(srcСчета:String) :Logical;
var Value :String;
 Value=Trim(Up(srcСчета));
 if Pos("/", Value)>0: ^True; fi;
 if Pos("+", Value)>0: ^True; fi;
 if Pos("-", Value)>0: ^True; fi;
 if Pos("&", Value)>0: ^True; fi;
 if Pos("~", Value)>0: ^True; fi;
 ^False;
end;

Func ИтоговаяМаскаСчета(srcСчета:String; РучнойВводСчетов:Logical; ЕстьЗабаланс:Logical; Sep:String) :String;
var Res, Value, tmp :String;
var num, ii :Integer;
 Res="";
 ClearVariable(Buf);
 if РучнойВводСчетов:
   if ЕстьСимволыЛогическогоОтбора(srcСчета): ^Trim(srcСчета); fi;
   -- ЕстьСимволыЛогическогоОтбора=False
   num=Length(srcСчета);
   if num>0:
     Value="";
     for ii=1 to num do
       tmp=SubStr(srcСчета, ii, 1);
       if ПравильныйСимволСчета(tmp):
         Value=Value+tmp;
       else
         if Value<>"":
           AddInArray(Buf, True, False, Value);
           Value="";
         fi;
       fi;
     od;
     if Value<>"": AddInArray(Buf, True, False, Value); Value=""; fi;
   fi;
 else
   num=WordsCount(srcСчета, Sep);
   if num>0:
     for ii=1 to num do
       Value=ExtractWord(ii, srcСчета, Sep);
       tmp=SubStr(Value, 1, 1);
       if tmp="<":
         Value=SubStr(Value, 2, Length(Value)-1);
       |  tmp=">":
         Value=SubStr(Value, 2, Length(Value)-1);
       |  tmp="^":
         Value="*."+SubStr(Value, 2, Length(Value)-1);
         if ЕстьЗабаланс and Match(Value, "*.10?.??.???"): Value=SubStr(Value, 1, 8)+"*"; fi;
       else
         Value="";
       fi;
       if Value<>"": AddInArray(Buf, True, False, Value); fi;
     od;
   fi;
 fi;
 num=LengthOfArray(Buf);
 if num>0: for ii=1 to num do Res=Res+"|"+Buf[ii]; od; fi;
 Res=Trim(Res);
 if SubStr(Res, 1, 1)=Sep: Res=SubStr(Res, 2, Length(Res)-1); fi;
 ^Res;
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 num, ii :Integer;
var OK, Edit :Logical;
var Value :String;
 Value="";
 if SaveКБК<>"":
   Edit=True;
   if Match(SaveКБК, "???.????.???????.???"):    ii=1; -- КР (ФКР)
   |  Match(SaveКБК, "???.?.??.?????.??.????"):  ii=2; -- КД
   |  Match(SaveКБК, "???.??.??.??.??.??.????"): ii=3; -- КИФД
   else Edit=False;
   fi;
 else
   Edit=False;
 fi;
 num=0;
 OK=True;
 РАБ.БЮДЖЕТ2005.РежимМаски="?";
 while OK do
   if not Edit: 
     ClearVariable(Buf);
     Buf[1]="КБК из структуры функциональной классификации расходов";
     Buf[2]="КБК из структуры классификации доходов";
     Buf[3]="КБК из структуры источников внутреннего финансирования дефицитов бюджетов";
     num=Alternate("Выберите тип КБК...", Buf, -1, ii, 12);
   else
     num=ii;
   fi;
   if num=0: OK=False;
   |  num=1: OK=False; Value=КБК_СформироватьМенюМасокКБК(SaveКБК, valКБК, maskСЧТ, num, Edit);
   |  num=2: OK=False; Value=КБК_СформироватьМенюМасокКБК(SaveКБК, valКБК, maskСЧТ, num, Edit);
   |  num=3: OK=False; Value=КБК_СформироватьМенюМасокКБК(SaveКБК, valКБК, maskСЧТ, num, Edit);
   fi;
 od;
 if Value="" or Value=" ": ^SaveКБК; fi;
 ^Value;
end;

Proc КБК_ВыбратьФильтрКБК(Нет500:Logical; OnExit:Logical);
var StoreКБК, NewКБК, mskСЧТ :String;
var SaveValue :Logical;
 SaveValue=False;
 StoreКБК=отчКБК;
 --
 if OnExit:
   NewКБК="";
 else
   mskСЧТ=ИтоговаяМаскаСчета(отчСЧТ, flgРучВводСчета, flgЗабалС, "|");
   if Нет500: if (Length(mskСЧТ)+18)<250: if mskСЧТ<>"": mskСЧТ="("+mskСЧТ+")&~(*.5??.??.???)"; else mskСЧТ="*&~(*.5??.??.???)"; fi; fi; fi;
   NewКБК=КБК_ВыборКБК(mskСЧТ, StoreКБК);
 fi;
 --
 if NewКБК<>StoreКБК: if not ОтменитьИзмененияУсловийОтчета: SaveValue=True; fi; fi;
 if SaveValue: отчКБК=NewКБК; fi;
end;

Func ИтогоФильтрАналитики :String;
var Value :String;
var len, kk :Integer;
 Value=""; len=0;
 if анаКОД1<>"": kk=Length(анаКОД1)+3; if (len+kk)<=255: len=len+kk; Value=Объединить("("+анаКОД1+")", Value, "&"); fi; fi;
 if анаКОД2<>"": kk=Length(анаКОД2)+3; if (len+kk)<=255: len=len+kk; Value=Объединить("("+анаКОД2+")", Value, "&"); fi; fi;
 if анаКОД3<>"": kk=Length(анаКОД3)+3; if (len+kk)<=255: len=len+kk; Value=Объединить("("+анаКОД3+")", Value, "&"); fi; fi;
 if  отчАНА<>"": kk=Length(отчАНА) +3; 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 СчетОтбора(КОДСЧТ:String; РежимОтбора:Integer) :String;
 if Match(КОДСЧТ, "???.??.???"):
   if РежимОтбора=0: ^(SubStr(КОДСЧТ, 1, 3));
   |  РежимОтбора=1: ^(SubStr(КОДСЧТ, 1, 6));
   |  РежимОтбора=3: if not НужноДетализироватьСчет(КОДСЧТ): ^(SubStr(КОДСЧТ, 1, 6)+".XXX"); fi;
   fi;
 else
   if Match(КОДСЧТ, "ЗАБ.??.???.??"):
     if РежимОтбора=0: ^(SubStr(КОДСЧТ, 8, 3));
     |  РежимОтбора=1: ^(SubStr(КОДСЧТ, 8, 6));
     |  РежимОтбора>1: ^(SubStr(КОДСЧТ, 8, 6)+".Z"+SubStr(КОДСЧТ, 5, 2));
     fi;
   fi;
 fi;
 ^КОДСЧТ;
end;

Proc FillСчета(РежимОтбора:Integer; нет500:Logical);
var R3, R5, R8, ii, num, kk, pp :Integer;
var Value, КОДСЧТ, ИМСЧТ5, ИМСЧТ3 :String;
 ClearVariable(AccCode);
 ClearVariable(AccStr3);
 ClearVariable(AccStr5);
 ClearVariable(AccStr8);
 R3=OpenWorkArea("РПО_БЮДЖ_КЛАСС", "CODE", "Name_Voc='СЧ' and Match(CODE, '???')"        +if(нет500, " and not Match(CODE, '5??')",        ""));
 R5=OpenWorkArea("РПО_БЮДЖ_КЛАСС", "CODE", "Name_Voc='СЧ' and Match(CODE, '???.??')"     +if(нет500, " and not Match(CODE, '5??.??')",     ""));
 R8=OpenWorkArea("РПО_БЮДЖ_КЛАСС", "CODE", "Name_Voc='СЧ' and Match(CODE, '???.??.???')" +if(нет500, " and not Match(CODE, '5??.??.???')", ""));
 ShowProgress(0, "Подготовка...");
 Try
   if РежимОтбора<1: --CODE='???'
     num=Records(R3);
     if num>0:
       ShowProgress(num, "Считывание справочника счетов...");
       for ii=1 to num do
         ProgressPos(ii);
         AccCode[ii]=GetFieldS(R3, ii, "CODE");
         AccStr8[ii]=GetFieldS(R3, ii, "TXT");
         AccStr5[ii]=GetFieldS(R3, ii, "TXT");
         AccStr3[ii]=GetFieldS(R3, ii, "TXT");
       od;
     fi;
   |  РежимОтбора=1: --CODE='???.??'
     num=Records(R5);
     if num>0 and Records(R3)>0:
       ShowProgress(num, "Считывание справочника счетов...");
       for ii=1 to num do
         ProgressPos(ii);
         AccCode[ii]=GetFieldS(R5, ii, "CODE");
         AccStr8[ii]=GetFieldS(R5, ii, "TXT");
         AccStr5[ii]=GetFieldS(R5, ii, "TXT");
         Value=SubStr(AccCode[ii], 1, 3);
         kk=Search(R3, 1, Value);
         if kk>0: AccStr3[ii]=GetFieldS(R3, kk, "TXT"); else AccStr3[ii]=""; fi;
       od;
     fi;
   |  РежимОтбора>1: --CODE='???.??.???'
     num=Records(R8);
     if num>0 and Records(R5)>0 and Records(R3)>0:
       ShowProgress(num, "Считывание справочника счетов...");
       for ii=1 to num do
         ProgressPos(ii);
         pp=InsertInArraySort(AccCode, GetFieldS(R8, ii, "CODE"));
         InsertInArray(AccStr8, pp, GetFieldS(R8, ii, "TXT"));
         --
         Value=SubStr(AccCode[pp], 1, 6);
         КОДСЧТ=Value+".XXX";
         --
         kk=Search(R5, 1, Value);
         if kk>0: 
           ИМСЧТ5=GetFieldS(R5, kk, "TXT");
           InsertInArray(AccStr5, pp, ИМСЧТ5);
         else
           ИМСЧТ5="";
           InsertInArray(AccStr5, pp, ИМСЧТ5);
         fi;
         --
         Value=SubStr(AccCode[pp], 1, 3);
         kk=Search(R3, 1, Value);
         if kk>0: 
           ИМСЧТ3=GetFieldS(R3, kk, "TXT");
           InsertInArray(AccStr3, pp, ИМСЧТ3);
         else
           ИМСЧТ3="";
           InsertInArray(AccStr3, pp, ИМСЧТ3);
         fi;
         --
         kk=SearchInArray(AccCode, КОДСЧТ, True, 1);
         if kk<0:
           pp=InsertInArraySort(AccCode, КОДСЧТ);
           InsertInArray(AccStr8, pp, ИМСЧТ5);
           InsertInArray(AccStr5, pp, ИМСЧТ5);
           InsertInArray(AccStr3, pp, ИМСЧТ3);
         fi;
       od;
     fi;
   fi;
 Finally
   CloseProgress;
   CloseWorkArea(R8);
   CloseWorkArea(R5);
   CloseWorkArea(R3);
 end;
end;

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

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

Func ВзятьКБК(Value:String) :String;
 if Value="З": ^"забаланс";
 |  Value="В": ^"вспомогательный";
 else ^Value;
 fi;
end;

Func ЗначениеУровнейСчета(vКОДСЧТ:String; vСтруктура:Logical; vСубИтогиСчета:Logical; vДетализация:Integer) :String;
var Res, Value :String;
var NullValue :Logical;
 Res="";
 Value=Trim(vКОДСЧТ);
 if vСубИтогиСчета:
   if vДетализация=1:
      NullValue=True;
      if not Pos(" ", Value)>0:
        if Match(Value, "???.??"):
          if vСтруктура: Res=SubStr(Value, 1, 3)+"#"+Value; NullValue=False; fi;
        fi;
      fi;
      if NullValue: if Value="": Res="яъ>#яъ>"; else Res="яъ>#"+Value; fi; fi;
   |  vДетализация>1:
      NullValue=True;
      if not Pos(" ", Value)>0:
        if Match(Value, "???.??.???"):
          if vСтруктура: Res=SubStr(Value, 1, 3)+"#"+SubStr(Value, 1, 6)+"#"+Value; NullValue=False; fi;
        fi;
      fi;
      if NullValue: if Value="": Res="яъ>#яъ>#яъ>"; else Res="яъ>#яъ>#"+Value; fi; fi;
   else
      if Value="": Res="яъ>"; else Res=Value; fi;
   fi;
 else
   if Value="": Res="яъ>"; else Res=Value; fi;
 fi;
 ^Res;
end;

Func СформироватьUNIQЗначениеСортировки(vИерархия:String; vСЧТ:String; vИСТ:String; vКБК:String; vСтруктура:Logical; vСубИтогиСчета:Logical; vДетализация:Integer) :String;
var Res, extWord, Value :String;
var num, ii :Integer;
 Res="";
 if Trim(vИерархия)<>"":
   num=WordsCount(vИерархия, " ");
   for ii=1 to num do
     extWord=ExtractWord(ii, vИерархия, " ");
     if extWord="СЧТ":
       Value=ЗначениеУровнейСчета(vСЧТ, vСтруктура, vСубИтогиСчета, vДетализация);
       Res=Объединить(Res, Value, "#");
     |  extWord="ИСТ":
       Value=vИСТ;
       if Trim(Value)="": Value="яъ>"; fi;
       Res=Объединить(Res, Value, "#");
     |  extWord="КБК":
       Value=vКБК;
       if Trim(Value)="": Value="яъ>"; fi;
       Res=Объединить(Res, Value, "#");
     fi;
   od;
 fi;
 if Res<>"": ^(Res+Chr(169)); fi;
 ^"";
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);
       kk=kk+1;
       Buf[kk]=Объединить(SignsMask(Acc, True), SignsMask(Acc, False), "|");
     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=Turn(maskСЧТ, 1.1.100, 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;

Proc ИщемДанные_Report(vMaskACC:String; vMaskANA:String; vИФД:String; vНПОТЧ:Date; vКПОТЧ:Date; vСубИтогиСчета:Logical; vРежимОтбора:Integer; vЕстьЗабаланс:Logical);
var Путь, Value, КОДСЧТ, СЧТ010, ИСТСЧТ, КБКСЧТ :String;
var поСтруктуре, Work :Logical;
var num, ii, pp :Integer;
var Отч1 :Report;
 ShowProgress(0, "Подготовка...");
 Try
   Путь=PlanVar("ОБЩИЕ")+"\ОТЧЕТЫ\Отч_набор_001.lst";
   if not ExistFile(Путь): Message("Файл с отчетами отсутствует!", mtError); Exit; fi;
   Try
     Отч1=RepOpen(Путь+"|По_счетам_Бал_Заб", vMaskACC, vMaskANA, vНПОТЧ, vКПОТЧ);
     RepReset(Отч1);
     Try
       num=RepRowsCount(Отч1);
       ii=0;
       ShowProgress(num, "Поиск данных...");
       while RepNext(Отч1) do
         КОДСЧТ=""; СЧТ010=""; ИСТСЧТ=""; КБКСЧТ=""; поСтруктуре=False;
         ii=ii+1;
         ProgressPos(ii);
         КОДСЧТ=RepIdent(Отч1);
         if vИФД<>"": -- балансовые счета применяются
           if Match(КОДСЧТ,    "???.????.???????.???."+vИФД+".???.??.???") : СЧТ010=SubStr(КОДСЧТ, 24, 10); ИСТСЧТ=SubStr(КОДСЧТ, 22, 1); КБКСЧТ=SubStr(КОДСЧТ, 1, 20); поСтруктуре=True;
           |  Match(КОДСЧТ,  "???.?.??.?????.??.????."+vИФД+".???.??.???") : СЧТ010=SubStr(КОДСЧТ, 26, 10); ИСТСЧТ=SubStr(КОДСЧТ, 24, 1); КБКСЧТ=SubStr(КОДСЧТ, 1, 22); поСтруктуре=True;
           |  Match(КОДСЧТ, "???.??.??.??.??.??.????."+vИФД+".???.??.???") : СЧТ010=SubStr(КОДСЧТ, 27, 10); ИСТСЧТ=SubStr(КОДСЧТ, 25, 1); КБКСЧТ=SubStr(КОДСЧТ, 1, 23); поСтруктуре=True;
           else
              if AccIsBalance(КОДСЧТ):
                if vИФД="?"      : СЧТ010=КОДСЧТ; ИСТСЧТ="В"; КБКСЧТ="В";                                                          else СЧТ010=""; ИСТСЧТ=""; КБКСЧТ=""; fi;
              else
                if vЕстьЗабаланс : СЧТ010=КОДСЧТ; ИСТСЧТ="З"; КБКСЧТ="З"; if Match(КОДСЧТ, "ЗАБ.??.???.??"): поСтруктуре=True; fi; else СЧТ010=""; ИСТСЧТ=""; КБКСЧТ=""; fi;
              fi;
           fi;
         else
              if vЕстьЗабаланс and not AccIsBalance(КОДСЧТ) : СЧТ010=КОДСЧТ; ИСТСЧТ="З"; КБКСЧТ="З"; if Match(КОДСЧТ, "ЗАБ.??.???.??"): поСтруктуре=True; fi; else СЧТ010=""; ИСТСЧТ=""; КБКСЧТ=""; fi;
         fi;
         if not AccIsBalance(КОДСЧТ) and not vЕстьЗабаланс: СЧТ010=""; ИСТСЧТ=""; КБКСЧТ=""; fi;
         if СЧТ010="" or (not flgСчета00и00Z and (СЧТ010="00" or СЧТ010="00Z")): Work=False; else Work=True; fi;
         if Work:
            СЧТ010=СчетОтбора(СЧТ010, vРежимОтбора);
            Value=СформироватьUNIQЗначениеСортировки(Иерархия, СЧТ010, ИСТСЧТ, КБКСЧТ, поСтруктуре, vСубИтогиСчета, vРежимОтбора);
            num=SearchInArray(LST_UNQSTR, Value, True, 1);
            if num=-1:
              pp=InsertInArraySort(LST_UNQSTR, Value);
              InsertInArray(LST_СЧТОТЧ, pp, СЧТ010);
              InsertInArray(LST_ИСТСЧТ, pp, ИСТСЧТ);
              InsertInArray(LST_КБКСЧТ, pp, КБКСЧТ);
              InsertInArray(LST_СТРУКТ, pp, поСтруктуре);
              InsertInArray(LST_СЧТЗАБ, pp, if(ИСТСЧТ="З", True, False));
              InsertInArray(LST_НАЧОСТ, pp, RepSaldoS(Отч1, отчСверн));
              InsertInArray(LST_ДЕБОБО, pp, RepTurn(Отч1, отчДеб));
              InsertInArray(LST_КРЕОБО, pp, RepTurn(Отч1, отчКре));
            else
              LST_НАЧОСТ[num]=LST_НАЧОСТ[num]+RepSaldoS(Отч1, отчСверн);
              LST_ДЕБОБО[num]=LST_ДЕБОБО[num]+RepTurn(Отч1, отчДеб);
              LST_КРЕОБО[num]=LST_КРЕОБО[num]+RepTurn(Отч1, отчКре);
            fi;
         fi;
       end; -- while
     Finally
       Отч1=RepClose(Отч1);
     end;
   Except
     Message("Ошибка создания отчета!", mtError);
     Exit;
   end;
 Finally
   CloseProgress;
 end;
end;

Proc ИщемДанные_Свертка(vMaskACC:String; vMaskANA:String; vИФД:String; vKBKвСвертке:String; vНПОТЧ:Date; vКПОТЧ:Date; vСубИтогиСчета:Logical; vРежимОтбора:Integer; vБезАналитики:Logical; vЕстьЗабаланс:Logical; vИспАНА1:Logical; vИспАНА2:Logical; vИспАНА3:Logical; vИспАНАD:Logical);
var ВременныйФайл, aVal1, aVal2, aDeb, aCre, aComment, Value, КОДСЧТ, СЧТ010, ИСТСЧТ, КБКСЧТ :String;
var Work, СЧДЕБ, поСтруктуре :Logical;
var len, xx, ii, num, pp :Integer;
var aSum1, aSum2, SUM :Numeric;
var aDate :Date;
 ShowProgress(0, "Подготовка...");
 Try
   -- ***
   -- Считаем ОСТАТКИ на НАЧАЛО! периода
   -- ***
   ClearVariable(aAna);
   ВременныйФайл=PlanVar('CACHE')+"\"+GetGUID;
   if ExistFile(ВременныйФайл): DeleteFile(ВременныйФайл); fi;
   xx=TujRepBalAccount+TujRepNoNullBal+if(vБезАналитики, 0, TujRepCombinedAna)+if(vЕстьЗабаланс, TujRepZabalance, 0);
   len=TujReport(ВременныйФайл, 1.1.100, vНПОТЧ, vMaskACC, vMaskANA, "ДНФА", "", "", xx, False);
   if len>0:
      ShowProgress(len, "Поиск данных (остатки)...");
      OpenTextJur(ВременныйФайл);
      Try
        ii=0;
        while not GetTransFromTextJur(aDate, aSum1, aVal1, aSum2, aVal2, aDeb, aCre, aAna, aComment) do
          ii=ii+1;
          ProgressPos(ii);
          КОДСЧТ=""; СЧТ010=""; ИСТСЧТ=""; КБКСЧТ="";
          поСтруктуре=False;
          -- *** Отбор по фильтру СЧЕТА ***
          if aDeb="00" or aDeb="00Z": КОДСЧТ=aCre; СЧДЕБ=False; fi;
          if aCre="00" or aCre="00Z": КОДСЧТ=aDeb; СЧДЕБ=True;  fi;
          --???.????.???????.???.?.???.??.???
          --???.?.??.?????.??.????.?.???.??.???
          --???.??.??.??.??.??.????.?.???.??.???
          --1234567890123456789012345678901234567890
          --         1         2         3         4
          if vИФД<>"": -- балансовые счета применяются
            if Match(КОДСЧТ,    "???.????.???????.???."+vИФД+".???.??.???") : СЧТ010=SubStr(КОДСЧТ, 24, 10); ИСТСЧТ=SubStr(КОДСЧТ, 22, 1); КБКСЧТ=SubStr(КОДСЧТ, 1, 20); поСтруктуре=True;
            |  Match(КОДСЧТ,  "???.?.??.?????.??.????."+vИФД+".???.??.???") : СЧТ010=SubStr(КОДСЧТ, 26, 10); ИСТСЧТ=SubStr(КОДСЧТ, 24, 1); КБКСЧТ=SubStr(КОДСЧТ, 1, 22); поСтруктуре=True;
            |  Match(КОДСЧТ, "???.??.??.??.??.??.????."+vИФД+".???.??.???") : СЧТ010=SubStr(КОДСЧТ, 27, 10); ИСТСЧТ=SubStr(КОДСЧТ, 25, 1); КБКСЧТ=SubStr(КОДСЧТ, 1, 23); поСтруктуре=True;
            else
              if AccIsBalance(КОДСЧТ):
                if vИФД="?"      : СЧТ010=КОДСЧТ; ИСТСЧТ="В"; КБКСЧТ="В";                                                          else СЧТ010=""; ИСТСЧТ=""; КБКСЧТ=""; fi;
              else
                if vЕстьЗабаланс : СЧТ010=КОДСЧТ; ИСТСЧТ="З"; КБКСЧТ="З"; if Match(КОДСЧТ, "ЗАБ.??.???.??"): поСтруктуре=True; fi; else СЧТ010=""; ИСТСЧТ=""; КБКСЧТ=""; fi;
              fi;
            fi;
          else
                if vЕстьЗабаланс and not AccIsBalance(КОДСЧТ) : СЧТ010=КОДСЧТ; ИСТСЧТ="З"; КБКСЧТ="З"; if Match(КОДСЧТ, "ЗАБ.??.???.??"): поСтруктуре=True; fi; else СЧТ010=""; ИСТСЧТ=""; КБКСЧТ=""; fi;
          fi;
          if not AccIsBalance(КОДСЧТ) and not vЕстьЗабаланс: СЧТ010=""; ИСТСЧТ=""; КБКСЧТ=""; fi;
          Work=False;
          if СЧТ010<>"":
            Work=True; -- Проводка соответствует отбору по счетам
            if vKBKвСвертке<>"": if not Match(КБКСЧТ, vKBKвСвертке): Work=False; fi; fi; -- Возможный отбор по КБК
          fi;
          -- *** Отбор по фильтру АНАЛИТИКИ ***
          if Work:
            xx=LengthOfArray(aAna);
            if not vБезАналитики:
              if Work and vИспАНА1: Work=ПроводкаПроходитОтборПоАналитике(xx, анаКОД1, False); fi;
              if Work and vИспАНА2: Work=ПроводкаПроходитОтборПоАналитике(xx, анаКОД2, False); fi;
              if Work and vИспАНА3: Work=ПроводкаПроходитОтборПоАналитике(xx, анаКОД3, False); fi;
              if Work and vИспАНАD: Work=ПроводкаПроходитОтборПоАналитике(xx,  отчАНА, True ); fi;
            fi;
          fi;
          -- *** Проводка отобрана ***
          if Work: -- если проводка соответствует условию отбора
            СЧТ010=СчетОтбора(СЧТ010, vРежимОтбора);
            SUM=0.00;
            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;
            -- СЧТ010#ИСТСЧТ#КБКСЧТ
            Value=СформироватьUNIQЗначениеСортировки(Иерархия, СЧТ010, ИСТСЧТ, КБКСЧТ, поСтруктуре, vСубИтогиСчета, vРежимОтбора);
            num=SearchInArray(LST_UNQSTR, Value, True, 1);
            if num=-1:
              pp=InsertInArraySort(LST_UNQSTR, Value);
              InsertInArray(LST_СЧТОТЧ, pp, СЧТ010);
              InsertInArray(LST_ИСТСЧТ, pp, ИСТСЧТ);
              InsertInArray(LST_КБКСЧТ, pp, КБКСЧТ);
              InsertInArray(LST_СТРУКТ, pp, поСтруктуре);
              InsertInArray(LST_СЧТЗАБ, pp, if(ИСТСЧТ="З", True, False));
              InsertInArray(LST_НАЧОСТ, pp, SUM);
              InsertInArray(LST_ДЕБОБО, pp, 0.00);
              InsertInArray(LST_КРЕОБО, pp, 0.00);
            else
              LST_НАЧОСТ[num]=LST_НАЧОСТ[num]+SUM;
            fi;
          fi; -- Work
        end; -- while
      Finally
        CloseTextJur;
        CloseProgress;
      end; -- Try
      Try DeleteFile(ВременныйФайл); Except end;
   fi; -- len>0 (TujReport)
   -- ***
   -- Считаем ОБОРОТЫ периода
   -- ***
   ClearVariable(aAna);
   ВременныйФайл=PlanVar('CACHE')+"\"+GetGUID;
   if ExistFile(ВременныйФайл): DeleteFile(ВременныйФайл); fi;
   xx=TujRepTurnDebCre+TujRepNoNullBal+if(vБезАналитики, 0, TujRepCombinedAna)+if(vЕстьЗабаланс, TujRepZabalance, 0);
   len=TujReport(ВременныйФайл, vНПОТЧ, vКПОТЧ, vMaskACC, vMaskANA, "ДНФА", "", "", xx, False);
   if len>0:
      OpenTextJur(ВременныйФайл);
      Try
        ShowProgress(len, "Поиск данных (обороты)...");
        ii=0;
        while not GetTransFromTextJur(aDate, aSum1, aVal1, aSum2, aVal2, aDeb, aCre, aAna, aComment) do
          ii=ii+1;
          ProgressPos(ii);
          КОДСЧТ=""; СЧТ010=""; ИСТСЧТ=""; КБКСЧТ="";
          поСтруктуре=False;
          -- *** Отбор по фильтру СЧЕТА ***
          if aDeb="00" or aDeb="00Z": КОДСЧТ=aCre; СЧДЕБ=False; fi;
          if aCre="00" or aCre="00Z": КОДСЧТ=aDeb; СЧДЕБ=True;  fi;
          if vИФД<>"": -- балансовые счета применяются
            if Match(КОДСЧТ,    "???.????.???????.???."+vИФД+".???.??.???") : СЧТ010=SubStr(КОДСЧТ, 24, 10); ИСТСЧТ=SubStr(КОДСЧТ, 22, 1); КБКСЧТ=SubStr(КОДСЧТ, 1, 20); поСтруктуре=True;
            |  Match(КОДСЧТ,  "???.?.??.?????.??.????."+vИФД+".???.??.???") : СЧТ010=SubStr(КОДСЧТ, 26, 10); ИСТСЧТ=SubStr(КОДСЧТ, 24, 1); КБКСЧТ=SubStr(КОДСЧТ, 1, 22); поСтруктуре=True;
            |  Match(КОДСЧТ, "???.??.??.??.??.??.????."+vИФД+".???.??.???") : СЧТ010=SubStr(КОДСЧТ, 27, 10); ИСТСЧТ=SubStr(КОДСЧТ, 25, 1); КБКСЧТ=SubStr(КОДСЧТ, 1, 23); поСтруктуре=True;
            else
              if AccIsBalance(КОДСЧТ):
                if vИФД="?"      : СЧТ010=КОДСЧТ; ИСТСЧТ="В"; КБКСЧТ="В";                                                          else СЧТ010=""; ИСТСЧТ=""; КБКСЧТ=""; fi;
              else
                if vЕстьЗабаланс : СЧТ010=КОДСЧТ; ИСТСЧТ="З"; КБКСЧТ="З"; if Match(КОДСЧТ, "ЗАБ.??.???.??"): поСтруктуре=True; fi; else СЧТ010=""; ИСТСЧТ=""; КБКСЧТ=""; fi;
              fi;
            fi;
          else
                if vЕстьЗабаланс and not AccIsBalance(КОДСЧТ) : СЧТ010=КОДСЧТ; ИСТСЧТ="З"; КБКСЧТ="З"; if Match(КОДСЧТ, "ЗАБ.??.???.??"): поСтруктуре=True; fi; else СЧТ010=""; ИСТСЧТ=""; КБКСЧТ=""; fi;
          fi;
          Work=False;
          if СЧТ010<>"":
            Work=True; -- Проводка соответствует отбору по счетам
            if vKBKвСвертке<>"": if not Match(КБКСЧТ, vKBKвСвертке): Work=False; fi; fi; -- Возможный отбор по КБК
          fi;
          -- *** Отбор по фильтру АНАЛИТИКИ ***
          if Work:
            xx=LengthOfArray(aAna);
            if not vБезАналитики:
              if Work and vИспАНА1: Work=ПроводкаПроходитОтборПоАналитике(xx, анаКОД1, False); fi;
              if Work and vИспАНА2: Work=ПроводкаПроходитОтборПоАналитике(xx, анаКОД2, False); fi;
              if Work and vИспАНА3: Work=ПроводкаПроходитОтборПоАналитике(xx, анаКОД3, False); fi;
              if Work and vИспАНАD: Work=ПроводкаПроходитОтборПоАналитике(xx,  отчАНА, True ); fi;
            fi;
          fi;
          -- *** Проводка отобрана ***
          if Work: -- если проводка соответствует условию отбора
            СЧТ010=СчетОтбора(СЧТ010, vРежимОтбора);
            SUM=0.00;
            if (aVal1="" or aVal1="РУБ") and aSum1<>0: SUM=aSum1;
            |  (aVal2="" or aVal2="РУБ") and aSum2<>0: SUM=aSum2;
            else SUM=0.00;
            fi;
            -- СЧТ010#ИСТСЧТ#КБКСЧТ
            Value=СформироватьUNIQЗначениеСортировки(Иерархия, СЧТ010, ИСТСЧТ, КБКСЧТ, поСтруктуре, vСубИтогиСчета, vРежимОтбора);
            num=SearchInArray(LST_UNQSTR, Value, True, 1);
            if num=-1:
              pp=InsertInArraySort(LST_UNQSTR, Value);
              InsertInArray(LST_СЧТОТЧ, pp, СЧТ010);
              InsertInArray(LST_ИСТСЧТ, pp, ИСТСЧТ);
              InsertInArray(LST_КБКСЧТ, pp, КБКСЧТ);
              InsertInArray(LST_СТРУКТ, pp, поСтруктуре);
              InsertInArray(LST_СЧТЗАБ, pp, if(ИСТСЧТ="З", True, False));
              InsertInArray(LST_НАЧОСТ, pp, 0.00);
              InsertInArray(LST_ДЕБОБО, pp, if(СЧДЕБ, SUM, 0.00));
              InsertInArray(LST_КРЕОБО, pp, if(СЧДЕБ, 0.00, SUM));
            else
              LST_ДЕБОБО[num]=LST_ДЕБОБО[num]+if(СЧДЕБ, SUM, 0.00);
              LST_КРЕОБО[num]=LST_КРЕОБО[num]+if(СЧДЕБ, 0.00, SUM);
            fi;
          fi;
        end; -- while
      Finally
         CloseTextJur;
      end; -- Try
      Try DeleteFile(ВременныйФайл); Except end;
   fi; -- len>0 (TujReport)
 Finally
   CloseProgress;
 end;
end;

Func ПоискДанных_ИщемДанные(НПОТЧ:Date; КПОТЧ:Date; ЕстьБюджет:Logical; ЕстьВнебюджет:Logical; ЕстьЗабаланс:Logical; СубИтогиСчета:Logical; РежимОтбора:Integer; РучнойВводСчета:Logical; ftrСЧТ:String; ftrКБК:String; Нет500:logical) :Logical;
var MaskACC, MaskKBK, MaskANA, KBKвСвертке, ИФД, Value, BindANA :String;
var ЕстьДанные, Режим, NOTuseANA, ANAкомпактно, Work, Выводить, f1, f2, f3, fд :Logical;
var len, len_Max, xx, ii, анаОТБ0, анаОТБ1, анаОТБ2, анаОТБ3 :Integer;
var SUM :Numeric;
 ЕстьДанные=False;
 Режим=AutoRefresh;
 ToggleAutoRefresh(False);
 Refresh(False);
 ShowProgress(0, "Подготовка данных...");
 Try
   ANAкомпактно=False; Work=False; MaskACC=""; MaskKBK=""; MaskANA=""; анаОТБ0=0; анаОТБ1=0; анаОТБ2=0; анаОТБ3=0;
   f1=False; f2=False; f3=False; fд=False; Выводить=False;
   -- ***
   -- Анализируем исходные условия
   -- ***
   MaskACC=ИтоговаяМаскаСчета(ftrСЧТ, РучнойВводСчета, ЕстьЗабаланс, "|");
   --
   KBKвСвертке="";
   if ftrКБК<>"":
     MaskKBK=ftrКБК+".?.???.??.???";
     len=Length(MaskKBK)+3; -- '('+')'+'&' = 3
     if (Length(MaskACC)+len)<250: if MaskACC="": MaskACC=MaskKBK; else MaskACC="("+MaskACC+")&"+MaskKBK; fi; else KBKвСвертке=MaskKBK; fi;
   fi;
   if MaskACC="": if ЕстьЗабаланс and flgНетЗАБНФА: MaskACC="*&~((ЗАБ.НФА.*/(ЗАБАЛАНС|00Z))|((ЗАБАЛАНС|00Z)/ЗАБ.НФА.*))"; else MaskACC="*"; fi; fi;
   --
   if     ЕстьБюджет and     ЕстьВнеБюджет: ИФД="?";
   |      ЕстьБюджет and not ЕстьВнеБюджет: ИФД="1";
   |  not ЕстьБюджет and     ЕстьВнеБюджет: ИФД="2";
   |  not ЕстьБюджет and not ЕстьВнеБюджет: ИФД="";
   fi;
   --
   if Trim(анаКОД1)="" and Trim(анаКОД2)="" and Trim(анаКОД3)="" and Trim(отчАНА)="":
     NOTuseANA=True;
   else
     NOTuseANA=False;
     xx=0; len=0; len_Max=250-Length(MaskACC); -- 250=255-5= -4['*{}] - 1[знак]
     Value=Trim(отчАНА);
     if Value<>"":
       xx=Length(Value)+2;
       if (len+xx)<=len_Max: len=len+xx; MaskANA=Объединить(MaskANA, "("+Value+")",  "&"); анаОТБ0=+1; else анаОТБ0=-1; fд=True; fi;
     fi;
     Value=Trim(анаКОД1);
     if Value<>"":
       xx=Length(Value)+3;
       if (len+xx)<=len_Max: len=len+xx; MaskANA=Объединить(MaskANA, "("+Value+")",  "&"); анаОТБ1=+1; else анаОТБ1=-1; f1=True; fi;
     fi;
     Value=Trim(анаКОД2);
     if Value<>"":
       xx=Length(Value)+3;
       if (len+xx)<=len_Max: len=len+xx; MaskANA=Объединить(MaskANA, "("+Value+")",  "&"); анаОТБ2=+1; else анаОТБ2=-1; f2=True; fi;
     fi;
     Value=Trim(анаКОД3);
     if Value<>"":
       xx=Length(Value)+3;
       if (len+xx)<=len_Max: len=len+xx; MaskANA=Объединить(MaskANA, "("+Value+")",  "&"); анаОТБ3=+1; else анаОТБ3=-1; f3=True; fi;
     fi;
   fi;
   if анаОТБ1<0 or анаОТБ2<0 or анаОТБ3<0 or анаОТБ0<0: ANAкомпактно=False; else ANAкомпактно=True; fi;
   if ANAкомпактно and KBKвСвертке="" and (Length(MaskACC)+Length(MaskANA)+5)<256: Work=True; else Work=False; fi;
   --
   TimeCreationRep="Время создания отчета: "+DateToString(ToDay)+" "+TimeToHMSstring(Time);
   СлужИнфоСЧТ="Отбор по счетам: "+MaskACC;
   СлужИнфоКБК=if(KBKвСвертке<>"", "Маска КБК: "+KBKвСвертке+". ", "")+if(ЕстьБюджет, "Отбор по бюджетным счетам. ", "")+if(ЕстьВнебюджет, "Отбор по внебюджетным счетам. ", "")+if(ЕстьЗабаланс, "Отбор по забалансовым счетам. ", "");
   СлужИнфоАНА="Отбор по признакам: "+ИтогоФильтрАналитики;
   -- ***
   -- Поиск данных
   -- ***
   ОчиститьLST;
   if Work: -- через функцию Report
     ИщемДанные_Report(MaskACC, MaskANA, ИФД, НПОТЧ, КПОТЧ, СубИтогиСчета, РежимОтбора, ЕстьЗабаланс);
   else           -- иначе через свертку
     BindANA=СправочникиСтруктурыПоМаскеСчетовПрогресс(MaskACC, НПОТЧ, КПОТЧ, True, True);
     if BindANA=" ": ^False; fi; -- если был Except
     -- Проверка на привязку счетов для "неуместившейся" аналитики
     if fд:
       len=ВсеСправочникиДопАналитикиПривязаны(отчАНА);
       if len>0:
       |  len=0: Message("Длинное условие отбора аналитики.^MИспользуется свертка...^M^MСправочник из строки 'Допол. признаки' не привязан к выбранному фильтру по счетам!", mtError); ^False;
       |  len<0: ^False;
       fi;
     fi;
     if f1:
       if not (SearchInArray(bindVOC, vocКОД1+".*", True, 1)>0):
         Message("Длинное условие отбора аналитики.^MИспользуется свертка...^M^MСправочник '"+vocКОД1+"' не привязан к выбранному фильтру по счетам!", mtError);
         ^False;
       fi;
     fi;
     if f2:
       if not (SearchInArray(bindVOC, vocКОД2+".*", True, 1)>0):
         Message("Длинное условие отбора аналитики.^MИспользуется свертка...^M^MСправочник '"+vocКОД2+"' не привязан к выбранному фильтру по счетам!", mtError);
         ^False;
       fi;
     fi;
     if f3:
       if not (SearchInArray(bindVOC, vocКОД3+".*", True, 1)>0):
         Message("Длинное условие отбора аналитики.^MИспользуется свертка...^M^MСправочник '"+vocКОД3+"' не привязан к выбранному фильтру по счетам!", mtError);
         ^False;
       fi;
     fi;
     --
     ИщемДанные_Свертка(MaskACC, MaskANA, ИФД, KBKвСвертке, НПОТЧ, КПОТЧ, СубИтогиСчета, РежимОтбора, NOTuseANA, ЕстьЗабаланс, f1, f2, f3, fд);
   fi;
   -- ***
   -- Обработка результата
   -- ***
   len=LengthOfArray(LST_UNQSTR);
   if len>0:
     ShowProgress(len, "Расчет остатков...");
     ОчиститьТаблицу;
     ValidateОтчетSection;
     xx=0;
     for ii=1 to len do
       ProgressPos(ii);
       SUM=Abs(Round(LST_НАЧОСТ[ii], 2))+Abs(Round(LST_ДЕБОБО[ii], 2))+Abs(Round(LST_КРЕОБО[ii], 2));
       if SUM<>0.00: Work=True; else Work=False; fi;
       if Work:
         if Нет500:
           if РежимОтбора<1: if Match(LST_СЧТОТЧ[ii], "5??")        : Work=False; fi;
           |  РежимОтбора=1: if Match(LST_СЧТОТЧ[ii], "5??.??")     : Work=False; fi;
           |  РежимОтбора>1: if Match(LST_СЧТОТЧ[ii], "5??.??.???") : Work=False; fi;
           fi;
         fi;
       fi;
       if Work:
         SUM=0.00;
         Выводить=True;
         Work=False;
         --
         SUM=LST_НАЧОСТ[ii]+LST_ДЕБОБО[ii]-LST_КРЕОБО[ii];
         -- Флаги фильра по сумме
         if Выводить:
           if flgОстНП:
             f1=False; if flgУч_М_НП: if LST_НАЧОСТ[ii]<0: f1=True; fi; fi;
             f2=False; if flgУч_Р_НП: if LST_НАЧОСТ[ii]=0: f2=True; fi; fi;
             f3=False; if flgУч_Б_НП: if LST_НАЧОСТ[ii]>0: f3=True; fi; fi;
             Выводить=(f1 or f2 or f3);
           fi;
         fi;
         if Выводить:
           if flgОбДеб:
             f1=False; if flgУч_М_ОД: if LST_ДЕБОБО[ii]<0: f1=True; fi; fi;
             f2=False; if flgУч_Р_ОД: if LST_ДЕБОБО[ii]=0: f2=True; fi; fi;
             f3=False; if flgУч_Б_ОД: if LST_ДЕБОБО[ii]>0: f3=True; fi; fi;
             Выводить=(f1 or f2 or f3);
           fi;
         fi;
         if Выводить:
           if flgОбКре:
             f1=False; if flgУч_М_ОК: if LST_КРЕОБО[ii]<0: f1=True; fi; fi;
             f2=False; if flgУч_Р_ОК: if LST_КРЕОБО[ii]=0: f2=True; fi; fi;
             f3=False; if flgУч_Б_ОК: if LST_КРЕОБО[ii]>0: f3=True; fi; fi;
             Выводить=(f1 or f2 or f3);
           fi;
         fi;
         if Выводить:
           if flgОстКП:
             f1=False; if flgУч_М_КП: if            SUM<0: f1=True; fi; fi;
             f2=False; if flgУч_Р_КП: if            SUM=0: f2=True; fi; fi;
             f3=False; if flgУч_Б_КП: if            SUM>0: f3=True; fi; fi;
             Выводить=(f1 or f2 or f3);
           fi;
         fi;
         --
         Work=Выводить;
       fi;
       if Work:
         xx=xx+1;
         тSRTFLD[xx]=LST_UNQSTR[ii];
         тСЧТОТЧ[xx]=LST_СЧТОТЧ[ii];
         тИСТСЧТ[xx]=if(LST_ИСТСЧТ[ii]<>"", LST_ИСТСЧТ[ii], "$$$");
         тКБКСЧТ[xx]=if(LST_КБКСЧТ[ii]<>"", LST_КБКСЧТ[ii], "$$$");
         тСТРУКТ[xx]=LST_СТРУКТ[ii];
         тСЧТЗАБ[xx]=LST_СЧТЗАБ[ii];
         if LST_СТРУКТ[ii]:
           Value=if(РежимОтбора>1, "???.??.*", "???.??");
           if Match(тСЧТОТЧ[xx], Value): тСЧТОТ5[xx]=SubStr(тСЧТОТЧ[xx], 1, 6); else тСЧТОТ5[xx]="$$$"; fi;
           Value=if(РежимОтбора>0, "???.*", "???");
           if Match(тСЧТОТЧ[xx], Value): тСЧТОТ3[xx]=SubStr(тСЧТОТЧ[xx], 1, 3); else тСЧТОТ3[xx]="$$$"; fi;
         else
           тСЧТОТ5[xx]="$$$";
           тСЧТОТ3[xx]="$$$";
         fi;
         тСУМ_НП[xx]=Round(LST_НАЧОСТ[ii], 2);
         тСУМ_ОД[xx]=Round(LST_ДЕБОБО[ii], 2);
         тСУМ_ОК[xx]=Round(LST_КРЕОБО[ii], 2);
         тСУМ_КП[xx]=Round(SUM, 2);
         тСУБИТГ[xx]="";
       fi; -- if Work
     od;
   else
     Message("По заданнам условиям отбора^Mданных для отбора не обнаружено!", mtInformation);
     ^False;
   fi;
   -- РЕЗУЛЬТАТ
   len=LengthOfArray(тSRTFLD);
   if len>0:
     ЕстьДанные=True;
   else
     Message("По заданнам условиям отбора^Mненулевых остатков не обнаружено!", mtInformation);
     ЕстьДанные=False;
   fi;
 Finally
   ToggleAutoRefresh(Режим);
   CloseProgress;
 end;
 ^ЕстьДанные;
end;

Func ВзятьИмяПараметраИерархическойГруппы(nameField:String; Iter:Integer) :String;
var кодValue, имяValue, tmp :String;
var num :Integer;
var Retry  :Logical;
--???.????.???????.???
--???.?.??.?????.??.????
--???.??.??.??.??.??.????
--12345678901234567890123
--         1         2
 if Trim(nameField)<>"" and Iter>0:
   Try кодValue=GetVariableS(nameField+"["+Str(Iter)+"]"); Except кодValue=""; end;
   имяValue="";
   if кодValue<>"":
     if кодValue<>"$$$":
    --   if тСЧТОТЧ[Iter]="ЗАБ.ДХ.180":
    --     Trace("");
    --   fi;
       if nameField="тСЧТОТЧ":
         if тСЧТОТЧ[Iter]<>"":
           if тСТРУКТ[Iter]:
             if тСЧТЗАБ[Iter]:
               if Match(тСЧТОТЧ[Iter], "???.??.Z??"): 
                 tmp="ЗАБ."+SubStr(тСЧТОТЧ[Iter], 9, 2)+".";
                 num=SearchInArray(AccTmpC, SubStr(тСЧТОТЧ[Iter], 1, 6), True, 1);
                 if num>0: имяValue=Trim(Name_S(tmp))+" ("+AccTmpT[num]+")"; else имяValue=Trim(Name_S(tmp)); fi;
               |  Match(тСЧТОТЧ[Iter], "10?.0?"):     
                 num=SearchInArray(AccTmpC, тСЧТОТЧ[Iter], True, 1);
                 if num>0: имяValue=AccTmpT[num]; fi;
               else имяValue=Trim(Name_S(тСЧТОТЧ[Iter]));
               fi;
             else
               num=SearchInArray(AccCode, тСЧТОТЧ[Iter], True, 1);
               if num>0: имяValue=AccStr8[num]; fi;
               if имяValue="": имяValue=Trim(Name_S(тСЧТОТЧ[Iter])); fi;
             fi;
           else
             if имяValue="": имяValue=Trim(Name_S(тСЧТОТЧ[Iter])+"."); fi;
             if имяValue="": имяValue=Trim(Name_S(тСЧТОТЧ[Iter])); fi;
           fi;
         fi;
       |  nameField="тСЧТОТ3":
         if тСЧТОТЧ[Iter]<>"":
           tmp=тСЧТОТЧ[Iter];
           if тСТРУКТ[Iter] and тСЧТЗАБ[Iter]:
             if Match(тСЧТОТЧ[Iter], "10?.??.Z??"): tmp=SubStr(тСЧТОТЧ[Iter], 1, 3)+".3"+SubStr(тСЧТОТЧ[Iter], 6, 1)+".XXX";
             |  Match(тСЧТОТЧ[Iter], "10?.0?"):     tmp=SubStr(тСЧТОТЧ[Iter], 1, 3)+".3"+SubStr(тСЧТОТЧ[Iter], 6, 1);
             fi;
           fi;
           num=SearchInArray(AccCode, tmp, True, 1);
           if num>0: имяValue=Trim(AccStr3[num]); fi;
           if имяValue="": имяValue=Trim(Name_S(тСЧТОТЧ[Iter])+"."); fi;
           if имяValue="": имяValue=Trim(Name_S(тСЧТОТЧ[Iter])); fi;
         fi;
       |  nameField="тСЧТОТ5":
         if тСЧТОТЧ[Iter]<>"":
           Retry=True;
           tmp=тСЧТОТЧ[Iter];
           if тСТРУКТ[Iter] and тСЧТЗАБ[Iter]: 
             Retry=False;
             num=0;
             if Match(тСЧТОТЧ[Iter], "10?.??.Z??") or Match(тСЧТОТЧ[Iter], "10?.0?"):
               tmp=SubStr(тСЧТОТЧ[Iter], 1, 6);
               num=SearchInArray(AccTmpC, tmp, True, 1);
               if num>0: имяValue=AccTmpT[num]; fi;
             fi;
             if num=0:
               tmp=SubStr(тСЧТОТЧ[Iter], 1, 3)+".3"+SubStr(тСЧТОТЧ[Iter], 6, 1)+".XXX";
               Retry=True;
             fi;
           fi;
           if Retry:
             num=SearchInArray(AccCode, tmp, True, 1);
             if num>0: имяValue=Trim(AccStr5[num]); fi;
             if имяValue="": имяValue=Trim(Name_S(тСЧТОТЧ[Iter])+"."); fi;
             if имяValue="": имяValue=Trim(Name_S(тСЧТОТЧ[Iter])); fi;
           fi;
         fi;
       |  nameField="тКБКСЧТ":
         if Match(кодValue, "???.????.???????.???"):
           имяValue=Trim(Name_S(SubStr(кодValue, 1, 9)))+" > "+Trim(Name_S(SubStr(кодValue, 1, 17)))+" > "+Trim(Name_S(кодValue+"."));
         |  Match(кодValue, "???.?.??.?????.??.????"):
           имяValue=Trim(Name_S(SubStr(кодValue, 1, 6)))+" > "+Trim(Name_S(SubStr(кодValue, 1, 09)))+" > "+Trim(Name_S(SubStr(кодValue, 1, 15)));
         |  Match(кодValue, "???.??.??.??.??.??.????"):
           имяValue=Trim(Name_S(SubStr(кодValue, 1, 7)))+" > "+Trim(Name_S(SubStr(кодValue, 1, 10)))+" > "+Trim(Name_S(SubStr(кодValue, 1, 13)));
         else имяValue=ВзятьКБК(кодValue);
         fi;
       |  nameField="тИСТСЧТ":
         имяValue=тИСТСЧТ[Iter];
         if имяValue<>"": имяValue=ВзятьИсточникСредствПолный(имяValue); fi;
       fi;
     |  кодValue="$$$": ^"Без группировки (прочее)";
     fi;
   fi;
   if имяValue<>"": ^(кодValue+Chr(13)+имяValue); else ^кодValue; fi;
 fi;
 ^"";
end;

Func КоличествоУровнейИерархии(vИерархия:String; vСубИтогиСчета:Logical; vРежимОтбора:Integer) :Integer;
var Value :String;
var max_kol :Integer;
 max_kol=1; -- СЧТ должен быть всегда
 Value=Up(vИерархия);
 if Pos("КБК", Value)>0: max_kol=max_kol+1; fi;
 if Pos("ИСТ", Value)>0: max_kol=max_kol+1; fi;
 if vСубИтогиСчета:
   if vРежимОтбора=1: max_kol=max_kol+1;
   |  vРежимОтбора>1: max_kol=max_kol+2;
   fi;
 fi;
 ^(max_kol-1);
end;

Func ЗаписатьКорректныйКод(srcVAL:String; srcLVL:String) :String;
 if srcLVL="тКБКСЧТ": ^ВзятьКБК(srcVAL);
 |  srcLVL="тИСТСЧТ": ^ВзятьИсточникСредствКороткий(srcVAL);
 fi;
 ^srcVAL;
end;

Func GetACC_СЧТ(Headers:Logical; vСЧТ:String; vИСТ:String; vКБК:String; AccZAB:Logical; изСтруктуры:Logical; noZABНФА:Logical; use00:Logical; Mode:String; нет500:Logical; ЕстьЗабаланс:Logical) :String;
var flgUse :Logical;
var Res, tmp :String;
 Res="";
 --
 flgUse=False;
 if vКБК<>"":
   if Match(vКБК, "???.??.??.??.??.??.????"): flgUse=True;
   |  Match(vКБК,  "???.?.??.?????.??.????"): flgUse=True;
   |  Match(vКБК,    "???.????.???????.???"): flgUse=True;
   fi;
 fi;
 if not flgUse: vКБК="*"; fi;
 --
 if vИСТ<>"": if Int(vИСТ)>0 and Int(vИСТ)<8: flgUse=True; else flgUse=False; fi; else flgUse=False; fi;
 if not flgUse: 
   if flgБюджет and not flgвнБюдж: vИСТ="1";
   |  not flgБюджет and flgвнБюдж: vИСТ="2";
   else vИСТ="?";
   fi;
 fi;
 --
 if Match(vСЧТ, "???.??.XXX"): vСЧТ=SubStr(vСЧТ, 1, 6)+".???"; fi;
 --
 if Headers:
   if vСЧТ<>"яъ>":
     Res=vКБК+"."+vИСТ+"."+vСЧТ+Mode;
     if ЕстьЗабаланс:
       if Match(vСЧТ+Mode, "101.??.???"): tmp=SubStr(vСЧТ, 5, 2); if tmp="??": Res="*.101.*"; else Res="*.101."+tmp+"*"; fi;
       |  Match(vСЧТ+Mode, "105.??.???"): tmp=SubStr(vСЧТ, 5, 2); if tmp="??": Res="*.105.*"; else Res="*.105."+tmp+"*"; fi;
       fi;
     fi;
   else
     Res="*&~(???.??.??.??.??.??.????.?.???.??.???|???.?.??.?????.??.????.?.???.??.???|???.????.???????.???.?.???.??.???|ЗАБ.??.???.??"+if(noZABНФА, "|ЗАБ.НФА.*", "")+if(Use00, "", "|00|00Z")+if(нет500, "|*.5??.??.???", "")+")";
   fi;
 else
   if AccZAB:
     if изСтруктуры:
       --ЗАБ.00.101.04
       if Match(vСЧТ, "???.??.Z??") :  Res="ЗАБ."+SubStr(vСЧТ, 9, 2)+"."+SubStr(vСЧТ, 1, 6);
       |  Match(vСЧТ, "???.??")     :  Res="ЗАБ.??."+vСЧТ;
       |  Match(vСЧТ, "???")        :  Res="ЗАБ.??."+vСЧТ+".??";
       fi;
     else
       Res=vСЧТ;
     fi;
   else
     if изСтруктуры: 
       Res=vКБК+"."+vИСТ+"."+vСЧТ+Mode;
     else
       Res=vСЧТ;
     fi;
   fi;
 fi;
 ^Res;
end;

Func GetACC_REP(Headers:Logical; AccZAB:Logical) :String;
 if Headers: ^"ВСЕ"; else if AccZAB: ^"ЗАБ"; else ^"БАЛ"; fi; fi;
end;

Func ФильтрАналитикиДляДетализации :String;
var xx, len, len_Max :Integer;
var Res, Value :String;
 if Trim(анаКОД1)="" and Trim(анаКОД2)="" and Trim(анаКОД3)="" and Trim(отчАНА)="": ^""; fi;
 xx=0; len=0; len_Max=250; -- 250 = 255 - 4['*{}] -1[*]
 Res="";
 Value=Trim(отчАНА);
 if Value<>"":
   xx=Length(Value)+2;
   if (len+xx)<=len_Max: len=len+xx; Res=Объединить(Res, "("+Value+")",  "&"); else ^" "; fi;
 fi;
 Value=Trim(анаКОД1);
 if Value<>"":
   xx=Length(Value)+3;
   if (len+xx)<=len_Max: len=len+xx; Res=Объединить(Res, "("+Value+")",  "&"); else ^" "; fi;
 fi;
 Value=Trim(анаКОД2);
 if Value<>"":
   xx=Length(Value)+3;
   if (len+xx)<=len_Max: len=len+xx; Res=Объединить(Res, "("+Value+")",  "&"); else ^" "; fi;
 fi;
 Value=Trim(анаКОД3);
 if Value<>"":
   xx=Length(Value)+3;
   if (len+xx)<=len_Max: len=len+xx; Res=Объединить(Res, "("+Value+")",  "&"); else ^" "; fi;
 fi;
 ^Res;
end;

Proc ДетализацияПроводокОтчета(IterTab:Integer; strИРХ:String; vСубИтогиСчета:Logical; vДетализация:Integer; noZABНФА:Logical; use00:Logical; нет500:Logical; ЕстьЗабаланс:Logical);
var xx, num, ii, jj, max_kol, ww, numСЧТ, numСЧ3, numСЧ5, numИСТ, numКБК :Integer;
var Путь, Знак, RepИмя, RepТип, Value, MaskACC, MaskANA, valУНИК, valСЧТ, valСЧ3, valСЧ5, valИСТ, valКБК, tmp :String;
var Headers, Work, AccZAB, изСтруктуры, НеСчета :Logical;
var repДН, repДК :Date;
var Sum :Numeric;
 Work=False;
 Путь=PlanVar("ОБЩИЕ")+"\ОТЧЕТЫ\Отч_набор_001.lst";
 if not ExistFile(Путь): Message("Файл с отчетами отсутствует!", mtError); Exit; fi;
 Refresh(False);
 MaskANA=ФильтрАналитикиДляДетализации;
 if MaskANA=" ": 
   num=EnqOkCancel("Слишком большое условие отбора аналитики.^MДетализировать без учета аналитики?", mtConfirmation);
   if num=cmOK: MaskANA=""; else Exit; fi;
 fi;
 if MaskANA<>"":
   Try Sum=Saldo("*{"+MaskANA+"}", 1.1.100); Except Message("Ошибка в условии отбора аналитики!", mtError); Exit; end;
 fi;
 if Trim(strИРХ)<>"" and IterTab>0:
   num=WordsCount(strИРХ, " ");
   max_kol=0;
   if vСубИтогиСчета:
     if vДетализация=1: max_kol=max_kol+1;
     |  vДетализация>1: max_kol=max_kol+2;
     fi;
   fi;
   tmp=SubStr(тSRTFLD[IterTab], Length(тSRTFLD[IterTab]), 1);
   if Ascii(tmp)=169: valУНИК=SubStr(тSRTFLD[IterTab], 1, Length(тSRTFLD[IterTab])-1); else valУНИК=тSRTFLD[IterTab]; fi;
   if num>0 and (num+max_kol)=WordsCount(valУНИК, "#"): Work=True; fi;
 fi;
 if Work:
   Work=False;
   ClearVariable(Buf);
   RepТип="";
   Buf[01]="01.--Детализация по проводкам...";
   Buf[02]="01.01--...по проводкам на  начало периода";
   Buf[03]="01.02--...по проводкам оборота по  дебету";
   Buf[04]="01.03--...по проводкам оборота по кредиту";
   Buf[05]="01.04--...по проводкам на  конец  периода";
   Buf[06]="02.--Детализация по времени (дни)...";
   Buf[07]="02.01--...по времени на  начало периода";
   Buf[08]="02.02--...по времени оборота по  дебету";
   Buf[09]="02.03--...по времени оборота по кредиту";
   Buf[10]="02.04--...по времени на  конец  периода";
   xx=0;
   xx=AlternateTree("Выберите тип детализации...", Buf, -1, 1, 12, ".", "код", "описание отчета", -1, False);
   if xx<1: Exit; fi;
   if xx=3 or xx=8: Знак="+";
   |  xx=4 or xx=9: Знак="-";
   else Знак="";
   fi;
   if xx<6: RepТип="По_проводкам_"; else RepТип="По_дням_"; fi;
   Work=True;
 fi;
 if Work:
   ClearVariable(Buf);
   Buf[1]=""; Buf[2]=""; Buf[3]=""; Buf[4]=""; Buf[5]="";
   max_kol=0;
   jj=0;
   for ii=1 to num do
     Value=ExtractWord(ii, strИРХ, " ");
     if Value="СЧТ":
       ww=1;
       max_kol=max_kol+1;
       if vСубИтогиСчета:
         if vДетализация=1:
           max_kol=max_kol+1;
           ww=ww+1;
           jj=jj+1; Try PutVariableS("Buf["+Str(jj)+"]", "тСЧТОТ3"); Except end;
           jj=jj+1; Try PutVariableS("Buf["+Str(jj)+"]", "тСЧТОТЧ"); Except end;
         |  vДетализация>1:
           max_kol=max_kol+2;
           ww=ww+2;
           jj=jj+1; Try PutVariableS("Buf["+Str(jj)+"]", "тСЧТОТ3"); Except end;
           jj=jj+1; Try PutVariableS("Buf["+Str(jj)+"]", "тСЧТОТ5"); Except end;
           jj=jj+1; Try PutVariableS("Buf["+Str(jj)+"]", "тСЧТОТЧ"); Except end;
         else
           jj=jj+1; Try PutVariableS("Buf["+Str(jj)+"]", "тСЧТОТЧ"); Except end;
         fi;
       else
         jj=jj+1; Try PutVariableS("Buf["+Str(jj)+"]", "тСЧТОТЧ"); Except end;
       fi;
     |  Value="ИСТ":
       max_kol=max_kol+1;
       jj=jj+1; Try PutVariableS("Buf["+Str(jj)+"]", "тИСТСЧТ"); Except end;
     |  Value="КБК":
       max_kol=max_kol+1;
       jj=jj+1; Try PutVariableS("Buf["+Str(jj)+"]", "тКБКСЧТ"); Except end;
     fi;
   od;
   jj=0;
   for ii=1 to 5 do if Buf[ii]<>"": jj=jj+1; else Break; fi; od;
   if max_kol=jj: Work=True; else Work=False; fi;
   numСЧТ=0;  numИСТ=0;  numКБК=0;  numСЧ3=0;  numСЧ5=0;
   valСЧТ=""; valИСТ=""; valКБК=""; valСЧ3=""; valСЧ5="";
   if Work:
     Headers     = if(Trim(тСУБИТГ[IterTab])<>"", True, False);
     AccZAB      = тСЧТЗАБ[IterTab];
     изСтруктуры = тСТРУКТ[IterTab];
     numСЧТ=SearchInArray(Buf, "тСЧТОТЧ", False, 1);
     numСЧ3=SearchInArray(Buf, "тСЧТОТ3", False, 1);
     numСЧ5=SearchInArray(Buf, "тСЧТОТ5", False, 1);
     numИСТ=SearchInArray(Buf, "тИСТСЧТ", False, 1);
     numКБК=SearchInArray(Buf, "тКБКСЧТ", False, 1);
     if numСЧТ>0: valСЧТ=Trim(ExtractWord(numСЧТ, valУНИК, "#")); fi;
     if numСЧ3>0: valСЧ3=Trim(ExtractWord(numСЧ3, valУНИК, "#")); fi;
     if numСЧ5>0: valСЧ5=Trim(ExtractWord(numСЧ5, valУНИК, "#")); fi;
     if numИСТ>0: valИСТ=Trim(ExtractWord(numИСТ, valУНИК, "#")); fi;
     if numКБК>0: valКБК=Trim(ExtractWord(numКБК, valУНИК, "#")); fi;
     --
     Value=""; RepИмя="";
     НеСчета=False;
     if vСубИтогиСчета:
       if vДетализация=1:
         if valСЧ3<>"" and valСЧТ<>"": Value=GetACC_СЧТ(Headers, valСЧТ, valИСТ, valКБК, AccZAB, изСтруктуры, noZABНФА, use00,    ".???", нет500, ЕстьЗабаланс); RepИмя=GetACC_REP(Headers, AccZAB);
         |  valСЧ3<>"" and valСЧТ ="": Value=GetACC_СЧТ(Headers, valСЧ3, valИСТ, valКБК, AccZAB, изСтруктуры, noZABНФА, use00, ".??.???", нет500, ЕстьЗабаланс); RepИмя=GetACC_REP(Headers, AccZAB);
         |  valСЧ3 ="" and valСЧТ ="": НеСчета=True;
         fi;
       |  vДетализация>1:
         if valСЧ3<>"" and valСЧ5<>"" and valСЧТ<>"": Value=GetACC_СЧТ(Headers, valСЧТ, valИСТ, valКБК, AccZAB, изСтруктуры, noZABНФА, use00,        "", нет500, ЕстьЗабаланс); RepИмя=GetACC_REP(Headers, AccZAB);
         |  valСЧ3<>"" and valСЧ5<>"" and valСЧТ ="": Value=GetACC_СЧТ(Headers, valСЧ5, valИСТ, valКБК, AccZAB, изСтруктуры, noZABНФА, use00,    ".???", нет500, ЕстьЗабаланс); RepИмя=GetACC_REP(Headers, AccZAB);
         |  valСЧ3<>"" and valСЧ5 ="" and valСЧТ ="": Value=GetACC_СЧТ(Headers, valСЧ3, valИСТ, valКБК, AccZAB, изСтруктуры, noZABНФА, use00, ".??.???", нет500, ЕстьЗабаланс); RepИмя=GetACC_REP(Headers, AccZAB);
         |  valСЧ3 ="" and valСЧ5 ="" and valСЧТ ="": НеСчета=True;
         fi;
       else
         if valСЧТ<>"": Value=GetACC_СЧТ(Headers, valСЧТ, valИСТ, valКБК, AccZAB, изСтруктуры, noZABНФА, use00, ".??.???", нет500, ЕстьЗабаланс); RepИмя=GetACC_REP(Headers, AccZAB); else НеСчета=True; fi;
       fi;
     else
       if valСЧТ<>"": 
         if vДетализация<1: tmp=".??.???";
         |  vДетализация=1: tmp=".???";
         |  vДетализация>1: tmp="";
         fi;
         Value=GetACC_СЧТ(Headers, valСЧТ, valИСТ, valКБК, AccZAB, изСтруктуры, noZABНФА, use00, tmp, нет500, ЕстьЗабаланс); RepИмя=GetACC_REP(Headers, AccZAB);
       else
          НеСчета=True;
       fi;
     fi;
     if НеСчета:
        if valИСТ<>"" and valКБК ="":
          if valИСТ="1": if ЕстьЗабаланс: RepИмя="ВСЕ"; else RepИмя="БАЛ"; fi; Value="(???.??.??.??.??.??.????."+valИСТ+".???.??.???|???.?.??.?????.??.????."+valИСТ+".???.??.???|???.????.???????.???."+valИСТ+".???.??.???)"+if(нет500, "&~(*.5??.??.???)", "");
          |  valИСТ="2": if ЕстьЗабаланс: RepИмя="ВСЕ"; else RepИмя="БАЛ"; fi; Value="(???.??.??.??.??.??.????."+valИСТ+".???.??.???|???.?.??.?????.??.????."+valИСТ+".???.??.???|???.????.???????.???."+valИСТ+".???.??.???)"+if(нет500, "&~(*.5??.??.???)", "");
          |  valИСТ="3": if ЕстьЗабаланс: RepИмя="ВСЕ"; else RepИмя="БАЛ"; fi; Value="(???.??.??.??.??.??.????."+valИСТ+".???.??.???|???.?.??.?????.??.????."+valИСТ+".???.??.???|???.????.???????.???."+valИСТ+".???.??.???)"+if(нет500, "&~(*.5??.??.???)", "");
          |  valИСТ="4": if ЕстьЗабаланс: RepИмя="ВСЕ"; else RepИмя="БАЛ"; fi; Value="(???.??.??.??.??.??.????."+valИСТ+".???.??.???|???.?.??.?????.??.????."+valИСТ+".???.??.???|???.????.???????.???."+valИСТ+".???.??.???)"+if(нет500, "&~(*.5??.??.???)", "");
          |  valИСТ="З": RepИмя="ЗАБ"; Value="*"+if(noZABНФА, "&~(ЗАБ.НФА.*", "")+if(use00, "", if(noZABНФА, "|", "&~(")+"00Z")+if(noZABНФА or not use00, ")", "");
          |  valИСТ="В": RepИмя="БАЛ"; Value="*&~(???.??.??.??.??.??.????.?.???.??.???|???.?.??.?????.??.????.?.???.??.???|???.????.???????.???.?.???.??.???"+if(use00, "", "|00")+")";
          |  valИСТ="?": RepИмя="ВСЕ"; Value="*"+if(noZABНФА, "&~(ЗАБ.НФА.*", "")+if(use00, "", if(noZABНФА, "|", "&~(")+"00|00Z")+if(нет500, if(noZABНФА or not use00, "|", "&~(")+"*.5??.??.???", "")+if(noZABНФА or not use00 or нет500, ")", "");
          fi;
        |  valИСТ ="" and valКБК<>"":
          if Match(valКБК, "???.??.??.??.??.??.????"): if ЕстьЗабаланс: RepИмя="ВСЕ"; else RepИмя="БАЛ"; fi; Value=valКБК+".?.???.??.???"+if(нет500, "&~(*.5??.??.???)", "");
          |  Match(valКБК,  "???.?.??.?????.??.????"): if ЕстьЗабаланс: RepИмя="ВСЕ"; else RepИмя="БАЛ"; fi; Value=valКБК+".?.???.??.???"+if(нет500, "&~(*.5??.??.???)", "");
          |  Match(valКБК,    "???.????.???????.???"): if ЕстьЗабаланс: RepИмя="ВСЕ"; else RepИмя="БАЛ"; fi; Value=valКБК+".?.???.??.???"+if(нет500, "&~(*.5??.??.???)", "");
          else
            if valКБК="З": RepИмя="ЗАБ"; Value="*"+if(noZABНФА, "&~(ЗАБ.НФА.*", "")+if(use00, "", if(noZABНФА, "|", "&~(")+"00Z")+if(noZABНФА or not use00, ")", "");
            |  valКБК="В": RepИмя="БАЛ"; Value="*&~(???.??.??.??.??.??.????.?.???.??.???|???.?.??.?????.??.????.?.???.??.???|???.????.???????.???.?.???.??.???"+if(use00, "", "|00")+")";
            fi;
          fi;
        |  valИСТ<>"" and valКБК<>"":
          if valИСТ="1" or valИСТ="2" or valИСТ="3" or valИСТ="4": tmp=valИСТ; else tmp="?"; fi;
          if Match(valКБК, "???.??.??.??.??.??.????"): if ЕстьЗабаланс: RepИмя="ВСЕ"; else RepИмя="БАЛ"; fi; Value=valКБК+"."+tmp+".???.??.???"+if(нет500, "&~(*.5??.??.???)", "");
          |  Match(valКБК,  "???.?.??.?????.??.????"): if ЕстьЗабаланс: RepИмя="ВСЕ"; else RepИмя="БАЛ"; fi; Value=valКБК+"."+tmp+".???.??.???"+if(нет500, "&~(*.5??.??.???)", "");
          |  Match(valКБК,    "???.????.???????.???"): if ЕстьЗабаланс: RepИмя="ВСЕ"; else RepИмя="БАЛ"; fi; Value=valКБК+"."+tmp+".???.??.???"+if(нет500, "&~(*.5??.??.???)", "");
          else
            if valИСТ="З" and valКБК="З": RepИмя="ЗАБ"; Value="*"+if(noZABНФА, "&~(ЗАБ.НФА.*", "")+if(use00, "", if(noZABНФА, "|", "&~(")+"00Z")+if(noZABНФА or not use00, ")", "");
            |  valИСТ="В" and valКБК="В": RepИмя="БАЛ"; Value="*&~(???.??.??.??.??.??.????.?.???.??.???|???.?.??.?????.??.????.?.???.??.???|???.????.???????.???.?.???.??.???"+if(use00, "", "|00")+")";
            fi;
          fi;
        fi;
     fi;
     if Value<>"" and RepИмя<>"" and RepТип<>"": Work=True; else Work=False; fi;
     if Work:
       MaskACC=if(Знак<>"", Знак+"("+Value+")", Value);
       Try Sum=Turn(MaskACC, 1.1.100, 1.1.100); Except Message("Ошибка в условии отбора счетов!", mtError); Exit; end;
       if (Length(MaskACC)+Length(MaskANA)+7)>255: Message("Слишком сложное условие для детализации!", mtError); Exit; fi;
       --
       if xx>0:
         if xx=2 or xx=7: repДН=1.1.100; repДК=DataНП; else repДН=DataНП;  repДК=DataКП; fi;
         Try
           Report(Путь+"|"+RepТип+RepИмя, repДН, repДК, MaskACC, MaskANA);
         Except
           Message("Ошибка при создании файла-отчета детализации!", mtError);
           Exit;
         end;
       else
         Message("Ошибка детализации!", mtError);
         Exit;
       fi;
     fi;
   fi;
 fi;
 if not Work:
   Message("Ошибка при считывании условий детализации!", mtError);
   Exit;
 fi;
end;

Func ПодсчетВставкаПромежуточныхИтогов(vИерархия:String; СубИтогиСчета:Logical; РежимОтбора:Integer; Подсказки:Logical; vНет500ОТЧ:Logical) :Logical;
var valDATA, valFLD1, valFLD2, valFLD3, valFLD4, namFLD1, namFLD2, namFLD3, namFLD4, valHDR1, valHDR2, valHDR3, valHDR4 :String;
var fldDATA, fldLVL1, fldLVL2, fldLVL3, fldLVL4, fldLVL5, Value :String;
var len, num, ii, jj, kk, xx, max_kol, hdr_kol :Integer;
var Work :Logical;
 len=LengthOfArray(тSRTFLD);
 if len>0:
   if Подсказки: 
     FillСчета(РежимОтбора, vНет500ОТЧ); 
     ClearVariable(AccTmpC);
     ClearVariable(AccTmpT);
     AccTmpC[01]="101.01"; AccTmpT[01]="Забалансовые НФА. Жилые помещения.";
     AccTmpC[02]="101.02"; AccTmpT[02]="Забалансовые НФА. Нежилые помещения.";
     AccTmpC[03]="101.03"; AccTmpT[03]="Забалансовые НФА. Сооружения.";
     AccTmpC[04]="101.04"; AccTmpT[04]="Забалансовые НФА. Машины и оборудование.";
     AccTmpC[05]="101.05"; AccTmpT[05]="Забалансовые НФА. Транспортные средства.";
     AccTmpC[06]="101.06"; AccTmpT[06]="Забалансовые НФА. Производственный и хозяйственный инвентарь.";
     AccTmpC[07]="101.07"; AccTmpT[07]="Забалансовые НФА. Библиотечный фонд.";
     AccTmpC[08]="101.08"; AccTmpT[08]="Забалансовые НФА. Прочие основные средства.";
     AccTmpC[09]="102.00"; AccTmpT[09]="Забалансовые НФА. Нематериальные активы.";
     AccTmpC[10]="105.01"; AccTmpT[10]="Забалансовые НФА. Медикаменты и перевязочные средства.";
     AccTmpC[11]="105.02"; AccTmpT[11]="Забалансовые НФА. Продукты питания.";
     AccTmpC[12]="105.03"; AccTmpT[12]="Забалансовые НФА. Горюче-смазочные материалы.";
     AccTmpC[13]="105.04"; AccTmpT[13]="Забалансовые НФА. Строительные материалы.";
     AccTmpC[14]="105.05"; AccTmpT[14]="Забалансовые НФА. Мягкий инвентарь.";
     AccTmpC[15]="105.06"; AccTmpT[15]="Забалансовые НФА. Прочие материальные запасы.";
     AccTmpC[16]="105.07"; AccTmpT[16]="Забалансовые НФА. Готовая продукция.";
     AccTmpC[17]="105.08"; AccTmpT[17]="Забалансовые НФА. Товары.";
   fi;
   ShowProgress(len, "Промежуточные итоги; подготовка...");
   Try
     fldDATA=""; fldLVL1=""; fldLVL2=""; fldLVL3=""; fldLVL4=""; fldLVL5="";
     if Trim(vИерархия)<>"":
       num=WordsCount(vИерархия, " ");
       if num>0:
         ClearVariable(Buf);
         max_kol=0;
         Buf[1]=""; Buf[2]=""; Buf[3]=""; Buf[4]=""; Buf[5]="";
         jj=0;
         for ii=1 to num do
           Value=ExtractWord(ii, vИерархия, " ");
           if Value="СЧТ":
             max_kol=max_kol+1;
             if СубИтогиСчета:
               if РежимОтбора=1:
                 max_kol=max_kol+1;
                 jj=jj+1; Try PutVariableS("Buf["+Str(jj)+"]", "тСЧТОТ3"); Except end;
                 jj=jj+1; Try PutVariableS("Buf["+Str(jj)+"]", "тСЧТОТЧ"); Except end;
               |  РежимОтбора>1:
                 max_kol=max_kol+2;
                 jj=jj+1; Try PutVariableS("Buf["+Str(jj)+"]", "тСЧТОТ3"); Except end;
                 jj=jj+1; Try PutVariableS("Buf["+Str(jj)+"]", "тСЧТОТ5"); Except end;
                 jj=jj+1; Try PutVariableS("Buf["+Str(jj)+"]", "тСЧТОТЧ"); Except end;
               else
                 jj=jj+1; Try PutVariableS("Buf["+Str(jj)+"]", "тСЧТОТЧ"); Except end;
               fi;
             else
               jj=jj+1; Try PutVariableS("Buf["+Str(jj)+"]", "тСЧТОТЧ"); Except end;
             fi;
           |  Value="ИСТ":
             max_kol=max_kol+1;
             jj=jj+1; Try PutVariableS("Buf["+Str(jj)+"]", "тИСТСЧТ"); Except end;
           |  Value="КБК":
             max_kol=max_kol+1;
             jj=jj+1; Try PutVariableS("Buf["+Str(jj)+"]", "тКБКСЧТ"); Except end;
           fi;
         od;
         fldLVL1=Buf[1]; fldLVL2=Buf[2]; fldLVL3=Buf[3]; fldLVL4=Buf[4]; fldLVL5=Buf[5];
         --
         Work=True;
         fldDATA=fldLVL5;
         if fldDATA="":
           fldDATA=fldLVL4;
           if fldDATA="":
             fldDATA=fldLVL3;
             if fldDATA="":
               fldDATA=fldLVL2;
               if fldDATA="":
                 fldDATA=fldLVL1;
                 if fldDATA="":
                   Work=False;
                 fi;
               fi;
             fi;
           fi;
         fi;
         if Work:
           Work=False;
           if max_kol>0 and max_kol<6:
             if max_kol=5: Value=fldLVL5;
             |  max_kol=4: Value=fldLVL4;
             |  max_kol=3: Value=fldLVL3;
             |  max_kol=2: Value=fldLVL2;
             |  max_kol=1: Value=fldLVL1;
             fi;
             if Up(fldDATA)=Up(Value): Work=True; fi;
           fi;
         fi;
         if not Work:
           Message("Ошибка в определении уровней группировки...", mtError);
           ^False;
         fi;
       fi;
     fi;
     -- Сразу узнали строку итогов таблицы
     итгНП=SumOfArray(тСУМ_НП, Позиции);
     итгОД=SumOfArray(тСУМ_ОД, Позиции);
     итгОК=SumOfArray(тСУМ_ОК, Позиции);
     итгКП=SumOfArray(тСУМ_КП, Позиции);
     --
     B_итгНП=0.00; Z_итгНП=0.00; V_итгНП=0.00;
     B_итгОД=0.00; Z_итгОД=0.00; V_итгОД=0.00;
     B_итгОК=0.00; Z_итгОК=0.00; V_итгОК=0.00;
     B_итгКП=0.00; Z_итгКП=0.00; V_итгКП=0.00;
     hdr_kol=max_kol-1;
     kk=1;
     ShowProgress(len*hdr_kol, "Подсчет, вставка промежуточных итогов...");
     while тСЧТОТЧ[kk]<>"" do
       if тСТРУКТ[kk]:
         if тСЧТЗАБ[kk]:
           Z_итгНП=Z_итгНП+тСУМ_НП[kk];
           Z_итгОД=Z_итгОД+тСУМ_ОД[kk];
           Z_итгОК=Z_итгОК+тСУМ_ОК[kk];
           Z_итгКП=Z_итгКП+тСУМ_КП[kk];
         else
           B_итгНП=B_итгНП+тСУМ_НП[kk];
           B_итгОД=B_итгОД+тСУМ_ОД[kk];
           B_итгОК=B_итгОК+тСУМ_ОК[kk];
           B_итгКП=B_итгКП+тСУМ_КП[kk];
         fi;
       else
         if тСЧТЗАБ[kk]:
           Z_итгНП=Z_итгНП+тСУМ_НП[kk];
           Z_итгОД=Z_итгОД+тСУМ_ОД[kk];
           Z_итгОК=Z_итгОК+тСУМ_ОК[kk];
           Z_итгКП=Z_итгКП+тСУМ_КП[kk];
         else
           V_итгНП=V_итгНП+тСУМ_НП[kk];
           V_итгОД=V_итгОД+тСУМ_ОД[kk];
           V_итгОК=V_итгОК+тСУМ_ОК[kk];
           V_итгКП=V_итгКП+тСУМ_КП[kk];
         fi;
       fi;
       valFLD1=""; valFLD2=""; valFLD3=""; valFLD4=""; valDATA="";
       valHDR1=""; valHDR2=""; valHDR3=""; valHDR4="";
       namFLD1=""; namFLD2=""; namFLD3=""; namFLD4="";
       if fldLVL1<>"": Try valFLD1=Trim(GetVariableS(fldLVL1+"["+Str(kk)+"]")); Except end; fi;
       if fldLVL2<>"": Try valFLD2=Trim(GetVariableS(fldLVL2+"["+Str(kk)+"]")); Except end; fi;
       if fldLVL3<>"": Try valFLD3=Trim(GetVariableS(fldLVL3+"["+Str(kk)+"]")); Except end; fi;
       if fldLVL4<>"": Try valFLD4=Trim(GetVariableS(fldLVL4+"["+Str(kk)+"]")); Except end; fi;
       if fldDATA<>"": Try valDATA=Trim(GetVariableS(fldDATA+"["+Str(kk)+"]")); Except end; fi;
       if valFLD1="" or valFLD1="$$$": valFLD1="яъ>"; fi;
       if valFLD2="" or valFLD2="$$$": valFLD2="яъ>"; fi;
       if valFLD3="" or valFLD3="$$$": valFLD3="яъ>"; fi;
       if valFLD4="" or valFLD4="$$$": valFLD4="яъ>"; fi;
       if valDATA="" or valDATA="$$$": valDATA="яъ>"; fi;
       if hdr_kol>0: -- если, кроме данных, есть субитоги
         --Формирование строки узла иерархии { Элемент1|Элемент2|Элемент3|Элемент4 }
         if hdr_kol>0 and valFLD1<>"":                                                 valHDR1=valFLD1+                                    RepStr("# ", hdr_kol-0)+Chr(169); else valHDR1=""; fi;
         if hdr_kol>1 and valFLD1<>"" and valFLD2<>"":                                 valHDR2=valFLD1+"#"+valFLD2+                        RepStr("# ", hdr_kol-1)+Chr(169); else valHDR2=""; fi;
         if hdr_kol>2 and valFLD1<>"" and valFLD2<>"" and valFLD3<>"":                 valHDR3=valFLD1+"#"+valFLD2+"#"+valFLD3+            RepStr("# ", hdr_kol-2)+Chr(169); else valHDR3=""; fi;
         if hdr_kol>3 and valFLD1<>"" and valFLD2<>"" and valFLD3<>"" and valFLD4<>"": valHDR4=valFLD1+"#"+valFLD2+"#"+valFLD3+"#"+valFLD4+RepStr("# ", hdr_kol-3)+Chr(169); else valHDR4=""; fi;
       fi;
       -- Заполнение таблицы и ее расшифровка
       тVALDAT[kk]=ЗаписатьКорректныйКод(valDATA, fldDATA);
       тVALH01[kk]=ЗаписатьКорректныйКод(valFLD1, fldLVL1);
       тVALH02[kk]=ЗаписатьКорректныйКод(valFLD2, fldLVL2);
       тVALH03[kk]=ЗаписатьКорректныйКод(valFLD3, fldLVL3);
       тVALH04[kk]=ЗаписатьКорректныйКод(valFLD4, fldLVL4);
       if Подсказки:
         тNAMDAT[kk]=ВзятьИмяПараметраИерархическойГруппы(fldDATA, kk);
         namFLD1=ВзятьИмяПараметраИерархическойГруппы(fldLVL1, kk);
         namFLD2=ВзятьИмяПараметраИерархическойГруппы(fldLVL2, kk);
         namFLD3=ВзятьИмяПараметраИерархическойГруппы(fldLVL3, kk);
         namFLD4=ВзятьИмяПараметраИерархическойГруппы(fldLVL4, kk);
       else
         тNAMDAT[kk]=""; namFLD1=""; namFLD2=""; namFLD3=""; namFLD4="";
       fi;
       --Добавление группы идет перед выбранным элементом (сортировка)
       if valHDR1<>"" and fldLVL1<>"":
         jj=SearchInArray(тSRTFLD, valHDR1, True, 1);
         if jj>0: -- накапливаем результат по разделу
           xx=jj;
           тСУМ_НП[xx]=тСУМ_НП[xx]+тСУМ_НП[kk];
           тСУМ_ОД[xx]=тСУМ_ОД[xx]+тСУМ_ОД[kk];
           тСУМ_ОК[xx]=тСУМ_ОК[xx]+тСУМ_ОК[kk];
           тСУМ_КП[xx]=тСУМ_КП[xx]+тСУМ_КП[kk];
         else -- добавление нового узла иерархии
           xx=InsertInArraySort(тSRTFLD, valHDR1);
           InsertInArray(тСЧТОТЧ, xx, "");
           InsertInArray(тСЧТОТ5, xx, "");
           InsertInArray(тСЧТОТ3, xx, "");
           InsertInArray(тИСТСЧТ, xx, "");
           InsertInArray(тКБКСЧТ, xx, "");
           InsertInArray(тСТРУКТ, xx, False);
           InsertInArray(тСЧТЗАБ, xx, False);
           InsertInArray(тVALH01, xx, ЗаписатьКорректныйКод(valFLD1, fldLVL1));
           InsertInArray(тVALH02, xx, "");
           InsertInArray(тVALH03, xx, "");
           InsertInArray(тVALH04, xx, "");
           InsertInArray(тVALDAT, xx, "");
           InsertInArray(тNAMH01, xx, namFLD1);
           InsertInArray(тNAMH02, xx, "");
           InsertInArray(тNAMH03, xx, "");
           InsertInArray(тNAMH04, xx, "");
           InsertInArray(тNAMDAT, xx, "");
           InsertInArray(тСУМ_НП, xx, тСУМ_НП[kk]);
           InsertInArray(тСУМ_ОД, xx, тСУМ_ОД[kk]);
           InsertInArray(тСУМ_ОК, xx, тСУМ_ОК[kk]);
           InsertInArray(тСУМ_КП, xx, тСУМ_КП[kk]);
           if тNAMH01[kk]<>"": Value=тNAMH01[kk]; else Value=valFLD1; fi;
           InsertInArray(тСУБИТГ, xx, Value);
           kk=kk+1; -- сдвинулись на единицу в связи с добавлением нового узла иерархии
           ProgressPos(kk);
         fi;
       fi;
       if valHDR2<>"" and fldLVL2<>"":
         jj=SearchInArray(тSRTFLD, valHDR2, True, 1);
         if jj>0: -- накапливаем результат по разделу
           xx=jj;
           тСУМ_НП[xx]=тСУМ_НП[xx]+тСУМ_НП[kk];
           тСУМ_ОД[xx]=тСУМ_ОД[xx]+тСУМ_ОД[kk];
           тСУМ_ОК[xx]=тСУМ_ОК[xx]+тСУМ_ОК[kk];
           тСУМ_КП[xx]=тСУМ_КП[xx]+тСУМ_КП[kk];
         else -- добавление нового узла иерархии
           xx=InsertInArraySort(тSRTFLD, valHDR2);
           InsertInArray(тСЧТОТЧ, xx, "");
           InsertInArray(тСЧТОТ5, xx, "");
           InsertInArray(тСЧТОТ3, xx, "");
           InsertInArray(тИСТСЧТ, xx, "");
           InsertInArray(тКБКСЧТ, xx, "");
           InsertInArray(тСТРУКТ, xx, False);
           InsertInArray(тСЧТЗАБ, xx, False);
           InsertInArray(тVALH01, xx, ЗаписатьКорректныйКод(valFLD1, fldLVL1));
           InsertInArray(тVALH02, xx, ЗаписатьКорректныйКод(valFLD2, fldLVL2));
           InsertInArray(тVALH03, xx, "");
           InsertInArray(тVALH04, xx, "");
           InsertInArray(тVALDAT, xx, "");
           InsertInArray(тNAMH01, xx, "");
           InsertInArray(тNAMH02, xx, namFLD2);
           InsertInArray(тNAMH03, xx, "");
           InsertInArray(тNAMH04, xx, "");
           InsertInArray(тNAMDAT, xx, "");
           InsertInArray(тСУМ_НП, xx, тСУМ_НП[kk]);
           InsertInArray(тСУМ_ОД, xx, тСУМ_ОД[kk]);
           InsertInArray(тСУМ_ОК, xx, тСУМ_ОК[kk]);
           InsertInArray(тСУМ_КП, xx, тСУМ_КП[kk]);
           if тNAMH02[kk]<>"": Value=тNAMH02[kk]; else Value=valFLD2; fi;
           InsertInArray(тСУБИТГ, xx, Value);
           kk=kk+1; -- сдвинулись на единицу в связи с добавлением нового узла иерархии
           ProgressPos(kk);
         fi;
       fi;
       if valHDR3<>"" and fldLVL3<>"":
         jj=SearchInArray(тSRTFLD, valHDR3, True, 1);
         if jj>0: -- накапливаем результат по разделу
           xx=jj;
           тСУМ_НП[xx]=тСУМ_НП[xx]+тСУМ_НП[kk];
           тСУМ_ОД[xx]=тСУМ_ОД[xx]+тСУМ_ОД[kk];
           тСУМ_ОК[xx]=тСУМ_ОК[xx]+тСУМ_ОК[kk];
           тСУМ_КП[xx]=тСУМ_КП[xx]+тСУМ_КП[kk];
         else -- добавление нового узла иерархии
           xx=InsertInArraySort(тSRTFLD, valHDR3);
           InsertInArray(тСЧТОТЧ, xx, "");
           InsertInArray(тСЧТОТ5, xx, "");
           InsertInArray(тСЧТОТ3, xx, "");
           InsertInArray(тИСТСЧТ, xx, "");
           InsertInArray(тКБКСЧТ, xx, "");
           InsertInArray(тСТРУКТ, xx, False);
           InsertInArray(тСЧТЗАБ, xx, False);
           InsertInArray(тVALH01, xx, ЗаписатьКорректныйКод(valFLD1, fldLVL1));
           InsertInArray(тVALH02, xx, ЗаписатьКорректныйКод(valFLD2, fldLVL2));
           InsertInArray(тVALH03, xx, ЗаписатьКорректныйКод(valFLD3, fldLVL3));
           InsertInArray(тVALH04, xx, "");
           InsertInArray(тVALDAT, xx, "");
           InsertInArray(тNAMH01, xx, "");
           InsertInArray(тNAMH02, xx, "");
           InsertInArray(тNAMH03, xx, namFLD3);
           InsertInArray(тNAMH04, xx, "");
           InsertInArray(тNAMDAT, xx, "");
           InsertInArray(тСУМ_НП, xx, тСУМ_НП[kk]);
           InsertInArray(тСУМ_ОД, xx, тСУМ_ОД[kk]);
           InsertInArray(тСУМ_ОК, xx, тСУМ_ОК[kk]);
           InsertInArray(тСУМ_КП, xx, тСУМ_КП[kk]);
           if тNAMH03[kk]<>"": Value=тNAMH03[kk]; else Value=valFLD3; fi;
           InsertInArray(тСУБИТГ, xx, Value);
           kk=kk+1; -- сдвинулись на единицу в связи с добавлением нового узла иерархии
           ProgressPos(kk);
         fi;
       fi;
       if valHDR4<>"" and fldLVL4<>"":
         jj=SearchInArray(тSRTFLD, valHDR4, True, 1);
         if jj>0: -- накапливаем результат по разделу
           xx=jj;
           тСУМ_НП[xx]=тСУМ_НП[xx]+тСУМ_НП[kk];
           тСУМ_ОД[xx]=тСУМ_ОД[xx]+тСУМ_ОД[kk];
           тСУМ_ОК[xx]=тСУМ_ОК[xx]+тСУМ_ОК[kk];
           тСУМ_КП[xx]=тСУМ_КП[xx]+тСУМ_КП[kk];
         else -- добавление нового узла иерархии
           xx=InsertInArraySort(тSRTFLD, valHDR4);
           InsertInArray(тСЧТОТЧ, xx, "");
           InsertInArray(тСЧТОТ5, xx, "");
           InsertInArray(тСЧТОТ3, xx, "");
           InsertInArray(тИСТСЧТ, xx, "");
           InsertInArray(тКБКСЧТ, xx, "");
           InsertInArray(тСТРУКТ, xx, False);
           InsertInArray(тСЧТЗАБ, xx, False);
           InsertInArray(тVALH01, xx, ЗаписатьКорректныйКод(valFLD1, fldLVL1));
           InsertInArray(тVALH02, xx, ЗаписатьКорректныйКод(valFLD2, fldLVL2));
           InsertInArray(тVALH03, xx, ЗаписатьКорректныйКод(valFLD3, fldLVL3));
           InsertInArray(тVALH04, xx, ЗаписатьКорректныйКод(valFLD4, fldLVL4));
           InsertInArray(тVALDAT, xx, "");
           InsertInArray(тNAMH01, xx, "");
           InsertInArray(тNAMH02, xx, "");
           InsertInArray(тNAMH03, xx, "");
           InsertInArray(тNAMH04, xx, namFLD4);
           InsertInArray(тNAMDAT, xx, "");
           InsertInArray(тСУМ_НП, xx, тСУМ_НП[kk]);
           InsertInArray(тСУМ_ОД, xx, тСУМ_ОД[kk]);
           InsertInArray(тСУМ_ОК, xx, тСУМ_ОК[kk]);
           InsertInArray(тСУМ_КП, xx, тСУМ_КП[kk]);
           if тNAMH04[kk]<>"": Value=тNAMH04[kk]; else Value=valFLD4; fi;
           InsertInArray(тСУБИТГ, xx, Value);
           kk=kk+1; -- сдвинулись на единицу в связи с добавлением нового узла иерархии
           ProgressPos(kk);
         fi;
       fi;
       kk=kk+1; -- переход на следующий элемент
       ProgressPos(kk);
     end; -- while
   Finally
     CloseProgress;
   end;
 fi;
 ^True;
end;

Func iniКолонки(vИерархия:String; vСубИтогиСчета:Logical; vДетализация:Integer; vКБК:Logical; vИСТ:Logical) :Logical;
var lenСЧ3, lenСЧ5, lenСЧ8, lenКБК, lenИСТ, lenНП, lenОД, lenОК, lenКП :Integer;
var max_kol, ii, jj, num, xx, pp, ww :Integer;
var Value :String;
var Work :Logical;
-- Начальные настройки                                               ВСЕГО: 10 (отступ) + 180 (таблица)
-- Столбец01 - Отступ слева                                          ширина 10 - всегда
-- Столбец02 - Счет ???                                              ширина 07
-- Столбец03 - Счет ???.??                                           ширина 11
-- Столбец04 - Счет ???.??.???                                       ширина 17
-- Столбец05 - КБК                                                   ширина 35
-- Столбец06 - Источник средств                                      ширина 20
-- Столбец07 - остаток на начало периода                             ширина 23
-- Столбец08 - оборот по ДЕБЕТУ                                      ширина 22
-- Столбец09 - оборот по КРЕДИТУ                                     ширина 22
-- Столбец10 - остаток на конец  периода                             ширина 23
 Work=False;
 if Trim(vИерархия)<>"":
   num=WordsCount(vИерархия, " ");
   if num>0: Work=True; fi;
 fi;
 if Work:
   ClearVariable(Buf);
   Buf[1]=""; Buf[2]=""; Buf[3]=""; Buf[4]=""; Buf[5]="";
   max_kol=0;
   jj=0;
   for ii=1 to num do
     Value=ExtractWord(ii, vИерархия, " ");
     if Value="СЧТ":
       ww=1;
       max_kol=max_kol+1;
       if vСубИтогиСчета:
         if vДетализация=1:
           max_kol=max_kol+1;
           ww=ww+1;
           jj=jj+1; Try PutVariableS("Buf["+Str(jj)+"]", "тСЧТОТ3"); Except end;
           jj=jj+1; Try PutVariableS("Buf["+Str(jj)+"]", "тСЧТОТЧ"); Except end;
         |  vДетализация>1:
           max_kol=max_kol+2;
           ww=ww+2;
           jj=jj+1; Try PutVariableS("Buf["+Str(jj)+"]", "тСЧТОТ3"); Except end;
           jj=jj+1; Try PutVariableS("Buf["+Str(jj)+"]", "тСЧТОТ5"); Except end;
           jj=jj+1; Try PutVariableS("Buf["+Str(jj)+"]", "тСЧТОТЧ"); Except end;
         else
           jj=jj+1; Try PutVariableS("Buf["+Str(jj)+"]", "тСЧТОТЧ"); Except end;
         fi;
       else
         jj=jj+1; Try PutVariableS("Buf["+Str(jj)+"]", "тСЧТОТЧ"); Except end;
       fi;
     |  Value="ИСТ":
       max_kol=max_kol+1;
       jj=jj+1; Try PutVariableS("Buf["+Str(jj)+"]", "тИСТСЧТ"); Except end;
     |  Value="КБК":
       max_kol=max_kol+1;
       jj=jj+1; Try PutVariableS("Buf["+Str(jj)+"]", "тКБКСЧТ"); Except end;
     fi;
   od;
   jj=0;
   for ii=1 to 5 do if Buf[ii]<>"": jj=jj+1; else Break; fi; od;
   if max_kol=jj: Work=True; else Work=False; fi;
   if Work:
     lenСЧ3=0; lenСЧ5=0; lenСЧ8=0; lenКБК=0; lenИСТ=0; lenНП=0; lenОД=0; lenОК=0; lenКП=0;
     if     vСубИтогиСчета and     vКБК and     vИСТ and vДетализация>1: lenСЧ3=070; lenСЧ5=110; lenСЧ8=170; lenКБК=350; lenИСТ=200; lenНП=250; lenОД=250; lenОК=250; lenКП=250; --070+110+170+350+200+250+250+250+250=1900
     |      vСубИтогиСчета and     vКБК and     vИСТ and vДетализация=1: lenСЧ3=090; lenСЧ5=0  ; lenСЧ8=220; lenКБК=350; lenИСТ=200; lenНП=260; lenОД=260; lenОК=260; lenКП=260; --090+0  +220+350+200+260+260+260+260=1900
     |  not vСубИтогиСчета and     vКБК and     vИСТ                   : lenСЧ3=0  ; lenСЧ5=0  ; lenСЧ8=290; lenКБК=360; lenИСТ=210; lenНП=260; lenОД=260; lenОК=260; lenКП=260; --0  +0  +290+360+210+260+260+260+260=1900
     |      vСубИтогиСчета and     vКБК and not vИСТ and vДетализация>1: lenСЧ3=100; lenСЧ5=150; lenСЧ8=250; lenКБК=360; lenИСТ=0  ; lenНП=260; lenОД=260; lenОК=260; lenКП=260; --100+150+250+360+0  +260+260+260+260=1900
     |      vСубИтогиСчета and     vКБК and not vИСТ and vДетализация=1: lenСЧ3=100; lenСЧ5=0  ; lenСЧ8=250; lenКБК=370; lenИСТ=0  ; lenНП=300; lenОД=290; lenОК=290; lenКП=300; --100+0  +250+370+0  +300+290+290+300=1900
     |  not vСубИтогиСчета and     vКБК and not vИСТ                   : lenСЧ3=0  ; lenСЧ5=0  ; lenСЧ8=350; lenКБК=370; lenИСТ=0  ; lenНП=300; lenОД=290; lenОК=290; lenКП=300; --0  +0  +350+370+0  +300+290+290+300=1900
     |      vСубИтогиСчета and not vКБК and     vИСТ and vДетализация>1: lenСЧ3=120; lenСЧ5=180; lenСЧ8=300; lenКБК=0  ; lenИСТ=220; lenНП=270; lenОД=270; lenОК=270; lenКП=270; --120+180+300+0  +220+270+270+270+270=1900
     |      vСубИтогиСчета and not vКБК and     vИСТ and vДетализация=1: lenСЧ3=130; lenСЧ5=0  ; lenСЧ8=325; lenКБК=0  ; lenИСТ=245; lenНП=300; lenОД=300; lenОК=300; lenКП=300; --130+0  +325+0  +245+300+300+300+300=1900
     |  not vСубИтогиСчета and not vКБК and     vИСТ                   : lenСЧ3=0  ; lenСЧ5=0  ; lenСЧ8=455; lenКБК=0  ; lenИСТ=245; lenНП=300; lenОД=300; lenОК=300; lenКП=300; --0  +0  +455+0  +245+300+300+300+300=1900
     |      vСубИтогиСчета and not vКБК and not vИСТ and vДетализация>1: lenСЧ3=140; lenСЧ5=210; lenСЧ8=350; lenКБК=0  ; lenИСТ=0  ; lenНП=300; lenОД=300; lenОК=300; lenКП=300; --140+210+350+0  +0  +300+300+300+300=1900
     |      vСубИтогиСчета and not vКБК and not vИСТ and vДетализация=1: lenСЧ3=200; lenСЧ5=0  ; lenСЧ8=500; lenКБК=0  ; lenИСТ=0  ; lenНП=300; lenОД=300; lenОК=300; lenКП=300; --200+0  +500+0  +0  +300+300+300+300=1900
     |  not vСубИтогиСчета and not vКБК and not vИСТ                   : lenСЧ3=0  ; lenСЧ5=0  ; lenСЧ8=700; lenКБК=0  ; lenИСТ=0  ; lenНП=300; lenОД=300; lenОК=300; lenКП=300; --0  +0  +700+0  +0  +300+300+300+300=1900
     fi;
     ClearVariable(BufInt); -- ширина столбца
     ClearVariable(BufStr); -- наименование столбца
     pp=0;
     BufInt[1]=100; BufStr[1]="";
     for ii=1 to max_kol do
       if Buf[ii]="тСЧТОТ3": BufInt[ii+1]=lenСЧ3; BufStr[ii+1]=Chr(13)+"Счет"; if pp=0: pp=ii+1; fi;
       |  Buf[ii]="тСЧТОТ5": BufInt[ii+1]=lenСЧ5; BufStr[ii+1]=Chr(13)+"Счет"; if pp=0: pp=ii+1; fi;
       |  Buf[ii]="тСЧТОТЧ": BufInt[ii+1]=lenСЧ8; BufStr[ii+1]=Chr(13)+"Счет"; if pp=0: pp=ii+1; fi;
       |  Buf[ii]="тИСТСЧТ": BufInt[ii+1]=lenИСТ; BufStr[ii+1]=Chr(13)+"Источник"+Chr(13)+"средств";
       |  Buf[ii]="тКБКСЧТ": BufInt[ii+1]=lenКБК; BufStr[ii+1]=Chr(13)+"КБК";
       fi;
     od;
     xx=5-max_kol;
     if xx>0: jj=LengthOfArray(BufInt); for ii=1 to xx do BufInt[jj+ii]=0; BufStr[jj+ii]=""; od; fi; -- скрытые столбцы
     jj=LengthOfArray(BufInt);
     BufInt[jj+1]=lenНП; BufStr[jj+1]=""; -- + столбцы цифр
     BufInt[jj+2]=lenОД; BufStr[jj+2]="";
     BufInt[jj+3]=lenОК; BufStr[jj+3]="";
     BufInt[jj+4]=lenКП; BufStr[jj+4]="";
     -- формирование ширины столбцов таблицы и ее видимости
     num=LengthOfArray(BufInt);
     if num>0:
       for ii=1 to num do
         if BufInt[ii]>0:
           СекцWorkЗТ.Column(ii, ColWidth,   BufInt[ii]);
           СекцWorkДТ.Column(ii, ColWidth,   BufInt[ii]);
           СекцWorkИТ.Column(ii, ColWidth,   BufInt[ii]);
           СекцWorkЗТ.Column(ii, ColVisible, True);
           СекцWorkДТ.Column(ii, ColVisible, True);
           СекцWorkИТ.Column(ii, ColVisible, True);
           if BufStr[ii]<>"": СекцWorkЗТ.Cell(2, ii, CellContents, BufStr[ii]); fi;
         else
           СекцWorkЗТ.Column(ii, ColVisible, False);
           СекцWorkДТ.Column(ii, ColVisible, False);
           СекцWorkИТ.Column(ii, ColVisible, False);
         fi;
       od;
       if ww>1 and pp>1: СекцWorkЗТ.CellLinks(pp, 2, pp+ww-1, 3); fi;
     fi;
   else
     Message("Ошибка инициализации размерностей колонок...", mtError);
     ^False;
   fi;
 else
   Message("Ошибка инициализации размерностей колонок^M(считывание иерархии)...", mtError);
   ^False;
 fi;
 ^True;
end;

Proc ФормированиеЦветовЗаголовков(СхемаЦвета:Integer);
var ColorH1, ColorH2, ColorH3, ColorH4 :Integer;
 ClearVariable(BufInt);
 ColorH1=0;
 ColorH2=0;
 ColorH3=0;
 ColorH4=0;
 if СхемаЦвета=0:
   ColorH1=Цвет(255, 200, 200);  -- красного цвета 1 УБЫВ (RGb)
   ColorH2=Цвет(255, 200, 170);
   ColorH3=Цвет(255, 200, 140);
   ColorH4=Цвет(255, 200, 110);
 |  СхемаЦвета=1:
   ColorH1=Цвет(255, 200, 110);  -- красного цвета 1 ВОЗР  (RGb)
   ColorH2=Цвет(255, 200, 140);
   ColorH3=Цвет(255, 200, 170);
   ColorH4=Цвет(255, 200, 200);
 |  СхемаЦвета=2:
   ColorH1=Цвет(255, 200, 200);  -- красного цвета 2 УБЫВ (RgB)
   ColorH2=Цвет(255, 170, 200);
   ColorH3=Цвет(255, 140, 200);
   ColorH4=Цвет(255, 110, 200);
 |  СхемаЦвета=3:
   ColorH1=Цвет(255, 110, 200);  -- красного цвета 2 ВОЗР  (RgB)
   ColorH2=Цвет(255, 140, 200);
   ColorH3=Цвет(255, 170, 200);
   ColorH4=Цвет(255, 200, 200);
 |  СхемаЦвета=4:
   ColorH1=Цвет(200, 255, 200);  -- зеленого цвета 1 УБЫВ (rGB)
   ColorH2=Цвет(170, 255, 200);
   ColorH3=Цвет(140, 255, 200);
   ColorH4=Цвет(110, 255, 200);
 |  СхемаЦвета=5:
   ColorH1=Цвет(110, 255, 200);  -- зеленого цвета 1 ВОЗР (rGB)
   ColorH2=Цвет(140, 255, 200);
   ColorH3=Цвет(170, 255, 200);
   ColorH4=Цвет(200, 255, 200);
 |  СхемаЦвета=6:
   ColorH1=Цвет(200, 255, 200);  -- зеленого цвета 2 УБЫВ (RGb)
   ColorH2=Цвет(200, 255, 170);
   ColorH3=Цвет(200, 255, 140);
   ColorH4=Цвет(200, 255, 110);
 |  СхемаЦвета=7:
   ColorH1=Цвет(200, 255, 110);  -- зеленого цвета 2 ВОЗР (RGb)
   ColorH2=Цвет(200, 255, 140);
   ColorH3=Цвет(200, 255, 170);
   ColorH4=Цвет(200, 255, 200);
 |  СхемаЦвета=8:
   ColorH1=Цвет(200, 200, 255);  -- синего цвета 1 УБЫВ (RgB)
   ColorH2=Цвет(200, 170, 255);
   ColorH3=Цвет(200, 140, 255);
   ColorH4=Цвет(200, 110, 255);
 |  СхемаЦвета=9:
   ColorH1=Цвет(200, 110, 255);  -- синего цвета 1 ВОЗР (RgB)
   ColorH2=Цвет(200, 140, 255);
   ColorH3=Цвет(200, 170, 255);
   ColorH4=Цвет(200, 200, 255);
 |  СхемаЦвета=10:
   ColorH1=Цвет(200, 200, 255);  -- синего цвета 2 УБЫВ (rGB)
   ColorH2=Цвет(170, 200, 255);
   ColorH3=Цвет(140, 200, 255);
   ColorH4=Цвет(110, 200, 255);
 |  СхемаЦвета=11:
   ColorH1=Цвет(110, 200, 255);  -- синего цвета 2 ВОЗР  (rGB)
   ColorH2=Цвет(140, 200, 255);
   ColorH3=Цвет(170, 200, 255);
   ColorH4=Цвет(200, 200, 255);
 |  СхемаЦвета=12:
   ColorH1=Цвет(255, 200, 200);  -- смешанная УБЫВ
   ColorH2=Цвет(200, 255, 200);
   ColorH3=Цвет(200, 200, 255);
   ColorH4=Цвет(230, 230, 230);
 |  СхемаЦвета=13:
   ColorH1=Цвет(230, 230, 230);  -- смешанная УБЫВ
   ColorH2=Цвет(200, 200, 255);
   ColorH3=Цвет(200, 255, 200);
   ColorH4=Цвет(255, 200, 200);
 fi;
 BufInt[1]=ColorH1;
 BufInt[2]=ColorH2;
 BufInt[3]=ColorH3;
 BufInt[4]=ColorH4;
end;

Proc ПрименитьЦвета;
var ColorH1, ColorH2, ColorH3, ColorH4 :Integer;
 ФормированиеЦветовЗаголовков(flgСхемаЦветов);
 ColorH1=BufInt[1];
 ColorH2=BufInt[2];
 ColorH3=BufInt[3];
 ColorH4=BufInt[4];
 -- Проверять координаты !!!
 СекцВнВид.Cell(04, 04, CellBgColor, ColorH1);
 СекцВнВид.Cell(04, 05, CellBgColor, ColorH2);
 СекцВнВид.Cell(04, 06, CellBgColor, ColorH3);
 СекцВнВид.Cell(04, 07, CellBgColor, ColorH4);
end;

Func ЗаписатьСумму(SumRep:Numeric) :String;
var tmp :String;
var len :Integer;
 if SumRep<>0.00: tmp=Str(SumRep, 0); len=Length(tmp); else len=17; fi;
 ^if(SumRep<>0.00, Format("%"+Str(len)+".2N", SumRep), Chr(151));
end;

Func Выравнивание(SumRep:Numeric) :Integer;
 ^if(SumRep<>0.00, 1, 2);
end;

Proc КнопкаДетализации(Iter:Integer);
 СекцWorkДТ.Cell(Iter, 12, CellFontStyle, fsBold);
 СекцWorkДТ.Cell(Iter, 12, CellFontSize,  8);
 СекцWorkДТ.Cell(Iter, 12, CellFontColor, coBlack);
 СекцWorkДТ.Cell(Iter, 12, CellBgColor,   coLtGray);
 СекцWorkДТ.Cell(Iter, 12, CellAlignment, 2);
 СекцWorkДТ.Cell(Iter, 12, CellBorder, "1,1,1,1");
 СекцWorkДТ.Cell(Iter, 12, CellWrap, False);
 СекцWorkДТ.Cell(Iter, 12, CellHint, "Детализация позиции");
 СекцWorkДТ.Cell(Iter, 12, CellContents, "Расшифр["+Str(Iter)+"]");
 СекцWorkДТ.Cell(Iter, 12, CellFieldType, cftStringField);
 СекцWorkДТ.Cell(Iter, 12, CellEventonEnter, "Детализация_onEnter");
 Расшифр[Iter]=Chr(133);
end;

Func ПостроениеОтчета(vИерархия:String; vСубИтогиСчета:Logical; vДетализация:Integer; vКБК:Logical; vИСТ:Logical; Подсказки:Logical) :Logical;
var maxHdr, len, ii, OffsetCol, ColorH1, ColorH2, ColorH3, ColorH4 :Integer;
var SrtHead1, SrtHead2, SrtHead3, SrtHead4, RepHead1, RepHead2, RepHead3, RepHead4 :String;
var Режим, Work, OK, Head, newHd1, newHd2, newHd3, newHd4 :Logical;
 len=LengthOfArray(тSRTFLD);
 if len>0:
   Режим=AutoRefresh;
   ToggleAutoRefresh(False);
   ShowProgress(len, "Формирование ведомости...");
   Try
     OffsetCol=1;
     maxHdr=КоличествоУровнейИерархии(vИерархия, vСубИтогиСчета, vДетализация);
     --
     OK=iniКолонки(vИерархия, vСубИтогиСчета, vДетализация, vКБК, vИСТ);
     if not OK: ^False; fi;
     --
     СекцWorkДТ.RowsCount=len;
     ValidateВедомостьSection(True);
     --
     ФормированиеЦветовЗаголовков(flgСхемаЦветов);
     ColorH1=BufInt[1];
     ColorH2=BufInt[2];
     ColorH3=BufInt[3];
     ColorH4=BufInt[4];
     --
     SrtHead1="";
     SrtHead2="";
     SrtHead3="";
     SrtHead4="";
     for ii=1 to len do
       ProgressPos(ii);
       newHd1=False; newHd2=False; newHd3=False; newHd4=False;
       RepHead1=тVALH01[ii];
       RepHead2=тVALH02[ii];
       RepHead3=тVALH03[ii];
       RepHead4=тVALH04[ii];
       if RepHead1="яъ>": RepHead1="без группировки"; fi;
       if RepHead2="яъ>": RepHead2="без группировки"; fi;
       if RepHead3="яъ>": RepHead3="без группировки"; fi;
       if RepHead4="яъ>": RepHead4="без группировки"; fi;
       Head=if(тСУБИТГ[ii]="", False, True);
       if Head: -- если это субитоги
         Work=False;
         if not Work: if SrtHead1<>RepHead1 and RepHead1<>""      and RepHead2=""       and RepHead3=""       and RepHead4=""  : SrtHead1=RepHead1; SrtHead2="";       SrtHead3="";       SrtHead4="";       newHd1=True;  newHd2=False; newHd3=False; newHd4=False; Work=True; fi; fi;
         if not Work: if SrtHead2<>RepHead2 and RepHead1=SrtHead1 and RepHead2<>""      and RepHead3=""       and RepHead4=""  :                    SrtHead2=RepHead2; SrtHead3="";       SrtHead4="";       newHd1=False; newHd2=True;  newHd3=False; newHd4=False; Work=True; fi; fi;
         if not Work: if SrtHead3<>RepHead3 and RepHead1=SrtHead1 and RepHead2=SrtHead2 and RepHead3<>""      and RepHead4=""  :                                       SrtHead3=RepHead3; SrtHead4="";       newHd1=False; newHd2=False; newHd3=True;  newHd4=False; Work=True; fi; fi;
         if not Work: if SrtHead4<>RepHead4 and RepHead1=SrtHead1 and RepHead2=SrtHead2 and RepHead3=SrtHead3 and RepHead4<>"" :                                                          SrtHead4=RepHead4; newHd1=False; newHd2=False; newHd3=False; newHd4=True;  Work=True; fi; fi;
         if not Work:
           Message("Ошибка при построении отчета!", mtError);
           ОчиститьОформление;
           ^False;
         fi;
         if Work and newHd1 and maxHdr>0:
           СекцWorkДТ.Cell(ii, OffsetCol+01, CellFontStyle , fsBold);
           СекцWorkДТ.Cell(ii, OffsetCol+01, CellFontSize  , 8);
           СекцWorkДТ.Cell(ii, OffsetCol+01, CellFontColor , coBlack);
           СекцWorkДТ.Cell(ii, OffsetCol+01, CellBgColor   , ColorH1);
           СекцWorkДТ.Cell(ii, OffsetCol+01, CellAlignment , 0);
           СекцWorkДТ.Cell(ii, OffsetCol+01, CellBorder    , "1,1,0,0");
           СекцWorkДТ.Cell(ii, OffsetCol+01, CellWrap      , True);
           СекцWorkДТ.Cell(ii, OffsetCol+01, CellContents  , SrtHead1);
           if Подсказки: СекцWorkДТ.Cell(ii, OffsetCol+01, CellHint, тNAMH01[ii]); fi;

           СекцWorkДТ.Cell(ii, OffsetCol+02, CellFontStyle , fsBold);
           СекцWorkДТ.Cell(ii, OffsetCol+02, CellFontSize  , 8);
           СекцWorkДТ.Cell(ii, OffsetCol+02, CellFontColor , coBlack);
           СекцWorkДТ.Cell(ii, OffsetCol+02, CellBgColor   , ColorH1);
           СекцWorkДТ.Cell(ii, OffsetCol+02, CellAlignment , 2);
           СекцWorkДТ.Cell(ii, OffsetCol+02, CellBorder    , "0,1,0,1");
           СекцWorkДТ.Cell(ii, OffsetCol+02, CellWrap      , True);
           СекцWorkДТ.Cell(ii, OffsetCol+02, CellContents  , "");

           СекцWorkДТ.Cell(ii, OffsetCol+03, CellFontStyle , fsBold);
           СекцWorkДТ.Cell(ii, OffsetCol+03, CellFontSize  , 8);
           СекцWorkДТ.Cell(ii, OffsetCol+03, CellFontColor , coBlack);
           СекцWorkДТ.Cell(ii, OffsetCol+03, CellBgColor   , ColorH1);
           СекцWorkДТ.Cell(ii, OffsetCol+03, CellAlignment , 2);
           СекцWorkДТ.Cell(ii, OffsetCol+03, CellBorder    , "0,1,0,1");
           СекцWorkДТ.Cell(ii, OffsetCol+03, CellWrap      , True);
           СекцWorkДТ.Cell(ii, OffsetCol+03, CellContents  , "");

           СекцWorkДТ.Cell(ii, OffsetCol+04, CellFontStyle , fsBold);
           СекцWorkДТ.Cell(ii, OffsetCol+04, CellFontSize  , 8);
           СекцWorkДТ.Cell(ii, OffsetCol+04, CellFontColor , coBlack);
           СекцWorkДТ.Cell(ii, OffsetCol+04, CellBgColor   , ColorH1);
           СекцWorkДТ.Cell(ii, OffsetCol+04, CellAlignment , 2);
           СекцWorkДТ.Cell(ii, OffsetCol+04, CellBorder    , "0,1,0,1");
           СекцWorkДТ.Cell(ii, OffsetCol+04, CellWrap      , True);
           СекцWorkДТ.Cell(ii, OffsetCol+04, CellContents  , "");

           СекцWorkДТ.Cell(ii, OffsetCol+05, CellFontStyle , fsBold);
           СекцWorkДТ.Cell(ii, OffsetCol+05, CellFontSize  , 8);
           СекцWorkДТ.Cell(ii, OffsetCol+05, CellFontColor , coBlack);
           СекцWorkДТ.Cell(ii, OffsetCol+05, CellBgColor   , ColorH1);
           СекцWorkДТ.Cell(ii, OffsetCol+05, CellAlignment , 2);
           СекцWorkДТ.Cell(ii, OffsetCol+05, CellBorder    , "0,1,0,1");
           СекцWorkДТ.Cell(ii, OffsetCol+05, CellWrap      , True);
           СекцWorkДТ.Cell(ii, OffsetCol+05, CellContents  , "");

           СекцWorkДТ.CellLinks(OffsetCol+01, ii, OffsetCol+maxHdr+01, ii);

           СекцWorkДТ.Cell(ii, OffsetCol+06, CellFontStyle , 0);
           СекцWorkДТ.Cell(ii, OffsetCol+06, CellFontSize  , 8);
           СекцWorkДТ.Cell(ii, OffsetCol+06, CellFontColor , coBlack);
           СекцWorkДТ.Cell(ii, OffsetCol+06, CellBgColor   , ColorH1);
           СекцWorkДТ.Cell(ii, OffsetCol+06, CellAlignment , Выравнивание(тСУМ_НП[ii]));
           СекцWorkДТ.Cell(ii, OffsetCol+06, CellBorder    , "1,1,1,1");
           СекцWorkДТ.Cell(ii, OffsetCol+06, CellWrap      , True);
           СекцWorkДТ.Cell(ii, OffsetCol+06, CellContents  , ЗаписатьСумму(тСУМ_НП[ii]));

           СекцWorkДТ.Cell(ii, OffsetCol+07, CellFontStyle , 0);
           СекцWorkДТ.Cell(ii, OffsetCol+07, CellFontSize  , 8);
           СекцWorkДТ.Cell(ii, OffsetCol+07, CellFontColor , coBlack);
           СекцWorkДТ.Cell(ii, OffsetCol+07, CellBgColor   , ColorH1);
           СекцWorkДТ.Cell(ii, OffsetCol+07, CellAlignment , Выравнивание(тСУМ_ОД[ii]));
           СекцWorkДТ.Cell(ii, OffsetCol+07, CellBorder    , "1,1,1,1");
           СекцWorkДТ.Cell(ii, OffsetCol+07, CellWrap      , True);
           СекцWorkДТ.Cell(ii, OffsetCol+07, CellContents  , ЗаписатьСумму(тСУМ_ОД[ii]));

           СекцWorkДТ.Cell(ii, OffsetCol+08, CellFontStyle , 0);
           СекцWorkДТ.Cell(ii, OffsetCol+08, CellFontSize  , 8);
           СекцWorkДТ.Cell(ii, OffsetCol+08, CellFontColor , coBlack);
           СекцWorkДТ.Cell(ii, OffsetCol+08, CellBgColor   , ColorH1);
           СекцWorkДТ.Cell(ii, OffsetCol+08, CellAlignment , Выравнивание(тСУМ_ОК[ii]));
           СекцWorkДТ.Cell(ii, OffsetCol+08, CellBorder    , "1,1,1,1");
           СекцWorkДТ.Cell(ii, OffsetCol+08, CellWrap      , True);
           СекцWorkДТ.Cell(ii, OffsetCol+08, CellContents  , ЗаписатьСумму(тСУМ_ОК[ii]));

           СекцWorkДТ.Cell(ii, OffsetCol+09, CellFontStyle , 0);
           СекцWorkДТ.Cell(ii, OffsetCol+09, CellFontSize  , 8);
           СекцWorkДТ.Cell(ii, OffsetCol+09, CellFontColor , coBlack);
           СекцWorkДТ.Cell(ii, OffsetCol+09, CellBgColor   , ColorH1);
           СекцWorkДТ.Cell(ii, OffsetCol+09, CellAlignment , Выравнивание(тСУМ_КП[ii]));
           СекцWorkДТ.Cell(ii, OffsetCol+09, CellBorder    , "1,1,1,1");
           СекцWorkДТ.Cell(ii, OffsetCol+09, CellWrap      , True);
           СекцWorkДТ.Cell(ii, OffsetCol+09, CellContents  , ЗаписатьСумму(тСУМ_КП[ii]));
         fi;
         if Work and newHd2 and maxHdr>1:
           СекцWorkДТ.Cell(ii, OffsetCol+01, CellFontStyle , fsBold);
           СекцWorkДТ.Cell(ii, OffsetCol+01, CellFontSize  , 8);
           СекцWorkДТ.Cell(ii, OffsetCol+01, CellFontColor , coBlack);
           СекцWorkДТ.Cell(ii, OffsetCol+01, CellBgColor   , ColorH1);
           СекцWorkДТ.Cell(ii, OffsetCol+01, CellAlignment , 2);
           СекцWorkДТ.Cell(ii, OffsetCol+01, CellBorder    , "1,0,1,0");
           СекцWorkДТ.Cell(ii, OffsetCol+01, CellWrap      , True);
           СекцWorkДТ.Cell(ii, OffsetCol+01, CellContents  , "");

           СекцWorkДТ.Cell(ii, OffsetCol+02, CellFontStyle , fsBold);
           СекцWorkДТ.Cell(ii, OffsetCol+02, CellFontSize  , 8);
           СекцWorkДТ.Cell(ii, OffsetCol+02, CellFontColor , coBlack);
           СекцWorkДТ.Cell(ii, OffsetCol+02, CellBgColor   , ColorH2);
           СекцWorkДТ.Cell(ii, OffsetCol+02, CellAlignment , 0);
           СекцWorkДТ.Cell(ii, OffsetCol+02, CellBorder    , "1,1,0,0");
           СекцWorkДТ.Cell(ii, OffsetCol+02, CellWrap      , True);
           СекцWorkДТ.Cell(ii, OffsetCol+02, CellContents  , SrtHead2);
           if Подсказки: СекцWorkДТ.Cell(ii, OffsetCol+02, CellHint, тNAMH02[ii]); fi;

           СекцWorkДТ.Cell(ii, OffsetCol+03, CellFontStyle , fsBold);
           СекцWorkДТ.Cell(ii, OffsetCol+03, CellFontSize  , 8);
           СекцWorkДТ.Cell(ii, OffsetCol+03, CellFontColor , coBlack);
           СекцWorkДТ.Cell(ii, OffsetCol+03, CellBgColor   , ColorH2);
           СекцWorkДТ.Cell(ii, OffsetCol+03, CellAlignment , 2);
           СекцWorkДТ.Cell(ii, OffsetCol+03, CellBorder    , "0,1,0,1");
           СекцWorkДТ.Cell(ii, OffsetCol+03, CellWrap      , True);
           СекцWorkДТ.Cell(ii, OffsetCol+03, CellContents  , "");

           СекцWorkДТ.Cell(ii, OffsetCol+04, CellFontStyle , fsBold);
           СекцWorkДТ.Cell(ii, OffsetCol+04, CellFontSize  , 8);
           СекцWorkДТ.Cell(ii, OffsetCol+04, CellFontColor , coBlack);
           СекцWorkДТ.Cell(ii, OffsetCol+04, CellBgColor   , ColorH2);
           СекцWorkДТ.Cell(ii, OffsetCol+04, CellAlignment , 2);
           СекцWorkДТ.Cell(ii, OffsetCol+04, CellBorder    , "0,1,0,1");
           СекцWorkДТ.Cell(ii, OffsetCol+04, CellWrap      , True);
           СекцWorkДТ.Cell(ii, OffsetCol+04, CellContents  , "");

           СекцWorkДТ.Cell(ii, OffsetCol+05, CellFontStyle , fsBold);
           СекцWorkДТ.Cell(ii, OffsetCol+05, CellFontSize  , 8);
           СекцWorkДТ.Cell(ii, OffsetCol+05, CellFontColor , coBlack);
           СекцWorkДТ.Cell(ii, OffsetCol+05, CellBgColor   , ColorH2);
           СекцWorkДТ.Cell(ii, OffsetCol+05, CellAlignment , 2);
           СекцWorkДТ.Cell(ii, OffsetCol+05, CellBorder    , "0,1,0,1");
           СекцWorkДТ.Cell(ii, OffsetCol+05, CellWrap      , True);
           СекцWorkДТ.Cell(ii, OffsetCol+05, CellContents  , "");

           СекцWorkДТ.CellLinks(OffsetCol+02, ii, OffsetCol+maxHdr+01, ii);

           СекцWorkДТ.Cell(ii, OffsetCol+06, CellFontStyle , 0);
           СекцWorkДТ.Cell(ii, OffsetCol+06, CellFontSize  , 8);
           СекцWorkДТ.Cell(ii, OffsetCol+06, CellFontColor , coBlack);
           СекцWorkДТ.Cell(ii, OffsetCol+06, CellBgColor   , ColorH2);
           СекцWorkДТ.Cell(ii, OffsetCol+06, CellAlignment , Выравнивание(тСУМ_НП[ii]));
           СекцWorkДТ.Cell(ii, OffsetCol+06, CellBorder    , "1,1,1,1");
           СекцWorkДТ.Cell(ii, OffsetCol+06, CellWrap      , True);
           СекцWorkДТ.Cell(ii, OffsetCol+06, CellContents  , ЗаписатьСумму(тСУМ_НП[ii]));

           СекцWorkДТ.Cell(ii, OffsetCol+07, CellFontStyle , 0);
           СекцWorkДТ.Cell(ii, OffsetCol+07, CellFontSize  , 8);
           СекцWorkДТ.Cell(ii, OffsetCol+07, CellFontColor , coBlack);
           СекцWorkДТ.Cell(ii, OffsetCol+07, CellBgColor   , ColorH2);
           СекцWorkДТ.Cell(ii, OffsetCol+07, CellAlignment , Выравнивание(тСУМ_ОД[ii]));
           СекцWorkДТ.Cell(ii, OffsetCol+07, CellBorder    , "1,1,1,1");
           СекцWorkДТ.Cell(ii, OffsetCol+07, CellWrap      , True);
           СекцWorkДТ.Cell(ii, OffsetCol+07, CellContents  , ЗаписатьСумму(тСУМ_ОД[ii]));

           СекцWorkДТ.Cell(ii, OffsetCol+08, CellFontStyle , 0);
           СекцWorkДТ.Cell(ii, OffsetCol+08, CellFontSize  , 8);
           СекцWorkДТ.Cell(ii, OffsetCol+08, CellFontColor , coBlack);
           СекцWorkДТ.Cell(ii, OffsetCol+08, CellBgColor   , ColorH2);
           СекцWorkДТ.Cell(ii, OffsetCol+08, CellAlignment , Выравнивание(тСУМ_ОК[ii]));
           СекцWorkДТ.Cell(ii, OffsetCol+08, CellBorder    , "1,1,1,1");
           СекцWorkДТ.Cell(ii, OffsetCol+08, CellWrap      , True);
           СекцWorkДТ.Cell(ii, OffsetCol+08, CellContents  , ЗаписатьСумму(тСУМ_ОК[ii]));

           СекцWorkДТ.Cell(ii, OffsetCol+09, CellFontStyle , 0);
           СекцWorkДТ.Cell(ii, OffsetCol+09, CellFontSize  , 8);
           СекцWorkДТ.Cell(ii, OffsetCol+09, CellFontColor , coBlack);
           СекцWorkДТ.Cell(ii, OffsetCol+09, CellBgColor   , ColorH2);
           СекцWorkДТ.Cell(ii, OffsetCol+09, CellAlignment , Выравнивание(тСУМ_КП[ii]));
           СекцWorkДТ.Cell(ii, OffsetCol+09, CellBorder    , "1,1,1,1");
           СекцWorkДТ.Cell(ii, OffsetCol+09, CellWrap      , True);
           СекцWorkДТ.Cell(ii, OffsetCol+09, CellContents  , ЗаписатьСумму(тСУМ_КП[ii]));
         fi;
         if Work and newHd3 and maxHdr>2:
           СекцWorkДТ.Cell(ii, OffsetCol+01, CellFontStyle , fsBold);
           СекцWorkДТ.Cell(ii, OffsetCol+01, CellFontSize  , 8);
           СекцWorkДТ.Cell(ii, OffsetCol+01, CellFontColor , coBlack);
           СекцWorkДТ.Cell(ii, OffsetCol+01, CellBgColor   , ColorH1);
           СекцWorkДТ.Cell(ii, OffsetCol+01, CellAlignment , 2);
           СекцWorkДТ.Cell(ii, OffsetCol+01, CellBorder    , "1,0,1,0");
           СекцWorkДТ.Cell(ii, OffsetCol+01, CellWrap      , True);
           СекцWorkДТ.Cell(ii, OffsetCol+01, CellContents  , "");

           СекцWorkДТ.Cell(ii, OffsetCol+02, CellFontStyle , fsBold);
           СекцWorkДТ.Cell(ii, OffsetCol+02, CellFontSize  , 8);
           СекцWorkДТ.Cell(ii, OffsetCol+02, CellFontColor , coBlack);
           СекцWorkДТ.Cell(ii, OffsetCol+02, CellBgColor   , ColorH2);
           СекцWorkДТ.Cell(ii, OffsetCol+02, CellAlignment , 2);
           СекцWorkДТ.Cell(ii, OffsetCol+02, CellBorder    , "1,0,1,0");
           СекцWorkДТ.Cell(ii, OffsetCol+02, CellWrap      , True);
           СекцWorkДТ.Cell(ii, OffsetCol+02, CellContents  , "");

           СекцWorkДТ.Cell(ii, OffsetCol+03, CellFontStyle , fsBold);
           СекцWorkДТ.Cell(ii, OffsetCol+03, CellFontSize  , 8);
           СекцWorkДТ.Cell(ii, OffsetCol+03, CellFontColor , coBlack);
           СекцWorkДТ.Cell(ii, OffsetCol+03, CellBgColor   , ColorH3);
           СекцWorkДТ.Cell(ii, OffsetCol+03, CellAlignment , 0);
           СекцWorkДТ.Cell(ii, OffsetCol+03, CellBorder    , "1,1,0,0");
           СекцWorkДТ.Cell(ii, OffsetCol+03, CellWrap      , True);
           СекцWorkДТ.Cell(ii, OffsetCol+03, CellContents  , SrtHead3);
           if Подсказки: СекцWorkДТ.Cell(ii, OffsetCol+03, CellHint, тNAMH03[ii]); fi;

           СекцWorkДТ.Cell(ii, OffsetCol+04, CellFontStyle , fsBold);
           СекцWorkДТ.Cell(ii, OffsetCol+04, CellFontSize  , 8);
           СекцWorkДТ.Cell(ii, OffsetCol+04, CellFontColor , coBlack);
           СекцWorkДТ.Cell(ii, OffsetCol+04, CellBgColor   , ColorH3);
           СекцWorkДТ.Cell(ii, OffsetCol+04, CellAlignment , 2);
           СекцWorkДТ.Cell(ii, OffsetCol+04, CellBorder    , "0,1,0,1");
           СекцWorkДТ.Cell(ii, OffsetCol+04, CellWrap      , True);
           СекцWorkДТ.Cell(ii, OffsetCol+04, CellContents  , "");

           СекцWorkДТ.Cell(ii, OffsetCol+05, CellFontStyle , fsBold);
           СекцWorkДТ.Cell(ii, OffsetCol+05, CellFontSize  , 8);
           СекцWorkДТ.Cell(ii, OffsetCol+05, CellFontColor , coBlack);
           СекцWorkДТ.Cell(ii, OffsetCol+05, CellBgColor   , ColorH3);
           СекцWorkДТ.Cell(ii, OffsetCol+05, CellAlignment , 2);
           СекцWorkДТ.Cell(ii, OffsetCol+05, CellBorder    , "0,1,0,1");
           СекцWorkДТ.Cell(ii, OffsetCol+05, CellWrap      , True);
           СекцWorkДТ.Cell(ii, OffsetCol+05, CellContents  , "");

           СекцWorkДТ.CellLinks(OffsetCol+03, ii, OffsetCol+maxHdr+01, ii);

           СекцWorkДТ.Cell(ii, OffsetCol+06, CellFontStyle , 0);
           СекцWorkДТ.Cell(ii, OffsetCol+06, CellFontSize  , 8);
           СекцWorkДТ.Cell(ii, OffsetCol+06, CellFontColor , coBlack);
           СекцWorkДТ.Cell(ii, OffsetCol+06, CellBgColor   , ColorH3);
           СекцWorkДТ.Cell(ii, OffsetCol+06, CellAlignment , Выравнивание(тСУМ_НП[ii]));
           СекцWorkДТ.Cell(ii, OffsetCol+06, CellBorder    , "1,1,1,1");
           СекцWorkДТ.Cell(ii, OffsetCol+06, CellWrap      , True);
           СекцWorkДТ.Cell(ii, OffsetCol+06, CellContents  , ЗаписатьСумму(тСУМ_НП[ii]));

           СекцWorkДТ.Cell(ii, OffsetCol+07, CellFontStyle , 0);
           СекцWorkДТ.Cell(ii, OffsetCol+07, CellFontSize  , 8);
           СекцWorkДТ.Cell(ii, OffsetCol+07, CellFontColor , coBlack);
           СекцWorkДТ.Cell(ii, OffsetCol+07, CellBgColor   , ColorH3);
           СекцWorkДТ.Cell(ii, OffsetCol+07, CellAlignment , Выравнивание(тСУМ_ОД[ii]));
           СекцWorkДТ.Cell(ii, OffsetCol+07, CellBorder    , "1,1,1,1");
           СекцWorkДТ.Cell(ii, OffsetCol+07, CellWrap      , True);
           СекцWorkДТ.Cell(ii, OffsetCol+07, CellContents  , ЗаписатьСумму(тСУМ_ОД[ii]));

           СекцWorkДТ.Cell(ii, OffsetCol+08, CellFontStyle , 0);
           СекцWorkДТ.Cell(ii, OffsetCol+08, CellFontSize  , 8);
           СекцWorkДТ.Cell(ii, OffsetCol+08, CellFontColor , coBlack);
           СекцWorkДТ.Cell(ii, OffsetCol+08, CellBgColor   , ColorH3);
           СекцWorkДТ.Cell(ii, OffsetCol+08, CellAlignment , Выравнивание(тСУМ_ОК[ii]));
           СекцWorkДТ.Cell(ii, OffsetCol+08, CellBorder    , "1,1,1,1");
           СекцWorkДТ.Cell(ii, OffsetCol+08, CellWrap      , True);
           СекцWorkДТ.Cell(ii, OffsetCol+08, CellContents  , ЗаписатьСумму(тСУМ_ОК[ii]));

           СекцWorkДТ.Cell(ii, OffsetCol+09, CellFontStyle , 0);
           СекцWorkДТ.Cell(ii, OffsetCol+09, CellFontSize  , 8);
           СекцWorkДТ.Cell(ii, OffsetCol+09, CellFontColor , coBlack);
           СекцWorkДТ.Cell(ii, OffsetCol+09, CellBgColor   , ColorH3);
           СекцWorkДТ.Cell(ii, OffsetCol+09, CellAlignment , Выравнивание(тСУМ_КП[ii]));
           СекцWorkДТ.Cell(ii, OffsetCol+09, CellBorder    , "1,1,1,1");
           СекцWorkДТ.Cell(ii, OffsetCol+09, CellWrap      , True);
           СекцWorkДТ.Cell(ii, OffsetCol+09, CellContents  , ЗаписатьСумму(тСУМ_КП[ii]));
         fi;
         if Work and newHd4 and maxHdr>3:
           СекцWorkДТ.Cell(ii, OffsetCol+01, CellFontStyle , fsBold);
           СекцWorkДТ.Cell(ii, OffsetCol+01, CellFontSize  , 8);
           СекцWorkДТ.Cell(ii, OffsetCol+01, CellFontColor , coBlack);
           СекцWorkДТ.Cell(ii, OffsetCol+01, CellBgColor   , ColorH1);
           СекцWorkДТ.Cell(ii, OffsetCol+01, CellAlignment , 2);
           СекцWorkДТ.Cell(ii, OffsetCol+01, CellBorder    , "1,0,1,0");
           СекцWorkДТ.Cell(ii, OffsetCol+01, CellWrap      , True);
           СекцWorkДТ.Cell(ii, OffsetCol+01, CellContents  , "");

           СекцWorkДТ.Cell(ii, OffsetCol+02, CellFontStyle , fsBold);
           СекцWorkДТ.Cell(ii, OffsetCol+02, CellFontSize  , 8);
           СекцWorkДТ.Cell(ii, OffsetCol+02, CellFontColor , coBlack);
           СекцWorkДТ.Cell(ii, OffsetCol+02, CellBgColor   , ColorH2);
           СекцWorkДТ.Cell(ii, OffsetCol+02, CellAlignment , 2);
           СекцWorkДТ.Cell(ii, OffsetCol+02, CellBorder    , "1,0,1,0");
           СекцWorkДТ.Cell(ii, OffsetCol+02, CellWrap      , True);
           СекцWorkДТ.Cell(ii, OffsetCol+02, CellContents  , "");

           СекцWorkДТ.Cell(ii, OffsetCol+03, CellFontStyle , fsBold);
           СекцWorkДТ.Cell(ii, OffsetCol+03, CellFontSize  , 8);
           СекцWorkДТ.Cell(ii, OffsetCol+03, CellFontColor , coBlack);
           СекцWorkДТ.Cell(ii, OffsetCol+03, CellBgColor   , ColorH3);
           СекцWorkДТ.Cell(ii, OffsetCol+03, CellAlignment , 2);
           СекцWorkДТ.Cell(ii, OffsetCol+03, CellBorder    , "1,0,1,0");
           СекцWorkДТ.Cell(ii, OffsetCol+03, CellWrap      , True);
           СекцWorkДТ.Cell(ii, OffsetCol+03, CellContents  , "");

           СекцWorkДТ.Cell(ii, OffsetCol+04, CellFontStyle , fsBold);
           СекцWorkДТ.Cell(ii, OffsetCol+04, CellFontSize  , 8);
           СекцWorkДТ.Cell(ii, OffsetCol+04, CellFontColor , coBlack);
           СекцWorkДТ.Cell(ii, OffsetCol+04, CellBgColor   , ColorH4);
           СекцWorkДТ.Cell(ii, OffsetCol+04, CellAlignment , 0);
           СекцWorkДТ.Cell(ii, OffsetCol+04, CellBorder    , "1,1,0,0");
           СекцWorkДТ.Cell(ii, OffsetCol+04, CellWrap      , True);
           СекцWorkДТ.Cell(ii, OffsetCol+04, CellContents  , SrtHead4);
           if Подсказки: СекцWorkДТ.Cell(ii, OffsetCol+04, CellHint, тNAMH04[ii]); fi;

           СекцWorkДТ.Cell(ii, OffsetCol+05, CellFontStyle , fsBold);
           СекцWorkДТ.Cell(ii, OffsetCol+05, CellFontSize  , 8);
           СекцWorkДТ.Cell(ii, OffsetCol+05, CellFontColor , coBlack);
           СекцWorkДТ.Cell(ii, OffsetCol+05, CellBgColor   , ColorH4);
           СекцWorkДТ.Cell(ii, OffsetCol+05, CellAlignment , 2);
           СекцWorkДТ.Cell(ii, OffsetCol+05, CellBorder    , "0,1,0,1");
           СекцWorkДТ.Cell(ii, OffsetCol+05, CellWrap      , True);
           СекцWorkДТ.Cell(ii, OffsetCol+05, CellContents  , "");

           СекцWorkДТ.CellLinks(OffsetCol+04, ii, OffsetCol+maxHdr+01, ii);

           СекцWorkДТ.Cell(ii, OffsetCol+06, CellFontStyle , 0);
           СекцWorkДТ.Cell(ii, OffsetCol+06, CellFontSize  , 8);
           СекцWorkДТ.Cell(ii, OffsetCol+06, CellFontColor , coBlack);
           СекцWorkДТ.Cell(ii, OffsetCol+06, CellBgColor   , ColorH4);
           СекцWorkДТ.Cell(ii, OffsetCol+06, CellAlignment , Выравнивание(тСУМ_НП[ii]));
           СекцWorkДТ.Cell(ii, OffsetCol+06, CellBorder    , "1,1,1,1");
           СекцWorkДТ.Cell(ii, OffsetCol+06, CellWrap      , True);
           СекцWorkДТ.Cell(ii, OffsetCol+06, CellContents  , ЗаписатьСумму(тСУМ_НП[ii]));

           СекцWorkДТ.Cell(ii, OffsetCol+07, CellFontStyle , 0);
           СекцWorkДТ.Cell(ii, OffsetCol+07, CellFontSize  , 8);
           СекцWorkДТ.Cell(ii, OffsetCol+07, CellFontColor , coBlack);
           СекцWorkДТ.Cell(ii, OffsetCol+07, CellBgColor   , ColorH4);
           СекцWorkДТ.Cell(ii, OffsetCol+07, CellAlignment , Выравнивание(тСУМ_ОД[ii]));
           СекцWorkДТ.Cell(ii, OffsetCol+07, CellBorder    , "1,1,1,1");
           СекцWorkДТ.Cell(ii, OffsetCol+07, CellWrap      , True);
           СекцWorkДТ.Cell(ii, OffsetCol+07, CellContents  , ЗаписатьСумму(тСУМ_ОД[ii]));

           СекцWorkДТ.Cell(ii, OffsetCol+08, CellFontStyle , 0);
           СекцWorkДТ.Cell(ii, OffsetCol+08, CellFontSize  , 8);
           СекцWorkДТ.Cell(ii, OffsetCol+08, CellFontColor , coBlack);
           СекцWorkДТ.Cell(ii, OffsetCol+08, CellBgColor   , ColorH4);
           СекцWorkДТ.Cell(ii, OffsetCol+08, CellAlignment , Выравнивание(тСУМ_ОК[ii]));
           СекцWorkДТ.Cell(ii, OffsetCol+08, CellBorder    , "1,1,1,1");
           СекцWorkДТ.Cell(ii, OffsetCol+08, CellWrap      , True);
           СекцWorkДТ.Cell(ii, OffsetCol+08, CellContents  , ЗаписатьСумму(тСУМ_ОК[ii]));

           СекцWorkДТ.Cell(ii, OffsetCol+09, CellFontStyle , 0);
           СекцWorkДТ.Cell(ii, OffsetCol+09, CellFontSize  , 8);
           СекцWorkДТ.Cell(ii, OffsetCol+09, CellFontColor , coBlack);
           СекцWorkДТ.Cell(ii, OffsetCol+09, CellBgColor   , ColorH4);
           СекцWorkДТ.Cell(ii, OffsetCol+09, CellAlignment , Выравнивание(тСУМ_КП[ii]));
           СекцWorkДТ.Cell(ii, OffsetCol+09, CellBorder    , "1,1,1,1");
           СекцWorkДТ.Cell(ii, OffsetCol+09, CellWrap      , True);
           СекцWorkДТ.Cell(ii, OffsetCol+09, CellContents  , ЗаписатьСумму(тСУМ_КП[ii]));
         fi;
       else -- если это строка данных
         СекцWorkДТ.Cell(ii, OffsetCol+01, CellFontStyle , if(maxHdr=0, 0, fsBold)              );
         СекцWorkДТ.Cell(ii, OffsetCol+01, CellFontSize  , 8                                    );
         СекцWorkДТ.Cell(ii, OffsetCol+01, CellFontColor , coBlack                              );
         СекцWorkДТ.Cell(ii, OffsetCol+01, CellBgColor   , ColorH1                              );
--         СекцWorkДТ.Cell(ii, OffsetCol+01, CellBgColor   , if(maxHdr=0, coTransparent, ColorH1) );
         СекцWorkДТ.Cell(ii, OffsetCol+01, CellAlignment , 2                                    );
         СекцWorkДТ.Cell(ii, OffsetCol+01, CellBorder    , if(maxHdr=0, "1,1,1,1", "1,0,1,0")   );
         СекцWorkДТ.Cell(ii, OffsetCol+01, CellWrap      , True                                 );
         СекцWorkДТ.Cell(ii, OffsetCol+01, CellContents  , if(maxHdr=0, тVALDAT[ii], "")        );
         if Подсказки and maxHdr=0: СекцWorkДТ.Cell(ii, OffsetCol+01, CellHint, тNAMDAT[ii]); fi;

         СекцWorkДТ.Cell(ii, OffsetCol+02, CellFontStyle , if(maxHdr=1, 0, fsBold)              );
         СекцWorkДТ.Cell(ii, OffsetCol+02, CellFontSize  , 8                                    );
         СекцWorkДТ.Cell(ii, OffsetCol+02, CellFontColor , coBlack                              );
         СекцWorkДТ.Cell(ii, OffsetCol+02, CellBgColor   , if(maxHdr=1, coTransparent, ColorH2) );
         СекцWorkДТ.Cell(ii, OffsetCol+02, CellAlignment , 2                                    );
         СекцWorkДТ.Cell(ii, OffsetCol+02, CellBorder    , if(maxHdr=1, "1,1,1,1", "1,0,1,0")   );
         СекцWorkДТ.Cell(ii, OffsetCol+02, CellWrap      , True                                 );
         СекцWorkДТ.Cell(ii, OffsetCol+02, CellContents  , if(maxHdr=1, тVALDAT[ii], "")        );
         if Подсказки and maxHdr=1: СекцWorkДТ.Cell(ii, OffsetCol+02, CellHint, тNAMDAT[ii]); fi;

         СекцWorkДТ.Cell(ii, OffsetCol+03, CellFontStyle , if(maxHdr=2, 0, fsBold)              );
         СекцWorkДТ.Cell(ii, OffsetCol+03, CellFontSize  , 8                                    );
         СекцWorkДТ.Cell(ii, OffsetCol+03, CellFontColor , coBlack                              );
         СекцWorkДТ.Cell(ii, OffsetCol+03, CellBgColor   , if(maxHdr=2, coTransparent, ColorH3) );
         СекцWorkДТ.Cell(ii, OffsetCol+03, CellAlignment , 2                                    );
         СекцWorkДТ.Cell(ii, OffsetCol+03, CellBorder    , if(maxHdr=2, "1,1,1,1", "1,0,1,0")   );
         СекцWorkДТ.Cell(ii, OffsetCol+03, CellWrap      , True                                 );
         СекцWorkДТ.Cell(ii, OffsetCol+03, CellContents  , if(maxHdr=2, тVALDAT[ii], "")        );
         if Подсказки and maxHdr=2: СекцWorkДТ.Cell(ii, OffsetCol+03, CellHint, тNAMDAT[ii]); fi;

         СекцWorkДТ.Cell(ii, OffsetCol+04, CellFontStyle , if(maxHdr=3, 0, fsBold)              );
         СекцWorkДТ.Cell(ii, OffsetCol+04, CellFontSize  , 8                                    );
         СекцWorkДТ.Cell(ii, OffsetCol+04, CellFontColor , coBlack                              );
         СекцWorkДТ.Cell(ii, OffsetCol+04, CellBgColor   , if(maxHdr=3, coTransparent, ColorH4) );
         СекцWorkДТ.Cell(ii, OffsetCol+04, CellAlignment , 2                                    );
         СекцWorkДТ.Cell(ii, OffsetCol+04, CellBorder    , if(maxHdr=3, "1,1,1,1", "1,0,1,0")   );
         СекцWorkДТ.Cell(ii, OffsetCol+04, CellWrap      , True                                 );
         СекцWorkДТ.Cell(ii, OffsetCol+04, CellContents  , if(maxHdr=3, тVALDAT[ii], "")        );
         if Подсказки and maxHdr=3: СекцWorkДТ.Cell(ii, OffsetCol+04, CellHint, тNAMDAT[ii]); fi;

         СекцWorkДТ.Cell(ii, OffsetCol+05, CellFontStyle , 0                                    );
         СекцWorkДТ.Cell(ii, OffsetCol+05, CellFontSize  , 8                                    );
         СекцWorkДТ.Cell(ii, OffsetCol+05, CellFontColor , coBlack                              );
         СекцWorkДТ.Cell(ii, OffsetCol+05, CellBgColor   , coTransparent                        );
         СекцWorkДТ.Cell(ii, OffsetCol+05, CellAlignment , 2                                    );
         СекцWorkДТ.Cell(ii, OffsetCol+05, CellBorder    , "1,1,1,1"                            );
         СекцWorkДТ.Cell(ii, OffsetCol+05, CellWrap      , True                                 );
         СекцWorkДТ.Cell(ii, OffsetCol+05, CellContents  , if(maxHdr=4, тVALDAT[ii], "")        );
         if Подсказки and maxHdr=4: СекцWorkДТ.Cell(ii, OffsetCol+05, CellHint, тNAMDAT[ii]); fi;

         СекцWorkДТ.Cell(ii, OffsetCol+06, CellFontStyle , 0);
         СекцWorkДТ.Cell(ii, OffsetCol+06, CellFontSize  , 8);
         СекцWorkДТ.Cell(ii, OffsetCol+06, CellFontColor , coBlack);
         СекцWorkДТ.Cell(ii, OffsetCol+06, CellBgColor   , coTransparent);
         СекцWorkДТ.Cell(ii, OffsetCol+06, CellAlignment , Выравнивание(тСУМ_НП[ii]));
         СекцWorkДТ.Cell(ii, OffsetCol+06, CellBorder    , "1,1,1,1");
         СекцWorkДТ.Cell(ii, OffsetCol+06, CellWrap      , True);
         СекцWorkДТ.Cell(ii, OffsetCol+06, CellContents  , ЗаписатьСумму(тСУМ_НП[ii]));

         СекцWorkДТ.Cell(ii, OffsetCol+07, CellFontStyle , 0);
         СекцWorkДТ.Cell(ii, OffsetCol+07, CellFontSize  , 8);
         СекцWorkДТ.Cell(ii, OffsetCol+07, CellFontColor , coBlack);
         СекцWorkДТ.Cell(ii, OffsetCol+07, CellBgColor   , coTransparent);
         СекцWorkДТ.Cell(ii, OffsetCol+07, CellAlignment , Выравнивание(тСУМ_ОД[ii]));
         СекцWorkДТ.Cell(ii, OffsetCol+07, CellBorder    , "1,1,1,1");
         СекцWorkДТ.Cell(ii, OffsetCol+07, CellWrap      , True);
         СекцWorkДТ.Cell(ii, OffsetCol+07, CellContents  , ЗаписатьСумму(тСУМ_ОД[ii]));

         СекцWorkДТ.Cell(ii, OffsetCol+08, CellFontStyle , 0);
         СекцWorkДТ.Cell(ii, OffsetCol+08, CellFontSize  , 8);
         СекцWorkДТ.Cell(ii, OffsetCol+08, CellFontColor , coBlack);
         СекцWorkДТ.Cell(ii, OffsetCol+08, CellBgColor   , coTransparent);
         СекцWorkДТ.Cell(ii, OffsetCol+08, CellAlignment , Выравнивание(тСУМ_ОК[ii]));
         СекцWorkДТ.Cell(ii, OffsetCol+08, CellBorder    , "1,1,1,1");
         СекцWorkДТ.Cell(ii, OffsetCol+08, CellWrap      , True);
         СекцWorkДТ.Cell(ii, OffsetCol+08, CellContents  , ЗаписатьСумму(тСУМ_ОК[ii]));

         СекцWorkДТ.Cell(ii, OffsetCol+09, CellFontStyle , 0);
         СекцWorkДТ.Cell(ii, OffsetCol+09, CellFontSize  , 8);
         СекцWorkДТ.Cell(ii, OffsetCol+09, CellFontColor , coBlack);
         СекцWorkДТ.Cell(ii, OffsetCol+09, CellBgColor   , coTransparent);
         СекцWorkДТ.Cell(ii, OffsetCol+09, CellAlignment , Выравнивание(тСУМ_КП[ii]));
         СекцWorkДТ.Cell(ii, OffsetCol+09, CellBorder    , "1,1,1,1");
         СекцWorkДТ.Cell(ii, OffsetCol+09, CellWrap      , True);
         СекцWorkДТ.Cell(ii, OffsetCol+09, CellContents  , ЗаписатьСумму(тСУМ_КП[ii]));
       fi;
       КнопкаДетализации(ii);
     od;
   Finally
     CloseProgress;
     ToggleAutoRefresh(Режим);
   end;
 fi;
 ValidateОтчетSection;
 ^True;
end;

Func КоличествоСтолбцовТаблицы(vИерархия:String; vСубИтогиСчета:Logical; vРежимОтбора:Integer) :Integer;
var Value :String;
var max_kol :Integer;
 max_kol=5; -- СЧТ должен быть всегда + 4 колонки цифр
 Value=Up(vИерархия);
 if Pos("КБК", Value)>0: max_kol=max_kol+1; fi;
 if Pos("ИСТ", Value)>0: max_kol=max_kol+1; fi;
 if vСубИтогиСчета:
   if vРежимОтбора=1: max_kol=max_kol+1;
   |  vРежимОтбора>1: max_kol=max_kol+2;
   fi;
 fi;
 ^max_kol;
end;

Proc ВыделитьСловоЖирнымВстроке(objSheet:AutoObject; XX:Integer; YY:Integer; start:Integer; len:Integer);
var xlsRng, xlsCrt, xlsFnt :AutoObject;
 xlsRng=AsAutoObject(objSheet.Cells[XX, YY]);
 Try
   xlsCrt=AsAutoObject(xlsRng.Characters(start, len));
   Try
     xlsFnt=AsAutoObject(xlsCrt.Font);
     Try
       xlsFnt.Bold = True;
     Finally
       ClearVariable(xlsFnt);
     end;
   Finally
     ClearVariable(xlsCrt);
   end;
 Finally
   ClearVariable(xlsRng);
 end;
end;

Func iniExcelКолонки(vИерархия:String; vСубИтогиСчета:Logical; vДетализация:Integer; vКБК:Logical; vИСТ:Logical; xlsSheet:AutoObject; UserПоправкаExcel:Integer; offsetIter:Integer) :Logical;
var lenСЧ3, lenСЧ5, lenСЧ8, lenКБК, lenИСТ, lenНП, lenОД, lenОК, lenКП :Integer;
var max_kol, coltbl, ii, jj, num, xx, pp, ww :Integer;
var Value :String;
var Work :Logical;
 ShowProgress(4, "Экспорт в Excel. Настройка...");
 Try
   Work=False;
   if Trim(vИерархия)<>"":
     num=WordsCount(vИерархия, " ");
     if num>0: Work=True; fi;
   fi;
   if Work:
     ProgressPos(1);
     ClearVariable(Buf);
     Buf[1]=""; Buf[2]=""; Buf[3]=""; Buf[4]=""; Buf[5]="";
     max_kol=0;
     jj=0;
     for ii=1 to num do
       Value=ExtractWord(ii, vИерархия, " ");
       if Value="СЧТ":
         ww=1;
         max_kol=max_kol+1;
         if vСубИтогиСчета:
           if vДетализация=1:
             max_kol=max_kol+1;
             ww=ww+1;
             jj=jj+1; Try PutVariableS("Buf["+Str(jj)+"]", "тСЧТОТ3"); Except end;
             jj=jj+1; Try PutVariableS("Buf["+Str(jj)+"]", "тСЧТОТЧ"); Except end;
           |  vДетализация>1:
             max_kol=max_kol+2;
             ww=ww+2;
             jj=jj+1; Try PutVariableS("Buf["+Str(jj)+"]", "тСЧТОТ3"); Except end;
             jj=jj+1; Try PutVariableS("Buf["+Str(jj)+"]", "тСЧТОТ5"); Except end;
             jj=jj+1; Try PutVariableS("Buf["+Str(jj)+"]", "тСЧТОТЧ"); Except end;
           else
             jj=jj+1; Try PutVariableS("Buf["+Str(jj)+"]", "тСЧТОТЧ"); Except end;
           fi;
         else
           jj=jj+1; Try PutVariableS("Buf["+Str(jj)+"]", "тСЧТОТЧ"); Except end;
         fi;
       |  Value="ИСТ":
         max_kol=max_kol+1;
         jj=jj+1; Try PutVariableS("Buf["+Str(jj)+"]", "тИСТСЧТ"); Except end;
       |  Value="КБК":
         max_kol=max_kol+1;
         jj=jj+1; Try PutVariableS("Buf["+Str(jj)+"]", "тКБКСЧТ"); Except end;
       fi;
     od;
     ProgressPos(2);
     jj=0;
     for ii=1 to 5 do if Buf[ii]<>"": jj=jj+1; else Break; fi; od;
     if max_kol=jj: Work=True; else Work=False; fi;
     coltbl=max_kol+4;
     if Work:
       lenСЧ3=0; lenСЧ5=0; lenСЧ8=0; lenКБК=0; lenИСТ=0; lenНП=0; lenОД=0; lenОК=0; lenКП=0;
       if     vСубИтогиСчета and     vКБК and     vИСТ and vДетализация>1: lenСЧ3=070; lenСЧ5=110; lenСЧ8=170; lenКБК=350; lenИСТ=200; lenНП=250; lenОД=250; lenОК=250; lenКП=250; --070+110+170+350+200+250+250+250+250=1900
       |      vСубИтогиСчета and     vКБК and     vИСТ and vДетализация=1: lenСЧ3=090; lenСЧ5=0  ; lenСЧ8=220; lenКБК=350; lenИСТ=200; lenНП=260; lenОД=260; lenОК=260; lenКП=260; --090+0  +220+350+200+260+260+260+260=1900
       |  not vСубИтогиСчета and     vКБК and     vИСТ                   : lenСЧ3=0  ; lenСЧ5=0  ; lenСЧ8=290; lenКБК=360; lenИСТ=210; lenНП=260; lenОД=260; lenОК=260; lenКП=260; --0  +0  +290+360+210+260+260+260+260=1900
       |      vСубИтогиСчета and     vКБК and not vИСТ and vДетализация>1: lenСЧ3=100; lenСЧ5=150; lenСЧ8=250; lenКБК=360; lenИСТ=0  ; lenНП=260; lenОД=260; lenОК=260; lenКП=260; --100+150+250+360+0  +260+260+260+260=1900
       |      vСубИтогиСчета and     vКБК and not vИСТ and vДетализация=1: lenСЧ3=100; lenСЧ5=0  ; lenСЧ8=250; lenКБК=370; lenИСТ=0  ; lenНП=300; lenОД=290; lenОК=290; lenКП=300; --100+0  +250+370+0  +300+290+290+300=1900
       |  not vСубИтогиСчета and     vКБК and not vИСТ                   : lenСЧ3=0  ; lenСЧ5=0  ; lenСЧ8=350; lenКБК=370; lenИСТ=0  ; lenНП=300; lenОД=290; lenОК=290; lenКП=300; --0  +0  +350+370+0  +300+290+290+300=1900
       |      vСубИтогиСчета and not vКБК and     vИСТ and vДетализация>1: lenСЧ3=120; lenСЧ5=180; lenСЧ8=300; lenКБК=0  ; lenИСТ=220; lenНП=270; lenОД=270; lenОК=270; lenКП=270; --120+180+300+0  +220+270+270+270+270=1900
       |      vСубИтогиСчета and not vКБК and     vИСТ and vДетализация=1: lenСЧ3=130; lenСЧ5=0  ; lenСЧ8=325; lenКБК=0  ; lenИСТ=245; lenНП=300; lenОД=300; lenОК=300; lenКП=300; --130+0  +325+0  +245+300+300+300+300=1900
       |  not vСубИтогиСчета and not vКБК and     vИСТ                   : lenСЧ3=0  ; lenСЧ5=0  ; lenСЧ8=455; lenКБК=0  ; lenИСТ=245; lenНП=300; lenОД=300; lenОК=300; lenКП=300; --0  +0  +455+0  +245+300+300+300+300=1900
       |      vСубИтогиСчета and not vКБК and not vИСТ and vДетализация>1: lenСЧ3=140; lenСЧ5=210; lenСЧ8=350; lenКБК=0  ; lenИСТ=0  ; lenНП=300; lenОД=300; lenОК=300; lenКП=300; --140+210+350+0  +0  +300+300+300+300=1900
       |      vСубИтогиСчета and not vКБК and not vИСТ and vДетализация=1: lenСЧ3=200; lenСЧ5=0  ; lenСЧ8=500; lenКБК=0  ; lenИСТ=0  ; lenНП=300; lenОД=300; lenОК=300; lenКП=300; --200+0  +500+0  +0  +300+300+300+300=1900
       |  not vСубИтогиСчета and not vКБК and not vИСТ                   : lenСЧ3=0  ; lenСЧ5=0  ; lenСЧ8=700; lenКБК=0  ; lenИСТ=0  ; lenНП=300; lenОД=300; lenОК=300; lenКП=300; --0  +0  +700+0  +0  +300+300+300+300=1900
       fi;
       ProgressPos(3);
       ClearVariable(BufInt); -- ширина столбца
       ClearVariable(BufStr); -- наименование столбца
       pp=0;
       for ii=1 to max_kol do
         if Buf[ii]="тСЧТОТ3": BufInt[ii]=lenСЧ3; if pp=0: pp=ii; BufStr[ii]="Счет"; fi;
         |  Buf[ii]="тСЧТОТ5": BufInt[ii]=lenСЧ5; if pp=0: pp=ii; BufStr[ii]="Счет"; fi;
         |  Buf[ii]="тСЧТОТЧ": BufInt[ii]=lenСЧ8; if pp=0: pp=ii; BufStr[ii]="Счет"; fi;
         |  Buf[ii]="тИСТСЧТ": BufInt[ii]=lenИСТ; BufStr[ii]="Источник"+Chr(10)+"средств";
         |  Buf[ii]="тКБКСЧТ": BufInt[ii]=lenКБК; BufStr[ii]="КБК";
         fi;
       od;
       xx=5-max_kol;
       if xx>0: jj=LengthOfArray(BufInt); for ii=1 to xx do BufInt[jj+ii]=0; BufStr[jj+ii]=""; od; fi; -- скрытые столбцы
       jj=LengthOfArray(BufInt);
       BufInt[jj+1]=lenНП; BufStr[jj+1]=РАБ.EXCEL.УбратьEnter(ЗагОстНП)+Chr(10)+"(остаток на"+Chr(10)+"начало"+Chr(10)+"периода)";
       BufInt[jj+2]=lenОД; BufStr[jj+2]="";
       BufInt[jj+3]=lenОК; BufStr[jj+3]="";
       BufInt[jj+4]=lenКП; BufStr[jj+4]=РАБ.EXCEL.УбратьEnter(ЗагОстКП)+Chr(10)+"(остаток на"+Chr(10)+"конец"+Chr(10)+"периода)";
       ProgressPos(4);
       -- формирование ширины столбцов таблицы и ее видимости
       num=LengthOfArray(BufInt);
       if num>0:
         jj=0;
         ShowProgress(num, "Экспорт в Excel. Настройка ширины столбцов...");
         for ii=1 to num do
           ProgressPos(ii);
           if BufInt[ii]>0:
             jj=jj+1;
             РАБ.Excel.УстановитьШиринуСтолбцаММAvg(xlsSheet, jj, BufInt[ii]/10, coltbl, UserПоправкаExcel);
             if BufStr[ii]<>"":
               РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetIter, jj, BufStr[ii]);
               РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetIter, jj, offsetIter+1, jj);
               РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetIter, jj, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, РАБ.УПП.LIB.Цвет(192, 192, 192), False);
             fi;
           fi;
         od;
         ShowProgress(6, "Экспорт в Excel. Форматирование столбцов...");
         ProgressPos(1);
         РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetIter+1, jj-2, "оборот"+Chr(10)+"по ДЕБЕТУ");
         РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetIter+1, jj-2, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, РАБ.УПП.LIB.Цвет(192, 192, 192), False);
         ProgressPos(2);
         РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetIter+1, jj-1, "оборот"+Chr(10)+"по КРЕДИТУ");
         РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetIter+1, jj-1, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, РАБ.УПП.LIB.Цвет(192, 192, 192), False);
         ProgressPos(3);
         ВыделитьСловоЖирнымВстроке(xlsSheet, offsetIter, jj-3, 1, Length(ЗагОстНП));
         ВыделитьСловоЖирнымВстроке(xlsSheet, offsetIter, jj  , 1, Length(ЗагОстКП));
         ProgressPos(4);
         if ww>1 and pp>0: РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetIter, pp, offsetIter+1, pp+ww-1); fi;
         ProgressPos(5);
         РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, offsetIter, jj-2, РАБ.EXCEL.ЗаменитьEnter(ЗагОборот));
         РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, offsetIter, jj-2, offsetIter, jj-1);
         РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, offsetIter, jj-2, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, True, False, РАБ.УПП.LIB.Цвет(192, 192, 192), False);
         ProgressPos(6);
         РАБ.EXCEL.УстановитьВсеГраницыДиапазонаИвнутри(xlsSheet, offsetIter, 1, offsetIter+1, jj, True, True, True, True, True, True, False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);
       fi;
     else
       Message("Ошибка инициализации размерностей колонок...", mtError);
       ^False;
     fi;
   else
     Message("Ошибка инициализации размерностей колонок^M(считывание иерархии)...", mtError);
     ^False;
   fi;
 Finally
   CloseProgress;
 end;
 ^True;
end;

Proc УстановитьНастройкиПринтера(objApp:AutoObject; objSheet:AutoObject; flgRusExcel:Logical; Альбомная:Logical; СквозныеСтроки:String; НаправлениеПечати:Integer);
var xlsRng :AutoObject;
var valNum :Numeric;
 xlsRng=AsAutoObject(objSheet.PageSetup);
 Try
   xlsRng.Orientation = if(Альбомная, РАБ.EXCEL.xlLandscape, РАБ.EXCEL.xlPortrait);
   if not Trim(СквозныеСтроки)="": xlsRng.PrintTitleRows = СквозныеСтроки; fi;
   xlsRng.CenterHorizontally = True;
   xlsRng.BlackAndWhite = True;
   xlsRng.Order = НаправлениеПечати;
   xlsRng.Zoom = 100;
   if flgRusExcel:
     xlsRng.LeftHeader  = '&"Arial,обычный"&7'+TimeCreationRep;
     xlsRng.RightFooter = '&"Arial,полужирный"&8Страница &С из &К';
   else
     xlsRng.LeftHeader  = '&"Arial,normal"&7'+TimeCreationRep;
     xlsRng.RightFooter = '&"Arial,bold"&8Страница &P из &N';
   fi;
   valNum=asReal(objApp.InchesToPoints[0.393700787401575]);
   xlsRng.LeftMargin   = valNum;
   xlsRng.RightMargin  = valNum;
   xlsRng.TopMargin    = valNum;
   xlsRng.BottomMargin = valNum;
   valNum=asReal(objApp.InchesToPoints[0.196850393700787]);
   xlsRng.HeaderMargin = valNum;
   xlsRng.FooterMargin = valNum;
 Finally
   ClearVariable(xlsRng);
 end;
end;

Func КолСтолбцовДляОбъединенияШапки(objSheet:AutoObject; maxCol:Integer) :Integer;
var xlsColumn :AutoObject;
var res, len, num, ii :Integer;
var Value :String;
var ww, sum_ww :Numeric;
 res=0;
 sum_ww=0.00;
 num=maxCol-4;
 if num>0:
   Value="Структурное подразделение";
   len=Length(Value);
   for ii=1 to num do
     xlsColumn=AsAutoObject(objSheet.Columns[ii]);
     Try
       ww = AsReal(xlsColumn.ColumnWidth);
       sum_ww=sum_ww+ww;
       res=res+1;
     Finally
       ClearVariable(xlsColumn);
     end;
     if sum_ww>=len: Break; fi;
   od;
 fi;
 ^res;
end;

Proc ЭкспортВедомости_Excel;
var xlsApp, xlsBooks, xlsBook, xlsSheets, xlsSheet, xlsRng :AutoObject;
var Iter, offIter, kolTable, ColorH1, ColorH2, ColorH3, ColorH4, num, ii, max_kol, maxHdr :Integer;
var rusExcel, Work, Head, newHd1, newHd2, newHd3, newHd4 :Logical;
var localTS, localDS, SrtHead1, SrtHead2, SrtHead3, SrtHead4, RepHead1, RepHead2, RepHead3, RepHead4 :String;

 xlsApp=CreateAutoObject('Excel.Application');
 Try
   ShowProgress(3, "Подготовка...");
   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
           num=0;
           ProgressPos(1);
           ФормированиеЦветовЗаголовков(flgСхемаЦветов);
           ColorH1=BufInt[1];
           ColorH2=BufInt[2];
           ColorH3=BufInt[3];
           ColorH4=BufInt[4];
           xlsSheets=AsAutoObject(xlsBook.Sheets);
           Try
             max_kol=asInteger(xlsSheets.Count);
             if max_kol>num:
               num=num+1;
               xlsSheet=AsAutoObject(xlsBook.Worksheets[num]);
             else
               xlsSheet=AsAutoObject(xlsSheets.Add);
             fi;
             -- НАЧАЛО ЭКСПОРТА
             Try
               xlsSheet.Name = "Ведомость"; -- ограничение на количество символов - должно быть меньше 32 символов
               ProgressPos(2);
               kolTable=КоличествоСтолбцовТаблицы(Иерархия, flgИтогПоУровню, MskAccUse);
               maxHdr=kolTable-5;
               if flgСлужИнф: offIter=13; else offIter=10; fi;
               ProgressPos(3);
               -- ...инициализируем колонки таблицы
               -- Пишем заголовки таблицы
               if ПоправкаExcel<1: ПоправкаExcel=1; fi;
               Work=iniExcelКолонки(Иерархия, flgИтогПоУровню, MskAccUse, flgКБК, flgИСТ, xlsSheet, ПоправкаExcel, offIter);
               if not Work:
                 xlsBook.Close(False); -- закрыть книгу без сохранения
                 Exit;
               fi;
               ShowProgress(11, "Экспорт в Excel. 'Шапка' ведомости...");
               -- Пишем настройки принтера
               ProgressPos(1);
               УстановитьНастройкиПринтера(xlsApp, xlsSheet, rusExcel, False, "$"+Str(offIter)+":$"+Str(offIter+1), РАБ.EXCEL.xlDownThenOver);
               -- Пишем служебную информацию оборотки
               ProgressPos(2);
               if flgСлужИнф:
                 РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, 1, kolTable, СлужИнфоСЧТ);
                 РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, 1, kolTable, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, False, "Arial", 6, 0, True, False, False, 0, True);
                 РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, 2, kolTable, СлужИнфоКБК);
                 РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, 2, kolTable, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, False, "Arial", 6, 0, True, False, False, 0, True);
                 РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, 3, kolTable, СлужИнфоАНА);
                 РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, 3, kolTable, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, False, "Arial", 6, 0, True, False, False, 0, True);
                 --
                 xlsRng=AsAutoObject(xlsSheet.Rows["1:3"]);
                 Try
                   xlsRng.RowHeight = 10;
                 Finally
                   ClearVariable(xlsRng);
                 end;
               fi;
               -- Пишем заголовок оборотки
               ProgressPos(3);
               Iter=offIter-9;
               РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, Iter, 1, "ОБОРОТНАЯ ВЕДОМОСТЬ ПО СИНТЕТИЧЕСКИМ СЧЕТАМ");
               РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, Iter, 1, Iter, kolTable);
               РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, 1, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, False, "Courier New", 14, 0, True, True, False, 0, True);
               -- Пишем шапку таблицы
               ProgressPos(4);
               Iter=offIter-8;
               РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, Iter, kolTable, "КОДЫ");
               РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, kolTable, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, False, "Times New Roman", 10, 0, True, False, False, 0, True);
               РАБ.EXCEL.УстановитьВсеГраницыОднойЯчейки(xlsSheet, Iter, kolTable, True, True, True, True, False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);
               ProgressPos(5);
               Iter=offIter-7;
               РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, Iter, 1, отчПерТит);
               РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, Iter, 1, Iter, kolTable-2);
               РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, 1, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, False, "Arial", 10, 0, True, False, True, 0, True);
               РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, Iter, kolTable-1, "Форма по ОКУД ");
               РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, kolTable-1, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, False, "Arial", 7, 0, True, False, False, 0, True);
               РАБ.EXCEL.УстановитьВсеГраницыОднойЯчейки(xlsSheet, Iter, kolTable, True, True, True, False, False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlMedium);
               ProgressPos(6);
               Iter=offIter-6;
               РАБ.EXCEL.УстановитьВсеГраницыОднойЯчейки(xlsSheet, Iter, kolTable, True, False, True, False, False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlMedium);
               РАБ.EXCEL.УстановитьГраницуОднойЯчейки(xlsSheet, Iter, kolTable, РАБ.EXCEL.xlEdgeBottom, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);
               xlsRng=AsAutoObject(xlsSheet.Rows[Str(Iter)+":"+Str(Iter)]);
               Try
                 xlsRng.RowHeight = 10;
               Finally
                 ClearVariable(xlsRng);
               end;
               ProgressPos(7);
               Iter=offIter-5;
               РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, Iter, 1, УЧР_ИМЯ);
               РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, Iter, 1, Iter, kolTable-2);
               РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, 1, РАБ.EXCEL.xlLeft, 0, РАБ.EXCEL.xlCenter, False, "Arial", 8, 0, True, True, False, 0, True);
               РАБ.EXCEL.УстановитьВсеГраницыДиапазона(xlsSheet, Iter, 1, Iter,  kolTable-2, False, False, False, True, False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);
               РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, Iter, kolTable-1, "по ОКПО ");
               РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, kolTable-1, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, False, "Arial", 7, 0, True, False, False, 0, True);
               РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, Iter, kolTable, УЧР_ОКПО);
               РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, kolTable, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, False, "Arial", 8, 0, True, False, False, 0, True);
               РАБ.EXCEL.УстановитьВсеГраницыОднойЯчейки(xlsSheet, Iter, kolTable, True, False, True, False, False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlMedium);
               ProgressPos(8);
               Iter=offIter-4;
               РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, Iter, 1, "учреждение");
               РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, Iter, 1, Iter, kolTable-2);
               РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, 1, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, False, "Arial", 6, 0, True, False, False, 0, True);
               --РАБ.EXCEL.НадстрочноеНачертаниеДиапазона(xlsSheet, Iter, 1, Iter, kolTable-2, True);
               РАБ.EXCEL.УстановитьВсеГраницыОднойЯчейки(xlsSheet, Iter, kolTable, True, False, True, False, False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlMedium);
               РАБ.EXCEL.УстановитьГраницуОднойЯчейки(xlsSheet, Iter, kolTable, РАБ.EXCEL.xlEdgeBottom, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);
               ProgressPos(9);
               Iter=offIter-3;
               РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, Iter, 1, ПОД_ИМЯ);
               РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, Iter, 1, Iter, kolTable-2);
               РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, 1, РАБ.EXCEL.xlLeft, 0, РАБ.EXCEL.xlCenter, False, "Arial", 8, 0, True, True, False, 0, True);
               РАБ.EXCEL.УстановитьВсеГраницыДиапазона(xlsSheet, Iter, 1, Iter,  kolTable-2, False, False, False, True, False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);
               РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, Iter, kolTable, ПОД_КОД);
               РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, kolTable, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, False, "Arial", 8, 0, True, False, False, 0, True);
               РАБ.EXCEL.УстановитьВсеГраницыОднойЯчейки(xlsSheet, Iter, kolTable, True, False, True, False, False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlMedium);
               ProgressPos(10);
               Iter=offIter-2;
               РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, Iter, 1, "структурное подразделение");
               РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, Iter, 1, Iter, kolTable-2);
               РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, 1, РАБ.EXCEL.xlCenter, 0, РАБ.EXCEL.xlCenter, False, "Arial", 6, 0, True, False, False, 0, True);
               --РАБ.EXCEL.НадстрочноеНачертаниеДиапазона(xlsSheet, Iter, 1, Iter, kolTable-2, True);
               РАБ.EXCEL.УстановитьВсеГраницыОднойЯчейки(xlsSheet, Iter, kolTable, True, False, True, True, False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlMedium);
               ProgressPos(11);
               -- Пишем данные таблицы
               num=LengthOfArray(тSRTFLD);
               if num>0:
                 ShowProgress(num, "Экспорт в Excel. Таблица ведомости...");
                 SrtHead1="";
                 SrtHead2="";
                 SrtHead3="";
                 SrtHead4="";
                 Iter=offIter+1;
                 for ii=1 to num do
                   Iter=Iter+1;
                   ProgressPos(ii);
                   newHd1=False; newHd2=False; newHd3=False; newHd4=False;
                   RepHead1=тVALH01[ii];
                   RepHead2=тVALH02[ii];
                   RepHead3=тVALH03[ii];
                   RepHead4=тVALH04[ii];
                   if RepHead1="яъ>": RepHead1="без группировки"; fi;
                   if RepHead2="яъ>": RepHead2="без группировки"; fi;
                   if RepHead3="яъ>": RepHead3="без группировки"; fi;
                   if RepHead4="яъ>": RepHead4="без группировки"; fi;
                   Head=if(тСУБИТГ[ii]="", False, True);
                   if Head: -- если это субитоги
                     Work=False;
                     if not Work: if SrtHead1<>RepHead1 and RepHead1<>""      and RepHead2=""       and RepHead3=""       and RepHead4=""  : SrtHead1=RepHead1; SrtHead2="";       SrtHead3="";       SrtHead4="";       newHd1=True;  newHd2=False; newHd3=False; newHd4=False; Work=True; fi; fi;
                     if not Work: if SrtHead2<>RepHead2 and RepHead1=SrtHead1 and RepHead2<>""      and RepHead3=""       and RepHead4=""  :                    SrtHead2=RepHead2; SrtHead3="";       SrtHead4="";       newHd1=False; newHd2=True;  newHd3=False; newHd4=False; Work=True; fi; fi;
                     if not Work: if SrtHead3<>RepHead3 and RepHead1=SrtHead1 and RepHead2=SrtHead2 and RepHead3<>""      and RepHead4=""  :                                       SrtHead3=RepHead3; SrtHead4="";       newHd1=False; newHd2=False; newHd3=True;  newHd4=False; Work=True; fi; fi;
                     if not Work: if SrtHead4<>RepHead4 and RepHead1=SrtHead1 and RepHead2=SrtHead2 and RepHead3=SrtHead3 and RepHead4<>"" :                                                          SrtHead4=RepHead4; newHd1=False; newHd2=False; newHd3=False; newHd4=True;  Work=True; fi; fi;
                     if not Work:
                       Message("Ошибка при считывании данных для построении отчета!", mtError);
                       xlsBook.Close(False); -- закрыть книгу без сохранения
                       Exit;
                     fi;
                     if Work and newHd1 and maxHdr>0:
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, Iter, 01, SrtHead1);
                       РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, Iter, 01, Iter, maxHdr+1);
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, 01, РАБ.EXCEL.xlLeft, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, True, False, ColorH1, False);
                       if flgРазрешИмена: РАБ.EXCEL.УстановитьКомментДляЯчеки(xlsSheet, Iter, 01, РАБ.EXCEL.ЗаменитьEnter(тNAMH01[ii])); fi;
                       РАБ.EXCEL.УстановитьВсеГраницыДиапазона(xlsSheet, Iter, 01, Iter, maxHdr+1, True, True, True, False, False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);
                       --
                       РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, Iter, kolTable-3, тСУМ_НП[ii], localDS, localTS);
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, kolTable-3, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, ColorH1, False);
                       РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, Iter, kolTable-2, тСУМ_ОД[ii], localDS, localTS);
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, kolTable-2, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, ColorH1, False);
                       РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, Iter, kolTable-1, тСУМ_ОК[ii], localDS, localTS);
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, kolTable-1, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, ColorH1, False);
                       РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, Iter, kolTable-0, тСУМ_КП[ii], localDS, localTS);
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, kolTable-0, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, ColorH1, False);
                       РАБ.EXCEL.УстановитьВсеГраницыДиапазонаИвнутри(xlsSheet, Iter, kolTable-3, Iter, kolTable, True, True, True, True, True, False, False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);
                     fi;
                     if Work and newHd2 and maxHdr>1:
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, Iter, 02, SrtHead2);
                       РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, Iter, 02, Iter, maxHdr+1);
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, 01, РАБ.EXCEL.xlLeft, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, True, False, ColorH1, False);
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, 02, РАБ.EXCEL.xlLeft, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, True, False, ColorH2, False);
                       if flgРазрешИмена: РАБ.EXCEL.УстановитьКомментДляЯчеки(xlsSheet, Iter, 02, РАБ.EXCEL.ЗаменитьEnter(тNAMH02[ii])); fi;
                       РАБ.EXCEL.УстановитьВсеГраницыДиапазона(xlsSheet, Iter, 01, Iter, 01,       True, False, True, False, False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);
                       РАБ.EXCEL.УстановитьВсеГраницыДиапазона(xlsSheet, Iter, 02, Iter, maxHdr+1, True, True,  True, False, False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);
                       --
                       РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, Iter, kolTable-3, тСУМ_НП[ii], localDS, localTS);
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, kolTable-3, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, ColorH2, False);
                       РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, Iter, kolTable-2, тСУМ_ОД[ii], localDS, localTS);
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, kolTable-2, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, ColorH2, False);
                       РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, Iter, kolTable-1, тСУМ_ОК[ii], localDS, localTS);
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, kolTable-1, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, ColorH2, False);
                       РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, Iter, kolTable-0, тСУМ_КП[ii], localDS, localTS);
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, kolTable-0, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, ColorH2, False);
                       РАБ.EXCEL.УстановитьВсеГраницыДиапазонаИвнутри(xlsSheet, Iter, kolTable-3, Iter, kolTable, True, True, True, True, True, False, False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);
                     fi;
                     if Work and newHd3 and maxHdr>2:
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, Iter, 03, SrtHead3);
                       РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, Iter, 03, Iter, maxHdr+1);
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, 01, РАБ.EXCEL.xlLeft, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, True, False, ColorH1, False);
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, 02, РАБ.EXCEL.xlLeft, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, True, False, ColorH2, False);
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, 03, РАБ.EXCEL.xlLeft, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, True, False, ColorH3, False);
                       if flgРазрешИмена: РАБ.EXCEL.УстановитьКомментДляЯчеки(xlsSheet, Iter, 03, РАБ.EXCEL.ЗаменитьEnter(тNAMH03[ii])); fi;
                       РАБ.EXCEL.УстановитьВсеГраницыДиапазона(xlsSheet, Iter, 01, Iter, 01,       True, False, True, False, False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);
                       РАБ.EXCEL.УстановитьВсеГраницыДиапазона(xlsSheet, Iter, 02, Iter, 02,       True, False, True, False, False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);
                       РАБ.EXCEL.УстановитьВсеГраницыДиапазона(xlsSheet, Iter, 03, Iter, maxHdr+1, True, True,  True, False, False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);
                       --
                       РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, Iter, kolTable-3, тСУМ_НП[ii], localDS, localTS);
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, kolTable-3, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, ColorH3, False);
                       РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, Iter, kolTable-2, тСУМ_ОД[ii], localDS, localTS);
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, kolTable-2, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, ColorH3, False);
                       РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, Iter, kolTable-1, тСУМ_ОК[ii], localDS, localTS);
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, kolTable-1, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, ColorH3, False);
                       РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, Iter, kolTable-0, тСУМ_КП[ii], localDS, localTS);
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, kolTable-0, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, ColorH3, False);
                       РАБ.EXCEL.УстановитьВсеГраницыДиапазонаИвнутри(xlsSheet, Iter, kolTable-3, Iter, kolTable, True, True, True, True, True, False, False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);
                     fi;
                     if Work and newHd4 and maxHdr>3:
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, Iter, 04, SrtHead4);
                       РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, Iter, 04, Iter, maxHdr+1);
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, 01, РАБ.EXCEL.xlLeft, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, True, False, ColorH1, False);
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, 02, РАБ.EXCEL.xlLeft, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, True, False, ColorH2, False);
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, 03, РАБ.EXCEL.xlLeft, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, True, False, ColorH3, False);
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, 04, РАБ.EXCEL.xlLeft, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, True, False, ColorH4, False);
                       if flgРазрешИмена: РАБ.EXCEL.УстановитьКомментДляЯчеки(xlsSheet, Iter, 04, РАБ.EXCEL.ЗаменитьEnter(тNAMH04[ii])); fi;
                       РАБ.EXCEL.УстановитьВсеГраницыДиапазона(xlsSheet, Iter, 01, Iter, 01,       True, False, True, False, False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);
                       РАБ.EXCEL.УстановитьВсеГраницыДиапазона(xlsSheet, Iter, 02, Iter, 02,       True, False, True, False, False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);
                       РАБ.EXCEL.УстановитьВсеГраницыДиапазона(xlsSheet, Iter, 03, Iter, 03,       True, False, True, False, False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);
                       РАБ.EXCEL.УстановитьВсеГраницыДиапазона(xlsSheet, Iter, 04, Iter, maxHdr+1, True, True,  True, False, False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);
                       --
                       РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, Iter, kolTable-3, тСУМ_НП[ii], localDS, localTS);
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, kolTable-3, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, ColorH4, False);
                       РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, Iter, kolTable-2, тСУМ_ОД[ii], localDS, localTS);
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, kolTable-2, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, ColorH4, False);
                       РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, Iter, kolTable-1, тСУМ_ОК[ii], localDS, localTS);
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, kolTable-1, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, ColorH4, False);
                       РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, Iter, kolTable-0, тСУМ_КП[ii], localDS, localTS);
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, kolTable-0, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, ColorH4, False);
                       РАБ.EXCEL.УстановитьВсеГраницыДиапазонаИвнутри(xlsSheet, Iter, kolTable-3, Iter, kolTable, True, True, True, True, True, False, False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);
                     fi;
                   else -- если это строка данных
                     РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, Iter, 01, if(maxHdr=0, тVALDAT[ii], ""));
                     РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, 01, РАБ.EXCEL.xlLeft, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, if(maxHdr=0, 0, ColorH1), if(maxHdr=0, True, False));
                     if flgРазрешИмена and maxHdr=0: РАБ.EXCEL.УстановитьКомментДляЯчеки(xlsSheet, Iter, 01, РАБ.EXCEL.ЗаменитьEnter(тNAMDAT[ii])); fi;
                     РАБ.EXCEL.УстановитьВсеГраницыДиапазона(xlsSheet, Iter, 01, Iter, 01, True, if(maxHdr=0, True, False), True, if(maxHdr=0, True, False), False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);
                     if maxHdr>0:
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, Iter, 02, if(maxHdr=1, тVALDAT[ii], ""));
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, 02, РАБ.EXCEL.xlLeft, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, if(maxHdr=1, 0, ColorH2), if(maxHdr=1, True, False));
                       if flgРазрешИмена and maxHdr=1: РАБ.EXCEL.УстановитьКомментДляЯчеки(xlsSheet, Iter, 02, РАБ.EXCEL.ЗаменитьEnter(тNAMDAT[ii])); fi;
                       РАБ.EXCEL.УстановитьВсеГраницыДиапазона(xlsSheet, Iter, 02, Iter, 02, True, if(maxHdr=1, True, False), True, if(maxHdr=1, True, False), False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);
                     fi;
                     if maxHdr>1:
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, Iter, 03, if(maxHdr=2, тVALDAT[ii], ""));
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, 03, РАБ.EXCEL.xlLeft, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, if(maxHdr=2, 0, ColorH3), if(maxHdr=2, True, False));
                       if flgРазрешИмена and maxHdr=2: РАБ.EXCEL.УстановитьКомментДляЯчеки(xlsSheet, Iter, 03, РАБ.EXCEL.ЗаменитьEnter(тNAMDAT[ii])); fi;
                       РАБ.EXCEL.УстановитьВсеГраницыДиапазона(xlsSheet, Iter, 03, Iter, 03, True, if(maxHdr=2, True, False), True, if(maxHdr=2, True, False), False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);
                     fi;
                     if maxHdr>2:
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, Iter, 04, if(maxHdr=3, тVALDAT[ii], ""));
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, 04, РАБ.EXCEL.xlLeft, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, if(maxHdr=3, 0, ColorH4), if(maxHdr=3, True, False));
                       if flgРазрешИмена and maxHdr=3: РАБ.EXCEL.УстановитьКомментДляЯчеки(xlsSheet, Iter, 04, РАБ.EXCEL.ЗаменитьEnter(тNAMDAT[ii])); fi;
                       РАБ.EXCEL.УстановитьВсеГраницыДиапазона(xlsSheet, Iter, 04, Iter, 04, True, if(maxHdr=3, True, False), True, if(maxHdr=3, True, False), False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);
                     fi;
                     if maxHdr>3:
                       РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, Iter, 05, тVALDAT[ii]);
                       РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, 05, РАБ.EXCEL.xlLeft, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, 0, True);
                       if flgРазрешИмена and maxHdr=4: РАБ.EXCEL.УстановитьКомментДляЯчеки(xlsSheet, Iter, 05, РАБ.EXCEL.ЗаменитьEnter(тNAMDAT[ii])); fi;
                       РАБ.EXCEL.УстановитьВсеГраницыДиапазона(xlsSheet, Iter, 05, Iter, 05, True, True, True, True, False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);
                     fi;
                     --
                     РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, Iter, kolTable-3, тСУМ_НП[ii], localDS, localTS);
                     РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, kolTable-3, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, 0, True);
                     РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, Iter, kolTable-2, тСУМ_ОД[ii], localDS, localTS);
                     РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, kolTable-2, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, 0, True);
                     РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, Iter, kolTable-1, тСУМ_ОК[ii], localDS, localTS);
                     РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, kolTable-1, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, 0, True);
                     РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, Iter, kolTable-0, тСУМ_КП[ii], localDS, localTS);
                     РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, kolTable-0, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, 0, True);
                     РАБ.EXCEL.УстановитьВсеГраницыДиапазонаИвнутри(xlsSheet, Iter, kolTable-3, Iter, kolTable, True, True, True, True, True, False, False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);
                   fi;
                 od;
                 xlsRng=AsAutoObject(xlsSheet.Rows[Str(offIter+1)+":"+Str(Iter)]);
                 Try
                   xlsRng.AutoFit;
                 Finally
                   ClearVariable(xlsRng);
                 end;
                 -- Записываем итог таблицы
                 ShowProgress(6, "Экспорт в Excel. Итоги ведомости...");
                 ProgressPos(1);
                 Iter=Iter+1;
                 РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, Iter, 1, "И Т О Г О по ведомости:");
                 РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, Iter, 01, Iter, maxHdr+1);
                 РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, 1, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, True, False, РАБ.УПП.LIB.Цвет(192, 192, 192), False);
                 РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, Iter, kolTable-3, итгНП, localDS, localTS);
                 РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, kolTable-3, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, True, False, РАБ.УПП.LIB.Цвет(192, 192, 192), False);
                 РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, Iter, kolTable-2, итгОД, localDS, localTS);
                 РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, kolTable-2, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, True, False, РАБ.УПП.LIB.Цвет(192, 192, 192), False);
                 РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, Iter, kolTable-1, итгОК, localDS, localTS);
                 РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, kolTable-1, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, True, False, РАБ.УПП.LIB.Цвет(192, 192, 192), False);
                 РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, Iter, kolTable-0, итгКП, localDS, localTS);
                 РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, kolTable-0, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, True, False, РАБ.УПП.LIB.Цвет(192, 192, 192), False);
                 ProgressPos(2);
                 Iter=Iter+1;
                 РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, Iter, 1, "в том числе,");
                 РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, Iter, 01, Iter, maxHdr+1);
                 РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, 1, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, True, False, РАБ.УПП.LIB.Цвет(192, 192, 192), False);
                 РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, Iter, kolTable-3, Iter, kolTable);
                 РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, kolTable-3, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, True, False, РАБ.УПП.LIB.Цвет(192, 192, 192), False);
                 ProgressPos(3);
                 Iter=Iter+1;
                 РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, Iter, 1, "по балансовым счетам:");
                 РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, Iter, 01, Iter, maxHdr+1);
                 РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, 1, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, РАБ.УПП.LIB.Цвет(192, 192, 192), False);
                 РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, Iter, kolTable-3, B_итгНП, localDS, localTS);
                 РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, kolTable-3, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, РАБ.УПП.LIB.Цвет(192, 192, 192), False);
                 РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, Iter, kolTable-2, B_итгОД, localDS, localTS);
                 РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, kolTable-2, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, РАБ.УПП.LIB.Цвет(192, 192, 192), False);
                 РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, Iter, kolTable-1, B_итгОК, localDS, localTS);
                 РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, kolTable-1, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, РАБ.УПП.LIB.Цвет(192, 192, 192), False);
                 РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, Iter, kolTable-0, B_итгКП, localDS, localTS);
                 РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, kolTable-0, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, РАБ.УПП.LIB.Цвет(192, 192, 192), False);
                 ProgressPos(4);
                 Iter=Iter+1;
                 РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, Iter, 1, "по забалансовым счетам:");
                 РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, Iter, 01, Iter, maxHdr+1);
                 РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, 1, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, РАБ.УПП.LIB.Цвет(192, 192, 192), False);
                 РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, Iter, kolTable-3, Z_итгНП, localDS, localTS);
                 РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, kolTable-3, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, РАБ.УПП.LIB.Цвет(192, 192, 192), False);
                 РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, Iter, kolTable-2, Z_итгОД, localDS, localTS);
                 РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, kolTable-2, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, РАБ.УПП.LIB.Цвет(192, 192, 192), False);
                 РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, Iter, kolTable-1, Z_итгОК, localDS, localTS);
                 РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, kolTable-1, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, РАБ.УПП.LIB.Цвет(192, 192, 192), False);
                 РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, Iter, kolTable-0, Z_итгКП, localDS, localTS);
                 РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, kolTable-0, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, РАБ.УПП.LIB.Цвет(192, 192, 192), False);
                 ProgressPos(5);
                 Iter=Iter+1;
                 РАБ.EXCEL.ЗаписатьЯчейкуТекст(xlsSheet, Iter, 1, "по вспомогательным счетам:");
                 РАБ.EXCEL.ОбъединитьЯчейкиДиапазона(xlsSheet, Iter, 01, Iter, maxHdr+1);
                 РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, 1, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, РАБ.УПП.LIB.Цвет(192, 192, 192), False);
                 РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, Iter, kolTable-3, V_итгНП, localDS, localTS);
                 РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, kolTable-3, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, РАБ.УПП.LIB.Цвет(192, 192, 192), False);
                 РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, Iter, kolTable-2, V_итгОД, localDS, localTS);
                 РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, kolTable-2, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, РАБ.УПП.LIB.Цвет(192, 192, 192), False);
                 РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, Iter, kolTable-1, V_итгОК, localDS, localTS);
                 РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, kolTable-1, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, РАБ.УПП.LIB.Цвет(192, 192, 192), False);
                 РАБ.EXCEL.ЗаписатьЯчейкуЧисло(xlsSheet, Iter, kolTable-0, V_итгКП, localDS, localTS);
                 РАБ.EXCEL.ФорматироватьЯчейку(xlsSheet, Iter, kolTable-0, РАБ.EXCEL.xlRight, 0, РАБ.EXCEL.xlCenter, True, "Arial", 8, 0, True, False, False, РАБ.УПП.LIB.Цвет(192, 192, 192), False);
                 --
                 ProgressPos(6);
                 РАБ.EXCEL.УстановитьВсеГраницыДиапазонаИвнутри(xlsSheet, Iter-4, 1, Iter, kolTable, True, True, True, True, True, True, False, False, РАБ.EXCEL.xlContinuous, РАБ.EXCEL.xlThin);
               fi;
             Finally
               ClearVariable(xlsSheet);
             end;
             -- КОНЕЦ ЭКСПОРТА
             xlsApp.Visible=True;  -- сделать видимым Excel
           Finally
             ClearVariable(xlsSheets);
           end;
         Except
           xlsBook.Close(False); -- закрыть книгу без сохранения
         end;
       Finally
         --xlsBook.Close(False); -- закрыть книгу без сохранения
         --xlsBook.Close; --xlsBook.Close(true, sXLSFile); -- закрыть книгу
         ClearVariable(xlsBook); -- освободить объект книги
       end;
     Finally
       ClearVariable(xlsBooks); -- освободить объект книг
     end;
   Finally
     ClearVariable(xlsApp); -- освободить объект Excel
     CloseProgress;
   end;
 Except
   ClearVariable(xlsRng);
   ClearVariable(xlsSheet);
   ClearVariable(xlsSheets);
   ClearVariable(xlsBook);
   ClearVariable(xlsBooks);
   ClearVariable(xlsApp);
 end;
 ClearVariable(xlsRng);
 ClearVariable(xlsSheet);
 ClearVariable(xlsSheets);
 ClearVariable(xlsBook);
 ClearVariable(xlsBooks);
 ClearVariable(xlsApp);
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;

Proc РасчетСинтОборотки;
var начало :Integer;
var OK, Work :Logical;
 начало=Time;
 -- Проверка заполнения
 if not ПроверкаДат: Exit; fi;
 if not flgБюджет and not flgвнБюдж and not flgЗабалС:
   Message("Не выбран источник средств:^Mбюджетные, внебюджетные либо забалансовые счета!", mtError);
   Template.Object="flgБюджет";
   Exit;
 fi;
 -- Поиск данных
 OK=ПоискДанных_ИщемДанные(DataНП, DataКП, flgБюджет, flgвнБюдж, flgЗабалС, flgИтогПоУровню, MskAccUse, flgРучВводСчета, отчСЧТ, отчКБК, flgНет500ОТЧ);
 -- Построение отчета
 if OK:
   Позиции=LengthOfArray(тSRTFLD);
   Work=ПодсчетВставкаПромежуточныхИтогов(Иерархия, flgИтогПоУровню, MskAccUse, flgРазрешИмена, flgНет500ОТЧ);
   if not Work: Exit; fi;
   Позиции=LengthOfArray(тSRTFLD);
   --
   Work=ПостроениеОтчета(Иерархия, flgИтогПоУровню, MskAccUse, flgКБК, flgИСТ, flgРазрешИмена);
   if not Work: Exit; fi;
   --
   SetFLGСлужИнф;
   ValidateОтчетSection;
   if Позиции>0: Message("Расчет завершен!^MВремя работы - "+TimeToHMSstring(Time-начало), mtInformation); fi;
 fi;
end;

Func ВыбратьСхемуЦветовИерархическихЗаголовков(ТекущийЦвет:Integer) :Integer;
var num:Integer;
 ClearVariable(Buf);
 Buf[01]="На основе красного цвета 1 УБЫВ (RGb)";
 Buf[02]="На основе красного цвета 1 ВОЗР (RGb)";
 Buf[03]="На основе красного цвета 2 УБЫВ (RgB)";
 Buf[04]="На основе красного цвета 2 ВОЗР (RgB)";
 Buf[05]="На основе зеленого цвета 1 УБЫВ (rGB)";
 Buf[06]="На основе зеленого цвета 1 ВОЗР (rGB)";
 Buf[07]="На основе зеленого цвета 2 УБЫВ (RGb)";
 Buf[08]="На основе зеленого цвета 2 ВОЗР (RGb)";
 Buf[09]="На основе синего цвета 1 УБЫВ (RgB)";
 Buf[10]="На основе синего цвета 1 ВОЗР (RgB)";
 Buf[11]="На основе синего цвета 2 УБЫВ (rGB)";
 Buf[12]="На основе синего цвета 2 ВОЗР (rGB)";
 Buf[13]="Смешанная УБЫВ";
 Buf[14]="Смешанная ВОЗР";
 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;

Func ВыбратьРежимСчета(ТекущийРежим:Integer) :Integer;
var num :Integer;
 ClearVariable(Buf);
 Buf[01]="Без режима";
 Buf[02]="По маске ???";
 Buf[03]="По маске ???.??";
 Buf[04]="По маске ???.??.???";
 Buf[05]="По маске ???.?? + ???.??.???";
 num=Alternate("Выберите режим вывода счета...", Buf, -1, ТекущийРежим+1, 12);
 if not num>0: ^ТекущийРежим; else ^(num-1); 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Уч_Р_ОД=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 ВзятьРеквизиты(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 ЗапомнитьЗначения;
 MskAccOld=MskAccUse;
 OldDateНП=DataНП;
 OldDateКП=DataКП;
 OldОтчАНА=отчАНА;
 OldСчтРуч=отчСЧТ;
end;

Proc Инициализация;
 lblVersion.Caption=infoVersion;
 --
 ИзмПрд="Изменить"+Chr(13)+"порядок"+Chr(13)+"сортировки";
 if ПоправкаExcel<1: ПоправкаExcel=1; fi;
 --
 if not Позиции>0:
   if Trim(Иерархия)="":
     flgИСТ=False; flgКБК=False;
     flgБюджет=True; flgвнБюдж=True; flgЗабалС=False;
     vocКОД1=""; vocКОД2=""; vocКОД3="";
     vocИМЯ1=""; vocИМЯ2=""; vocИМЯ3="";
     анаКОД1=""; анаКОД2=""; анаКОД3="";
     анаИМЯ1=""; анаИМЯ2=""; анаИМЯ3="";
     ОчиститьАналитикуОтбора;
     MskAccUse=1;
     отчАНА=""; OldОтчАНА="";
     Иерархия="СЧТ";
     flgСчета00и00Z=True;
     flgНетЗАБНФА=True;
     flgНет500ОТЧ=True;
     flgСхемаЦветов=1;
   fi;
   flgРазрешИмена=True;
   flgПечСлужИнф=True;
 fi;
 --
 РазрешенУчетУсловийОстатков(flgУчетОст);
 РазрешенУчетУсловийОборотов(flgУчетОбо);
 --
 ПорядокГрупп_ПеречитатьГруппы;
 --
 ВозможностьДопАналитики;
 --
 Счета_ВнешнийВид;
 --
 Даты_ТЧSet(if(ОтчПрд>0, False, True));
 --
 ЗапомнитьЗначения;
 ValidateSection(False);
 --
 ВзятьРеквизиты(УЧР_REC, True);
 --
end;

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

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_Бюджет" or Sender="cb_внБюдж":
         ОчиститьАналитикуОтбора;
         Счета_ВнешнийВид;
     |  Sender="cb_ЗабалС"    :
         ОчиститьАналитикуОтбора;
         Счета_ВнешнийВид;
     fi;
   fi;
   ValidateОтчетSection;
 fi;
end;

Proc ФлагиДетализацииСчетов_onChange(Sender:String);
var curFlag, oldFlag :Integer;
 if Template_OnClear: Exit; fi;
 curFlag=MskAccUse; -- текущий статус
 oldFlag=MskAccOld; -- предыдущий статус
 if ОтменитьИзмененияУсловийОтчета: curFlag=oldFlag; fi;
 MskAccUse=curFlag;
 if curFlag<>oldFlag:
   ОчиститьАналитикуОтбора;
   Счета_ВнешнийВид;
   ОтображениеСубитоговСчета;
   MskAccOld=curFlag;
 fi;
 ValidateОтчетSection;
end;

Proc ФлагРучногоВводаСчетов_onChange(Sender:String);
var curFlag, oldFlag :Logical;
 if Template_OnClear: Exit; fi;
 curFlag = flgРучВводСчета; -- текущий статус
 oldFlag = not flgРучВводСчета; -- предыдущий статус
 if ОтменитьИзмененияУсловийОтчета: curFlag=oldFlag; fi;
 flgРучВводСчета=curFlag;
 cb_РучВводСчета.State=curFlag;
 if curFlag<>oldFlag:
   if not curFlag: ОчиститьАналитикуОтбора; else отчСЧТ=Счета_ПеревестиНаРучной(отчСЧТ, "|"); fi;
   --ОчиститьАналитикуОтбора;
   Счета_ВнешнийВид;
 fi;
 ValidateОтчетSection;
end;

Proc ФлагиНастроекОтчета(refField:String; onExit:Logical);
var SaveValue, StoreFlag, NewFlag :Logical;
 if Template_OnClear: Exit; fi;
 SaveValue=False;
 StoreFlag=GetVariableL(refField);
 if onExit: NewFlag = False; else NewFlag = not StoreFlag; fi;
 if NewFlag<>StoreFlag: if not ОтменитьИзмененияУсловийОтчета: SaveValue=True; fi; fi;
 if SaveValue: PutVariableL(refField, NewFlag); fi;
end;

Proc cb_НстрВнВидОтч_OnChange(Sender:String);
 ПрименитьЦвета;
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;

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="ИзмПрд_"        : ИзменитьПорядокГрупп(Иерархия); ^False;
 |  Field="usrСЧТ_"        : Счета_ВыбратьФильтрСчета(False); ^False;
 |  Field="отчКБК_"        : КБК_ВыбратьФильтрКБК(flgНет500ОТЧ, False); ^False;
 |  Field="vocКОД1_"       : ВыбратьДопСправочник(Field, False); ^False;
 |  Field="vocКОД2_"       : ВыбратьДопСправочник(Field, False); ^False;
 |  Field="vocКОД3_"       : ВыбратьДопСправочник(Field, False); ^False;
 |  Field="анаКОД1_"       : Аналитика_ВыбратьФильтрАналитики(Field, False); ^False;
 |  Field="анаКОД2_"       : Аналитика_ВыбратьФильтрАналитики(Field, False); ^False;
 |  Field="анаКОД3_"       : Аналитика_ВыбратьФильтрАналитики(Field, False); ^False;
 |  Field="flgРежимСЧТ_"   : flgРежимСЧТ    = ВыбратьРежимСчета(flgРежимСЧТ); ^False;
 |  Field="flgПечСлужИнф"  : flgПечСлужИнф  = not flgПечСлужИнф; SetFLGСлужИнф; ^False;
 |  Field="flgСхемаЦветов" : flgСхемаЦветов = ВыбратьСхемуЦветовИерархическихЗаголовков(flgСхемаЦветов); ПрименитьЦвета; ^False;
 |  Field="ПоправкаExcel_" : ПоправкаExcel  = ВыбратьПоправкуExcel(ПоправкаExcel); ^False;
 |  Field="flgСчета00и00Z" : ФлагиНастроекОтчета(Field, False); ^False;
 |  Field="flgРазрешИмена" : ФлагиНастроекОтчета(Field, False); ^False;
 |  Field="flgНетЗАБНФА"   : ФлагиНастроекОтчета(Field, False); ^False;
 |  Field="flgНет500ОТЧ"   : ФлагиНастроекОтчета(Field, False); ^False;
 |  Field="УЧР_ИМЯ"        : ВзятьРеквизиты(УЧР_REC, False); ^False;
 |  Field="УЧР_ОКПО"       : ВзятьРеквизиты(УЧР_REC, False); ^False;
 |  Field="ПОД_ИМЯ"        : ПО_Выбор(ПОД_КОД); ^False;
 |  Field="ПОД_КОД"        : ПО_Выбор(ПОД_КОД); ^False;
 fi;
 ^True;
end;

Func Детализация_onEnter(Field:String; Iter:Integer): Logical; -- на входе в клетку
var ppn, ppk :Integer;
 ppn=Pos("[",Field);
 ppk=Pos("]",Field);
 Iter=Int(SubStr(Field, ppn+1, ppk-ppn-1));
 ДетализацияПроводокОтчета(Iter, Иерархия, flgИтогПоУровню, MskAccUse, flgНетЗАБНФА, flgСчета00и00Z, flgНет500ОТЧ, flgЗабалС);
 ^False;
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ОтчАНА: if ОтменитьИзмененияУсловийОтчета: отчАНА=OldОтчАНА; fi; fi;
                       if not Flag_onEnter and отчАНА="":         if ОтменитьИзмененияУсловийОтчета: отчАНА=OldОтчАНА; fi; fi;
 |  Field="ОтчПрд_"  : Даты_ВыборДаты(True);
 |  Field="flgИСТ_"  : ФлагиПараметровГруппировки(Field, True);
 |  Field="flgКБК_"  : ФлагиПараметровГруппировки(Field, True);
 |  Field="usrСЧТ_"  : Счета_ВыбратьФильтрСчета(True);
 |  Field="отчКБК_"  : КБК_ВыбратьФильтрКБК(flgНет500ОТЧ, True);
 |  Field="vocКОД1_" : ВыбратьДопСправочник(Field, True);
 |  Field="vocКОД2_" : ВыбратьДопСправочник(Field, True);
 |  Field="vocКОД3_" : ВыбратьДопСправочник(Field, True);
 |  Field="анаКОД1_" : Аналитика_ВыбратьФильтрАналитики(Field, True);
 |  Field="анаКОД2_" : Аналитика_ВыбратьФильтрАналитики(Field, True);
 |  Field="анаКОД3_" : Аналитика_ВыбратьФильтрАналитики(Field, True);
 |  Field="ИспФИО"   : if ИспФИО="": ИспДол=""; ИспREC=NIL; fi;
 |  Field="flgСчета00и00Z" : ФлагиНастроекОтчета(Field, True);
 |  Field="flgРазрешИмена" : ФлагиНастроекОтчета(Field, True);
 |  Field="flgНетЗАБНФА"   : ФлагиНастроекОтчета(Field, True);
 |  Field="flgНет500ОТЧ"   : ФлагиНастроекОтчета(Field, True);
 |  Field="УЧР_ИМЯ"        : if УЧР_ИМЯ="": УЧР_ОКПО=""; fi;
 |  Field="УЧР_ОКПО"       : if УЧР_ОКПО="": УЧР_ИМЯ=""; fi;
 |  Field="ПОД_ИМЯ"        : if ПОД_ИМЯ="": ПОД_КОД=""; fi;
 |  Field="ПОД_КОД"        : if ПОД_КОД="": ПОД_ИМЯ=""; fi;
 |  Field="flgСхемаЦветов" : if flgСхемаЦветов=0: ПрименитьЦвета; fi;
 fi;
 ValidateОтчетSection;
 Flag_onEnter=False;
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_OnValidateСчета(Field:String; Iter:Integer; Value:String) :Logical;
var Res :Numeric;
 if Field="отчСЧТ":
   if Length(Value)>250: Message("Строка фильтра отбора счетов не может быть больше 250 символов!", mtWarning); ^False; fi;
   Try Res=Turn(Value, 1.1.100, 1.1.100); Except Raise; ^False; end;
   отчКБК="";
   valКБК="";
 fi;
 ^True;
end;

Func Field_onEnterСчета(Field:String; Iter:Integer): Logical; -- на входе в клетку
 if Template_OnClear: ^False; fi;
 Flag_onEnter=False;
 OldСчтРуч=отчСЧТ;
 Flag_onEnter=True;
 ^True;
end;

Proc Field_OnExitСчета(Field:String; Iter:Integer);
 if     Flag_onEnter and отчСЧТ<>OldСчтРуч: if ОтменитьИзмененияУсловийОтчета: отчСЧТ=OldСчтРуч; fi; fi;
 if not Flag_onEnter and отчСЧТ="":         if ОтменитьИзмененияУсловийОтчета: отчСЧТ=OldСчтРуч; fi; fi;
 ValidateОтчетSection;
 Flag_onEnter=False;
end;

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

-2- События шаблона
Proc Template_OnOpen(Create:Logical); -- при открытии шаблона
 РАБ.НАСТР_ПЕЧАТЬ.Cfg(PlanVar("Общие")+"\Настройки\", "ТББ_STD_Portret10_num_000.cfg");
end;

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

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

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