Не работает фильтр в окне выбора данных

Добрый день. У меня возникла следующая проблема: для запуска БП использую окно wnd_SelectData. Перед его открытием применяется функция ApplyDatasetIsNullFilter для фильтрации. Далее, если в окне я использую поиск по заголовку, то он не работает. Причём, если воспользоваться сначала быстрым фильтром, а после поиском, то он начинает работать. Я думаю, что проблема в применеии перед открытием ApplyDatasetIsNullFilter, потому что без этого всё работает. Может кто-нить подскажет решение?

Нравится

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

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

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

Выложите код - попробуем помочь.

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

function SelectServiceByCodeForTaskInProcess(ServiceCode, ShowCodeField, NotifyObject, Tag) {
	var Dataset = Services.GetNewItemByUSI(ServiceDatasetUSI);
	var AdminUnitID = Connector.CurrentUser.ID;
	ApplyDatasetFilter(Dataset, 'ServiceTypeCode', ServiceCode, true);
	ApplyDatasetFilter(Dataset, 'AdminUnitID', AdminUnitID, true);
	ApplyDatasetIsNullFilter(Dataset, 'IsStart', true);
 
	if (ShowCodeField) {
		var SearchFieldNames = 'Code;Caption';
		var DisplayFieldNames = 'Code;Caption';
	} else {
		var SearchFieldNames = 'Caption';
		var DisplayFieldNames = 'Caption';
	}
	SelectWindow = ShowSelectDataWindowForTaskInProcess(Dataset, SearchFieldNames,
		DisplayFieldNames, 'ID', GUID_NULL, 'Caption', '', NotifyObject ,Tag, false, false);
	if (!IsEmptyValue(Tag)) {
		SelectWindow.Tag = Tag;
	}
}
function ShowSelectDataWindowForTaskInProcess(Dataset, SearchFieldNames, DisplayFieldNames,
		KeyFieldName, KeyValue, SearchFieldName, SearchValue, NotifyObject,
		Tag, IsReadOnly, ShowModal) {
	var SelectDataWindow = Services.GetNewItemByUSI('wnd_SelectData');
	SetAttribute(SelectDataWindow, 'Dataset', Dataset);
	SetAttribute(SelectDataWindow, 'DisplayFieldNames', DisplayFieldNames);
	SetAttribute(SelectDataWindow, 'SearchFieldNames', SearchFieldNames);
	SetAttribute(SelectDataWindow, 'KeyFieldName', KeyFieldName);
	SetAttribute(SelectDataWindow, 'KeyValue', KeyValue);
	SetAttribute(SelectDataWindow, 'SearchFieldName', SearchFieldName);
	SetAttribute(SelectDataWindow, 'SearchValue', SearchValue);
	SetAttribute(SelectDataWindow, 'NotifyObject', NotifyObject);
	SetAttribute(SelectDataWindow, 'Tag', Tag);
	SetAttribute(SelectDataWindow, 'IsReadOnly', IsReadOnly);
	SetAttribute(SelectDataWindow, 'DeleteButtons', true);
	SelectDataWindow.Tag = Tag;
	SelectDataWindow.Prepare();
	if (ShowModal) {
		SelectDataWindow.ShowModal();
	} else {
		SelectDataWindow.Show();
	}	
	return SelectDataWindow;
}

В SelectData код стандартный, ничего не меняла

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

Попробовал вызвать окно из скрипта следующим образом, предварительно добавив в запрос sq_Service фильтр Unlocked (при применении возвращает список незаблокированных сервисов):

function SelectServiceByCodeForTaskInProcess(ServiceCode, ShowCodeField, NotifyObject, Tag) {
        var Dataset = Services.GetNewItemByUSI('ds_Service');
        var AdminUnitID = Connector.CurrentUser.ID;
        ApplyDatasetFilter(Dataset, 'ServiceTypeCode', ServiceCode, true);
        //ApplyDatasetFilter(Dataset, 'AdminUnitID', AdminUnitID, true);
        ApplyDatasetIsNullFilter(Dataset, 'Unlocked', true);
 
        if (ShowCodeField) {
                var SearchFieldNames = 'Code;Caption';
                var DisplayFieldNames = 'Code;Caption';
        } else {
                var SearchFieldNames = 'Caption';
                var DisplayFieldNames = 'Caption';
        }
        SelectWindow = ShowSelectDataWindowForTaskInProcess(Dataset, SearchFieldNames,
                DisplayFieldNames, 'ID', GUID_NULL, 'Caption', '', NotifyObject ,Tag, false, false);
        if (!IsEmptyValue(Tag)) {
                SelectWindow.Tag = Tag;
        }
}
 
function Main() {
	SelectServiceByCodeForTaskInProcess('Table', true);
}

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

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

Пишу поподробнее. Вызов окна следующий:

function SelectServiceByCodeForTaskInProcess(ServiceCode, ShowCodeField, NotifyObject, Tag) {
	var Dataset = Services.GetNewItemByUSI('ds_WFInGroup');
	var AdminUnitID = Connector.CurrentUser.ID;
	ApplyDatasetFilter(Dataset, 'AdminUnitID', AdminUnitID, true);
	ApplyDatasetIsNullFilter(Dataset, 'IsStart', true);
	if (ShowCodeField) {
		var SearchFieldNames = 'Code;Description';
		var DisplayFieldNames = 'Code;Description';
	} else {
		var SearchFieldNames = 'Number;Description';
		var DisplayFieldNames = 'Number;Description';
	}
	SelectWindow = ShowSelectDataWindowForTaskInProcess(Dataset, SearchFieldNames,
		DisplayFieldNames, 'WFServiceID', GUID_NULL, 'Description', '', NotifyObject ,Tag, false, false);
	if (!IsEmptyValue(Tag)) {
		SelectWindow.Tag = Tag;
	}
}

Фильтр IsStart - это пользовательский sql-фильтр, код следующий:

EXISTS 
	(SELECT
		[tbl_WFGroupRights].[ID] AS [ID]
	FROM
		[dbo].[tbl_WFGroupRights] AS [tbl_WFGroupRights]
	LEFT OUTER JOIN
		[dbo].[tbl_AdminUnit] AS [tbl_AdminUnit] ON [tbl_AdminUnit].[ID] = [tbl_WFGroupRights].[AdminUnitID]
	WHERE([tbl_WFGroupRights].[WFGroupID] = [tbl_WFInGroup].[WFGroupID] AND
		[tbl_AdminUnit].[ID] = :AdminUnitID)) OR
   EXISTS (SELECT
		[tbl_WFGroupRights].[ID] AS [ID]
	FROM
		[dbo].[tbl_WFGroupRights] AS [tbl_WFGroupRights]
	LEFT OUTER JOIN
		[dbo].[tbl_AdminUnit] AS [tbl_AdminUnit] ON [tbl_AdminUnit].[ID] = [tbl_WFGroupRights].[AdminUnitID]
	LEFT OUTER JOIN
		[dbo].[tbl_UserInGroup] AS [tbl_UserInGroup] ON [tbl_UserInGroup].[GroupID] = [tbl_AdminUnit].[ID]
	WHERE([tbl_WFGroupRights].[WFGroupID] = [tbl_WFInGroup].[WFGroupID] AND
		[tbl_UserInGroup].[UserID] = :AdminUnitID)) OR
	EXISTS (SELECT [tbl_WFRights].[ID] AS [ID]
	FROM
		[dbo].[tbl_WFRights] AS [tbl_WFRights]
	WHERE([tbl_WFRights].[WFServiceID] = [tbl_WFInGroup].[WFServiceID] AND
		[tbl_WFRights].[AdminUnitID] = :AdminUnitID AND [tbl_WFInGroup].[WFGroupID] = :AllWorkflow)) OR
	EXISTS (SELECT
		[tbl_WFRights].[ID] AS [ID]
	FROM
		[dbo].[tbl_WFRights] AS [tbl_WFRights]
	LEFT OUTER JOIN
		[dbo].[tbl_AdminUnit] AS [tbl_AdminUnit] ON [tbl_AdminUnit].[ID] = [tbl_WFRights].[AdminUnitID]
	LEFT OUTER JOIN
		[dbo].[tbl_UserInGroup] AS [tbl_UserInGroup] ON [tbl_UserInGroup].[GroupID] = [tbl_AdminUnit].[ID]
	WHERE([tbl_WFRights].[WFServiceID] = [tbl_WFInGroup].[WFServiceID] AND
		[tbl_UserInGroup].[UserID] = :AdminUnitID AND [tbl_WFInGroup].[WFGroupID] = :AllWorkflow))
 

Честно говоря, не совсем понял, где здесь IsNull-фильтр. Это фильтр типа Exists.

Попробуйте поступить следующим образом: включите в фильтре IsStart все условия, кроме корневого (с кодом IsStart). Далее вместо вызова

ApplyDatasetIsNullFilter(Dataset, 'IsStart', true);

поступите следующим образом:

var Parameters = Dataset.SelectQuery.Parameters;
SetParameterValue(Parameters, 'AdminUnitID', AdminUnitID);
EnableDatasetFilters(Dataset, true, 'IsStart');

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

Я так тоже пробовала - всё равно не получается. Даже и не знаю, в чём тут дело.

У меня подобная фильтрация работала. Думаю, проблема где-то в другом месте.

Для более тщательного анализа предоставьте, пожалуйста, удалённый доступ к Вашей конфигурации (если это возможно). Параметры удалённого доступа просьба выслать на support@tscrm.com

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

Ещё раз посмотрел текст Вашего запроса. Первый раз не заметил, что у Вас кроме параметра :AdminUnitID есть ещё :AllWorkflow. Необходимо установить значение и для него. Например:

var Parameters = Dataset.SelectQuery.Parameters;
var AllWorkflowID = <ID группы "Все процессы">;
SetParameterValue(Parameters, 'AdminUnitID', AdminUnitID);
SetParameterValue(Parameters, 'AllWorkflow', AllWorkflowID);
EnableDatasetFilters(Dataset, true, 'IsStart');

Либо же установить значение этого параметра непосредственно в запросе.

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

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