Доброго дня.
Дорогие форумчане, подскажите пожалуйста. Необходимо реализовать автоматическую подпись на вкладке "Ход задачи" (например: "Тестовый Сергей Сергеевич - 27 июля 2016 г. 14:22:00")
Я уже реализовал на страничке "Описание задачи" вот только там RichDataControl
а Ход задачи - MemoDataControl.
Заранее спасибо.

Нравится

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

Если Вы хотите при каждой правке текста в поле добавлять туда какие-то дополнительные данные, то можно завязаться на событие DataChange датасета, добавив ветвь с этим полем в обработчик dlDataOnDatasetDataChange на уровне карточки задачи или аналогичную SelfOnDatasetDataChange на уровне объекта датасета ds_Task. Главное при этом не получить вечную рекурсию, когда программное добавление текста вызовет повторное срабатывание.

Имя текущего пользователя получается в коде как CurrentUser.ContactName, дата — System.Now().

Спасибо, сейчас попробую

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

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

Нравится

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

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

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

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

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

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

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

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

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

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

Прошу пересмотреть логику отображения активностей в расписании.

1. Отображать разные виды активностей разным цветом. Например, мы в vtiger CRM меняли цвет стандартной встречи, звонка, задачи с голубого на зеленый для встреч, желтый для задач, голубой для звонков. При недельном или дневном представлении календаря очень удобно видеть критичные по времени и месту встречи, критичные по времени звонки и не критичные по времени и месту задачи.

2. Убрать наложение активностей в расписании. Если на 18.07.15 в 15:00 есть задача, звонок и начало встречи в 15:45, то их все нужно отображать в дневном или недельном представлении, не смешивая в месиво, как это есть в текущей версии бпм. нужно растягивать ячейку 15:00, чтобы туда поместились все 3 активности с отображением заголовка активности. см вложенный скриншот.

3. "Починить" фильтр по ответственному (По ответственному сотруднику). Было бы очень удобно, чтобы этот фильтр показывал активности того сотрудника, который является "ответственным" по активности, а не участником активности.

4. Доработайте бесполезную "что я могу для вас сделать" в полноценную строку поиска по всей базе CRM согласно рамок прав доступа пользователя. Чтобы введя туда "Улан" я нашел все контакты с этим именем, все упоминания в активностях и ленте, контрагентах и т.п. Поиск должен работать по нажатию Enter, а не заставлять нажимать Go.

5. Сделать быстрый поиск в реестрах Контрагент, Контакт, Продажи. Чтобы строки поиска были вверху реестра, и можно было задавать ряд параметров поиска - название, сайт и т.п. без создания каждый раз нового фильтра.

Нравится

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

Вот по всем пунктам поддержу!
Особенно про строку поиска :twisted:

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

Добрый день!

Подскажите, имеется ли в BPMonline функционал повторяющихся задач? И, если есть, то где его искать (не нашел)?

Нравится

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

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

Данного функционала в текущих версиях приложения BPM'online, к сожалению, нет.

Жаль. Очень нужен. В ближайших версиях планируется?

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

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

Коллеги с Террасофт, голосую за этот функционал. Мы перешли из другой CRM-системы на bpm, такая функция очень удобна для любого пользователя, т.к. есть задачи оплаты ежемесячно, формирования документов, подготовки отчетов и т.п.

Желательно, чтобы функция была с возможностью выставлять дату завершения повторения, периоды повторения по дням, месяцам, неделям и т.п.

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

"Бондарь Наталия" написал:

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

Реализация повторяющихся задач, по количеству запросов пользователей, не вошла в версию 7.7, но мы обязательно рассмотрим ее реализацию в последующих версиях.


Наталья, а нам сказали что будет в ближайшем релизе.

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

Здравствуйте!
Возникла необходимость запретить редактирование и удаление записей в разделе "Задачи" для всех пользователей кроме ее автора или администратора системы.

Запрет на редактирование полей карточки редактирования, отвечающих за постановку задачи я реализовал (код ниже).

//В событии OnPrepare wnd_TaskEdit
if (dlData.Dataset.Values('AuthorID') != Connector.CurrentUser.ContactID && Connector.CurrentUser.IsAdmin == false) {
                fgMainData.IsEnabled = false;
                edtTitle.IsEnabled = false;
        } else {
                fgMainData.IsEnabled = true;
                edtTitle.IsEnabled = true;
        }

Теперь думаю о том, как запретить удаление задач не авторами. Была идея повешать return на событие нажатие кнопки удаления при условии, что текущий пользователь не является автором выделенной записи. Подскажите, как определить значение поля "AuthorID" для выделенной записи в разделе в скрипте wnd_TasksWorkspace. Быть может есть более правильный путь? Спасибо.

Нравится

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

Если идти по пути интерфейса - можно "отключить" кнопку "удалить" если автор не совпадает с текущим пользователем для выделенной записи. Только делать это надо в wnd_TasksGridArea. В скрипте scr_TasksGridArea поправить функцию InitializeControls().
AuthorID получить можно как BaseGridArea.GridDataset.Values('AuthorID')

