Вопрос

Настройка окна выбора, вызываемого из FilterBuilderControl

Доброго времени суток, коллеги.

Есть TerrasoftCRM 3.3.2.245.

При выборе значения фильтра из FilterBuilderControl вызывается стандартное окно wnd_MultiSelectData. Можно ли заменить его на свое? По аналогии с заданием свойства LookupWindowUSI в LookupControl.

Нравится

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

У компонента фильтра есть событие OnFiltersBuilderValueSelect. Возможно, логику можно прописать в его обработчике.

В конфигурации готовых примеров нет, но в 3.4.1 похожее событие OnFiltersBuilderItemSelect в скрипте wnd_IWTGraphWizardScript окна настройки графика переопределяется и в функции fbcFilterOnFiltersBuilderItemSelect задаётся своё окно:

function fbcFilterOnFiltersBuilderItemSelect(FilterBuilderControl, FiltersBuilderItem, AX, AY, DoHandled) {
	DoHandled.Value = false;
	var FiltersBuilder = FilterBuilderControl.FiltersBuilder;
	if (!GraphWizard.CustomDataset) {
		return;
	}
	var FBItemIndex = -1;
	var LastSelectedField;
 
	var CurrentSection = GraphWizard.CurrentSection;
	var SelectWindow = ShowSelectObjectByRelationWindow(CurrentSection.MainTableUSI, smField,
		tlmAllLinks, "Выбор поля фильтрации", null, null, true);
	if (!Assigned(SelectWindow)) {
		return;
	}
	var Results = SelectWindow.Attributes('Results');
	var Path, FBItemIndex, Column, FBItem, Result;
	for (var i = 0, Count = Results.length; i<Count; i++) {
		Result = Results[i];
		Path = Result.Column.FieldPath;
		FBItemIndex = -1;
		if (FiltersBuilderItem) {
			RemoveFilterItem(FiltersBuilderItem);
			FBItemIndex = FiltersBuilder.RootItems.GetIndexOfItem(FiltersBuilderItem);
			FiltersBuilder.RootItems.Remove(FiltersBuilderItem);
		}
		Column = AddFilterItem(Path, null);
		Column.Caption = Result.Column.Caption;
		var CustomDataset = CreateCustomDataset();
		GraphWizard.CustomDataset = CustomDataset
		FiltersBuilder.Dataset = System.EmptyValue;
		FiltersBuilder.Dataset = CustomDataset;
		var DataFields = CustomDataset.DataFields;
		var DataField = null;
		if ((Result.IsLookup != 0) && (Result.IsLookup != null)) {
			DataField = DataFields.ItemsByName(Column.ColumnAlias + 'ID')
		}
		if (!Assigned(DataField)) {
			DataField = DataFields.ItemsByName(Column.ColumnAlias);
		}
		FBItem = FiltersBuilder.RootItems.CreateItemByDataField(DataField);
		if (FBItemIndex < 0) {
			FiltersBuilder.RootItems.Add(FBItem);
		} else {
			FiltersBuilder.RootItems.InsertItem(FBItemIndex, FBItem);
		}
		FBItem.Enabled = true;
		FBItem.RefreshDisplayValue();
		FBItem.ValueNotSet = true;
		FilterBuilderControl.Refresh();
		AddFilterItem(Path, FBItem);
	}
	SetIsChanged();
}
 
function ShowSelectObjectByRelationWindow(MainTableUSI, Mode, TablesListMode,
	WindowCaption, LastSelectedField, ExceptDataTypes, IsHistoryVisible, LinksVisibility,
	OnlyLookupFieldsForTableUSI) {
	var SelectWindow = Services.GetNewItemByUSI('wnd_SelectObjectsByRelations');
	SetAttribute(SelectWindow, 'NotifyObject', Self);
	SetAttribute(SelectWindow, anMode, Mode);
	SetAttribute(SelectWindow, anMainTableUSI, MainTableUSI);
	SetAttribute(SelectWindow, anTablesListMode, TablesListMode);
	SetAttribute(SelectWindow, anDataTypes, ExceptDataTypes);
	if ((ExceptDataTypes) && (ExceptDataTypes.length > 0)) {
		SetAttribute(SelectWindow, anIsFieldDataTypeListIsExceptionList, true);
	}
	SetAttribute(SelectWindow, anLastSelected, LastSelectedField);
	SetAttribute(SelectWindow, anIsHighlightRelations, true);
	SetAttribute(SelectWindow, anOnlyLookupFieldsForTableUSI, 
		OnlyLookupFieldsForTableUSI);
	SetAttribute(SelectWindow, anWindowCaption, WindowCaption);
	SetAttribute(SelectWindow, 'HistoryPageName', "Поля графика");
 
	SetAttribute(SelectWindow, anIsColumnsHistoryVisible, IsHistoryVisible);
	if (!LinksVisibility) {
		SetAttribute(SelectWindow, anLinksVisibility, lvAll);
	} else {
		SetAttribute(SelectWindow, anLinksVisibility, LinksVisibility);
	}
	if (IsHistoryVisible) {
		var UserColumns = new Object();
		var Keys = new VBArray(GraphWizard.CurrentSection.Columns.Keys()).toArray();
		for (var i = 0; i < Keys.length; i++) {
			UserColumns[Keys[i]] = GetUserColumnByColumn(GraphWizard.
				CurrentSection.Columns(Keys[i]));
		}
		SetAttribute(SelectWindow, anColumnsHistory, UserColumns);
	}
 
	SelectWindow.Prepare();
	if (SelectWindow.ShowModal() != wmrOK) {
		return null;
	}
	return SelectWindow;
}

 

Зверев Александр,

Благодарю за помощь.

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

Я почему спрашиваю: событие OnFiltersBuilderItemSelect вызывается до того, как будет показан список полей. Следовательно я должен создать такое окно, в котором нужно выбирать и поле и значение?

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

Готового примера по событию OnFiltersBuilderValueSelect нет, нужно экспериментировать. По идее, в момент выбора значения поле уже выбрано каким-либо способом.

У меня в 3.3.2 у FiltersBuilderControl нет события OnFiltersBuilderValueSelect. Только OnFiltersBuilderItemSelect и OnFiltersBuilderItemRemove 

 

 

 

 

 

 

 

Так что в моем случае похоже придется реализовывать и выбор поля и выбор значения.

Интересно вот это окно доступно как сервис конфигурации?

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

Окно больше похожее на генерируемое ядром.

Зверев Александр пишет:

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

Так и собирался сделать. Но мне нужен обработчик события, в котором я могу установить атрибуты для окна wnd_MultiSelectData. Но если примеров реализации толком нет, то не вижу смыла тратить время и просто добавлю LookupControl и в OnPrepareSelectWindow заполню все как мне нужно.

Еще раз благодарю за помощь.

Можно поступить, как во всех боле-менее нестандартных разделах (задачи, проекты): добавить в fmGroupsWindow выше wndGroups новый fg и туда добавить этот LookupControl. Он отобразится выше дерева групп. А логику дополнительной фильтрации привязать, как это сделано в указанных разделах.

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