Введение
В составе стандартной поставки системы есть компонента «Разработка отчетов», позволяющая формировать различные отчеты, в том числе аналитические. Но вот беда – данный функционал не содержит встроенного интерфейса и для того чтобы запросить какие-либо параметры разработчикам приходилось использовать функцию InputDialog/InputDialogEx. Безусловно, использование данных функций решает проблему запроса, например, периода, но если дело дойдет до списка записей справочника или списка документов, то приходится доставать «шаманский бубен» и разжигать «ритуальный костер».
В версии 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")
Заключение
1. Передача списка записей справочников от мастера действий в отчет происходит в виде строки кодов разделенных символом «|». Для передачи списка документов можно организовать строку, состоящую из ИД документов разделенных символом «|».
2. Для каждого отчета можно не разрабатывать свой мастер действий, достаточно до выполнения метода Execute правильно инициировать свойство CurrentStep.
3. Ничего не мешает подобным же образом организовать «интерфейс» для сценариев.
Подскажите пожалуйста, часть 2 :
Где находится этот "Расчёт"?
Кнопка "Расчет" на форме разработки отчета: тынц
Расчёт нашёл... Запускаю мастер действий, а он мне пишет ошибку:
как я понимаю это вот эта строчка:
но не могу выяснить где я ошибся...
Напишите перед строкой 2 что нибудь типа ShowMessage(Params.ValueByName("ReportName").Value) и посмотрите правильное ли наименование пришло в мастер действий.
возвращает значение "Null", думал из-за того что база пустая... создал документ для проверки... а она всё равно пишет "Null"...
Ну количество документов в базе здесь совсем не при чем... Скорее всего что то не так вот в этой строке:
CurWizard.Params.ValueByName("ReportName").Value = Object.Name
спасибо за помощь, буду разбираться.
Иван, просто в параметре ReportName необходимо было указать наименование отчета, а так Вы передаете пустое значение, вот он Вам и выдает NULL
Авторизуйтесь, чтобы написать комментарий