Доброго времени суток, коллеги.
Есть 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. Он отобразится выше дерева групп. А логику дополнительной фильтрации привязать, как это сделано в указанных разделах.