<?xml version="1.0" encoding="windows-1251"?>
<registry>
	<node path="%root%\Ресурсы\Макросы\Отчеты\Расширения">
		<value type="7" name="Расширение_ВыводОтчетаВВорд">включить '\Библиотеки\LibRu.lib';
включить '\Библиотеки\Reports.lib';
включить '\Библиотеки\Documents.lib';
включить '\Библиотеки\SysUtils.lib';
включить '\Макросы\Отчеты\ПоддержкаРасширений.abl';
включить '\Библиотеки\F1Tools.lib';
включить '\Библиотеки\Variables.lib';
включить '\Библиотеки\XLS.lib';

ВывестиОтчетВMSWord(МоментВызова: Целое; ПараметрыРасширений: ВнешнийОбъект; Параметры: IVariables);

константы 
  //Константы ворда
  wdPreferredWidthPercent = 2;
  wdFindContinue = 1;
  wdLine = 5;
  wdCell = 12;
  wdExtend = 1;  
  wdAlignParagraphRight = 2;
  wdAlignParagraphLeft = 0;
  wdAutoFitWindow = 2;
  wdAutoFitContent = 1;
  wdAutoFitFixed = 3;
  wdCellAlignVerticalTop = $00000000;
  wdCellAlignVerticalCenter = $00000001;
  wdCellAlignVerticalBottom = $00000003;

  wdAlignParagraphCenter = $00000001;
  wdAlignParagraphJustify = $00000003;
  wdAlignParagraphDistribute = $00000004;
  wdAlignParagraphJustifyMed = $00000005;
  wdAlignParagraphJustifyHi = $00000007;
  wdAlignParagraphJustifyLow = $00000008;
  wdActiveEndPageNumber = $00000003;
  wdNumberOfPagesInDocument = $00000004;
  wdDeleteCellsEntireRow = $00000002;
  wdActiveEndAdjustedPageNumber = $00000001;

  wdBorderTop = -1;
  wdBorderLeft = -2;
  wdBorderBottom = -3;
  wdBorderRight = -4;
  wdBorderVertical = -6;
  wdBorderDiagonalDown = -7;
  wdBorderDiagonalUp = -8; 
  wdBorderHorizontal = -5; 

  wdTextOrientationUpward = 2;

  wdPaneNone = 0;        
  wdPrintView = 3;

  wdLineStyleNone = 0;
  wdLineStyleSingle = 1;
  wdLineWidth050pt = 4;
  wdColorAutomatic = -16777216;
  
  wdRow = 10;
  wdRowHeightExactly = 2;
  
  wdHorizontalPositionRelativeToTextBoundary = 7;
  wdAdjustFirstColumn = 2;
  wdAdjustNone = 0; 
  wdAdjustProportional = 1; 
  wdAdjustSameWidth = 3; 
  
  wdCharacter = 1; 
  wdCollapseEnd = 0; 
  wdCollapseStart = 1; 
  
  wdFirstCharacterLineNumber = 10;
  
  wdHeaderFooterEvenPages = 3; // Returns all headers or footers on even-numbered pages. 
  wdHeaderFooterFirstPage = 2; // Returns the first header or footer in a document or section. 
  wdHeaderFooterPrimary = 1; // Returns the header or footer on all pages other than the first page of a document or section.
  
  wdAlignPageNumberCenter = 1; // Centered. 
  wdAlignPageNumberInside = 3; // Left-aligned just inside the footer. 
  wdAlignPageNumberLeft = 0; // Left-aligned. 
  wdAlignPageNumberOutside = 4; // Right-aligned just outside the footer. 
  wdAlignPageNumberRight = 2; // Right-aligned. 
 

  wdSeekMainDocument = 0;
  
  F1FileExcel97 = 11;
  // fuckingtext = "if_you_can_read_this_text, then export to msWord is failed";
  //Текст должен быть небольшой, иначе он может расширить колонку, и таблица выйдет за край листа
  fuckingtext = "@#$%&amp;*";

переменные
  Визуализатор : IUniViewer;
  Excel, Word, Sheet, Cell1, Cell2, Document, DocumentBuf, FindObject, Options, BordersObject, HeaderObject: ВнешнийОбъект;
  Workbook, ОбластьОбъединения: ВнешнийОбъект;
  ТекстЗаголовка: строка;
  F1, BufF1 : IF1Book;
  Файл : строка;
  Flexcel : IXLSContainer;
  prog: IProgress;
  сч, maxCol, firstCol, maxRow, НомерКолонки: целое;
  RepeatableRow: целое;
  RowAddress: строка;
  SaveValue: строка;
  РасширенноеВыравнивание, ПоляСтраницы, ПоляЯчеекТаблиц, ПоляЯчеекЗаголовкаТаблиц, ПоляЯчеекПодЗаголовкаТаблиц, ВысотаРабочихСтрок, ВысотаСтрокЗаголовка: строка;
  УдалятьПустыеСтрокиТаблицыВНачалеСтраницы, ОпуститьТекстЯчейки, ВосстанавливатьБордюры, СтрокиБордюров, ТаблицаПоШиринеСтраницы, ПодстройкаОстальныхСтолбцов: строка; 
  ЗаголовокСтраницы, НумерацияСтраниц: строка;
  НомераСтолбцов, ВыравниваниеТекстаПоШирине, ШиринаСтолбцов, RulerStyle, УстанавливатьПодЗаголовок: строка;
  ШиринаПодровнять, ШиринаИндексы, ШиринаДельта: Текст;
  НоваяШирина: дробное; 
//  ШиринаДельтаИндекс, ШиринаИндексыУсловие: целое;
  ШиринаСтолбцовНачало, ШиринаСтолбцовКонец, ПодровнятьСтраницы, БордюрНачало, БордюрКонец: целое;
  ПослеТаблицы: ВнешнийОбъект;
  комматекст, комматекст1: Текст;
  ExcelLeftMargin, ExcelRightMargin, ExcelTopMargin, ExcelBottomMargin: Целое;
  ИндексОсновнойТаблицы, РазрешитьПереносСтрокТаблицыНаСледующуюСтраницу, ж, п, к, ИндексЗаголовка: целое;
  ЯчейкиОсобогоЗаголовка: ВнешнийОбъект;
  НачалоЗаголовка, КонецЗаголовка: целое;
  ВысотаСтроки: дробное;
  ЯчейкиНазвания, ЯчейкаШапки0: строка;
  НаправлениеТекста: строка;
  ЭтойЯчейки, ТойЯчейки: целое;
  ДлинаЯчейкиНазвания: СтатическиеДанные;
  ДлинаЯчейки: Поле;
  координаты, НомерСтроки: целое;
  // Комментарий
  функция ЗаменитьНулиПрочеркамиВСтолбцах( Таблица : ВнешнийОбъект; НомераСтолбцов : Текст);
  переменные
    Ячейка, Строки, область : ВнешнийОбъект;
    rCounter, cCounter : Целое;
    ЧислоСтрок : Целое;
    числовв : целое;
  начало
    prog.BeginProgress();
    prog.SetMessage("Форматирование таблицы: Замена нулевых значений");
    Строки := Таблица.Rows;
    ЧислоСтрок := Строки.Count;
    от rCounter:=1 до ЧислоСтрок делать
    начало
      если prog.CheckCancelButton тогда
        выход;
      попытка
        Ячейка := Таблица.Cell(rcounter, ccounter);
        prog.SetMessage("Замена нулевых ячеек: Обработка строки ("+ ЦелоеВСтроку(rCounter)+"/"+ЦелоеВСтроку(ЧислоСтрок) + ")");
        от cCounter:=1  до НомераСтолбцов.Количество делать
        начало
          Ячейка := Таблица.Cell(rCounter, СтрокаВЦелое(НомераСтолбцов.ЗначениеПараметра(cCounter)));
          область := Ячейка.Range;
          числовв := область.Words.Count;
          если числовв = 2 тогда
          начало
            если СтрокаВЦелое(Ячейка.Range.Words.First.Text) = 0 тогда
            начало
              Ячейка.Range.Text := '-';
              prog.SetMessage("Запись значения ("+ ЦелоеВСтроку(rCounter)+"ячейка"+ ЦелоеВСтроку(cCounter) + "/"+ЦелоеВСтроку(ЧислоСтрок) + ")");
              Ячейка.VerticalAlignment := wdCellAlignVerticalCenter;
              Ячейка.Range.Paragraphs.First.Alignment := wdAlignParagraphCenter; 
            конец;
          конец;
        конец;
        prog.SetProgress((rcounter цел ЧислоСтрок) * 100);
      неудача
      конец;
    конец;
  
  конец;
  
  // отличаются номера страниц в начале и в конце ячейки
  функция ОтличаютсяНомера(Ячейка: ВнешнийОбъект; УзнатьВысоту: целое): целое;
  переменные
    Start, End: ВнешнийОбъект;
    lStart, lEnd: целое;
  начало
    Start := Ячейка.Range;
    End := Ячейка.Range;
    
    //Изменяем диапазон "rRangeEnd", чтобы потом
    //можно было сделать нужное действие.
    End.MoveEnd(wdCharacter, -1);
    
    //Изменяем диапазон "rRangeEnd".
    //Теперь диапазон представляет собой конец диапазона "rRangeEnd".
    End.Collapse(wdCollapseEnd);  
    
    //wdFirstCharacterLineNumber - даёт порядковый номер строки в документе.
    lStart := Start.Information(wdFirstCharacterLineNumber);
    lEnd := End.Information(wdFirstCharacterLineNumber);
    
    УзнатьВысоту := lEnd;
    
