Вопрос

Коллеги, добрый день!

Проблема в следующем:

При создании стандартного фильтра (по группе ответственных) в разделе Обращения, на страницу выводится список обращений не только данной группы, но и других групп.

Оказалось, что при создании такого фильтра, по умолчанию выставляется  условие сравнения "СОДЕРЖИТ", а не  "=" (равно).  

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

Можно ли как-то изменить "условие сравнения по умолчанию" для стандартного фильтра?

Спасибо!

У меня такой же вопрос

1 комментарий

Добрый день!

Стандартный фильтр действительно работает по принципу "СОДЕРЖИТ". Внести изменения в его условия сравнения возможности нет. 

Рекомендуем использовать расширенный фильтр, где есть возможность выбрать "=".

Войдите или зарегистрируйтесь, чтобы комментировать
Публикация

Рады сообщить о выпуске видеоурока по работе с тегами в bpm'online.
Узнайте, как использовать теги в системе для быстрого и удобного поиска необходимой информации по ключевым словам. Данный видеоурок ознакомит вас с видами тегов в bpm'online и их функциональными особенностями. Если вам интересно, как создать тег, как тегировать запись и как отфильтровать записи в разделе по тегам, не проходите мимо!

Видео доступно по ссылке: Работа с тегами в bpm'online

Больше обучающих видео смотрите на сайте академии Terrasoft.

Поделиться

0 комментариев
Войдите или зарегистрируйтесь, чтобы комментировать
Идея

Необходимо улучшить поиск в мобильном приложении. Поиска по основной колонке зачастую недостаточно. Как и добавлять колонки в конфигурацию раздела.Как минимум нужна возможность пользоваться настроенными группами (например, работая в полях, найти клиентов, расположенных в данном районе)

Реализована
4 комментария

Добрый день, Владимир!

Добавлять дополнительные поля в мобильное приложение возможно с версии 7.5, посредством мастера мобильного приложения.
Расширенный поиск по всем полям уже запланирован, в версию 7.7 он еще не войдет, но в последующие планируем включить.
Что касается добавления работы со статическими группами\тегами – планируем в 7.7.

Добрый день!

В релизе 7.11 реализована функциональность быстрой фильтрации в разделах и деталях мобильного приложения. Для поиска нужных записей в разделе (или на детали) можно настроить "быстрый" фильтр по колонкам объекта. 

Наталия Крылова,

Добрый день! А как можно искать в мобильном приложении не по самим колонкам объекта, а по связанным колонкам. Например, находясь в активностях, отфильтровать активности по контрагенту определенного типа, и т.п.

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

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Есть ли какой-нибудь кейс установки фильтров в модуле раздела (файлы с названием Section.js)? Нужен именно быстрый фильтр, а не fixedFilter. fixedFilter написан так, что если поле фильтрации лукапное, то он считает, что это поле - "Owner" и подставляет в выбор текущего пользователя. Мне же нужно фильтровать по кастомному полю.
В клиентских схемах нашел модуль QuickFilterHelper, но не разобрался как с ним работать, а примеров работы с ним не нашел.
Если у кого-то может предоставить готовые примеры фильтрации по кастомному полю - буду премного благодарен!

У меня такой же вопрос

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

Богдан, здравствуйте!

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

var module = "SectionModuleV2";
var section = "ActivitySectionV2";
var filterColumnName = "Type";
var filterValue = "Задача";
var filterState = {
                ignoreFixedFilters: true,
                ignoreFolderFilters: true,
                customFilterState: {}
};
filterState.customFilterState[filterColumnName] = {
                displayValue: filterValue
};
var state = this.sandbox.publish("GetHistoryState");
var newState = this.Terrasoft.deepClone(state.state || {});
this.Ext.apply(newState, {
                activeTab: "mainView",
                filterState: filterState,
                searchState: true,
                moduleId: "ViewModule_SectionModule"
});
var storage = this.Terrasoft.configuration.Storage.Filters = this.Terrasoft.configuration.Storage.Filters || {};
var sessionFilters = storage[section] = storage[section] || {};
sessionFilters.CustomFilters = {};
var filter = Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.START_WITH, filterColumnName, filterValue);
sessionFilters.CustomFilters[filterColumnName] = {
                value: filterValue,
                displayValue: filterValue,
                filter: filter.serialize({serializeFilterManagerInfo: true})
};
this.sandbox.publish("PushHistoryState", {
                hash: this.Terrasoft.combinePath(module, section),
                stateObj: newState
});

