Здравствуйте.
Есть деталь, с одним справочным полем UsrTest, у этого справочника есть поле UsrText (строковой тип). Необходимо отфильтровать выдаваемые значения этого справочника по полю UsrText.

rules: {
    "UsrTest": {
        FiltrationUsrTest: {
            ruleType: ConfigurationEnums.BusinessRule.RuleType.FILTRATION,
            baseAttributePatch: "UsrText",
            comparisonType: Terrasoft.ComparisonType.EQUAL,
            type: ConfigurationEnums.BusinessRule.ValueType.CONSTANT,
            attribute: {value:"77-0"}
                                }
                        }
                }
        };
});

В консоле ошибок нет, но и не фильтрует.
Подскажите пожалуйста в чем проблема. Спасибо.

Нравится

1 комментарий

Здравствуйте. Мне нужно реализовать фильтрацию справочника Account по 2-типам. Например, чтобы при выборе контрагента были видны только с типами "Поставщик" и "Клиент". Подскажите пожалуйста как я это могу реализовать. Пробовал следующим образом:
"UsrAccount": {
FiltrationAccountByTypeWithAutocomplete: {
logical: Terrasoft.LogicalOperatorType.AND,
ruleType: ConfigurationEnums.BusinessRule.RuleType.FILTRATION,
autocomplete: true,
baseAttributePatch: "Type",
comparisonType: Terrasoft.ComparisonType.EQUAL,
type: ConfigurationEnums.BusinessRule.ValueType.CONSTANT,
value: {value: "f3c0ce97-53e6-df11-971b-001d60e938c6"},
baseAttributePatch: "Type",
comparisonType: Terrasoft.ComparisonType.EQUAL,
type: ConfigurationEnums.BusinessRule.ValueType.CONSTANT,
value: {value: "b7ea5b78-85c2-4eee-bbb2-847fb86c293a"}

}
}

Нравится

3 комментария

Здравствуйте!

Используйте следующий пример:

…..
attributes: {                                        
                "Account": {
                    dataValueType: Terrasoft.DataValueType.LOOKUP,
                    lookupListConfig: {filter: function() {
                        return Terrasoft.createColumnInFilterWithParameters("Type",
                            ["03A75490-53E6-DF11-971B-001D60E938C6", "F2C0CE97-53E6-DF11-971B-001D60E938C6"]);
                    }
                    }
                },
…..                     

Андрей, спасибо. Все заработало.

А как сделать аналогичное, но чтобы значения НЕ были равны этим двум типам?
Update: сорри, нашел ответ

var candidates = ['5d4d6b06-4de2-4d23-8e6e-f2ab624af5d0', '3c6f72a7-3218-4f23-b96a-e344bac099f4', 'a9b68651-d313-4c83-9007-31a659547bd5'];
var filterGroup = new Terrasoft.createFilterGroup();
var existsFilter = Terrasoft.createColumnInFilterWithParameters(
	"Id",
	candidates);
existsFilter.comparisonType = Terrasoft.ComparisonType.NOT_EQUAL;

Как то не унифицированно всё, в каких то функциях фильтрации ComparisonType - параметр, в других - свойство. Крайне затрудняет обучение.

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

Здравствуйте, подскажите реализацию в BPM 7.3

this.filterPath,
this.filterValue.

define("MapDetail", ["terrasoft","Segment","MapHelper","Promise"],
    function(Terrasoft,entitySchema,MapHelper,Promise){
        return {
            entitySchemaName: "Segment",
            attributes: {},
            methods: {
                    init : function (reload) {
                    this.callParent(arguments);

                    var filters =
                        {
                            filterPath: this.filterPath,
                            filterValue: this.filterValue
                        };
                        gridData = this.getGridData();
                        editingMode = true;
                    MapHelper.GetMap(gridData, null, editingMode, filters, !reload);
                },
                reload : function () {
                            this.init(true);
                }
            },
            diff: []
        }
    }
);

В данном контексте возвращает undefined.
Как реализовать данную конструкцию?

Нравится

3 комментария

Спасибо за Ваше обращение. Мы зарегистрировали его в Службе технической поддержки и назначили специалиста, который сможет Вас компетентно проконсультировать по данному вопросу

Александр, вместо this.filterPath используйте this.get("DetailColumnName");
Данная запись позволяет получить колонку детали для фильтрации.
Вместо this.filterValue используйте this.get("MasterRecordId"); (значение ключа родительской записи).
Обратите внимание, в версии 7.3 изменилась структура деталей. Со списком атрибутов Вы можете ознакомиться в BaseDetailV2 и BaseGridDetailV2 (для детали с реестром).

Спасибо, уже тоже заметил.

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

Допустим, у нас в BPMonline 5.X есть документ с полями Contact1, Contact2, Contact3 (справочники, ссылаются на раздел контактов). Нужно на детали «Документы» раздела контактов отображать записи по совпадению любого из этих полей.

Если нужно отображать деталь с фильтрацией по нескольким полям, это можно сделать так:

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

Переопределяем в бизнес-процессе событие «ScriptTaskBasePrepareFilters»:

блок БП

Код скрипта:

//Отключаем старые фильтры
var detailFilter = Page.DataSource.CurrentStructure.Filters.FindByName("DetailFilter");
if (detailFilter != null) {
        Page.DataSource.CurrentStructure.Filters.Remove(detailFilter);
}
var viewFilter = Page.DataSource.CurrentStructure.Filters.FindByName("ViewFilters");
if (viewFilter != null) {
        Page.DataSource.CurrentStructure.Filters.Remove(viewFilter);
}
//Новая группа фильтров с условием «или»
var filterGroup = Page.DataSource.CurrentStructure.CreateFiltersGroup("ViewFilters", LogicalOperationStrict.Or);
//Фильтры в группе
var filter1 = Page.DataSource.CreateFilterWithParameters(
                        FilterComparisonType.Equal,
                        "Contact1", SelectedNodePrimaryColumnValue);

var filter2 = Page.DataSource.CreateFilterWithParameters(
                        FilterComparisonType.Equal,
                        "Contact2", SelectedNodePrimaryColumnValue);
var filter3 = Page.DataSource.CreateFilterWithParameters(
                        FilterComparisonType.Equal,
                        "Contact3", SelectedNodePrimaryColumnValue);

//Добавляем фильтры в группу
filterGroup.Add(filter1);
filterGroup.Add(filter2);
filterGroup.Add(filter3);

//А группу фильтров — в источник данных
Page.DataSource.CurrentStructure.Filters.Add(filterGroup);
return true;

Готово. Осталось в настройках рабочих мест указать нужную страницу реестра детали, остальные настройки можно не менять.

свойства детали

Нравится

Поделиться

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

Добрый день всем, возникло два вопроса по отчетам в 7-ке (на примере раздела Воздействия):
1. В разделе есть отчет "Эффективность воздействий". В него нужно добавить фильтр по ответственному. Как это правильно сделать? (дизайнер отчетов запустил, отчет в него загрузил, параметр отчета добавил, но как дальше это подключить в BPM ?)
2. Как вообще добавить свой отчет для раздела (не печатную форму, именно отчет в раздел Аналитика)

Нравится

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

Спасибо за Ваше обращение.

Мы зарегистрировали его в Службе технической поддержки и назначили специалиста, который сможет Вас компетентно проконсультировать по данному вопросу.

Здравствуйте, Валерий!

Рекомендую Вам ознакомиться с нашим видео-уроком по построению отчетов - http://www.youtube.com/watch?v=81g0HDZxKWU.
В видео показан процесс создания отчета и его добавление в рабочие места.

Добрый день,

Видео я уже смотрел, но там показано подключение к BPM 5 (в 7-ке нет рабочих столов), и вообще ничего не рассказано про окно фильтрации.

Валерий, добрый день!

https://www.youtube.com/watch?v=4MpjbeCErzs

ознакомьтесь с этим видео начиная приблизительно с 3:00:00, там как раз об отчетах идет речь.

--------------------------------------------
Айти-Сфера

Здравтсвуйте, Валерий!
Прикрепляю инструкцию по изменению базовых отчетов в BPMonline 7x.
По поводу фильтрации, необходимо делать по аналогии с существующими отчетами. То есть, нужно
заместить страницу с фильтрацией и добавить на нее контрол-справочник с указанием имени соответствующего параметра отчета (свойство "parameterName"), а затем по значению параметра накладывать соответсвующие фильтры (это делается в скрипте отчета).

Владимир, Андрей, спасибо! Посмотрим...

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

BPM 5.4.0
Необходимо ставить в поле "Ответственный" в карточке Задачи не только контактов с типом "Сотрудник своей организации", но и с другим типом (допустим его id записан в переменную OtherTypeId)
В карточке задачи в скрипте ChildInitAfterParentScriptExecute есть такой код (наверняка он фильтрует)

Page.OwnerEdit.PrepareLookupFilter += delegate (object sender, LookupEditEventArgs e) {
        var employersContactTypeUId = "60733efc-f36b-1410-a883-16d83cab0980";          
        CollectionDictionarystring, object>> filters = e.Filters;
        filters.Add(new Dictionarystring, object> {
           {"comparisonType", FilterComparisonType.Equal},
           {"leftExpressionColumnPath", "Type"},
           {"useDisplayValue", false},
           {"rightExpressionParameterValues", new object[] {employersContactTypeUId}}});       
};

Как добавить еще один фильтр с условием ИЛИ?

Нравится

3 комментария
filters.Add(new Dictionary<string, object> {
           {"comparisonType", FilterComparisonType.Equal},
           {"leftExpressionColumnPath", "Type"},
           {"useDisplayValue", false},
           {"rightExpressionParameterValues", new object[] {employersContactTypeUId}},
           {"logicalOperation", FilterComparisonType.Or}
}); 
filters.Add(new Dictionary<string, object> {
           {"comparisonType", FilterComparisonType.Equal},
           {"leftExpressionColumnPath", "Type"},
           {"useDisplayValue", false},
           {"rightExpressionParameterValues", new object[] {otherTypeUId}},
           {"logicalOperation", FilterComparisonType.Or}
}); 

Александр, думаю, вы немного ошиблись вместо FilterComparisonType.Or надо LogicalOperationStrict.Or.
Но все равно в результате этого у меня выводит пустой список.

Как часто: сам задал вопрос, сам ответил.
А все тупо:

filters.Add(new Dictionary<string, object> {
           {"comparisonType", FilterComparisonType.Equal},
           {"leftExpressionColumnPath", "Type"},
           {"useDisplayValue", false},
           {"rightExpressionParameterValues", new object[] {employersContactTypeUId,otherTypeUId}},
});
Показать все комментарии

Коллеги, день добрый!

Задача:
В разделе лиды сделать предустановленную фильтрацию лидов по региону текущего контакта

Дано:
1) в стандартной сущности Контакт (Contact) добавлено поле Регион контакта (ContactRegion, ссылка на справочник Регион (id,name,description))
2) в стандартной сущности Лид (Lead) добавлено поле Регион контрагента (AccountRegion, ссылка на справочник Регион)
3) Есть модуль ConfigurationConstantsEx (аналог ConfigurationConstants для новых значений справочников в том числе и ContactRegion)

