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

Нравится

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 новую функцию, которая даёт возможность получить отображаемое значение поля датасета. Данное изменение связано с тем, что для отображения в отчёте нам нужны строковые значения. Итого, получаем:

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

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