Есть процесс, который при добавлении "Обращения" его изменяет и устанавливает "Группу ответственных".

Так вот если обращение создал портальный пользователь то данное поле не заполняется, как так?

Нравится

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

Добрый день, Евгений!

 

Речь о базовом процессе или о каком-то вашем кастомном? Если о кастомном, то нужно, как минимум, посмотреть на него. Можете выложить схему или скриншоты здесь, или обратится для анализа в техническую поддержку на адрес support@terrasoft.ru 

Адасюк Валерий Викторович,

Кастомный. Там все просто и тривиально, читаем обращение если оно соответсвует фильтру, то измени его.

Грубо говоря.

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

Под всеми работает, а под порталом не работает.

Евгений.,

А процесс вообще запускается? Поля, на основании которых должна быть установлена группа ответственных Сервис и сервисный договор заполнены в обращении? С какой ошибкой падает процесс (в логе можно посмотреть)? На каком элементе останавливается?

Адасюк Валерий Викторович,

он без ошибок падает, все выполняется. Но под портальным пользователем не заполняется поле, хоть и процесс пишет что все ок.

Евгений.,

В таком случае нужен доступ на среду с данным процессом для выявления причин. Напишите запрос на 

 support@terrasoft.ru с описанием проблемы и рамках технической поддержки проблема будет проанализирована и решена.

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

Добрый день, коллеги!
Назрел вопрос: при эскалации назначаем обращение на группу ответственных, эскалируем и автоматически переходим в реестр записей раздела. Группу ответственных мы видим: https://yadi.sk/d/jsQwYbwB3Jcnqa Но когда мы снова переходим в данную запись, то видим, что колонка не заполнена: https://yadi.sk/d/jlqjBIdV3Jcnyr Если нажмем Отмена, то колонка заполнится автоматически тем значением, которое мы указали: https://yadi.sk/d/3LQigNM83JcoA8

Что за баг такой, и как его побороть?

Нравится

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

"Голикова Елена Евгеньевна" написал:Что за баг такой, и как его побороть?

Похоже, что какая-то логика перетирает значение поля при открытии карточки? Это коробочная версия bpm service?

"Варфоломеев Данила" написал:
Голикова Елена Евгеньевна пишет:

Что за баг такой, и как его побороть?

Похоже, что какая-то логика перетирает значение поля при открытии карточки? Это коробочная версия bpm service?


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

"Голикова Елена Евгеньевна" написал:Могло ли это повлиять на работу?

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

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

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

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

Нравится

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

Здравствуйте!

Уточните, пожалуйста, версию продукта, который Вы используете.

Этот же вопрос обсуждается здесь.

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

Доброго дня!
Подскажите пожалуйста, необходимо сделать выборку по групповым задачам.
Начал делать по аналогии с выборкой по "Ответственному"
Добавил Lookup Control, сделал линк на датасет "Группа контактов". Вот только теперь при выборе группы контактов никакие задачи не отображаются. Что я сделал не так? Или может я что то не доделал?
Заранее спасибо

Нравится

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

Добрый день Дмитрий!!!

вы внимательно проанализируйте как происходит Инициализация и фильтрация раздела По контакту и вам все станет ясно. Одним добавлением DatasetLink-om там не обойдешься. Плюс прошу описать какая у вас платформа и конфигурация. Чтобы вам подсказать. Если уже будет сложно разобраться как происходит стандартная фильтрация. Я готов вам по полочкам разложить рассказать как это все работает.

Буду Вам очень благодарен если расскажете

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

Александр, вот я пытался сделать по аналогии, однако при выборе в поле "Группу ответственных" ничего не происходило.
Буду дальше пытаться :)

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

Вот обработчик чек-бокса для фильтрации по "Ответственному"

function chbShowForContactOnClick(Control) {
	if ((!IsEmptyValue(edtTaskOwner.Value) || !Control.IsChecked) && 
		BaseWorkspace.WasShowed && (!TasksWorkspace.NoRefresh)) {
		TasksWorkspace.TaskOwnerIsChanged = true;
		RefreshTasks();
	}
}

