
В составе стандартной поставки системы DIRECTUM есть компонента «Разработка отчетов», позволяющая (сюрприз!) формировать различные отчеты, в том числе аналитические. Но вот беда — данный функционал не содержит встроенного интерфейса и для того, чтобы запросить какие-либо параметры, разработчикам приходилось использовать функции InputDialog и InputDialogEx.
Безусловно, использование данных функций решает проблему запроса, например, периода, но если дело дойдет до списка записей справочника или списка документов, то приходится доставать бубен и разжигать ритуальный костер. К счастью, в версии DIRECTUM 4.7 появился новый объект — «Мастер действий», и его вполне можно использовать как интерфейс для отчетов.
Идея достаточно проста: при запуске отчета программно проверить список поступивших параметров и, если он пуст, то вызвать соответствующий шаг специального мастера действий, который по окончании своей работы снова вызовет отчет, но уже с параметрами.
Постановка задачи
Допустим, необходимо реализовать отчет, показывающий количество документов, созданных за период. Причем пользователь должен иметь возможность выбрать интересующие виды документов, а также определить список работников, по которым необходимо выполнить подсчет.
Решение (часть 1)
Для начала создаем мастер действий и задаем ему параметры:
С параметрами DateBegin и DateEnd, думаю все ясно. Параметры RefVed и RefWorker реализуют списки записей справочников «Виды электронных документов» и «Работники», соответственно. А вот параметр ReportName — служебный, и будет хранить наименование отчёта, вызвавшего мастер. Далее создаем этап мастера типа «Форма» и размещаем на нем параметры. Также необходимо не забыть отключить действия «Previous» и «Next» — для параметров отчета нам необходимы только «Cancel» и «Finish».
В событие мастера «Finish» прописываем следующий программный код:
Params = Wizard.Params
CurRep = Reports.GetObjectByName(Params.ValueByName("ReportName").Value)
RepParam = CurRep.Params
RepParam.Add("DateBegin";Params.ValueByName("DateBegin").Value)
RepParam.Add("DateEnd";Params.ValueByName("DateEnd").Value)
//Виды документов
sTmp = ""
foreach RefInfo in Params.ValueByName("RefVed").Value
sTmp = AddSubString(RefInfo.Code;sTmp;"|")
endforeach
RepParam.Add("RefVed";sTmp)
//Работники
sTmp = ""
foreach RefInfo in Params.ValueByName("RefWorker").Value
sTmp = AddSubString(RefInfo.Code;sTmp;"|")
endforeach
RepParam.Add("RefWorker";sTmp)
CurRep.Execute
Решение (часть 2)
Теперь можно приниматься за сам отчет, с которым все гораздо проще. Достаточно лишь в «Расчете», в начале, написать несколько строк:
//Код мастера действий "Параметры отчетов"
sWizardPrmCode = "ALTPrm"
RepParam = Object.Params
if RepParam.Count = 0
CurWizard = Wizards.GetObjectByCode(sWizardPrmCode)
CurWizard.Params.ValueByName("ReportName").Value = Object.Name
CurWizard.CurrentStep = CurWizard.Steps.ValueByName("Параметры1")
CurWizard.Execute
Exit()
endif
DateBegin = RepParam.ValueByName("DateBegin")
DateEnd = RepParam.ValueByName("DateEnd")
if Not (Assigned(DateBegin) And Assigned(DateEnd))
Exit()
endif
RefVedCode = RepParam.ValueByName("RefVed")
RefUsCode = RepParam.ValueByName("RefWorker")
Заключение
- Передача списка записей справочников от мастера действий в отчет происходит в виде строки кодов, разделенных символом «|». Для передачи списка документов можно организовать строку, состоящую из ID документов, разделенных символом «|».
- Для каждого отчета можно не разрабатывать свой мастер действий, достаточно до выполнения метода Execute правильно инициировать свойство CurrentStep.
- Ничто не мешает нам подобным же образом организовать «интерфейс» для сценариев.
Оригинал был опубликован 20 декабря 2011 года на сайте DIRECTUM Club. На любые вопросы автор с удовольствием ответит по почте: al@b-alt.ru