Фильтрация в отчете?

Добрый день! Есть ли возможность отфильтровать в окне фильтрации отчета тот набор данных который выводиться при выборе поля из справочника. Например выбираешь контрагентов и выводишь только с адресом "Москва"???

Нравится

13 комментариев

Можно добавить в запрос и датасет отчета поле адрес контрагента, и выбирать его в окне фильтрации

Не так то понятно можно. Я хотел фильтровать именно выбор контрагента по определенным полям чтобы окно выбора контрагента уже выводилось отфильтрованным?

Иван, это можно реализовать только используя своё окно фильтрации. В нём Вы сможете накладывать на поля какие угодно фильтры и присваивать им начальные значения при обработке OnPrepare самого окна, или же при обработке OnPrepareSelectWindow Lookup-контролов.

Спасибо понятно! А как создать свое окно фильтрации для отчета. Просто создаешь окно указываешь в нем датасет отчета?

Не совсем. Нужно создать окно, в нём можно использовать как один, так и несколько датасетов, которые Вам нужны для выбора значений. Но они не связаны с датасетами отчёта. Все остальные действия по фильтрации значений и вычислении выполняются в скрипте окна.

Посмотрите реализацию базовых отчётов, которые используют свои окна фильтрации. Например, отчёт "Движение денежных средств" (использует wnd_CashflowReportFilter). Или другие отчёты, которые есть в Вашей конфигурации.

Спасибо большое! Буду пробовать!

"Лабьяк Олег Игоревич" написал:Посмотрите реализацию базовых отчётов, которые используют свои окна фильтрации. Например, отчёт "Движение денежных средств"

Добрый день!
Я новичок и у меня возникла похожая ситуация. Необходимо в отчете подправить фильтр таким образом, чтобы при выборе значения в фильтре Подразделения в фильтре Ответственный указывались бы только ответственные из выбранного подразделения (или по всем, если подразделение не выбрано).

Можете подробнее рассказать о том, как можно создать свое окно фильтрации для отчета и как его к нему привязать? Или дайте ссылку, где почитать.