//    если lEnd &lt; lStart тогда
//      результат := Start.PageSetup.LinesPage - lStart
//    иначе
//      результат := lEnd - lStart + 1;
//    
    
    //Start.Collapse(wdCollapseStart);
    результат := lEnd &lt; lStart;
  конец;

  функция УдалитьПустыеСтрокиТаблицыВНачалеСтраницы(Таблица: ВнешнийОбъект; Опции: строка; НеНадоДальше: целое);  
  переменные
    Ячейка, Строки : ВнешнийОбъект;
    нужноУдалять, нужноИскать, яПроверка : Целое;
    rCounter, cCounter : Целое;
    ТекущаяСтраница, олд_ТекущаяСтраница : Целое;
    ЧислоСтрок, ЧислоСтолбцов: Целое;
    
    ОбщиеПараметры: Текст;
    ВысокаяКолонка, ж, п, к, ВысотаТекста, НадоДелать, т, т0, т1, колл: целое;
    Колонки: Текст;
  начало
    prog.BeginProgress();
    prog.SetMessage("Форматирование таблицы: Удаление  пустых строк таблицы в начале  страницы");
    
    ОбщиеПараметры := СоздатьТекст;
    ОбщиеПараметры.РазделенноеЗначение(";") := Опции;
    НадоДелать := да;
    если ОбщиеПараметры.ЗначениеПараметра("pattern") = "" тогда
      НадоДелать := нет
    иначе
      ВысокаяКолонка := СтрокаВЦелое(ОбщиеПараметры.ЗначениеПараметра("pattern"));
    если ОбщиеПараметры.ЗначениеПараметра("cols") = "" тогда
      НадоДелать := нет
    иначе
    начало
      Колонки := СоздатьТекст;
      Колонки.РазделенноеЗначение := ОбщиеПараметры.ЗначениеПараметра("cols");
    конец;
    
    Строки := Таблица.Rows;
    ТекущаяСтраница := 1;
    олд_ТекущаяСтраница := ТекущаяСтраница;
    ЧислоСтрок := Строки.Count - НеНадоДальше;
    ЧислоСтолбцов := Таблица.Columns.Count;
    нужноИскать := да;
    rCounter := 1;
    ccounter := 1;
    
    пока нужноИскать и (rCounter &lt;= ЧислоСтрок) делать
    начало
      попытка
        Ячейка := Таблица.Cell(rcounter, ccounter);
        prog.SetMessage("Форматирование таблицы: Обработка строки ("+ ЦелоеВСтроку(rCounter)+"/"+ЦелоеВСтроку(ЧислоСтрок) + ")");
        prog.SetProgress((rcounter цел ЧислоСтрок) * 100);
        ТекущаяСтраница := Ячейка.Range.Information(wdActiveEndPageNumber);
        если (ТекущаяСтраница &lt;&gt; олд_ТекущаяСтраница) тогда
        начало
          олд_ТекущаяСтраница  := ТекущаяСтраница;
          ж := rcounter; 
          если ОтличаютсяНомера(Таблица.Cell(ж, ВысокаяКолонка), ВысотаТекста) тогда
          начало
            если НадоДелать тогда
              от п := 0 до Колонки.Количество - 1 делать
              начало
                если УбратьПробелы(Таблица.Cell(ж, Колонки.Стр(п)).Range.Text) &lt;&gt; "" тогда
                начало
                  ОтличаютсяНомера(Таблица.Cell(ж, Колонки.Стр(п)), т0);
                  т1 := т0; колл := 0;
                  пока т1 &gt;= т0 делать
                  начало
                    Таблица.Cell(ж, Колонки.Стр(п)).Range.InsertParagraphBefore;
                    колл := колл + 1;
                    ОтличаютсяНомера(Таблица.Cell(ж, ВысокаяКолонка), т);
                    ОтличаютсяНомера(Таблица.Cell(ж, Колонки.Стр(п)), т1); 
                  конец;
                  от к := 2 до ВысотаТекста делать
                    Таблица.Cell(ж, Колонки.Стр(п)).Range.InsertParagraphBefore;
                конец;
              конец
          конец
          иначе
          начало
            нужноУдалять := ОбщиеПараметры.ЗначениеПараметра("deleteemptyrow") = "да";
            ccounter := 1;
            пока (нужноУдалять) и (cCounter &lt;= ЧислоСтолбцов) делать
            начало
              Ячейка := Таблица.Cell(rcounter, ccounter);
              яПроверка := Ячейка.Range.Words.Count;
              нужноУдалять := УбратьПробелы(Ячейка.Range.Text) = "";
              ccounter := ccounter + 1;
            конец;
            ccounter := 1;
            если нужноУдалять тогда
            начало
              prog.SetMessage("Форматирование таблицы: Удаление строки ("+ ЦелоеВСтроку(rCounter) + ")");
              Ячейка.Delete(wdDeleteCellsEntireRow);
              ЧислоСтрок := Строки.Count - НеНадоДальше;
              rCounter := rCounter - 1;
              олд_ТекущаяСтраница  := олд_ТекущаяСтраница - 1; 
            конец;
          конец;
        конец;
      неудача
      конец;
      rCounter := rCounter + 1;
    конец;
  конец;
  
  функция УстановитьВыравниваниеКолонки(ИндексТаблицы: целое; ИмяКолонки: Строка; Сторона: Строка; Сдвиг: целое);
  переменные
    ИндексКолонки: целое;
    Колонка, ФорматКолонки: ВнешнийОбъект;
    ВыравниваниеЗаголовка: целое;    
  начало
    //Пока колонки идентифицируются по индексам. Потом надо бы сделать по именам
    ИндексКолонки := СтрокаВЦелое(ИмяКолонки);
    Колонка := Document.Tables(ИндексТаблицы).Columns(ИндексКолонки);
    //ячейку первой строки не выделяем, т.к. это заголовок
    если Колонка.Cells.Count &gt; 1 тогда
    начало
      //Запоминаем выравнивание заголовка
      Колонка.Cells(1).Select;      
      ВыравниваниеЗаголовка := Document.ActiveWindow.Selection.ParagraphFormat.Alignment;      
      //Устанавливаем выравнивание колонки
      Колонка.Select;
      ФорматКолонки := Document.ActiveWindow.Selection.ParagraphFormat;    
      если Сторона = 'r' тогда
      начало
        ФорматКолонки.Alignment := wdAlignParagraphRight;
        ФорматКолонки.RightIndent := Сдвиг;
      конец  
      иначе если Сторона = 'l' тогда
      начало
        ФорматКолонки.Alignment := wdAlignParagraphLeft;
        ФорматКолонки.LeftIndent := Сдвиг;
      конец  
      иначе 
        ВызватьОшибку("Неверно задан параметр выравнивания колонки: "+ИмяКолонки);          
      ФорматКолонки.SpaceBeforeAuto := нет;
      ФорматКолонки.SpaceAfterAuto := нет;
      //Восстанавливаем выравнивание заголовка
      Колонка.Cells(1).Select;
      Document.ActiveWindow.Selection.ParagraphFormat.Alignment := ВыравниваниеЗаголовка;
      Document.ActiveWindow.Selection.ParagraphFormat.RightIndent := 0;
      Document.ActiveWindow.Selection.ParagraphFormat.LeftIndent := 0; 
    конец;          
  конец;
  
  функция УстановитьВыравниваниеКолонок(ИндексТаблицы: целое; Выравнивание: строка);
  переменные
    Колонки: Текст;
    Индекс: целое;
    ИмяКолонки: Строка;
    ВыравнКолонки: Строка;
    Сдвиг: целое;
  начало
    Колонки := СоздатьТекст;
    попытка
      Колонки.РазделенноеЗначение := Выравнивание;
      от Индекс := 0 до Колонки.Количество - 1 делать
      начало
        ИмяКолонки := Колонки.ИмяПараметра(Индекс);
        ВыравнКолонки := Колонки.ЗначениеПараметра(ИмяКолонки);
        Сдвиг := СтрокаВЦелое(Подстрока(ВыравнКолонки, 2, Длина(ВыравнКолонки)-1));
        УстановитьВыравниваниеКолонки(ИндексТаблицы, ИмяКолонки, ВыравнКолонки[1], Сдвиг);
      конец;
    обязательно
      УдалитьОбъект(Колонки);
    конец;
  конец;
    
  // Комментарий
  функция GetPath(TPath: строка): строка;
  переменные
    БезПробелов: строка;
  начало
    БезПробелов := УбратьПробелы(TPath);
    если БезПробелов[Длина(БезПробелов)] = '\' тогда
      результат := TPath
    иначе
      результат := TPath + '\';
  конец;

  // Папка с отчетами может располагаться в чужом домене сети.
  // Копируем dot-шаблон локально, чтобы не было проблем с доступом.
  функция ПолучитьБезопасныйПуть(TPath, TName: строка): строка;
  начало
    результат := GetPath(GetTmpPath) + TName;
    CopyFile(GetPath(TPath) + TName, результат, нет)
  конец;

  // Комментарий
  функция Абзацев(Количество: целое = 0): строка;
  переменные
    ж: целое;
  начало
    результат := '';
    от ж := 1 до Количество делать
    начало
      результат := результат + #13#10;
    конец;
  конец;
  
    // Удаляем текст между таблицами, если в нем только пустые абзацы с пробелами.
  функция УдалялиАбзацы(Документ, Таблица1, Таблица2: ВнешнийОбъект): целое;
  переменные
    МежтабличноеПространство: ВнешнийОбъект;
  начало
    результат := нет;
    МежтабличноеПространство := Документ.Range(Таблица1.Range.End, Таблица2.Range.Start);
    если УбратьПробелы(МежтабличноеПространство.Text) = "" тогда
    начало
      МежтабличноеПространство.Delete;
      результат := да;
    конец;
  конец;
  
  // Комментарий
  функция СделатьНумерациюСтраниц(Раздел: ВнешнийОбъект; Где, Выровнять: строка);
  переменные
    МестоНомера: ВнешнийОбъект;
    ГдеИменно: целое;
  начало
    выбрать Где из
      "внизу": 
        МестоНомера := Раздел.Footers(wdHeaderFooterPrimary);
      "вверху": 
        МестоНомера := Раздел.Headers(wdHeaderFooterPrimary);
      иначе
        МестоНомера := Раздел.Footers(wdHeaderFooterPrimary);
    конец;
    попытка
      ГдеИменно := СтрокаВЦелое(Выровнять);
      если Выровнять = "" тогда
        ГдеИменно := wdAlignPageNumberCenter;
    неудача
      ГдеИменно := wdAlignPageNumberCenter;
    конец;
    МестоНомера.PageNumbers.Add(ГдеИменно);
  конец;