"Карпенков Никита Олегович" написал:Быть может есть более правильный путь?

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

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

Раздел должен быть "Администрируемым по записям" (см. мануал)

"Андросов Дмитрий" написал:да, есть, и находится он в разделе Администрирование - права доступа по-умолчанию.

Есть нюанс.
Ответственный всегда получит полные права на задачу (см скрипт ds_TaskScript в нем в SelfOnDatasetAfterPost() вызывается функция GiveRightsToRecordOwner()). Вот если поправить GiveRightsToRecordOwner() поставить там CanDelete = false то все будет хорошо :smile:

"Александр Кудряшов" написал:Ответственный всегда получит полные права на задачу

да, так давно отключил, что уже и не помню :wink:

"Андросов Дмитрий" написал:да, так давно отключил, что уже и не помню :wink:

Теплые ламповые скрипты 3.х :cool:

Александр Кудряшов, спасибо за подсказку, BaseGridArea.GridDataset.Values('AuthorID') - то, что нужно.
Андросов Дмитрий, про права доступа знаю и использую, но задачу поставили именно такую, как я написал. Через права доступа это реализовать нельзя.

"Карпенков Никита Олегович" написал:задачу поставили именно такую, как я написал. Через права доступа это реализовать нельзя.

Через права доступа реализуется вполне запрет на удаление... кнопка удалить блокируется если прав нет...
только старые записи обработать придется :)

"Карпенков Никита Олегович" написал:задачу поставили именно такую

иногда входящие надо корректировать, но вам виднее

"Александр Кудряшов" написал:только старые записи обработать придется

и это решаемо http://www.community.terrasoft.ru/blogs/9611

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

Как лучше реализовать наследование задач? Например, я ставлю задачу руководителю отдела, а он на ее основе формирует еще три задачи различным сотрудникам, одному что-то уточнить, другому позвонить, третьему кофе сделать.

Нравится

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

И пока наследованные задачи не будут завершены, родительская задача не будет закрыта.

Один из вариантов - небольшой бизнес процесс.

пока не представляю, как это можно реализовать в рамках бизнес процесса

Вот например в бизнес процессе поставили задачу, потом перешил к следующей задачи. Ккак вернуться к первой задаче, чтобы поставить еще одну подзадачу?

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

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

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

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

Спасибо!

Нравится

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

Добюрый день, Дмитрий.

Предлагаю такой вариант, реализации Вашей задачи:
В сервисе Tasks\Details\Contacts\wnd_ContactInTaskGridArea для фрейма формы frmButtons установите в свойствах следующие параметры:

  • Is Enabled = False
  • IsTransparent = True
  • IsVisible = False

Для каждой из кнопок этого фрейма установите свойство IsVisible = False.

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

Спасибо.

Еще вопрос: можно ли сделать копию сервисов, которые находятся в группе: Accounts\Details\Contacts\, переместить их в раздел Task и адаптировать под этот раздел? Чтобы в этой детали отображалось тоже самое, что и в разделе Контрагенты, но фильтр был по полю AccountID задачи.

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

Или может быть есть другой вариант? Задача вообще состоит в том, чтобы на детали Контакты раздела Задачи автоматически отображались все контакты выбранного в задаче контрагента.

Добрый день, Дмитрий.
Ипортируйте, пожалуйста, прирепленные сервисы. (Не забывайте про резервные опии!).

В Tasks\General\Main Grid\wnd_TasksWorkspace Деталь[Контакты] переименована на Контакты в задаче и добавленна Деталь[Контакты в контрагенте]. Это делать наследуется от датагрида "Контакты в контрагенте" - wnd_ContactsInAccountGridArea.

Добавленной логике в Tasks\General\Main Grid\scr_TasksWorkspace предшевствует коментарий //ContactInAccount

Большое спасибо! Именно то что нужно.

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

Добрый день!

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

Нравится

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

Добрый день, Александр!

Добавьте в справочник "Состояния задач" новое значение: Административная эскалация (код: Administration). В сервисе Tasks\General\Main Grid\scr_TaskEdit в методе UpdateControlsAndDataByStatusID после

var StatusCode = GetTaskStatusCodeByID(TaskStatusID);
       if (StatusCode == 'Running') {
	SetActualDates(BaseDBEdit.Dataset, 'ActualStartDate', true);
}

вставьте еще один блок уловия:

if (StatusCode == 'Administration')  {  
	chbRemindToAuthor.IsChecked = false;
	chbRemindToOwner.IsChecked = false;
}

Для того чтобы задачи со статусом "Административная эскалация" не отображались в отчете "Просроченные задачи", например, измените сервис Tasks\Reports\Overdue Tasks\ds_ReportOverdueTasksScript:

function SelfOnDatasetCalcFields(Dataset) {
	var TaskStatusID = Dataset.Values('StatusID');
	var StatusCode = GetTaskStatusCodeByID(TaskStatusID);
 
	if (StatusCode != 'Administration')  {
		CalcActualDuration(Dataset);
		Dataset.Values('DelayDaysStr') = GetOverdueTaskDelayString(Dataset);
	}
}

