Начинаем цикл статей о разработке для веб-доступа. В этой статье рассмотрим разработку отчетов для веб-доступа, а именно особенности разработки в прикладной части и в клиентской объектной модели (КОМ).
Для работы с отчетом КОМ веб-доступа, необходимо обращаться к фабрике отчетов WebAccess.factories.reports, которая предоставляет инструменты для работы с отчетами, более подробное описание с примерами есть в справке к системе. Хотелось бы остановиться на некоторых моментах.
Для выполнения отчетов без показа запрашиваемых параметров используется функция execute, для интегрированных отчетов функция executeIntegrated. Например:
// Запустить отчет и открыть его в новом окне.
BaseWebAccess.viewOrgInfo = function () {
WebAccess.factories.reports("Сводка по организации (HTML)").execute({ Org: WA.CR.form.requisites.Код.getValue() }).done(function (report) {
report.open();
}).fail(
function (res) {
WA.CR.inlineHint.showError(res.Error);
});
}
// Вызвать интегрированный отчет "Конверт со штрих-кодом для почты России"
RecordOffice.printEnvelope = function () {
WA.FC.reports("MailEnvelopeWithBarCode").executeIntegrated(new WA.Link()).done(function (report) {
report.open();
});
};
Далее рассмотрим разработку отчетов с запрашиваемыми параметрами с использованием диалогов и без.
Если отчет запускается с закладки «Запустить» или по ссылке (ссылка копируется из десктоп-клиента и вставляется в браузер), то для вызова диалога укажите его имя в XML-файле веб-модуля, а параметр "getparams" равным " fromdialog".
<Report name="AssignmentExecutionDeadlineControl" getparams="fromdialog" dialogname="AssignmentExecutionDeadlineControl" />
В результате при запуске отчета автоматически отобразится диалог запроса параметров, а параметры отчета заполнятся значениями реквизитов диалога.
Если отчет запускается по кнопке на ленте, то для показа диалога в веб-доступе воспользуйтесь функциями клиентской объектной модели: showDialogAndExecute или showDialogAndExecuteIntegrated. Например:
WebAccess.factories.reports("AssignmentExecutionDeadlineControl").showDialogAndExecute("AssignmentExecutionDeadlineControl").done(function(report) {
report.open();
});
При разработке отчетов, запрашивающих параметры с помощью прикладных диалогов, используйте прикладную функцию ShowDialog() вместо вызова метода Show объекта IDialog. Если отчет запущен в веб-клиенте, то функция передаст значения, введенные в диалоге, в объект IDialog. Если отчет запущен в десктоп-клиенте, то функция покажет окно диалога. В результате в обоих случаях в дальнейшем расчете можно использовать свойства и методы IDialog.
// Создать и показать диалог запроса параметров
Dialog = Dialogs.AssignmentExecutionDeadlineControl.CreateNew
ShowDialog(Dialog)
if Dialog.Result = mrOk or IsWebRuntimeContext()
StartDate = Dialog.Requisites('Date').AsString
EndDate = Dialog.Requisites('Date2').AsString
...
endif
Если в отчете необходимо запросить у пользователя какие-либо данные, мы можем установить в XML файле веб-модуля параметр "getparams" равным "true". В JavaScript-файле необходимо использовать метод с запросом параметров. Рассмотрим на примере интегрированного отчета "Штрих-код (RTF)".
//XML
<Report name="Штрих-код (RTF)" getparams="true"/>
//JS:
WebAccess.factories.reports("Штрих-код (RTF)").queryParamsAndExecuteIntegrated(new WA.Link()).done(function (report) {
report.open();
});
В прикладной части для корректной работы такого отчета необходимо сформировать XML, в котором указать необходимые параметры. Пример шаблона XML:
<Params>
<Param name="Имя параметра" caption="Заголовок" type="Тип" refcode="Код справочника (для типа ReferenceRecord)" defaultvalue="Значение по умолчанию" required="Обязательность"/>
...
</Params>
Полученную XML необходимо записать в параметр отчета "_result" и после этого выполнить Exit(). Это необходимо, так как отчет с запрашиваемыми параметрами будет запускаться 2 раза: первый раз — для получения параметров, а второй непосредственно для формирования самого отчета на их основе. При первом запуске веб-доступ автоматически передает в отчет параметр "_action" со значением "getparams". Если не выполнять Exit(), то отчет полностью отработает, но у пользователя не будут запрашиваться параметры, в связи с этим могут быть ошибки.
// Обработка запроса параметров для веб-доступа
Action = ValueByName(Params; '_action'; '')
if Action == "getparams"
// Сформировать параметры для веб
ResultXML = Format('
<Params>
<Param name="LeftRight" caption="%0:s" type="Pick" choices="%1:s=%1:s;%2:s=%2:s" defaultvalue="%3:s" required="true"/>
<Param name="UpDown" caption="%4:s" type="Pick" choices="%5:s=%5:s;%6:s=%6:s" defaultvalue="%7:s" required="true"/>
<Param name="TextOrient" caption="%8:s" type="Pick" choices="%9:s=%9:s;%10:s=%10:s" defaultvalue="%11s" required="true"/>
</Params>'; ArrayOf(
HorisontalAlignment; Left; Right; SubString(DefaultValue; '|'; 1);
VerticalAlignment; Top; Bottom; SubString(DefaultValue; '|'; 2);
TextOrientation; Horizontal; Vertical; SubString(DefaultValue; '|'; 3)))
Params.SetVar("_result"; ResultXML)
Exit()
endif
if IsWebRuntimeContext() and Action <<>> "getparams"
// Считать параметры, заполненные в вебе
LeftRight = ValueByName(Params; "LeftRight"; '')
UpDown = ValueByName(Params; "UpDown"; '')
TextOrient = ValueByName(Params; "TextOrient"; '')
...
endif
В ситуациях, когда параметры не нужны, в "_result" нужно передать пустую строку и выполнить Exit():
if PrintMode == "" or PrintMode == Automatic
if IsWebRuntimeContext()
Action = ValueByName(Params; '_action'; '')
if Action == "getparams"
Params.SetVar("_result"; "")
Exit()
endif
endif
...
else
...
endif
Если этого не сделать, то вычисления могут увеличивать время формирования отчета в 2 - 3 раза. Если рассмотреть на нашем примере, то отчет "Штрих-код(RTF)" формируется около 8 секунд, но при неправильной работе с параметрами задержка может достигать 30 секунд и более.
В заключении хочется резюмировать: если есть запрашиваемые параметры, то отчет в вебе запускается несколько раз. При первом запуске отобразится окно запроса параметров, после чего отчет будет запущен снова с уже записанными в параметры данными. Для дальнейшей обработки необходимо считать их из параметров. После передачи параметров, необходимо выполнять Exit(). Если для запроса параметров в отчетах вызываются прикладные диалоги, то используйте функцию ShowDialog().
Авторизуйтесь, чтобы написать комментарий