начало
  если МоментВызова &lt;&gt; мвПослеВыводаДанных тогда
    Выход;

  prog := Progress;
  если (prog &lt;&gt; nil) тогда
    начало
      prog.SetMessage('Экспорт в Word');
      prog.SetProgress(0);
    конец;
    
  Визуализатор := Параметры.Values(АлгВизуализатор);
  F1 := Визуализатор.Viewer;
  BufF1 := CreateF1Book;
  CopyF1Book(F1, BufF1, F1.NumSheets, 1, да, да); 
  Файл := GetTmpPath + "temp.xls";
  пока FileExists(Файл) делать
    начало
       сч := сч + 1;
       Файл := Формат("%stemp%d.xls", GetTmpPath, сч);
    конец;
  SaveF1BookEx(F1, Файл, F1.NumSheets, 0, СоздатьКоллекцию);  

  Flexcel := createcomobject(XLSContainer);
  попытка
    Flexcel.OpenFile(Файл);
    Flexcel.DeleteFormulas;

    если (prog &lt;&gt; nil) тогда prog.SetProgress(50);  
    если ПараметрСуществует("ТекстовыйПроцессорДокумент") тогда
    начало
      Document := Значение("ТекстовыйПроцессорДокумент");
      Document.Activate;
      Document.Select;
      Word := Document.Application;
    конец
    иначе
    начало
      Word := СоздатьВнешнийОбъект("Word.Application");
      // Установки шрифта, оступов, параметров  страниц можно сделать в шаблоне
      если FileExists(GetPath(TemplatePath) + "PlanningNormal.dotm") тогда
        Document := Word.Documents.Add(ПолучитьБезопасныйПуть(TemplatePath, "PlanningNormal.dotm"))
      иначе
        Document := Word.Documents.Add;
      Document.Activate;
      Document.Select;
    конец;
    Word.DisplayAlerts := нет;


    Flexcel.SaveFile(Файл);
    Excel := СоздатьВнешнийОбъект("Excel.Application");
    Excel.DisplayAlerts := нет;                           
    Workbook := Excel.Workbooks.Open(Файл);

    Sheet := Workbook.ActiveSheet; 
    maxCol := BufF1.LastCol;
    firstCol := 1; // первая колонка, ширина которой не 0   