Спасибо за развернутый ответ!

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

День добрый, уважаемые участники интернет сообщества!

Как вы, наверное, все знаете, в Terrasoft существует возможность двусторонней синхронизации задач между MS Outlook и Terrasoft. Хочу рассказать об одной особенности: если выполнять синхронизацию задач из Terrasoft в MS Outlook, то в случае если для задачи в Terrasoft установлен признак "Отображать в расписании", то задача будет интегрирована в MS Outlook как встреча и будет отображена в календаре.
1
В ином случае - задача попадет в меню "Задачи" в папку "Задачи".
2

Эта особенность реализована в скрипте scr_MsOutlookSynchronization:

if (ShowInSheduler) {
         olItem = OutlookSync.OutlookApplication.CreateItem(olAppointmentItem);
} else {
         olItem = OutlookSync.OutlookApplication.CreateItem(olTaskItem);
         }
IsAddUserField = true;
OutlookSync.CreatedItem++;

где
 var ShowInSheduler = (TerrasoftItemDataset.Values('ShowInScheduler') == 1);

Соответственно, Вы можете легко изменить указанную логику, например по типу задачи (если тип: встреча – создаем встречу, в ином случае задачу):

if (IsMeetingOrTask) {
         olItem = OutlookSync.OutlookApplication.CreateItem(olAppointmentItem);
} else {
         olItem = OutlookSync.OutlookApplication.CreateItem(olTaskItem);
         }
IsAddUserField = true;
OutlookSync.CreatedItem++;

var IsMeetingOrTask = (TerrasoftItemDataset.Values('TypeID') == '{63FB4E89-EE75-404F-8352-1E712AC909F6}');

где '{63FB4E89-EE75-404F-8352-1E712AC909F6}' – ID типа задачи «Встреча».

Либо, как другой вариант, в этом участке кода можно настроить синхронизацию таким образом, чтобы создавалась как задача так и встреча, убрав проверку вообще:

olItem = OutlookSync.OutlookApplication.CreateItem(olAppointmentItem);
olItem = OutlookSync.OutlookApplication.CreateItem(olTaskItem);        
IsAddUserField = true;
OutlookSync.CreatedItem++;

Приятной работы с Terrasoft!

Нравится

Поделиться

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

Доброго времени суток, коллеги!

В разделе [Задачи] существуют такие действия как "Запустить таймер" и "Остановить таймер", пользуясь которыми можно автоматически заполнять поля "Факт. дата начала" (старт таймера), "Факт. дата завершения" (стоп таймера) и "Факт. продолжительность" (разница между датой начала и датой завершения) в карточке редактирования задачи.
Однако, если запускать таймер несколько раз, в поле "Факт. продолжительность" будет проставлен период последнего запуска таймера, когда часто необходимо суммировать время всех периодов запусков таймера.

Для реализации данного функционала, необходимо внести изменения в функцию function SetTaskActualDuration(TaskID, StartTime) скрипта scr_TaskWorkspace (Tasks \ General \ MainGrid ):
1
Код JScript:

function SetTaskActualDuration(TaskID, StartTime) {
         if (!Assigned(TasksWorkspace.TaskStopTimerUpdateQuery)) {
                   InitializeTaskStopTimerUpdateQuery();
         }
         if (TasksWorkspace.ClosedTastStatusCalc != true) {
                   TasksWorkspace.ClosedTastStatusID = GetTaskStatusIDByCode('Closed');
                   if (IsEmptyGUID(TasksWorkspace.ClosedTastStatusID)) {
                            TasksWorkspace.ClosedTastStatusID = null;
                   }
                   TasksWorkspace.ClosedTastStatusCalc = true;
         }
         var UpdateQuery = TasksWorkspace.TaskStopTimerUpdateQuery;
         var CurrentTime = new Date(System.Now());
         var Milliseconds = CurrentTime.getTime() - StartTime;
         var ActualDurationData =
                   GetDurationDataFromMilliseconds(Milliseconds);
         var ActualDurationHours = ActualDurationData.Hours;
         var ActualDurationMinutes = ActualDurationData.Minutes;
         var Parameters = UpdateQuery.Parameters;        
         var Dataset = Services.GetNewItemByUSI('ds_Task');        
         ApplyDatasetFilter(Dataset, 'ID', TaskID, true);
         Dataset.Open();
         var OldActualDuration = Dataset.Values('ActualDuration');
         Dataset.Close();                
         SetParameterValue(Parameters, 'ID', TaskID);
         SetParameterValue(Parameters, 'ActualDurationHours', ActualDurationHours);
         SetParameterValue(Parameters, 'ActualDurationMinutes', ActualDurationMinutes);
         SetParameterValue(Parameters, 'ActualDuration',
                   (Math.round(Milliseconds / 1000 / 60) + OldActualDuration));
         SetParameterValue(Parameters, 'StatusID', TasksWorkspace.ClosedTastStatusID);
         UpdateQuery.Execute();
}

Нравится

Поделиться

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