Благодарю! Вроде работает, но в консоли вот такая ошибка.

Да, и фильтр работает только со второго раза.
Первый раз, если перейти по кнопке - фильтр применяется, но список в разделе пуст.
Перейдя по кнопке второй раз - список отображается нормально.
И так для каждого значения фильтра.

"Вильшанский Дмитрий" написал:

Богдан, здравствуйте!

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

var module = "SectionModuleV2";
var section = "ActivitySectionV2";
var filterColumnName = "Type";
var filterValue = "Задача";
var filterState = {
                ignoreFixedFilters: true,
                ignoreFolderFilters: true,
                customFilterState: {}
};
filterState.customFilterState[filterColumnName] = {
                displayValue: filterValue
};
var state = this.sandbox.publish("GetHistoryState");
var newState = this.Terrasoft.deepClone(state.state || {});
this.Ext.apply(newState, {
                activeTab: "mainView",
                filterState: filterState,
                searchState: true,
                moduleId: "ViewModule_SectionModule"
});
var storage = this.Terrasoft.configuration.Storage.Filters = this.Terrasoft.configuration.Storage.Filters || {};
var sessionFilters = storage[section] = storage[section] || {};
sessionFilters.CustomFilters = {};
var filter = Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.START_WITH, filterColumnName, filterValue);
sessionFilters.CustomFilters[filterColumnName] = {
                value: filterValue,
                displayValue: filterValue,
                filter: filter.serialize({serializeFilterManagerInfo: true})
};
this.sandbox.publish("PushHistoryState", {
                hash: this.Terrasoft.combinePath(module, section),
                stateObj: newState
});

Добрый день!
В вашем примере вы говорите о кнопке в разделе - скажите, пожалуйста, как можно добавить свою кнопку в раздел - именно кнопку, а не действие ( в SDK приведен пример с действием)

В вашем примере, filterValue принимает фиксированное значение "Задача", скажите, пожалуйста, можно ли добавить в сам раздел строку для ввода, с которой можно считывать значение?

Дарья, реализацию кнопки в разделе вы можете посмотреть в схеме BaseSectionV2 (например, кнопка "AddRecordButton").

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

День добрый, коллеги!

Возникла следующая проблема - при использовании быстрого фильтра по дробному числу в поле ввода значения некоторые пользователи не могут ввести число, больше 8-ми символов, хотя размер числа установлен 15 и точность 4, а некоторые могут. А в фильтрах Workspace-а уже все пользователи могут ввести только 11 символов.

Может кто сталкивался с данной проблемой?
Заранее спасибо.

У меня такой же вопрос

3 комментария

Какая используется версия бинарников?

Александр, добрый день.
Там, где работает, бинарники 3.3.2.210
А где нет - 3.3.2.43

Как я понимаю, всё дело в этом?

Денис,

да, исправления были внесены в новую версию бинарных файлов.

Вам необходимо обновить бинарные файлы.

По запросу в техническую поддержку (support@terrasoft.ru) мы можем предоставить Вам самую актуальную версию (на данный момент - 3.3.2.311).

Войдите или зарегистрируйтесь, чтобы комментировать
Публикация

Иногда и такое нужно. Как пример -- есть окно с несколькими гридами на основе записей меморидатасет. Записей много -- поэтому у клиента возникает необходимость их быстро искать.
Сам фильтр сложно реализовать(потому что при закрытии, как известно, меморидатасет очищается. тем более, если функционал сложный, то при "собирании заново" тратится время на проверку всех условий и т.п.), но можно сделать иначе: просто выделять нужные записи.

Как это работает -- ищет по полям, где содержится слово, введенное в поле (то есть, принцип тот же, что и в обычном поиске, тип поиска можно поменять в системных настройках) -- и выделяет найденные записи. При нажатии на "крестик"(то есть "убираем" быстрый поиск) оно снимает выделение.