Указанного в комментарии отчета для примера не нашла у себя :(

Заранее благодарна!

Если у Вас нет указанного отчета, то Вы можете найти другие примеры из конфигурации. Все отчеты хранятся в подветках Reports каждого корневого узла дерева сервисов. Вам нужны те отчеты, среди сервисов которых присутствует сервис wnd_* окна фильтрации. Посмотрите, например, в инцидентах. Там точно хотя бы два есть.
Окно фильтрации привязывается к отчету в клиентском приложении в разделе "Отчеты" (Инструменты-Отчеты). По кнопке изменения свойств отчета нужно указать созданное окно фильтрации для отчета.
Логика работы нужного Вам окна должна быть таковой: в окне должно быть хотя бы два поля -- для выбора подразделения и для выбора ответственного. Дальше, как и рекомендовал Олег, в обработчике события OnPrepareSelectWindow Lookup-контрола выбора ответственного нужно по выбранному подразделению (edtDepartment.DataField.Value) фильтровать LookupDataset, который приходит в обработчик параметром. Например, так:
ApplyDatasetFilter(LookupDataset, 'DepartmentID', edtDepartment.DataField.Value, true);
Тут edtDepartment - это Lookup-контрол для выбора подразделения из Вашего окна фильтрации.
Поищите по узлам Reports готовые отчеты с окнами фильтрации, чтобы детальнее разобраться с проблемой.

Спасибо за ответ!
Попробовала привязать форму к отчету, получилось, что при вызове отчета окно с фильтрами очень долго грузится, а когда открывается, то оно пустое (то есть не из чего параметры выбирать). Подскажите, может я чего неправильно делаю?

Вот код на открытие формы с фильтрами:

Но я использовала код готовой уже формы, т.к. я новичок и только разбираюсь во всем.

var FilterEngine = new Object();
 
 
function wnd_ReportTaskByManagerOnPrepare(Window) {
	FilterEngine.ReportPreviewer = GetAttribute(Window, 'ReportPreviewer');
	FilterEngine.Report = FilterEngine.ReportPreviewer.Report;
 
   	FilterEngine.dsOpportunities = Services.GetNewItemByUSI('ds_Opportunity'); 
	FilterEngine.OpportunityFilterWindow = wndOpportunityFilter.Window;
	PrepareReportFilterWindow(FilterEngine.OpportunityFilterWindow, 
	FilterEngine.dsOpportunities, 'ID', 'Title', 'OpportunityFilters');
 
	FilterEngine.dsAccounts = Services.GetNewItemByUSI('ds_Account');
        FilterEngine.AccountFilterWindow = wndAccountFilter.Window;
        PrepareReportFilterWindow(FilterEngine.AccountFilterWindow, 
	FilterEngine.dsAccounts, 'ID', 'Name', 'AccountFilters');		
 
	FilterEngine.dsOwners = Services.GetNewItemByUSI('ds_Contact'); 
	FilterEngine.OwnerFilterWindow = wndOwnerFilter.Window;
	PrepareReportFilterWindow(FilterEngine.OwnerFilterWindow, 
	FilterEngine.dsOwners, 'ID', 'Name', 'OwnerFilters');
 
	FilterEngine.dsTaskType = Services.GetNewItemByUSI('ds_TaskType');
        FilterEngine.TypeFilterWindow = wndTypeFilter.Window;
        PrepareReportFilterWindow(FilterEngine.TypeFilterWindow, 
	FilterEngine.dsTaskType, 'ID', 'Name', 'TypeFilter');
 
	FilterEngine.dsPriority = Services.GetNewItemByUSI('ds_TaskPriority');
	FilterEngine.PriorityFilterWindow = wndPriorityFilter.Window;
	PrepareReportFilterWindow(FilterEngine.PriorityFilterWindow, 
	FilterEngine.dsPriority, 'ID', 'Name', 'PriorityFilters');
 
	FilterEngine.dsStatus = Services.GetNewItemByUSI('ds_TaskStatus');
	FilterEngine.StatusFilterWindow = wndStatusFilter.Window;
	PrepareReportFilterWindow(FilterEngine.StatusFilterWindow, 
	FilterEngine.dsStatus, 'ID', 'Status', 'StatusFilters');
 
	FilterEngine.DateFilterWindow = wndDateFilter.Window; 		
 
}
function wnd_FilterTasksListOnPrepare(Window) {
	PrepareWindow(Window); 
}

Вы выбрали довольно сложное окно фильтрации, как для начала. Посмотрите на wnd_ReportOpportunitiesDateFilter -- это простенькое пользовательское окно фильтрации по периоду. Для него и скрипт обработки wnd_ReportOpportunitiesDateFilterScript совсем небольшой. В функции SaveDatePeriod производится считывание значений из окна (на самом деле из датасета mds_DatePeriod, привязанного к окну), дальше производится фильтрация набора данных и передача значений в параметры отчета для отображения их также и там. Если будете использовать его для своих целей или для тестирования, то создайте новое окно, укажите в параметре TemplateWindowUSI значение wnd_ReportOpportunitiesDateFilter, сохраните сервис созданного окна, закройте его, откройте вновь и получите фактически копию. Уже с ним можете работать. Проверьте также, чтобы это окно было указано в свойствах нужного отчета в клиентском приложении Террасофт.

Спасибо огромное! Сейчас попробую реализовать :smile:

Добрый день, Уважаемые!

Опять у меня проблемка возникла. Решаю, какие компоненты использовать для фильтрации значений. Lookup - не подходит, т.к. необходим множественный выбор (подразделений можно выбрать несколько и по этим нескольким подразделениям необходимо фильтровать параметр ответственный).

Поискала информацию на форуме, так и не поняла, какой компонент в такой ситуации использовать: FiltersBuilderControl или EnumDataControl? Или еще какой можно?

Марина, LookupControl вполне подходит для множественного выбора. В появившемся окне выбора (используется окно wnd_SelectData) Вы можете выбрать несколько значений с помощью клавиш Shift или Ctrl, доступ к которым можно будет получить через атрибут KeyValues окна.

Показать все комментарии