Как разработать ПФ с шаблоном в MS Word

Материал из RSB-Doc
Перейти к: навигация, поиск

Создаём шаблон в MS Word (*.dot)

PrintFormWord 1.jpg PrintFormWord 2.jpg PrintFormWord 3.jpg

PrintFormWord 4.jpg

DOCPROPERTY  D1  \@ "DD MMMM YYYY" * MERGEFORMAT

Если в поле выводится число, то после слэша (\) можно дописать # и далее в кавычках задать формат. Пример:

DOCPROPERTY  S1  \# "# ###" * MERGEFORMAT

Pic2.jpg

Создаём макрос ПФ

Основные особенности макроса:

Замечание:

Ранее в метод PrintTemplate передавалось два параметра. Первый - имя файла, и второй - объект типа CReportInputParams. При этом
шаблон не только формировался, но и сразу отображался на экране, что приводило к ошибкам при дальнейших изменениях шаблона (см.
#25856). Во избежание таких ошибок метод CreateObjWord был вынесен из PrintTemplate. Теперь алгоритм такой: вызваем CreateObjWord,
заполняем все параметры, и в конце вызываем PrintTemplate. По аналогии с ПФ на FastReport'е.

Пример макроса:

cpwin;
import "COrptWord.mac";
 
class (CReportPrintFormWord) CCOrptPrintFormMSWordExample()
  InitCReportPrintFormWord();
 
  macro Print (bShowPreview)
    CreateObjWord("COrptPrintFormMSWordExample.dot");  // Установка шаблона

    var oParams = CReportInputParams();
    oParams.SetValue("Номер документа", 777);  // Устанавливаем поле

    Doc.Range(Doc.Bookmarks("Начало_2_абзаца").Start, Doc.Bookmarks("Конец_2_абзаца").Start).Delete();  // Скрываем 2-ой абзац

    // Заполняем таблицу
    var i = 0;
    while (i < 3)
      i = i + 1;
      Doc.Tables(1).Cell(i + 1, 1).Range.Text = i;
      Doc.Tables(1).Cell(i + 1, 2).Range.Text = "Текст_1";
      Doc.Tables(1).Cell(i + 1, 3).Range.Text = "Текст_2";
      if (i < 2)
        Doc.Tables(1).Rows.Add();
      end;
    end;

    PrintTemplate(oParams);  // Заполнение шаблона и вывод его на экран

    // Если в шаблоне ПФ используются колонтитулы, в которые добавлены динамически заполняемые поля,
    // следует вызвать метод Update() для этих полей, иначе пользователю будут выведены значения,
    // установленные по-умолчанию вместо необходимых значений.
    // Doc.Sections(1).Headers(1) - верхний колонтитул
    // Doc.Sections(1).Footers(1) - нижний колонтитул
    Doc.Sections(1).Footers(1).Range.Fields.Update(); // Обновим поля в нижнем колонтитуле

  OnError (er)
    ReportError(er);
  end;
end; 

macro RunReport (objParam)
  var objReport = CCOrptPrintFormMSWordExample();
  objReport.Print(objParam.bShowPreview);
end;
Личные инструменты
Пространства имён
Варианты
Действия
Навигация
Для разработки
Инструменты