Использование мастера действий при формировании отчетов

13 8

Введение

В составе стандартной поставки системы есть компонента «Разработка отчетов», позволяющая формировать различные отчеты, в том числе аналитические. Но вот беда – данный функционал не содержит встроенного интерфейса и для того чтобы запросить какие-либо параметры разработчикам приходилось использовать функцию 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. Ничего не мешает подобным же образом организовать «интерфейс» для сценариев.

13
Авторизуйтесь, чтобы оценить материал.
1
Иван Сычев

Подскажите пожалуйста, часть 2 :

Теперь можно приниматься за сам отчет, с которым все гораздо проще. Достаточно лишь в «Расчете», в начале, написать несколько строк:

 Где находится этот "Расчёт"?

 

 

Андрей Литвинов

Кнопка "Расчет" на форме разработки отчета: тынц

Иван Сычев

Расчёт нашёл... Запускаю мастер действий, а он мне пишет ошибку:

Несовпадение типов.
Рекомендуется завершить работу приложения!
Мастер поиска документов, этап "Параметры", действие "Finish": ошибка в строке 2.
 

как я понимаю это вот эта строчка:

CurRep = Reports.GetObjectByName(Params.ValueByName("ReportName").Value)

 но не могу выяснить где я ошибся...

 

 

Андрей Литвинов

Напишите перед строкой 2 что нибудь типа ShowMessage(Params.ValueByName("ReportName").Value) и посмотрите правильное ли наименование пришло в мастер действий.

 

Иван Сычев

возвращает значение "Null", думал из-за того что база пустая... создал документ для проверки... а она всё равно пишет "Null"...

Андрей Литвинов

Ну количество документов в базе здесь совсем не при чем... Скорее всего что то не так вот в этой строке:

CurWizard.Params.ValueByName("ReportName").Value = Object.Name

Иван Сычев

спасибо за помощь, буду разбираться.

Алексей Голубев

Иван, просто в параметре ReportName необходимо было указать наименование отчета, а так Вы передаете пустое значение, вот он Вам и выдает NULL

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