Собсна, попробовал следующий вариант:
в Разделе контакты (ContactSection) добавил this.fixedFilterConfig

this.fixedFilterConfig = {
                                entitySchema: Lead,
                                filters: [
                                        {
                                                name: 'AccountRegionFilter',
                                                caption: resources.localizableStrings.mAccountRegionCaption,
                                                dataValueType: Terrasoft.DataValueType.LOOKUP,
                                                columnName: 'AccountRegion',
                                                defValue: {
                                                        //value: Terrasoft.currContactRegion.value,
                                                        value: ConfigurationConstantsEx.Lead.AccountRegion.MSK.value,
                                                        //displayValue: Terrasoft.currContactRegion.displayValue
                                                        displayValue: ConfigurationConstantsEx.Lead.AccountRegion.MSK.displayValue
                                                }
                                        },
                                        {
                                                name: 'StatusFilter',
                                                caption: resources.localizableStrings.mNewLeadStatus,
                                                dataValueType: Terrasoft.DataValueType.LOOKUP,
                                                columnName: 'Status',
                                                defValue: {
                                                        value: ConfigurationConstantsEx.Lead.Status.New.value,
                                                        displayValue: ConfigurationConstantsEx.Lead.Status.New.displayValue
                                                }
                                        }
                                ]
                        };

