BPMonline: фильтрация одного поля в зависимости от значения другого

Для того, чтобы настроить фильтрацию одного поля справочника по другому, необходимо добавить в обработчик события 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 комментариев
Показать все комментарии