//    от сч := 1 до Flexcel.MaxCol делать
//      если (Flexcel.ColumnWidth(сч) = 0) тогда
//        firstCol := firstCol + 1;
    пока Flexcel.ColumnWidth(firstCol) &lt; 1000 и firstCol &lt;= Flexcel.MaxCol делать
    начало
      firstCol := firstCol + 1;
    конец;
    
   maxRow := BufF1.LastRow;
    если maxCol=0 тогда
      maxCol := 1;
    если maxRow=0 тогда
      maxRow := 1;
    
    // ячейки с расположением результата Заголовок располагаются в строках с объединением
    // по всей ширине отчета. Текст из этой ячейки заголовка нам нужен.
    // Текст располагается в скрытых колонках (их ширина 0). При копировании в Ворд текст не остается.
    // Мы хотим взять текст из невидимой ячейки, переобъединить ячейки на видимую область, и вставить текст.
    от сч := 1 до Flexcel.MaxRow делать
    начало
      ОбластьОбъединения := Sheet.Cells(сч, 2).MergeArea; 
      // количество колонок в объединении и в той же самой строке отчета одинаково, тогда сделаем перенос текста
      если ОбластьОбъединения.Columns.Count = Sheet.Range(sheet.Cells(сч, 2), sheet.Cells(сч, maxCol)).Columns.Count тогда
      начало
        ТекстЗаголовка := Sheet.Cells(сч, 2).Value;
        ОбластьОбъединения.MergeCells := нет;
        Sheet.Range(sheet.Cells(сч, firstCol), sheet.Cells(сч, Flexcel.MaxCol)).MergeCells := да;
        sheet.Cells(сч, firstCol).Value := ТекстЗаголовка; 
      конец;
    конец;

    Cell1 := sheet.Cells(1, firstCol);
    Cell2 := sheet.Cells(maxRow, maxCol);
    Sheet.Range(Cell1, Cell2).Copy;
  
    
    // Ориентация на странице и размеры полей
    Если F1.PrintLandscape тогда Document.PageSetup.Orientation := 1;
    ExcelLeftMargin := Excel.ActiveSheet.PageSetup.LeftMargin;
    ExcelRightMargin := Excel.ActiveSheet.PageSetup.RightMargin;
    ExcelTopMargin := Excel.ActiveSheet.PageSetup.TopMargin;
    ExcelBottomMargin := Excel.ActiveSheet.PageSetup.BottomMargin;      
    
    // Получаем повторяющуюся строку
    RowAddress := Excel.ActiveSheet.PageSetup.PrintTitleRows;
    если RowAddress &lt;&gt; "" тогда 
    начало
      RepeatableRow := Excel.ActiveSheet.Range(RowAddress).Row;    
      SaveValue := Excel.ActiveSheet.Cells(RepeatableRow, firstCol).Value;
      Excel.ActiveSheet.Cells(RepeatableRow, firstCol).Value := fuckingtext;   
    конец;  
    
    Document.ActiveWindow.Selection.PasteExcelTable(0,0,0);       
  обязательно  
    Excel.Quit;
    Document.SaveAs(GetTmpPath + "temp.doc");
    
    если ПараметрСуществует("ТекстовыйПроцессорДокумент") тогда
    начало
      Document.Close;
    конец  
    иначе
    начало
      Word.Documents.Close(0);
      Word.Quit;
    конец;
  конец;  
  если не ПараметрСуществует("ТекстовыйПроцессорДокумент") тогда  
    Word := СоздатьВнешнийОбъект("Word.Application");
  попытка
    если не ПараметрСуществует("ТекстовыйПроцессорДокумент") тогда
    начало  
      Word.ScreenUpdating := нет;
      Word.Visible := нет;
    конец;
    DocumentBuf := Word.Documents.Open(GetTmpPath + "temp.doc");
    DocumentBuf.Activate;
    DocumentBuf.Range.Copy;
    DocumentBuf.Close;
    // закоментировано, потому что глючила последующая вставка (Paste), при формировании нескольких приложений
