Для того, чтобы настроить фильтрацию одного поля справочника по другому, необходимо добавить в обработчик события Init карточки редактирования программный код фильтрации. То есть, подписаться на обработчик события изменения значения поля.
Пример:
Откройте раздел Инструменты – Конфигурация, откройте Страницу редактирования конфигурационной единицы (ConfigurationItemModuleEditPage)
Посмотрите в карточке названия полей, которые необходимо будет связать между собой. Например, нам надо фильтровать список контактов по выбранному в соответствующем поле контрагенту:
Откройте процесс карточки:
В процессе найдите скрипт обработчика события Init:
В скрипт обработчика добавьте подписывание делегата:
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:
В обработчик события добавьте следующий программный код:
Page.ContactEdit.Clear(); //если у нас поле справочника
Page. ContactEdit.ListPrepared = false; //если у нас поле с выпадающим списком
Обратите внимание, если обработчик уже создан, нет необходимости создавать его повторно, код следует добавить в существующий.
После добавления программного кода опубликуйте карточку для применения изменений:
Примечание: если Вам нужно фильтровать результат по нескольким полям, тело делегата будет иметь следующий вид:
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}}});
}