Этот код можно добавить прямо в скрипт scr_BaseMemDSGridArea, а в окошке wnd_BaseMemDSGridArea прописать на гриде события grdDataOnQuickFilter (запуск быстрого фильтра) и grdDataOnClearFilter (снятие быстрого фильтра).
Еще момент -- код "ориентируется" на поле ID в мемори датасете, поэтому, если у Вас такого поля нет, то нужно или добавить его, или соответствующе изменять функции.

//-------- quick filter  --------------

function grdDataOnQuickFilter(DataGrid, DataField, Value, QuickFilterLikeType, DoFilter, DoQuickFilter) {
        DataGrid.DisableEvents();  //debugger;
        var QuickFilterLikeType = GetSystemParameterValueEx('QuickFilterLikeType');            
        LastSearchRecordID = LocateOnSearchRecord(DataGrid, dlData.Dataset,DataField.Name,Value,QuickFilterLikeType);
        DataGrid.EnableEvents();
        if (!!LastSearchRecordID) {
                if (dlData.Dataset('ID') != LastSearchRecordID) {
                        DataGrid.UnSelectRow(dlData.Dataset('ID'));
                }
        } else {
            DataGrid.UnSelectRow(dlData.Dataset('ID'));
        }
}



function LocateOnSearchRecord(Grid, DS, DataFieldName, DataFieldValue, FilterType) {
        //debugger;
        var Count = DS.RecordsCount;
        if (!Count) {
                return;
        }      
        var SelectedIDsCount = Grid.SelectedIDs.Count;
        if (!!SelectedIDsCount) {
                Grid = UnSelectSelectedIDs(Grid);
        } else {    
                 Grid.UnSelectRow(DS('ID'));
        }
        DS.GotoFirst();
        var SearchArray = new Array();
        for (var i = 0; i Count; i++) {
                if (IsSearchValueInCurrentDSRecord(DS,DataFieldName,DataFieldValue, FilterType)) {
                         SearchArray.push(DS('ID'));
                }
                DS.GotoNext(); 
        }
        var LastSearchRecordID = null;
        if (!!SearchArray.length) {
                SelectSearchRecords(Grid, SearchArray);
                LastSearchRecordID = SearchArray[SearchArray.length - 1];
        }
        return LastSearchRecordID;
}

function  UnSelectSelectedIDs(Grid) {           //
        var Count = Grid.SelectedIDs.Count;
        var SelectedIDs  =  GetArrayByCollection(Grid.SelectedIDs);
        for (var i=0; i Count; i++) {
                Grid.UnSelectRow(SelectedIDs[i]);
        }
        return  Grid;
}
function IsSearchValueInCurrentDSRecord(DS,DataFieldName,DataFieldValue, FilterType) {   //debugger;
        var CurrentDataFieldValue = DS(DataFieldName);
        CurrentDataFieldValue = CurrentDataFieldValue.toString();
        DataFieldValue = DataFieldValue.toString();
        var Result = false;
        switch (FilterType.toString()) {
                case qfltEqual:
                        Result = (CurrentDataFieldValue == DataFieldValue);     //поле равно значению
                break;         
                case qfltDefault:
                case qfltContain:
                        Result = (CurrentDataFieldValue.indexOf(DataFieldValue) != -1);  //значение содержится в поле
                break;
                case qfltStartsWith:
                        Result = (CurrentDataFieldValue.substr(0,DataFieldValue.length) == DataFieldValue);  //поле начинается со значения
                break;          
                case qfltEndsWith:
                        Result = (CurrentDataFieldValue.substr(CurrentDataFieldValue.length-DataFieldValue.length+1, DataFieldValue.length) == DataFieldValue);  //поле заканчивается значением
                break;
        }
        return Result;
}

function SelectSearchRecords(Grid, SearchArray) {
        for (var i=0; i SearchArray.length; i++) {
                Grid.SelectRow(SearchArray[i]);
        }
}

function grdDataOnClearFilter(DataGrid) {
        DataGrid.DisableEvents();
        UnSelectSelectedIDs(DataGrid)  ;
        DataGrid.EnableEvents();
}