При попытке использовать статические значения для фильтров из ConfigurationConstantsEx все работает отлично...
а вот при попытке вытягивать значение из БД начинаются вполне предсказуемые проблемы

Код:

function getRegion(){
        var contactId = Terrasoft.SysValue.CURRENT_USER_CONTACT.value;

        var select = Ext.create('Terrasoft.EntitySchemaQuery', {
                rootSchemaName: 'Contact'
        });

        select.addColumn('ContactRegion.Id');
        select.addColumn('ContactRegion.Name');

        select.getEntity(contactId, function(response) {
                if (response && response.success) {
                        var entity = response.entity;
                        if (entity) {
                                Terrasoft.currContactRegion = {
                                                                displayValue: entity.get('ContactRegion.Name'),
                                                                value: entity.get('ContactRegion.Id')
                                                        };
                        }
                }
        }, this);
}

Проблема в том что на момент формирования секции и установки фильтров (fixedFilterConfig) функция getRegion() ничего не присваивает Terrasoft.currContactRegion ( так как ответа от сервера еще просто нет)
Ответ приходит уже после формирования визуального представления раздела (проверял, после формирования раздела Terrasoft.currContactRegion заполнен правильными значениями)
p.s. пробовал так же вариант с заполнением Terrasoft.currContactRegion ДО открытия раздела Лидов (в принципе получилось, но результат не радует так как пришлось наследовать совершенно ненужный мне модуль)
Вопроса у меня 3 
1) Может, кто сталкивался с подобной проблемой и нашел решение или я что-то делаю неправильно?
2) Есть ли возможность уже после формирования раздела программно установить значение определенного фильтра (на init например)?
3) Есть ли возможность добавить функцию получения данных контакта в Terrasoft.SysValue (что-нить типа Terrasoft.SysValue.CURRENT_CONTACT_REGION)?

С уважением, Волков Артем

Нравится

4 комментария

Добрый день.

1) Может, кто сталкивался с подобной проблемой и нашел решение или я что-то делаю неправильно?
Все работает предсказуемо и правильно - ответ от функции по заполнению значений из БД придет в callback асинхронно. Соответственно, нужно построить логику так, чтобы либо ждать, либо после выполнения запроса обновлять фильтр.

2) Есть ли возможность уже после формирования раздела программно установить значение определенного фильтра (на init например)?

В QuickFilterModule есть message для изменения фильтров AddFixedFilter, AddFolderFilter, AddCustomFilter. Как они работают можно посмотреть в модуле.
В SectionModule есть message для обновления фильтров QuickFilterChanged.
Примеры у нас есть в конфигурации.

3) Есть ли возможность добавить функцию получения данных контакта в Terrasoft.SysValue (что-нить типа Terrasoft.SysValue.CURRENT_CONTACT_REGION)?

Нет, к сожалению, нельзя.

Спасибо, Дмитрий!
Буду копать QuickFilterModule :)

С уважением, Волков Артем

Дмитрий, к сожалению,сам так и не осилил решение через message (инфы мало по работе с сообщениями) Может поможете?

пример тот же, хочу в функции getRegion() в модуле LeadSection после получения положительного ответа от сервера (if (response && response.success)) либо добавить фильтр через message(AddFixedFilter), либо изменить уже созданный в fixedFilterConfig

Заранее спасибо!

Артем, возможным решением будет добавить в Ваш метод GetRegion() строчки:

viewModel.clear(viewModel.get('currentTabName'));
viewModel.load(viewModel.get('currentTabName'));

как это делается в подписке на событие QuickFilterChanged в SectionModule для обносления реестра.

А для того чтобы отправить сообщение достаточно вызвать метод sandbox.publish().

Также альтернативой будет определить в разделе метод modifySelectQuery, в котором вы на основе этого атрибута дополнительно наложите фильтр на запрос. Например:

this.methods.modifySelectQuery = function(select, tabName, event) {
                var operationFilterType = this.get('OperationFilterType'); 
                if (operationFilterType === ‘Income') {
                                /*Накладываем фильтр на select* /
                }
}

Второй вариант будет лучше, скорее всего.

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

Добрый день. Возникла проблема с фильтром отчета в разделе. В запросе прописан фильтр пользователя, запрос прикреплен к отчету типа Excel. А при выборе отчета в разделе, фильтр не всплывает, выдается сразу отчет в Excel, естественно не фильтрованный. В чем может быть проблема?

Нравится

1 комментарий

Фильтр будет отображаться только в том случае, если отчет строится по всем записям.
Проверьте чему установлено свойство "Тип фильтрации" отчета.

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

Для того, чтобы настроить фильтрацию одного поля справочника по другому, необходимо добавить в обработчик события Init карточки редактирования программный код фильтрации. То есть, подписаться на обработчик события изменения значения поля.

Пример:

Откройте раздел Инструменты – Конфигурация, откройте Страницу редактирования конфигурационной единицы (ConfigurationItemModuleEditPage)

delegate1

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

delegate2

Откройте процесс карточки:

delegate3

В процессе найдите скрипт обработчика события Init:

delegate4

В скрипт обработчика добавьте подписывание делегата:

Page.ContactEdit.PrepareLookupFilter += delegate (object sender, LookupEditEventArgs e) // либо
 {     
        if (!Page.AccountEdit.Value.Equals(Guid.Empty)) {
                CollectionDictionarystring, object>> filters = e.Filters;
                filters.Add(new Dictionarystring, object> {
                                   {"comparisonType", FilterComparisonType.Equal},
                                   {"leftExpressionColumnPath", "Account.Id"},
                                   {"useDisplayValue", false},
                                   {"rightExpressionParameterValues", new object[] {Page.AccountEdit.Value}}});
        }
};

Где
AccountEdit – название поля в карточке, по которому фильтруем
ContactEdit – название поля в карточке, для которого производится фильтрация
Account - название поля в объекте, которое будет сопоставляться со значением AccountEdit
LookupEditEventArgs - параметр, указывающий на тип поля. LookupEditEventArgs - если это поле справочника, ComboBoxEditEventArgs - если это поле с выпадающим списком.

Затем создайте обработчик события AccountEditChange:

delegate5

В обработчик события добавьте следующий программный код:

Page.ContactEdit.Clear(); //если у нас поле справочника
Page. ContactEdit.ListPrepared = false; //если у нас поле с выпадающим списком

Обратите внимание, если обработчик уже создан, нет необходимости создавать его повторно, код следует добавить в существующий.

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

delegate6

delegate7

Примечание: если Вам нужно фильтровать результат по нескольким полям, тело делегата будет иметь следующий вид:

var filters = e.Filters;
object value = Page.CountryEdit.Value;
Guid countryId = (value == null || value.ToString().Equals(string.Empty)) ? Guid.Empty : Guid.Parse(value.ToString());
value = Page.RegionEdit.Value;
Guid regionId = (value == null || value.ToString().Equals(string.Empty)) ? Guid.Empty : Guid.Parse(value.ToString());
if (countryId != Guid.Empty) {
        filters.Add(new Dictionarystring, object> {
                {"comparisonType", FilterComparisonType.Equal},
                {"leftExpressionColumnPath", "Country.Id"},
                {"useDisplayValue", false},
                {"rightExpressionParameterValues", new object[] {countryId}}});
}
if (regionId != Guid.Empty) {
        filters.Add(new Dictionarystring, object> {
                {"comparisonType", FilterComparisonType.Equal},
                {"leftExpressionColumnPath", "Region.Id"},
                {"useDisplayValue", false},
                {"rightExpressionParameterValues", new object[] {regionId}}});
}

Нравится

Поделиться

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

Доброго дня всем!
Подскажите плиз, как эффективнее всего сделать справочник, который будет содержать области групп и фильтрации при вызове из других карточек редактирования? Нужно ли делать его в виде workspace? Также необходимо динамически добавлять в область групп этого справочника группу с выбранным в гриде контрагентом.
Заранее спасибо!

Нравится

2 комментария

Здравствуйте, Иван Александрович.
Сделайте в виде отдельного окна Workspace. Подобная реализация есть в базовой версии: выбор проекта в карточках счета, договора; добавление файла на деталь [Файлы] из библиотеки.

Спасибо Наталия, все получилось!

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