Подскажите пожалуйста как мне адаптировать этот код для моего чекбокса (

function chbShowForContactGroupOnClick(Control) {
 
}

Судя по строке:

TasksWorkspace.TaskOwnerIsChanged = true;

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

Как я понял все происходит именно здесь

function ApplyContactFilter() {
	var Dataset = BaseWorkspace.GridDataset;
	var Grid = BaseWorkspace.Grid;
	var IsGridPageActive = pcData.ActivePage.Name == pgGridData.Name;
	var MyTasksIsActive = IsGridPageActive &&
		(Grid.ActiveView.Name == TasksWorkspace.MyTaskView.Name);	
    var ForControlIsActive = IsGridPageActive &&
		(Grid.ActiveView.Name == TasksWorkspace.ForControlView.Name);
	chbShowForContact.IsEnabled = (!MyTasksIsActive);
	edtTaskOwner.IsEnabled = chbShowForContact.IsEnabled;
	fgShowTasksBody.IsEnabled = chbShowForContact.IsEnabled;
	var TaskOwnerID = edtTaskOwner.Value;
	var EmptyContact = IsEmptyGUID(TaskOwnerID) || (!chbShowForContact.IsChecked);
	var IDs = GetContactsFilterArray();
	if ((!IsGridPageActive) && (IDs.length == 0)) {
		if (ShowConfirmationDialog(
			"Действие может занять некоторое время. Продолжить?") != mrYes) {
			TasksWorkspace.NoRefresh = true;
			chbShowForContact.IsChecked = true;
			TasksWorkspace.NoRefresh = false;
			IDs.push(edtTaskOwner.Value);
		}
	}
	var ShowForContact = ((IDs.length > 0) || (!EmptyContact));
	if (EmptyContact) {
		TaskOwnerID = Connector.CurrentUser.ContactID;
	}
	if (IsGridPageActive) {
		SetAttribute(BaseWorkspace.GridWindow, 'OwnerID', TaskOwnerID);
		if (MyTasksIsActive) {
			EnableDatasetFilters(Dataset, true, 'MyTasks');
			return;
		}
		if (ForControlIsActive) {
			EnableDatasetFilters(Dataset, true, 'ForControl');
			if (IDs.length > 1) {
				EnableDatasetFilters(Dataset, false, 'CreatedByID');
				ApplyDatasetIncludeFilter(Dataset, 'CreatedByIDs', IDs, true);
			} else {
				EnableDatasetFilters(Dataset, false, 'CreatedByIDs');
				ApplyDatasetFilter(Dataset, 'CreatedByID', TaskOwnerID,
					ShowForContact);
			}
			SetAttribute(Self, 'ContactsFilterArray', IDs);
			return;
		}
	} else {
		var ScheduleControl = 
			wndSchedulerArea.Window.ComponentsByName('ScheduleControl');
		SetAttribute(TasksWorkspace.SchedulerWindow, 'OwnerID', TaskOwnerID);
		ApplyDatasetFilter(Dataset, 'ShowInScheduler', true, true);   			
	}
	if (ShowForContact) {
		if (IDs.length == 1) {
			SetContactWhite(IDs[0]);
		}
		SetAttribute(Self, 'ContactsFilterArray', IDs);
		BaseFilters = Dataset.SelectQuery.Items(0).Filters.Items(0);
		var Filter = BaseFilters.ItemsByCode('ContactIDs');
		if (!Assigned(Filter)) {
			Filter = BaseFilters.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 IsSchedulerPageActive = (pcData.ActivePage.Name == pgScheduler.Name);
	if (IsSchedulerPageActive) {
		if (TasksWorkspace.TaskOwnerIsChanged) {
			if (ShowForContact) {
				if (TaskOwnerID == Connector.CurrentUser.ContactID) {
					SetTimeZone(ScheduleControl, TaskOwnerID, true);
					ScheduleControl.ShowAdditionalTimeZone = false;
				} else {
					SetTimeZone(ScheduleControl, TaskOwnerID, false);
				}
			} else { 
				ScheduleControl.ShowAdditionalTimeZone = false;
			}
			TasksWorkspace.TaskOwnerIsChanged = false;
		}
	}
}

Осталось понять, что нужно поправлять для моей задачи

Здравствуйте.

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

А не подскажете как это сделать? А то я что то не понимать :exclaim:

Создаете свою функцию, в которой будет включаться/отключаться фильтр. Затем вызываете созданную Вами функцию, из функции ApplyTasksWorkspaceFilter.
Пример:

function MyTaskFilter() {
	var Dataset = BaseWorkspace.GridDataset;
	var MyFilterName = 'MyFilter';
	var Value = edtMyLookup.Value;
	if (!IsEmptyValue(Value)) {
		ApplyDatasetFilter(Dataset, MyFilterName, Value, true);
	} else {
		EnableDatasetFilters(Dataset, false, MyFilterName);
	}
}
 
function ApplyTasksWorkspaceFilter() {
	var Dataset = BaseWorkspace.GridDataset;
	ApplyStandardWorkspaceFilter(); 
	var Grid = BaseWorkspace.Grid;
	var IsCycleView = (Grid.ActiveView.Name == 'dgvCycleTasks') && 
			!(pcData.ActivePage.Name == pgScheduler.Name)
	EnableDatasetFilters(Dataset, IsCycleView, 'IsCycle');
	if ((chbShowForPeriod.IsChecked) ||
		(pcData.ActivePage.Name == pgScheduler.Name)) {
		var FromDate = 
			TasksWorkspace.DatePeriodMemoryDataset.ValAsDateTime('From');
		var ToDate = TasksWorkspace.DatePeriodMemoryDataset.ValAsDateTime('To');
		ApplyTaskDateFilter(Dataset, FromDate, ToDate);
		if (TasksWorkspace.SchedulerWindow == null) {
			TasksWorkspace.SchedulerWindow = wndSchedulerArea.Window;
		}
		SetScheduleAreaTimePeriod(FromDate, ToDate);
	}
	ApplyDatasetGroupIDFilter(BaseWorkspace.GroupsDataset,	Dataset);
	ApplyContactFilter();
 
	MyTaskFilter();
} 
 
......
 
 
function edtMyLookupOnChange(LookupControl) {
	RefreshTasks();
}

Cпасибо огромное!

Сделал фильтр по примеру, теперь при выборе группы ответственных в поле выдает ошибку "Исключение брошено и не поймано"
В чем может быть причина? подскажите пожалуйста

Вам необходимо выполнить пошаговую отладку кода, с помощью Microsoft Script Debugger или Microsoft Visual Studio.

Пример отладки кода приведен в статье.

Если честно, я так и не понял в чем причина ;(
после отладки перенаправляет на эту функцию:

У Вас исключение происходит скорее всего в функции ApplyContactGroupFilter.
Необходимо установить debugger в ApplyContactGroupFilter.

Пример кода:

function MyTaskFilter() {
        debugger;
        var Dataset = BaseWorkspace.GridDataset;
        var MyFilterName = 'MyFilter';
        var Value = edtMyLookup.Value;
        if (!IsEmptyValue(Value)) {
                ApplyDatasetFilter(Dataset, MyFilterName, Value, true);
        } else {
                EnableDatasetFilters(Dataset, false, MyFilterName);
        }
}

После чего отладит код, проверяя каждый объект на содержание значения с провалом в функции (горячая клавиша F11)

Одна задача выполнена, но появилась новая проблема...
После фильтрации, при нажатии на "Группу ответственных" в колонке, выдает ошибку: "Не удается найти карточку редактирования для выбранного элемента". А поскольку помимо фильтрации по групповым задачам необходима фильтрация по каждому ответственному, который входит в эту группу, хочу спросить как можно ли реализовать открытие карточки "Группа ответственных"?
(По такому принципу: отфильтровал по группе, посмотрел кто входит в группу, отфильтровал по ответственному №1, №2...)

Если пройдетесь по коду конфигурации, то сможете найти как это реализовано для других колонок.
Советую обратить внимание на источник данных (Dataset) раздела, а также использовать Microsoft Visual Studio для изучения алгоритма работы приложения.

А не подскажете какие изменения нужно добавить в фильтре, если мне необходимо отобразить задачи не только пользователя, но также задачи всех групп, в которые входит этот пользователь?
Или это вообще не в фильтре нужно делать?

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

Добрый день, подскажите пожалуйста...
Если при создании задачи выбираю группу ответственных, во вкладке "Все задачи" группа не отображается.
Как это можно исправить?
Заранее спасибо

Нравится

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

Здравствуйте, Дмитрий!

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

Если это поле не в карточке редактирования задачи, тогда уточните, пожалуйста, где Вы выбираете группу ответственных(покажите скриншот).

Выбираю в карточке редактирования. А где я могу посмотреть список скрытых колонок?

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

Спасибо, удалось добавить колонку.
В моем случае, в карточке редактирования задачи, если выбирается поле "Ответственный" , то поле "Группа ответственных" становится недоступным и наоборот.
Хотелось бы чтобы все отображалось в одной колонке (выбрал ответственного, в гриде в колонке "Ответственный" отобразился ответственный. Выбрал группу ответственных, в гриде в колонке "Ответственный" отобразилась группа ответственных), можно ли это реализовать?

Дмитрий, можно добавить (в tbl, sq, ds и страницу реестра) третью колонку, текстовую.
И при изменении ответственного или группы заполнять это поле нужным названием или именем.
Логику заполнения можно реализовать как на триггере, так и на датасете или карточке.

Ещё вариант реализации — добавить в сервис sq колонку типа Custom SQL, где будет кусок SQL-кода, получающий то или другое значение при помощи оператора CASE. Затем добавить такую же колонку в ds и страницу реестра. Но тут нужно проверять, будет ли такое работать корректно, поскольку у этих полей есть свои ограничения, может не работать фильтрация.

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