Поделиться

0 комментариев
Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Здравствуйте, уважаемые коллеги!

Заметил такую штуку. Один и тот же датасет в конфигурации 3.3.2.198 и в 3.4.0.38 ведёт себя по-разному при добавлении быстрого фильтра в реестре. В 3.3.2 всё отлично работает, но в 3.4 реестр остаётся пустым. Профайлер показывает следующее:

в 3.3.2:

exec sp_executesql N'SELECT TOP 40
        [tbl_Document].[ID] AS [ID],
        [tbl_Document].[Code] AS [Code],
        case
        when [tbl_Document].[Description] is null
        then 0
        else 1
end  AS [IsHasDescription]
FROM
        [dbo].[tbl_Document] AS [tbl_Document]
WHERE((case
        when [tbl_Document].[Description] is null
        then 0
        else 1
end  = @P1))'
,N'@P1 int',1

в 3.4.0:

exec sp_executesql N'SELECT TOP 40
        [tbl_Document].[ID] AS [ID],
        [tbl_Document].[Code] AS [Code],
        case
        when [tbl_Document].[Description] is null
        then 0
        else 1
end  AS [IsHasDescription]
FROM
        [dbo].[tbl_Document] AS [tbl_Document]
WHERE((NULL = @P1))'
,N'@P1 int',1

Как тут быть?

У меня такой же вопрос

3 комментария

Анатолий, попробуйте поместить CustomSQL в subselect. Возможно ситуация изменится.

Спасибо, Стас! Помогло! Да, в subselecte ест вполне корректно. Давным-давно Дима Мушенко открыл этот способ обхитрить ядро, но мне не пришло в голову применять этот трюк на 3.4.
Ох, чёрт, значит, при переносе с 3.3 на 3.4 надо все такие колонки в subselect засунуть. Хоть бы их немного оказалось... :smile:

Именно, это Димин способ. :)

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Всем доброго времени суток.

Помогите, пожалуйста, уже всю голову сломала...

Каким образом можно программно "добраться" до быстрого фильтра??? (установить его и применить).

Или может быть существуют другие (более простые) решения моей задачи: при добавлении к записи раздела файлов из Библиотеки необходимо, чтобы в окне Библиотеки отображалась только конкретная запись (ID ее есть). ApplyDatasetFilter почему-то сбрасывается после отработки функции обработчика, и окно Библиотеки открывается со всеми записями.

Версия 3.2.

Заранее спасибо.

У меня такой же вопрос

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

Программно установить быстрый фильтр не получится.

Фильтрация при выборе значения из справочника.

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

function btnAddShablonOnClick(Control) {
	var WorkspaceWindow = GetAttribute(Self, 'WorkspaceWindow');
	var DetailPages = WorkspaceWindow.ComponentsByName('pcDetails');
	var FilesPage = WorkspaceWindow.ComponentsByName('pgFilesDetail');
	var FilesDetailWindow = 
		WorkspaceWindow.ComponentsByName('wndFilesDetail').Window;
	var FileDataWindow = FilesDetailWindow.ComponentsbyName('wndFileData').Window;  
 
	var SelWin = ShowSelectWorkspaceWindow('wnd_LibraryWorkspace', FileDataWindow);
	NotVisibleDetails(SelWin.ComponentsByName('wnddata').Window.
		ComponentsbyName('pcDetails'));
	SelWin.ComponentsByName('wnddata').Window.ComponentsbyName('pcDetails').
		ItemsByName('pgFilesDetail').IsVisible = true;
 
	var DocTypeID = BaseGridArea.GridDataset.DataFields.
		ItemsByName('DocumentTypeID').Value;
	var LibID = GetDatasetFieldValueByID('ds_DocumentType', DocTypeID,
			'ShablonGroupID');
	SetAttribute(SelWin.ComponentsByName('wnddata').Window.
		ComponentsByName('wndGridData').Window, 'ParentItemID', LibID);
	var DataSet = SelWin.ComponentsByName('wnddata').Window.
		ComponentsByName('wndGridData').Window.ComponentsByName('dlData').Dataset;
 
	var IsEnabled = !IsEmptyValue(LibID);
	ApplyDatasetFilter(DataSet, 'ID', LibID, IsEnabled);
 
}

