Доброго времени суток, коллеги.
Есть TerrasoftCRM 3.3.2.245.
При выборе значения фильтра из FilterBuilderControl вызывается стандартное окно wnd_MultiSelectData. Можно ли заменить его на свое? По аналогии с заданием свойства LookupWindowUSI в LookupControl.
Нравится
У компонента фильтра есть событие 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. Он отобразится выше дерева групп. А логику дополнительной фильтрации привязать, как это сделано в указанных разделах.