//    если не ПараметрСуществует("ТекстовыйПроцессорДокумент") тогда
//    начало
//      Word.Quit;
//      Word := СоздатьВнешнийОбъект("Word.Application");
//      Word.ScreenUpdating := нет;
//      Word.Visible := нет;
//    конец;
    // Установки шрифта, оступов, параметров  страниц можно сделать в шаблоне  
    если FileExists(GetPath(TemplatePath) + "PlanningNormal.dotm") тогда
      Document := Word.Documents.Add(ПолучитьБезопасныйПуть(TemplatePath, "PlanningNormal.dotm"))
    иначе
      Document := Word.Documents.Add;
    Document.Activate;
    Document.Range.Paste;

    // Ориентация на странице и размеры полей
    Если BufF1.PrintLandscape тогда Document.PageSetup.Orientation := 1;
    Document.PageSetup.LeftMargin := ExcelLeftMargin;
    Document.PageSetup.RightMargin := ExcelRightMargin;
    Document.PageSetup.TopMargin := ExcelTopMargin;
    Document.PageSetup.BottomMargin := ExcelBottomMargin;
   
    DeleteFile(GetTmpPath + "temp.doc"); 
    
    // принудительная установка полей страницы, так как при установке везде в PlanningNormal.dotm и 
    ПоляСтраницы := ПолучитьЗначениеПараметраРасширения('ПоляСтраницы', ПараметрыРасширений, '');
    если ПоляСтраницы &lt;&gt; '' тогда
    начало
      попытка
        комматекст := СоздатьТекст;
        комматекст.РазделенноеЗначение := ПоляСтраницы;   
        если комматекст.ЗначениеПараметра('l') &lt;&gt; '' тогда
          Document.PageSetup.LeftMargin := Document.Application.CentimetersToPoints(СтрокаВДробное(комматекст.ЗначениеПараметра('l')));
        если комматекст.ЗначениеПараметра('r') &lt;&gt; '' тогда
          Document.PageSetup.RightMargin := Document.Application.CentimetersToPoints(СтрокаВДробное(комматекст.ЗначениеПараметра('r')));
        если комматекст.ЗначениеПараметра('t') &lt;&gt; '' тогда
          Document.PageSetup.TopMargin := Document.Application.CentimetersToPoints(СтрокаВДробное(комматекст.ЗначениеПараметра('t')));
        если комматекст.ЗначениеПараметра('b') &lt;&gt; '' тогда
          Document.PageSetup.BottomMargin := Document.Application.CentimetersToPoints(СтрокаВДробное(комматекст.ЗначениеПараметра('b')));
      неудача
      конец;
    конец;
    
    если Document.Tables.Count=0 тогда
    начало
      если (prog &lt;&gt; nil) тогда prog.SetProgress(70);
      DeleteFile(Файл);  
      если (prog &lt;&gt; nil) тогда prog.EndProgress;
      если ПараметрСуществует("ТекстовыйПроцессорДокумент") тогда
        Значение("ТекстовыйПроцессорДокумент") := Document
      иначе
        Word.Visible := да;
      Word.ScreenRefresh;    
      Word.ScreenUpdating := да; 
      выход;
    конец;

    
    // Вставляем и выравниваем текст
    Document.Tables(1).Select;
    ТаблицаПоШиринеСтраницы := ПолучитьЗначениеПараметраРасширения('ТаблицаПоШиринеСтраницы', ПараметрыРасширений, 'да');
    если ТаблицаПоШиринеСтраницы = 'да' тогда
    начало
      Document.Tables(1).AutoFitBehavior(wdAutoFitWindow); 
      Document.Tables(1).AllowAutoFit := да;
    конец; 
    Document.Tables(1).Rows.HeightRule := 0;
    Document.Tables(1).Rows.Height := 0;
    
    
    РазрешитьПереносСтрокТаблицыНаСледующуюСтраницу := -(ПолучитьЗначениеПараметраРасширения('РазрешитьПереносСтрокТаблицыНаСледующуюСтраницу', ПараметрыРасширений, 'да') = 'да');    
    Document.Tables(1).Rows.AllowBreakAcrossPages := РазрешитьПереносСтрокТаблицыНаСледующуюСтраницу;
        
    НаправлениеТекста := ПолучитьЗначениеПараметраРасширения('НаправлениеТекста', ПараметрыРасширений, '');
    ВысотаСтрокЗаголовка := ПолучитьЗначениеПараметраРасширения('ВысотаСтрокЗаголовка', ПараметрыРасширений, '');
    если НаправлениеТекста &lt;&gt; '' тогда
    начало
      комматекст1 := СоздатьТекст;
      комматекст1.РазделенноеЗначение(';') := НаправлениеТекста;
      от координаты := 0 до комматекст1.Количество - 1 делать
      попытка  
        комматекст := СоздатьТекст;
        комматекст.РазделенноеЗначение(',') := комматекст1.стр(координаты);
        ж := СтрокаВЦелое(комматекст.ЗначениеПараметра('x'));
        п := СтрокаВЦелое(комматекст.ЗначениеПараметра('y'));      
        Document.Tables(1).Cell(ж, п).Range.Orientation := wdTextOrientationUpward;
        
        если ВысотаСтрокЗаголовка &lt;&gt; '' тогда
        начало 
          ВысотаСтроки := Document.Application.CentimetersToPoints(СтрокаВДробное(ВысотаСтрокЗаголовка)); 
          Document.Tables(1).Cell(ж, п).Height := ВысотаСтроки;
          Document.Tables(1).Cell(ж, п).HeightRule := wdRowHeightExactly;
        конец;
      неудача
      конец;             
    конец;    
    
    ПоляЯчеекТаблиц := ПолучитьЗначениеПараметраРасширения('ПоляЯчеекТаблиц', ПараметрыРасширений, '');
    если ПоляЯчеекТаблиц &lt;&gt; '' тогда
    начало
      попытка
        комматекст := СоздатьТекст;
        комматекст.РазделенноеЗначение := ПоляЯчеекТаблиц; 

        если комматекст.ЗначениеПараметра('w') = '' тогда
        начало   
          если комматекст.ЗначениеПараметра('t') &lt;&gt; '' тогда
            Document.Tables(1).TopPadding := Document.Application.CentimetersToPoints(СтрокаВДробное(комматекст.ЗначениеПараметра('t')));
          если комматекст.ЗначениеПараметра('b') &lt;&gt; '' тогда
            Document.Tables(1).BottomPadding := Document.Application.CentimetersToPoints(СтрокаВДробное(комматекст.ЗначениеПараметра('b')));
          если комматекст.ЗначениеПараметра('l') &lt;&gt; '' тогда
            Document.Tables(1).LeftPadding := Document.Application.CentimetersToPoints(СтрокаВДробное(комматекст.ЗначениеПараметра('l')));
          если комматекст.ЗначениеПараметра('r') &lt;&gt; '' тогда
            Document.Tables(1).RightPadding := Document.Application.CentimetersToPoints(СтрокаВДробное(комматекст.ЗначениеПараметра('r')));
        конец;
      неудача
      конец;
    конец;
    
    ЯчейкиНазвания := ПолучитьЗначениеПараметраРасширения('ЯчейкиНазвания', ПараметрыРасширений, '');
    если ЯчейкиНазвания &lt;&gt; '' тогда
    начало
      ДлинаЯчейкиНазвания := СоздатьСтатическиеДанные;
      ДлинаЯчейки := ДлинаЯчейкиНазвания.ДобавитьЦелоеПоле('Длина');
      ДлинаЯчейкиНазвания.Open;
      ДлинаЯчейкиНазвания.IndexFieldNames := 'Длина';
      комматекст := СоздатьТекст;
      комматекст.РазделенноеЗначение('-') := ЯчейкиНазвания; 
      ЭтойЯчейки := СтрокаВЦелое(комматекст.Стр(0)); ТойЯчейки := СтрокаВЦелое(комматекст.Стр(1));
      
      от ж := ЭтойЯчейки до ТойЯчейки делать
      начало
        ЯчейкиОсобогоЗаголовка := Document.Tables(1).Cell(ж, 1);
        ЯчейкиОсобогоЗаголовка.RightPadding := 0;
        ЯчейкиОсобогоЗаголовка.LeftPadding := 0;
        ЯчейкиОсобогоЗаголовка.TopPadding := 0;
        ЯчейкиОсобогоЗаголовка.BottomPadding := 0;
        ЯчейкиОсобогоЗаголовка.Range.Text := УбратьПробелы(ЯчейкиОсобогоЗаголовка.Range.Text);
        
        ЯчейкиОсобогоЗаголовка.Range.ParagraphFormat.Alignment := wdAlignParagraphRight;
        ДлинаЯчейкиНазвания.Insert;
        ДлинаЯчейки.КакЦелое := ЯчейкиОсобогоЗаголовка.Range.Information(wdHorizontalPositionRelativeToTextBoundary);
        ДлинаЯчейкиНазвания.Post;
      конец;
      ДлинаЯчейкиНазвания.First;
      от ж := ЭтойЯчейки до ТойЯчейки делать
      начало
        ЯчейкиОсобогоЗаголовка := Document.Tables(1).Cell(ж, 1);
        
        ЯчейкиОсобогоЗаголовка.Range.ParagraphFormat.Alignment := wdAlignParagraphLeft;
        ЯчейкиОсобогоЗаголовка.Range.ParagraphFormat.LeftIndent := ДлинаЯчейки.КакЦелое - 0.53;
      конец;
    конец;
    
    // запрещаем автоформатирование, а то при разделении таблицы колонци у второй смещаются
    Document.Tables(1).AutoFitBehavior(wdAutoFitFixed);      
    Document.Tables(1).AllowAutoFit := нет;   
    
    // Получаем повторяющуюся строку
    если RowAddress &lt;&gt; "" тогда 
    начало  
      // попробуем найти нехорошую строку. Там где мы ее найдем, там и есть наша строка, 
      // там и надо рубить таблицу на две части.
      Document.ActiveWindow.Selection.Find.ClearFormatting;
      FindObject := Document.ActiveWindow.Selection.Find;
      FindObject.Text := fuckingtext;
      FindObject.Replacement.Text := "";
      FindObject.Forward := да;
      FindObject.Wrap := wdFindContinue;
      FindObject.Format := нет;
      FindObject.MatchCase := нет;
      FindObject.MatchWholeWord := нет;
      FindObject.MatchWildcards := нет;
      FindObject.MatchSoundsLike := нет;
      FindObject.MatchAllWordForms := нет;
      Document.ActiveWindow.Selection.Find.Execute;
      Document.ActiveWindow.Selection.TypeText(SaveValue);
      
      ПоляЯчеекЗаголовкаТаблиц := ПолучитьЗначениеПараметраРасширения('ПоляЯчеекЗаголовкаТаблиц', ПараметрыРасширений, '');
      если ПоляЯчеекЗаголовкаТаблиц &lt;&gt; '' тогда
      начало
        попытка
          комматекст := СоздатьТекст;
          комматекст.РазделенноеЗначение := ПоляЯчеекЗаголовкаТаблиц; 
          ИндексЗаголовка := СтрокаВЦелое(комматекст.ЗначениеПараметра('n')) - 1;
          КонецЗаголовка := Document.ActiveWindow.Selection.Range.Cells(1).RowIndex - 1; // предыдущая от строки с fuckingtext
          НачалоЗаголовка := КонецЗаголовка - ИндексЗаголовка;                     
   
          от ж := НачалоЗаголовка до КонецЗаголовка делать
          начало
            от п := 1 до 100 делать
            начало
              попытка
                ЯчейкиОсобогоЗаголовка := Document.Tables(1).Cell(ж, п);
                если комматекст.ЗначениеПараметра('t') &lt;&gt; '' тогда
                  ЯчейкиОсобогоЗаголовка.TopPadding := Document.Application.CentimetersToPoints(СтрокаВДробное(комматекст.ЗначениеПараметра('t')));
                если комматекст.ЗначениеПараметра('b') &lt;&gt; '' тогда
                  ЯчейкиОсобогоЗаголовка.BottomPadding := Document.Application.CentimetersToPoints(СтрокаВДробное(комматекст.ЗначениеПараметра('b')));
                если комматекст.ЗначениеПараметра('l') &lt;&gt; '' тогда
                  ЯчейкиОсобогоЗаголовка.LeftPadding := Document.Application.CentimetersToPoints(СтрокаВДробное(комматекст.ЗначениеПараметра('l')));
                если комматекст.ЗначениеПараметра('r') &lt;&gt; '' тогда
                  ЯчейкиОсобогоЗаголовка.RightPadding := Document.Application.CentimetersToPoints(СтрокаВДробное(комматекст.ЗначениеПараметра('r')));
              неудача
              конец
            конец;
          конец;
        неудача
        конец;
      конец;
      
      ПоляЯчеекПодЗаголовкаТаблиц := ПолучитьЗначениеПараметраРасширения('ПоляЯчеекПодЗаголовкаТаблиц', ПараметрыРасширений, '');
      если ПоляЯчеекПодЗаголовкаТаблиц &lt;&gt; '' тогда
      начало
        попытка
          комматекст := СоздатьТекст;
          комматекст.РазделенноеЗначение := ПоляЯчеекПодЗаголовкаТаблиц; 
          ИндексЗаголовка := Document.ActiveWindow.Selection.Range.Cells(1).RowIndex;
   
          от п := 1 до 100 делать
          попытка
            ЯчейкиОсобогоЗаголовка := Document.Tables(1).Cell(ИндексЗаголовка, п); 
            если комматекст.ЗначениеПараметра('t') &lt;&gt; '' тогда
              ЯчейкиОсобогоЗаголовка.TopPadding := Document.Application.CentimetersToPoints(СтрокаВДробное(комматекст.ЗначениеПараметра('t')));
            если комматекст.ЗначениеПараметра('b') &lt;&gt; '' тогда
              ЯчейкиОсобогоЗаголовка.BottomPadding := Document.Application.CentimetersToPoints(СтрокаВДробное(комматекст.ЗначениеПараметра('b')));
            если комматекст.ЗначениеПараметра('l') &lt;&gt; '' тогда
              ЯчейкиОсобогоЗаголовка.LeftPadding := Document.Application.CentimetersToPoints(СтрокаВДробное(комматекст.ЗначениеПараметра('l')));
            если комматекст.ЗначениеПараметра('r') &lt;&gt; '' тогда
              ЯчейкиОсобогоЗаголовка.RightPadding := Document.Application.CentimetersToPoints(СтрокаВДробное(комматекст.ЗначениеПараметра('r')));
          неудача   
          конец;
        неудача
        конец;
      конец;
        
      // 1. Split    
      Document.ActiveWindow.Selection.SplitTable;
      // 2. Сдвигаем.
      Document.ActiveWindow.Selection.Font.Size := 1;
      
      УстанавливатьПодЗаголовок := ПолучитьЗначениеПараметраРасширения('УстанавливатьПодЗаголовок', ПараметрыРасширений, 'да');
      если УстанавливатьПодЗаголовок = "да" тогда
        // 3. Устанавливаем опцию
        Document.Tables(2).Rows(1).HeadingFormat := -1;
      
      
      ШиринаСтолбцов := ПолучитьЗначениеПараметраРасширения('ШиринаСтолбцов', ПараметрыРасширений, '');
      если ШиринаСтолбцов &lt;&gt; '' тогда   
      попытка
        ШиринаСтолбцовНачало := СтрокаВЦелое(ПолучитьЗначениеПараметраРасширения('ШиринаСтолбцовНачало', ПараметрыРасширений, '1'));
        ШиринаСтолбцовКонец := СтрокаВЦелое(ПолучитьЗначениеПараметраРасширения('ШиринаСтолбцовКонец', ПараметрыРасширений, '0'));
        ПодстройкаОстальныхСтолбцов := ПолучитьЗначениеПараметраРасширения('ПодстройкаОстальныхСтолбцов', ПараметрыРасширений, 'первыйстолбец');
        ШиринаПодровнять := СоздатьТекст; //ШиринаПодровнять.Сортированый := да; ШиринаПодровнять.Дубликаты := 2;
        ШиринаИндексы := СоздатьТекст;
        ШиринаДельта := СоздатьТекст; //ШиринаДельта.Сортированый := да; ШиринаДельта.Дубликаты := 1;
        ШиринаПодровнять.РазделенноеЗначение := ПолучитьЗначениеПараметраРасширения('ШиринаПодровнять', ПараметрыРасширений, '');
        выбрать строчные(ПодстройкаОстальныхСтолбцов) из
          "одинаковаяширина": RulerStyle := wdAdjustSameWidth;
          "первыйстолбец": RulerStyle := wdAdjustFirstColumn; 
          "пропорционально": RulerStyle := wdAdjustProportional; 
          "": RulerStyle := wdAdjustNone; 
        конец; 
        если ШиринаСтолбцовКонец = 0 тогда
          ШиринаСтолбцовКонец := Document.Tables(2).Rows.Count
        иначе
          ШиринаСтолбцовКонец := Document.Tables(2).Rows.Count - ШиринаСтолбцовКонец;
        комматекст := СоздатьТекст;
        комматекст.РазделенноеЗначение := ШиринаСтолбцов;
