Особенности разработки отчетов для работы в веб-доступе

13 0

Начинаем цикл статей о разработке для веб-доступа. В этой статье рассмотрим разработку отчетов для веб-доступа, а именно особенности разработки в прикладной части и в клиентской объектной модели (КОМ).

Для работы с отчетом КОМ веб-доступа, необходимо обращаться к фабрике отчетов 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().

13
Авторизуйтесь, чтобы оценить материал.
6
Пока комментариев нет.

Авторизуйтесь, чтобы написать комментарий