Word
ворд
колонтитул
отчет
Отчёты
Разработка

Вывод полей вордовского отчета в колонтитул

Возник вопрос, можно ли вывести поля вордовского отчета в колонтитул?
Или может я что-то не так делаю, потому-что в самом документе данные подставляются, а в колонтитуле остается просто название поля.

Нравится

11 комментариев

Добрый день, Юрий!

На данный момент функционал вывода данных в колонтитул не реализован. По Вашему обращению зарегистрирован запрос на изменение №61233.
Мы обязательно сообщим Вам, как только получим результаты.

Татьяна,
Есть ли какие-то продвижения по этому запросу?
Для нашей компании вопрос тоже актуален.
Заранее спасибо!

Михаил, на текущий момент есть следующее решение:

Для реализации задачи нужно (полужирным выделен текст, который нужно добавить):
1) В скрипте scr_UserReportCommon изменить функцию ProcessWordReportDataFill, после вызова функции ProcessOneRootRecordWordReportDataField добавить обработку колонтитулов:

function ProcessWordReportDataFill(Document, RootSection, Sections, IsPreview,

ProcessOneRootRecordWordReportDataField(DocumentRange, Selection,
RootSection, Sections, RecordsCountObject, WorkspaceWindow);
if (RootDataset.RecordNumber == 1) {
ProcessRange(Document.Sections(1).Headers(1).Range);
ProcessRange(Document.Sections(1).Footers(1).Range);
}


}

2) В скрипте scr_UserReportCommon добавить функцию ProcessRange:

function ProcessRange(Range) {
InitializeTagFindObject(Range.Find);
while (Range.Find.Execute()) {
Range.Select();
var ExpressionObject = GetExpressionObject(Range.Text);
Range.Text = GetFieldValueByCaption(MSWordUserReport.RootDataset,
ExpressionObject.FieldName) || '';
}
}

Олег, благодарю за ответ!
Попробуем.

Олег,
Мы воплотили предложенное Вами решение. При этом возникает проблема, которую я опишу ниже.

Нам необходимо в колонтитуле иметь надпись наподобие такой "Договор об оказании услуг № 101/ФТ/11 от 13.01.2011". Для этого в шаблон отчета мы вставляем два поля и получаем следующее "Договор об оказании услуг № <#Деталь 1.Номер> от <#Деталь 1.Дата начала>". Оба поля (номер и дата начала) встречаются в этом же отчете в другом месте (не в колонтитуле) и прекрасно работают. В колонтитуле же при формировании отчета первое поле работает, а второе - нет (получается "Договор об оказании услуг № 94/ФТ/10 от <#Деталь 1.Дата начала>"). Мы пробовали для интереса использовать другие поля, но нам не удалось заставить правильно отображать одновременно 2 поля.

Также почему-то при формировании отчета Word открывается в режиме отображения "Черновик" с отдельным полем для колонтитула снизу - см. приложенный скриншот. Это конечно легко решается ручным выбором режима "Разметка страницы", однако было бы удобнее, если бы он сразу открывался в этом режиме, как при формировании других отчетов.

Буду благодарен за помощь в решении проблемы!

Да, предоставленное решение не является универсальным.

Попробуйте следующим образом:

1) Создать по образцу функции GetFieldValueByCaption скрипта scr_UserReportCommon новую функцию, которая даёт возможность получить отображаемое значение поля датасета. Данное изменение связано с тем, что для отображения в отчёте нам нужны строковые значения. Итого, получаем:

[javascript]
function GetFieldValueByCaptionEx(Dataset, FieldCaption, ReturnText) {
var DataField = GetDataFieldByCaption(Dataset, FieldCaption);
if (!Assigned(DataField)) {
return;
}
if (!DataField.IsEnabled) {
return;
}
if ((DataField.FieldType == dftEnum) || ReturnText) {
return DataField.DisplayValue;
} else {
return DataField.Value;
}
}
[/javascript]

2) Функцию ProcessRange переписать так (добъёмся замены всех макросов, а не только первого):

[javascript]
function ProcessRange(Element) {
var Range = Element.Range;
InitializeTagFindObject(Range.Find);
while (Range.Find.Execute()) {
Range.Select();
var ExpressionObject = GetExpressionObject(Range.Text);
Range.Text = GetFieldValueByCaptionEx(MSWordUserReport.RootDataset,
ExpressionObject.FieldName, true) || '';
Range = Element.Range;
InitializeTagFindObject(Range.Find);
}
}
[/javascript]

3) Изменить сам вызов замены колонтитулов в функции ProcessWordReportDataFill:

[javascript]
function ProcessWordReportDataFill(Document, RootSection, Sections, IsPreview,

ProcessOneRootRecordWordReportDataField(DocumentRange, Selection,
RootSection, Sections, RecordsCountObject, WorkspaceWindow);
if (RootDataset.RecordNumber == 1) {
for (var i = 1; i <= Document.Sections.Count; i++) {
for (var j = 1; j <= Document.Sections(i).Headers.Count; j++) {
ProcessRange(Document.Sections(i).Headers(j));
}
for (var k = 1; k <= Document.Sections(i).Footers.Count; k++) {
ProcessRange(Document.Sections(i).Footers(k));
}
}
}
Document.Windows.Item(1).View.Type = 3;

}
[/javascript]

Последняя строчка в приведённом выше коде изменяет режим окна документа на "Разметка страницы".

Олег,
Благодарю за ответ.
Работает!

На счет последней строчки Document.Windows.Item(1).View.Type = 3, если оставить все так то тогда если выбираем несколько записей - система валится.

Сделал так: Document.Windows.Item(1).View.Type = 4 - режим предварительного просмотра. Так работает и возможно удобней, поскольку сразу готово к печати.

Чтобы после формирования отчета с колонтитулами вид документа возвращался с состояние «Разметка страницы», необходимо в сервисе scr_UserReportCommon изменить метод ProcessWordReportDataFill следующим образом:

[javascript]
function ProcessWordReportDataFill(Document, RootSection, Sections, IsPreview,

...

// Document.Windows.Item(1).View.Type = 3; // убрать

DoChildDatasetsOperation(ChildDatasetsArray, 'Close');
if (RootDataset.IsLastPageRecord(1)) {
break;
}
if (RecordsCountObject.CancelledByUser) {
break;
}
if (RootDataset.RecordNumber < RootRecordsCount) {
DocumentRange = GetNextTemplate(Document, Selection, DocumentTemplate, UserClipboardContent);
}
RootDataset.GotoNext();

}
RootDataset.Close();
Document.Content.Collapse(0);
Document.Windows.Item(1).View.Type = 3; // добавить
Document.Windows.Item(1).ActivePane.View.SeekView = 0; // добавить
Document.Windows.Item(1).View.Type = 3; // добавить
Selection.End = 0;
}
[/javascript]

Функция ProcessRange не была обнаружена. Попытка добавления своей функции не привела к успеху.
Версия продукта Terrasoft XRM Distribution 3.4.0.135.

Выкладываю Вам рабочий сервис, сравните со своим.scr_userreportcommon3.4.0.156.rar

Показать все комментарии