//        если ШиринаПодровнять.Количество &gt; 0 тогда
//          от ж := 0 до ШиринаПодровнять.Количество - 1 делать
//          начало
//            ШиринаДельта.Вставить(ж, ШиринаПодровнять.ИмяПараметра(ж)); 
//          конец;
        от ж := 0 до комматекст.Количество - 1 делать
        начало
          НомерКолонки := СтрокаВЦелое(комматекст.ИмяПараметра(ж));          
          
          от п := ШиринаСтолбцовНачало до Document.Tables(1).Rows.Count делать
          начало
            попытка
//              ШиринаИндексы.РазделенноеЗначение(";") := ШиринаПодровнять.ЗначениеПараметра(ЦелоеВСтроку(НомерКолонки));
//              если ШиринаИндексы.Количество &gt; 0 тогда
//                ШиринаИндексыУсловие := СтрокаВЦелое(ШиринаИндексы.Стр(0)) = п и СтрокаВЦелое(ШиринаИндексы.Стр(1)) &lt;&gt; НомерКолонки
//              иначе
//                ШиринаИндексыУсловие := нет;
//              если не ШиринаИндексыУсловие тогда
                Document.Tables(1).Cell(п, НомерКолонки).SetWidth(Document.Application.CentimetersToPoints(СтрокаВДробное(комматекст.ЗначениеПараметра(комматекст.ИмяПараметра(ж)))), RulerStyle);
            неудача
            конец;               
          конец;
        конец;  
        если ШиринаСтолбцовКонец &lt; Document.Tables(2).Rows.Count тогда
        начало
          Document.Tables(2).Rows(ШиринаСтолбцовКонец+1).Range.Select; 
          Document.ActiveWindow.Selection.SplitTable;  
        конец;     
        
        от ж := 0 до комматекст.Количество - 1 делать
        начало
          НомерКолонки := СтрокаВЦелое(комматекст.ИмяПараметра(ж));          
                   
            попытка
//              СтараяШирина := Document.Tables(2).Columns(НомерКолонки).Width; 
              Document.Tables(2).Columns(НомерКолонки).SetWidth(Document.Application.CentimetersToPoints(СтрокаВДробное(комматекст.ЗначениеПараметра(комматекст.ИмяПараметра(ж)))), RulerStyle);
//              ШиринаДельтаИндекс := ШиринаДельта.Поиск(комматекст.ИмяПараметра(ж));
//              если ШиринаДельтаИндекс &gt;= 0 тогда
//              начало
//                ШиринаДельта.Удалить(ШиринаДельтаИндекс);
//                ШиринаДельта.ЗначениеПараметра(комматекст.ИмяПараметра(ж)) := ДробноеВСтроку(Document.Tables(2).Columns(НомерКолонки).Width - СтараяШирина);
//              конец;
            неудача
            конец;              
        конец;
        //удалим второй разрыв
        УдалялиАбзацы(Document, Document.Tables(2), Document.Tables(3));
        
        от ж := 0 до ШиринаПодровнять.Количество - 1 делать
        начало
          ШиринаИндексы.РазделенноеЗначение(";") := ШиринаПодровнять.ИмяПараметра(ж);
          п := СтрокаВЦелое(ШиринаИндексы.Стр(0)); 
          НомерКолонки := СтрокаВЦелое(ШиринаИндексы.Стр(1));          
          если п &gt; 0 тогда
            ИндексОсновнойТаблицы := 1
          иначе
          начало
            ИндексОсновнойТаблицы := 2;
            п := Document.Tables(ИндексОсновнойТаблицы).Rows.Count - п;
          конец;
          ШиринаДельта.РазделенноеЗначение("+") := ШиринаПодровнять.ЗначениеПараметра(ШиринаПодровнять.ИмяПараметра(ж));
          НоваяШирина := 0;
          от к := 0 до ШиринаДельта.Количество - 1 делать
          начало
            НоваяШирина := НоваяШирина + Document.Tables(2).Cell(1, СтрокаВЦелое(ШиринаДельта.Стр(к))).Width;
          конец;
          если НоваяШирина &lt; 0.00005 тогда 
            НоваяШирина := Document.Tables(ИндексОсновнойТаблицы).Cell(п, НомерКолонки).Width;


          попытка
            Document.Tables(ИндексОсновнойТаблицы).Cell(п, НомерКолонки).SetWidth(НоваяШирина, RulerStyle);
          неудача
          конец;               
        конец;  
      неудача