Была в отпуске, не могла об этом думать )

После применения фильтра датасет нужно переоткрывать.

Пробовала. Все равно не фильтруется.

....
DataSet.Close();
DataSet.Open();
}

Попробуйте перед применением фильтра закрывать датасет, а после - открывать. Например, так:

if (DataSet.State != dstInactive) {
    DataSet.Close();
}
ApplyDatasetFilter(DataSet, 'ID', LibID, IsEnabled);
DataSet.Open();

Вообще я правильно понимаю, что Вы сначала открываете окно (с помощью функции ShowSelectWorkspaceWindow), а потом накладываете фильтр на датасет? Попробуйте наоборот: сначала применить фильтр, а потом открывать окно.

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

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

А если в окно передавать уже отфильтрованный датасет? Применили фильтр, а потом

Window.ComponentsByName('dlData').Dataset = OurFilteredDataset;

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

Вот так заработало. Олег, огромное спасибо за помощь.

function btnAddShablonOnClick(Control) {
	var WorkspaceWindow = GetAttribute(Self, 'WorkspaceWindow');
	var DetailPages = WorkspaceWindow.ComponentsByName('pcDetails');
	var FilesPage = WorkspaceWindow.ComponentsByName('pgFilesDetail');
	var FilesDetailWindow = 
		WorkspaceWindow.ComponentsByName('wndFilesDetail').Window;
	var FileDataWindow = FilesDetailWindow.ComponentsbyName('wndFileData').Window; 
 
	var DocTypeID = BaseGridArea.GridDataset.DataFields.
		ItemsByName('DocumentTypeID').Value;
	var LibID = GetDatasetFieldValueByID('ds_DocumentType', DocTypeID,
			'ShablonGroupID');
	var IsEnabled = !IsEmptyValue(LibID);
 
	var LibDataset = Services.GetNewItemByUSI('ds_Library');
	ApplyDatasetIDFilter(LibDataset, LibID, IsEnabled);
	var SelWin = Services.GetNewItemByUSI('wnd_SelectWorkspaceData');
	SetAttribute(SelWin, 'NotifyObject', FileDataWindow);
	SetAttribute(SelWin, 'WorkspaceUSI', 'wnd_LibraryWorkspace');
	System.BeginProcessing();
	try {
		SelWin.Prepare();
		SelWin.ComponentsByName('wnddata').Window.ComponentsByName('wndGridData').
			Window.ComponentsByName('dlData').Dataset = LibDataset;
		SelWin.Show();
		LibDataset.Open();
	} finally {
		System.EndProcessing();
	}
 
	NotVisibleDetails(SelWin.ComponentsByName('wnddata').Window.
		ComponentsbyName('pcDetails'));
	SelWin.ComponentsByName('wnddata').Window.ComponentsbyName('pcDetails').
		ItemsByName('pgFilesDetail').IsVisible = true;
 
}

(функция добавления шаблонов документов из библиотеки, в зависимости от типа документа)

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

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

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

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

У меня такой же вопрос

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).

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

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Здравствуйте обитатели форума! Столкнулся я с такой проблемой, во время работы с разделом задача, при попытке сделать быстрый фильтр по задачам, а именно по заголовку задачи, система начинает ругаться и выдает в лог такое сообщение : (E) Ошибка выполнения метода 'dlTasksOnDatasetBeforeOpen'. 'null' is null or not an object «Call Stack», а дебагер ругается на следующую строчку : var TeamFilter = Filter.ItemsByCode('tcTeam');, иногда фильтрация проходит удачно и без ошибок, но при снятии и установлении флагов фильтрации задач по периоду (показать за период : сегодня, текущая неделя...) или при установлении/снятии флага фильтрации по ответственному выходит такая же ошибка ... Подскажите, это только у меня такое возникает, или все же есть не доработка?

У меня такой же вопрос

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

1. Какая версия сборки и на какой СУБД?
2. В разделе "Задачи" делались доработки или это базовая?

