Возник вопрос, можно ли вывести поля вордовского отчета в колонтитул?
Или может я что-то не так делаю, потому-что в самом документе данные подставляются, а в колонтитуле остается просто название поля.
Нравится
Добрый день, Юрий!
На данный момент функционал вывода данных в колонтитул не реализован. По Вашему обращению зарегистрирован запрос на изменение №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 новую функцию, которая даёт возможность получить отображаемое значение поля датасета. Данное изменение связано с тем, что для отображения в отчёте нам нужны строковые значения. Итого, получаем:
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; } }
2) Функцию ProcessRange переписать так (добъёмся замены всех макросов, а не только первого):
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); } }
3) Изменить сам вызов замены колонтитулов в функции ProcessWordReportDataFill:
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; … }
Последняя строчка в приведённом выше коде изменяет режим окна документа на "Разметка страницы".
На счет последней строчки Document.Windows.Item(1).View.Type = 3, если оставить все так то тогда если выбираем несколько записей - система валится.
Сделал так: Document.Windows.Item(1).View.Type = 4 - режим предварительного просмотра. Так работает и возможно удобней, поскольку сразу готово к печати.
Чтобы после формирования отчета с колонтитулами вид документа возвращался с состояние «Разметка страницы», необходимо в сервисе scr_UserReportCommon изменить метод ProcessWordReportDataFill следующим образом:
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; }
Функция ProcessRange не была обнаружена. Попытка добавления своей функции не привела к успеху.
Версия продукта Terrasoft XRM Distribution 3.4.0.135.
Выкладываю Вам рабочий сервис, сравните со своим.scr_userreportcommon3.4.0.156.rar