//          msgbox(ПоследняяОшибка);               
      конец;
      
  
      РасширенноеВыравнивание := ПолучитьЗначениеПараметраРасширения('Выравнивание', ПараметрыРасширений, '');
      если РасширенноеВыравнивание &lt;&gt; '' тогда
        УстановитьВыравниваниеКолонок(2, РасширенноеВыравнивание);

      ВыравниваниеТекстаПоШирине := ПолучитьЗначениеПараметраРасширения('ВыравниваниеПоШирине', ПараметрыРасширений, '');
      если ВыравниваниеТекстаПоШирине &lt;&gt; '' тогда   
      попытка
        комматекст := СоздатьТекст;
        комматекст.РазделенноеЗначение := ВыравниваниеТекстаПоШирине;
        от ж := 0 до комматекст.Количество - 1 делать
        начало
          НомерКолонки := СтрокаВЦелое(комматекст.Стр(ж));          
          от п := 2 до Document.Tables(2).Rows.Count делать
          начало
            Document.Tables(2).Cell(п, НомерКолонки).Range.ParagraphFormat.Alignment := wdAlignParagraphJustify;
          конец;
        конец;          
      неудача
      конец;    
      
      //Уберем у шапки нижнюю границу
      Document.Tables(1).Borders(wdBorderTop).LineStyle := wdLineStyleNone;
      Document.Tables(1).Borders(wdBorderBottom).LineStyle := wdLineStyleNone;
      Document.Tables(1).Borders(wdBorderDiagonalDown).LineStyle := wdLineStyleNone;
      Document.Tables(1).Borders(wdBorderDiagonalUp).LineStyle := wdLineStyleNone;
      Document.Tables(1).Borders.Shadow := нет;
      Document.Application.Options.DefaultBorderLineStyle := wdLineStyleSingle;
      Document.Application.Options.DefaultBorderLineWidth := wdLineWidth050pt;
      Document.Application.Options.DefaultBorderColor := wdColorAutomatic;

      Document.ActiveWindow.Selection.EscapeKey;  
    конец;
    
    если Document.Tables.Count = 1 тогда
      ИндексОсновнойТаблицы := 1
    иначе 
      ИндексОсновнойТаблицы := 2;
      
    ПоляЯчеекТаблиц := ПолучитьЗначениеПараметраРасширения('ПоляЯчеекТаблиц', ПараметрыРасширений, '');
    если ПоляЯчеекТаблиц &lt;&gt; '' тогда
    начало
      попытка
        комматекст := СоздатьТекст;
        комматекст.РазделенноеЗначение := ПоляЯчеекТаблиц; 

        если комматекст.ЗначениеПараметра('w') &lt;&gt; '' тогда
        начало   
          если комматекст.ЗначениеПараметра('t') &lt;&gt; '' тогда
            Document.Tables(2).TopPadding := Document.Application.CentimetersToPoints(СтрокаВДробное(комматекст.ЗначениеПараметра('t')));
          если комматекст.ЗначениеПараметра('b') &lt;&gt; '' тогда
            Document.Tables(2).BottomPadding := Document.Application.CentimetersToPoints(СтрокаВДробное(комматекст.ЗначениеПараметра('b')));
          если комматекст.ЗначениеПараметра('l') &lt;&gt; '' тогда
            Document.Tables(2).LeftPadding := Document.Application.CentimetersToPoints(СтрокаВДробное(комматекст.ЗначениеПараметра('l')));
          если комматекст.ЗначениеПараметра('r') &lt;&gt; '' тогда
            Document.Tables(2).RightPadding := Document.Application.CentimetersToPoints(СтрокаВДробное(комматекст.ЗначениеПараметра('r')));
        конец;
      неудача
      конец;
    конец;
      
     
     //Делаем обводку переносимого заголовка     
     ВосстанавливатьБордюры := ПолучитьЗначениеПараметраРасширения('ВосстанавливатьБордюры', ПараметрыРасширений, 'да');
      если ВосстанавливатьБордюры = 'да' тогда
      начало
        СтрокиБордюров := ПолучитьЗначениеПараметраРасширения('СтрокиБордюров', ПараметрыРасширений, '');
        если СтрокиБордюров &lt;&gt; "" тогда
        начало
          комматекст := СоздатьТекст;
          комматекст.РазделенноеЗначение := СтрокиБордюров;
          БордюрНачало := СтрокаВЦелое(комматекст.ЗначениеПараметра('t'));
          БордюрКонец := Document.Tables(ИндексОсновнойТаблицы).Rows.Count - СтрокаВЦелое(комматекст.ЗначениеПараметра('b'));
          BordersObject := Document.Range(Document.Tables(ИндексОсновнойТаблицы).Rows(БордюрНачало).Range.Start, 
          Document.Tables(ИндексОсновнойТаблицы).Rows(БордюрКонец).Range.End)
        конец
        иначе
          BordersObject := Document.Tables(ИндексОсновнойТаблицы)
      конец
      иначе
        BordersObject := Document.Tables(ИндексОсновнойТаблицы).Rows(1);

      Options := Word.Options;
      BordersObject.Borders.Enable := да;
      BordersObject.Borders(wdBorderTop).LineStyle := Options.DefaultBorderLineStyle;
      BordersObject.Borders(wdBorderTop).LineWidth := Options.DefaultBorderLineWidth;
      BordersObject.Borders(wdBorderTop).Color := Options.DefaultBorderColor;

      BordersObject.Borders(wdBorderLeft).LineStyle := Options.DefaultBorderLineStyle;
      BordersObject.Borders(wdBorderLeft).LineWidth := Options.DefaultBorderLineWidth;
      BordersObject.Borders(wdBorderLeft).Color := Options.DefaultBorderColor;
      если ВосстанавливатьБордюры = 'да' тогда
      начало
        BordersObject.Borders(wdBorderBottom).LineStyle := Options.DefaultBorderLineStyle;
        BordersObject.Borders(wdBorderBottom).LineWidth := Options.DefaultBorderLineWidth;
        BordersObject.Borders(wdBorderBottom).Color := Options.DefaultBorderColor;
      конец;
      
      BordersObject.Borders(wdBorderRight).LineStyle := Options.DefaultBorderLineStyle;
      BordersObject.Borders(wdBorderRight).LineWidth := Options.DefaultBorderLineWidth;
      BordersObject.Borders(wdBorderRight).Color := Options.DefaultBorderColor;

    попытка  
      BordersObject.Borders(wdBorderVertical).LineStyle := Options.DefaultBorderLineStyle;
      BordersObject.Borders(wdBorderVertical).LineWidth := Options.DefaultBorderLineWidth;
      BordersObject.Borders(wdBorderVertical).Color := Options.DefaultBorderColor;
    неудача
    конец;
    
    ЯчейкаШапки0 := ПолучитьЗначениеПараметраРасширения('ЯчейкаШапки0', ПараметрыРасширений, '');
    если ЯчейкаШапки0 &lt;&gt; '' тогда
    начало
      комматекст := СоздатьТекст;
      комматекст.РазделенноеЗначение := ЯчейкаШапки0; 
      ж := СтрокаВЦелое(комматекст.ЗначениеПараметра('x')); п := СтрокаВЦелое(комматекст.ЗначениеПараметра('y'));
      
      Document.Tables(1).Cell(ж, п).RightPadding := 0;
    конец;
        
    УдалятьПустыеСтрокиТаблицыВНачалеСтраницы := строчные(ПолучитьЗначениеПараметраРасширения('УдалятьПустыеСтрокиТаблицыВНачалеСтраницы', ПараметрыРасширений, 'нет'));
    ОпуститьТекстЯчейки := ПолучитьЗначениеПараметраРасширения('ОпуститьТекстЯчейки', ПараметрыРасширений, '');
    если УдалятьПустыеСтрокиТаблицыВНачалеСтраницы = "да" или ОпуститьТекстЯчейки &lt;&gt; "" тогда
      попытка
        УдалитьПустыеСтрокиТаблицыВНачалеСтраницы(Document.Tables(ИндексОсновнойТаблицы), ОпуститьТекстЯчейки + ";deleteemptyrow=" + УдалятьПустыеСтрокиТаблицыВНачалеСтраницы,
        СтрокаВЦелое(ПолучитьЗначениеПараметраРасширения('ШиринаСтолбцовКонец', ПараметрыРасширений, '0')));
      неудача
      конец;

    НомераСтолбцов := ПолучитьЗначениеПараметраРасширения('ЗаменятьНулиПрочерками', ПараметрыРасширений, '');
    если НомераСтолбцов &lt;&gt; '' тогда
      попытка
        комматекст := СоздатьТекст;
        комматекст.РазделенноеЗначение := НомераСтолбцов; 
        ЗаменитьНулиПрочеркамиВСтолбцах(Document.Tables.Item(1), комматекст);
      неудача
      конец;

    ВысотаРабочихСтрок := ПолучитьЗначениеПараметраРасширения('ВысотаРабочихСтрокСПозиции', ПараметрыРасширений, '');
    если ВысотаРабочихСтрок &lt;&gt; '' тогда
    начало
      комматекст := СоздатьТекст;
      комматекст.РазделенноеЗначение := ВысотаРабочихСтрок;       
      если ИндексОсновнойТаблицы = 1 тогда
        НомерСтроки := СтрокаВЦелое(комматекст.ЗначениеПараметра('x'))
      иначе НомерСтроки := 2; 
      ВысотаСтроки := Document.Application.CentimetersToPoints(СтрокаВДробное(комматекст.ЗначениеПараметра('h')));
        от ж := НомерСтроки до Document.Tables(ИндексОсновнойТаблицы).Rows.Count делать
          от п := 1 до Document.Tables(ИндексОсновнойТаблицы).Rows(ж).Cells.Count делать
          начало
            Document.Tables(ИндексОсновнойТаблицы).Cell(ж, п).Height := ВысотаСтроки;
            Document.Tables(ИндексОсновнойТаблицы).Cell(ж, п).HeightRule := wdRowHeightExactly;
          конец;