--
www.it-sfera.com.ua

Версия сборки 3.3.1, СУБД SQL 2005, раздел задач без доработок, базовый.

Если вы плюёте мне в спину, значит я впереди вас!

Только-что проверил на базовой TS XRM 3.3.1.45
не наблюдается описанная Вами проблема!

--
www.it-sfera.com.ua

Простите сборка 3.3.1.31

Если вы плюёте мне в спину, значит я впереди вас!

У меня есть только последняя 45... Возможно, в 31 и была какая-то проблема, но если конфигурация базовая - это Вам лучше на support писать! :smile:

--
www.it-sfera.com.ua

Спасибо! Обязательно так и сделаю. :smile:

Если вы плюёте мне в спину, значит я впереди вас!

если ошибка возникает хаотично то возможно нехватает этого кода

var Filter = BaseFilters.ItemsByCode('ContactIDs');
if (!Assigned(Filter)) {
Filter = BaseFilters.Items(0).ItemsByCode('ContactIDs');
}

var Parameters = Dataset.SelectQuery.Parameters;
var TeamFilter = Filter.ItemsByCode('tcTeam');

там присутствует код приведенный ниже, а переменная "Filter" уже существует, где мне сделать модификацию кода? Спасибо!
var IDs = GetContactsFilterArray();
SetAttribute(Self, 'ContactsFilterArray', IDs);
var Filter = Dataset.SelectQuery.Items(0).Filters.Items(0)
.ItemsByCode('ContactIDs');
var Parameters = Dataset.SelectQuery.Parameters;
var TeamFilter = Filter.ItemsByCode('tcTeam');
var SubSelectFilter = TeamFilter.TestExpression
.ExpressionSelectQuery.Items(0).Filters;
var OwnerIDsFilter = Filter.ItemsByCode('tcOwnerIDs');
var ContactIDsFilter = Filter.ItemsByCode('tcContactIDs');
var SubContactIDsFilter = SubSelectFilter.ItemsByCode('tcContactIDs');
ApplyIncludeFilter(OwnerIDsFilter, IDs, true, null, Parameters);
ApplyIncludeFilter(ContactIDsFilter, IDs, true, null, Parameters);
ApplyIncludeFilter(SubContactIDsFilter, IDs, true, null, Parameters);
TeamFilter.IsEnabled = true;
Filter.IsEnabled = true;

Если вы плюёте мне в спину, значит я впереди вас!

var IDs = GetContactsFilterArray();
SetAttribute(Self, 'ContactsFilterArray', IDs);
var Filter = Dataset.SelectQuery.Items(0).Filters.Items(0)
.ItemsByCode('ContactIDs');
if (!Assigned(Filter)) {
Filter = Dataset.SelectQuery.Items(0).Filters.Items(0).Items(0).ItemsByCode('ContactIDs');
}

var Parameters = Dataset.SelectQuery.Parameters;
var TeamFilter = Filter.ItemsByCode('tcTeam');
var SubSelectFilter = TeamFilter.TestExpression
.ExpressionSelectQuery.Items(0).Filters;
var OwnerIDsFilter = Filter.ItemsByCode('tcOwnerIDs');
var ContactIDsFilter = Filter.ItemsByCode('tcContactIDs');
var SubContactIDsFilter = SubSelectFilter.ItemsByCode('tcContactIDs');
ApplyIncludeFilter(OwnerIDsFilter, IDs, true, null, Parameters);
ApplyIncludeFilter(ContactIDsFilter, IDs, true, null, Parameters);
ApplyIncludeFilter(SubContactIDsFilter, IDs, true, null, Parameters);
TeamFilter.IsEnabled = true;
Filter.IsEnabled = true;

Спасибо огромное! Теперь все заработала как надо :)

Если вы плюёте мне в спину, значит я впереди вас!

Разработчики написали код... Вы его установили... А потом, кто-то подумал о значение null... Добавили заплатку... А Вам уж, звиняйте, нужно ручками дописывать :biggrin:

--
www.it-sfera.com.ua

Войдите или зарегистрируйтесь, чтобы комментировать