Включение быстрого фильтра из скрипта

Подскажите как включать быстрый фильтр из скрипта?

Мне нужно в окне подбора товара (картинку я прикрепил) наложить фильтр по торговой марке и чтобы было видно, что этот фильтр наложен (быстрый фильтр подходит). Также необходимо, чтобы этот фильтр не убирался при перемещении по дереву групп товаров - быстрый фильтр удовлетворяет этому условию.

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

Нравится

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

Теоретически:
Поле и значение

"Глова Сергей" написал:Теоретически:
Поле и значение

Попробовал поменять значение этих параметров из скрипта, не могу - выкидывает ошибку:

Ошибка выполнения Microsoft JScript: Объект не поддерживает это свойство или метод

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

Жаль :sad:

нда. не посмотрел, что они ридонли.

Андрей, а почему Вы именно "быстрый" фильтр? Возможно Вас устроит функционал, фильтра? Посмотрите как происходит фильтрация, когда Вы переходите по контекстному меню в любом реестре раздела - Ответственный, Контрагент и т.п.

Андрей, добрый день.

Быстрый фильтр из конфигурации включить нельзя. Его можно только очистить. Если Вам подходит функционал модуля фильтрации, то есть такое решение:

1) создаём функции для создания и применения фильтра в FiltersBuilder раздела:

function FilterWorkspace(WorkspaceWindow, DataFieldName, DataFieldValue) {
	WorkspaceWindow.ComponentsByName('wndGridData').Window.
		ComponentsByName('grdData').CancelQuickFilter();
	FilterByFieldValue(WorkspaceWindow, DataFieldName, DataFieldValue);	
}
 
function FilterByFieldValue(WorkspaceWindow, DataFieldName, DataFieldValue) {
	var FBControl = WorkspaceWindow.ComponentsByName('fbcFilters');
	var Dataset = FBControl.DatasetLink.Dataset;
	FBControl.FiltersBuilder.ClearFilter();
	var DataField = Dataset.DataFields.ItemsByName(DataFieldName);
	var FBItem = FBControl.FiltersBuilder.RootItems.CreateItemByDataField(
		DataField);
	FBItem.Value = DataFieldValue;
	FBItem.Operator = totEqual;
	FBControl.FiltersBuilder.RootItems.Add(FBItem);
	EnableDatasetFilters(Dataset, false);
	FBControl.ApplyFilter();
	FBControl.Refresh();
}

2) дальше в функции, где Вы хотите применить фильтр, пишем следующее:

var WorkspaceWindow = Connector.Attributes('MainWindow').
		ComponentsByName('wndWorkspace').Window;
FilterWorkspace(WorkspaceWindow, 'Name', "Ваша компания");

В данном примере я использовал раздел "Контрагенты", фильтр по названию.

Условия для корректной работы данного функционала: наличие фильтра в основном запросе раздела; функционал используется для активного на данный момент раздела.

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

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

Я решил не использовать быстрый фильтр, а просто переписал функцию dlOfferingOnDatasetBeforeOpen, которая срабатывает на событие OnDatasetBeforeOpen датасета с продуктами:

function dlOfferingOnDatasetBeforeOpen(Dataset, DoOpen) {
 ApplyStandardWorkspaceFilter();
 ApplyFilterToQuickOfferingSelectionGrid();
}

где ApplyFilterToQuickOfferingSelectionGrid - функция, в которой я накладываю необходимый мне фильтр, после накладывания всех фильтов FilterBuilder-а (ф-я ApplyStandardWorkspaceFilter).

// Функция накладывает фильтр на датасет окна подбора товара,
// если в окно подбора товара была передана информация о фильтре
function ApplyFilterToQuickOfferingSelectionGrid() {
 var Dataset = BaseWorkspace.GridDataset;
 var FilterFieldName = GetAttribute(Self,'FilterFieldName');
 var FilterFieldValue = GetAttribute(Self,'FilterFieldValue');
 if (IsEmptyStr(FilterFieldName) || IsEmptyStr(FilterFieldValue)) {
  return
 } else {
  ApplyDatasetFilter(Dataset, FilterFieldName,FilterFieldValue, true);
 }
}

Да, совсем забыл.

После применения фильтра нужно обновить датасет раздела:

var WorkspaceDataset = WorkspaceWindow.ComponentsByName('dlAccounts').Dataset;
RefreshDataset(WorkspaceDataset);

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

"Кошкаров Андрей" написал:
Я решил не использовать быстрый фильтр, а просто переписал функцию dlOfferingOnDatasetBeforeOpen, которая срабатывает на событие OnDatasetBeforeOpen датасета с продуктами

Мне кажется, что при таком решении может возникнуть путаница, так как накладывается дополнительное условие фильтрации, но его нигде не видно. Если использовать приведённую выше функцию FilterByFieldValue, закомментировав строчку

FBControl.FiltersBuilder.ClearFilter();

Вы сможете добавить к уже существующим в модуле фильтрации условиям своё.

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

"Лабьяк Олег Игоревич" написал:Мне кажется, что при таком решении может возникнуть путаница, так как накладывается дополнительное условие фильтрации, но его нигде не видно.

Да, вы правы. Поробовал использовать вашу функцию, перед этим убрал из нее 2 строчки:

FBControl.FiltersBuilder.ClearFilter();
и
EnableDatasetFilters(Dataset, false);

При запуске возникла ошибка на строке:

FBItem.Value = DataFieldValue;

Текст ошибки:

Ошибка выполнения Microsoft JScript: Недопустимое число аргументов или присвоение значения свойства

при этом
DataFieldValue = "{3F4FB1DA-2B46-4321-9F44-45EF855124CD}"

Подскажите, в чем может быть проблема?

Скажите, пожалуйста, с какими параметрами Вы вызываете функцию? Вы применяете фильтр для справочника, или для строки? Возможно, тип значения не подходит для фильтра.

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

Я применяю фильтр для справочного поля VendorID из датасета ds_Offering.
Вызываю с теми же аргументами, что и вы написали:
FilterByFieldValue(Self, 'VendorID', '{3F4FB1DA-2B46-4321-9F44-45EF855124CD}');

из скрипта Workspace-окна.

Оказалось, для полей типа "Справочник" не всё так просто... Для строк работает нормально, а у фильтров для справочников несколько другие свойства.

Пока попробуйте вызывать так:

FilterByFieldValue(Self, 'VendorName', <Название>);

Если этого недостаточно, постараюсь завтра разобраться, как поступать с фильтрами для справочников.

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

Для поля типа Справочник в приведенной ф-ии замените строчку

FBItem.Value = DataFieldValue;

на

FBItem.Value.Add(DataFieldValue);

Отмечу, что если Вы используете версию бинарников ниже 3.3.1.65, то фильтр создастся нормально и будет работать как задумано, но вместо отображаемого значения справочника в фильтре будет пустая строчка.

"Лабьяк Олег Игоревич" написал:Если этого недостаточно, постараюсь завтра разобраться, как поступать с фильтрами для справочников.

Спасибо, в любом случае полезная информация :)
Я пока оставлю фильтрацию обычным способом, по имени мне видиться не сильно корректно. Может быть ситуация, что занесут случайно 2 компании с одинаковыми полями. А по ID получается не видно названия торговой марки, как и написал Репко Артём (у меня версия бинарников 3.3.1.31).

Артём, спасибо за помощь. Возьму на заметку

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