//      неудача
//      конец;
    конец;

    ВысотаРабочихСтрок := ПолучитьЗначениеПараметраРасширения('ВысотаРабочихСтрок', ПараметрыРасширений, '');
    если ВысотаРабочихСтрок &lt;&gt; '' тогда
    начало
      //попытка
        ВысотаСтроки := Document.Application.CentimetersToPoints(СтрокаВДробное(ВысотаРабочихСтрок));
        от ж := 2 до Document.Tables(ИндексОсновнойТаблицы).Rows.Count делать
          от п := 1 до Document.Tables(ИндексОсновнойТаблицы).Rows(ж).Cells.Count делать
          начало
            Document.Tables(ИндексОсновнойТаблицы).Cell(ж, п).Height := ВысотаСтроки;
            Document.Tables(ИндексОсновнойТаблицы).Cell(ж, п).HeightRule := wdRowHeightExactly;
          конец;
//      неудача
//      конец;
    конец;

    ПодровнятьСтраницы := Строчные(ПолучитьЗначениеПараметраРасширения('ПодровнятьСтраницы', ПараметрыРасширений, 'нет')) = 'да';
    если ПодровнятьСтраницы тогда
    начало
      ПослеТаблицы := Document.Range(Document.Tables(ИндексОсновнойТаблицы).Range.End, Document.Bookmarks("\endofdoc").Range.End);
      если УбратьПробелы(ПослеТаблицы.Text) = "" тогда
        ПослеТаблицы.Text := "";
      от ж := Document.Tables(ИндексОсновнойТаблицы).Rows.Count назад Document.Tables(ИндексОсновнойТаблицы).Rows.Count - 5 делать
        если УбратьПробелы(Document.Tables(ИндексОсновнойТаблицы).Cell(ж, 2).Range.Text) = "" тогда
        начало
          ВысотаСтроки := Document.Tables(ИндексОсновнойТаблицы).Cell(ж, 2).Height цел 2;
          от п := 1 до Document.Tables(ИндексОсновнойТаблицы).Rows(ж).Cells.Count делать  
            попытка
              Document.Tables(ИндексОсновнойТаблицы).Cell(ж, п).Height := ВысотаСтроки;
              Document.Tables(ИндексОсновнойТаблицы).Cell(ж, п).HeightRule := wdRowHeightExactly;
            неудача
            конец;
        конец;
    конец;
    
    НумерацияСтраниц := УбратьПробелы(Строчные(ПолучитьЗначениеПараметраРасширения('НумерацияСтраниц', ПараметрыРасширений, '')));
    если НумерацияСтраниц &lt;&gt; "" тогда
    начало
      комматекст := СоздатьТекст;
      комматекст.РазделенноеЗначение := НумерацияСтраниц;
      Document.PageSetup.DifferentFirstPageHeaderFooter := -1;
      СделатьНумерациюСтраниц(Document.Sections(1), комматекст.ЗначениеПараметра("где"), комматекст.ЗначениеПараметра("выровнять"));
      Document.ActiveWindow.ActivePane.View.SeekView := wdSeekMainDocument;
    конец;
    
    // зададим верхний колонтитул в виде заголовка таблицы
    ЗаголовокСтраницы := ПолучитьЗначениеПараметраРасширения('ЗаголовокСтраницы', ПараметрыРасширений, '');
    если ЗаголовокСтраницы &lt;&gt; '' тогда
    начало
      попытка
        если Document.Tables.Count &gt; 1 тогда
          УдалялиАбзацы(Document, Document.Tables(1), Document.Tables(2));
        Document.PageSetup.DifferentFirstPageHeaderFooter := -1;
        комматекст := СоздатьТекст;
        комматекст.РазделенноеЗначение := ЗаголовокСтраницы; 
        HeaderObject := Document.Range(Document.Tables(1).Cell(СтрокаВЦелое(комматекст.ЗначениеПараметра('t')), СтрокаВЦелое(комматекст.ЗначениеПараметра('l'))).Range.Start, 
        Document.Tables(1).Cell(СтрокаВЦелое(комматекст.ЗначениеПараметра('b')), СтрокаВЦелое(комматекст.ЗначениеПараметра('r'))).Range.End);
        HeaderObject.Copy;

        для Document.Sections(1).Headers(wdHeaderFooterPrimary).Range делать
        начало
          .Collapse(wdCollapseEnd);
          .Paste;
        конец;
        Document.Sections(1).Headers(wdHeaderFooterPrimary).Range.Paragraphs.Last.Range.Font.Size := 1;
        Document.Sections(1).Headers(wdHeaderFooterPrimary).Range.Paragraphs.Indent;
        Document.Sections(1).Headers(wdHeaderFooterPrimary).Range.Paragraphs.Outdent;
        Document.ActiveWindow.ActivePane.View.SeekView := wdSeekMainDocument;
        Document.Tables(1).Range.Paragraphs.Indent;
        Document.Tables(1).Range.Paragraphs.Outdent;
      неудача
      конец;
    конец;
    
    Document.ActiveWindow.Selection.HomeKey;// курсор в начало
    // тут должно уже все быть хорошо.
    
  обязательно
    если (prog &lt;&gt; nil) тогда prog.SetProgress(70);
    DeleteFile(Файл);  
    если (prog &lt;&gt; nil) тогда prog.EndProgress;
    если ПараметрСуществует("ТекстовыйПроцессорДокумент") тогда
      Значение("ТекстовыйПроцессорДокумент") := Document
    иначе
      Word.Visible := да;
    Word.ScreenRefresh;    
    Word.ScreenUpdating := да;  
    Document.ActiveWindow.Selection.HomeKey;// курсор в начало
  конец;
конец.

</value>
		<param value="Расширение_ВыводОтчетаВВорд" type="1" name="AccessCount">912</param>
		<param value="Расширение_ВыводОтчетаВВорд" type="2" name="AccessDate">41951,7636600347</param>
		<param value="Расширение_ВыводОтчетаВВорд" type="3" name="crc32">$018DA97D</param>
		<param value="Расширение_ВыводОтчетаВВорд" type="3" name="installversion">1.0</param>
		<param value="Расширение_ВыводОтчетаВВорд" type="3" name="version">34.036.00</param>
	</node>
</registry>
