Добрый день!

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

P.S.: информацию по добавлению действия в раздел кое какую нашел, а вот в карточку - нет.

Нравится

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

Александр, здравствуйте.

В приложении инструкция по созданию действия для стандартного раздела.

Елена, ну я же специально уточнил и скриншот приложил: мне нужно добавить действие НЕ В РАЗДЕЛ, А В КАРТОЧКУ.

Александр,

Принцип добавления действия в карточку раздела аналогичен принципу добавления действия в раздел. Разница только в схемах, в которые добавляется код обработчика. Для добавления действия в раздел обработчик добавляется в схему [Название_объекта_раздела]Section. Если необходимо добавить действие в карточку раздела - изменяется схема [Название_объекта_раздела]Page.
В вашем случае необходимо создать замещающий модуль для страницы ActivityPage и добавить в него код обработчика.

В приложении инструкция по добавлению действия, в которой добавлено описание кейса по добавлению действия в карточку раздела.

Елена,

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

P.S.: данные с самой карточки получаются легко согласно статье, а вот для деталей аналогичного не нашел.

Александр,

через объект получить доступ к деталям не получится. Можно использовать select и получить данные из базы данных. Например так:

var selectFilevar = 
        new Select(UserConnection)
        .Column("Name")
        .From("ActivityFilel")
        .Where("ActivityId").IsEqual(activity.Id)

Андрей,

все бы хорошо, но вот незадача: ActivityPage - это js-страница. Поэтому, чтобы ее переопределить, приходится писать на js. Код:

this.methods.showAvtivityInfo = function() {
   var activityTitle = this.get("Id");
   var esq = Ext.create('Terrasoft.EntitySchemaQuery', {
    rootSchemaName: 'ActivityFile'
   });
   esq.addColumn('Id');
   esq.addColumn('Name');
   esq.addColumn('ActivityId');
   /*var filters = esq.filters;
   var filterNameActivityId = 'ActivityId';
   var filterActivityId = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
    'ActivityId', activityTitle);
   filters.add(filterNameActivityId, filterActivityId);*/
   esq.getEntityCollection(function(result) {
    var collection = result.collection;
    if (collection && collection.collection.length > 0) {
     var item = collection.collection.items[0].values;
     this.showInformationDialog(activityTitle);
    }
   }, this);
  };

Exception выходит на строке

esq.addColumn('ActivityId');

Текст exception: [17:51:16.813] uncaught exception: -;5<5=B :>;;5:F88 A 8<5=5< ActivityId =5 =0945=

P.S.: Поля 'ID' и 'Name' отрабатывают корректно.

Александр, у Вас опечатка:

this.methods.showAvtivityInfo = function() {

Должно быть showActivityInfo.

Попробуйте использовать Select(UserConnection), как я описывал выше.

Андрей,

опечатка не существенна, потому что я вызывал функцию ниже именно по этому имени. Сейчас поменял - не помогло.
Вы описали Select(UserConnection), это применимо для C# кода, в JS коде получаем ожидаемую ошибку.
1. При сохранении (во вложении)
2. В консоли браузера:
[14:42:41.377] ReferenceError: Select is not defined @ http://stnd-bpm-02:88/0//configuration/30e6e6890bd6a8c10768d330b68949d4…

Александр,

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

Андрей,

файл во вложении.

Методом тыка и медитированя нашел решение:

esq.addColumn('Activity.Id');

Теперь вопрос в том, как вызвать свой серверный метод?
Видимо нужно использовать DLL либо .NET Managed Assemblies отсюда, но примеров нет:(

Александр, если я правильно понял, то нужно просто дописать

click: {
         bindTo: 'showActivityInfo'
        }

Андрей,
Уверен, Вы меня не правильно поняли. Я получил idшники файлов, круто. Теперь мне нужно вызвать метод, написанный на C#. На сколько я понимаю, мне для этого нужно:
1. Создать проект со сбокой dll в VisualStudio
2. Подключить сборку к dll. Как?
3. Вызвать из js-кода метод из сборки. Как?

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

То есть варианты DLL сборки и .Net Managed сборки не подходят?
Можно тогда инструкцию/пример по написанию сервиса и вызову его из js-кода в Террасофт?

Александр, веб-сервис пишется на любом языке программирования и регистрируется в IIS.
Потом через API сервиса вызывать его методы. Пример запроса к Google с помощью jQuery:

1) Подключить jQuery в зависимые модули нашей страницы редактирования (в примере ProductPage) модуль jQuery.
2) В коде страницы добавить define('ProductPage', ['ext-base', 'terrasoft', 'sandbox', 'jQuery' …..
function(Ext, Terrasoft, sandbox, jQuery ……
3) В обработчик нажатия кнопки добавить следующий код:
var geocodingAPI = "http://maps.googleapis.com/maps/api/geocode/json?address=Россия+Москва&sensor=true";
window.jQuery.getJSON(geocodingAPI, function (json) {
console.log('json : ', JSON.stringify(json));
});

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

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

Стоит задача импортировать данные из Excel, из одного файла в разделы - Задача, Контрагент, Контакт. (Импорт проводится регулярно)

После того, как прошел импорт, менеджер через Задачу выполняет следующие действия: Контекстное меню задачи - Позвонить - Контрагент. В открывшимся окне Звонка при нажатии на кнопку Позвонить поле Контрагент удаляется.

Техподдержка ответила, что это происходит из-за того, что после импорта не заполняется деталь [Средства связи].

Пробовала:
1. после импорта запускать скрипт, который для новых Контрагентов создавал запись на деталь Средства связи. Проблема осталась.
2. затем непосредственно в настройках импорта заполняла деталь. Не помогло.

В обоих действиях на средствах связи был номер телефона. И в карточку звонка он подтягивается.

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

В чем проблема не понятно.

Нравится

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

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

Не совсем понимаю, почему нет информации на детали, ведь в импорте указаны поля, и при просмотре контрагента на детали "Средства связи" отображается :

Средства связи

Если не заполнена деталь Средства связи, при попытки позвонить выдает сообщение "Для выбранного элемента не выбраны средства связи". А тут затирает Контрагента

уточните версию продукта (например 3.4.1.100), я постараюсь воспроизвести ситуацию.

Террасофт 3.3.2.127

Марина, службе технической поддержки Вы сообщили, что проблема решена.
Если она вновь возникнет, пожалуйста, сообщите.

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

Здравствуйте! Требуется настроить планирование по работе менеджера. У менеджера есть задача обзвонить и назначить определенное количество встреч. Данная информация фиксируется через Задачи.
Как сделать настройку планирования, чтобы данная настройка отображалась в Разделе Планирования?
Пробовал сделать, но почему то не вышло.
Сделал запрос по задачам, создал настройку планирования - в поле показатель выбрал поле Количество,которые сформировано в запросе из Заголовка, выбрал функцию "Сумма".
Мне кажется, не совсем правильно выбрал показатель в настройке планирования.
При нажатии кнопки "Пересчитать факт" в разделе планирования выдает ошибку
Сообщение об ошибке: Ошибка открытия источника данных "". Оригинальное сообщение об ошибке: Operand data type nvarchar is invalid for sum operator
Как вывести в настройки планирования фактическое количество Задач в показатель? И чтобы по этому показателю можно было формировать плановые данные?

Спасибо.

Нравится

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

Все настроил. в Демо базе есть пример. Вопрос снимается

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

Пример можно посмотреть в демо версии

Здравствуйте!
Настраиваю Планирование задач по примеру в демо версии. Смотрю количество задач по Ответственным. На детали Подробно для выбранного в списке ответственного отображается 4 задачи, при этом в колонке факт основной таблицы - 0,00.
Нажимаю "Пересчитать факт" ситуация сохраняется. В чем может быть причина?

Проблема решилась настройкой прав доступа.:smile:

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

Добрый день.
Помогите пожалуйста разобраться.
Менеджер заводит нового контрагента. Если тип у этого контрагента остается "Потенциальный клиент", то нужно создать для этого менеджера задачу со статусом Выполнена, длиетельностью 2 минуты со стандартным Title-ом и с привязкой к этому контрагенту.

В скрипте scr_AccountEdit в функции
пишу следущее

function btnOKOnClick(Control) {
        if (!CheckAccountData()) {
            return;
        }
//Начало моей правки
debugger;

   if (edtAccountType.DataField.DisplayValue=='Потенциальный клиент') {
        var Attributes = new ActiveXObject('Scripting.Dictionary');
        var DefaultValues = new ActiveXObject('Scripting.Dictionary');
        DefaultValues.Add('Title','Первоначальный звонок клиенту');
        var CurrentTime = new Date(System.Now());
        CurrentTime.setMinutes(CurrentTime.GetMinutes+2);    
        DefaultValues.Add('DueDate',CurrentTime.getVarDate());
        var prior = GetDictionaryIDByName('Tasks\\Dictionaries\\Priority\\ds_TaskPriority', '2.Средний');
                DefaultValues.Add('PriorityID', prior);
        var statusid=GetDictionaryIDByName('Tasks\\Dictionaries\\Status\\ds_TaskStatus', 'Выполнена');
        DefaultValues.Add('StatusID',statusid);
        DefaultValues.Add('AccountID',edtName.DataField.Value);
            ShowEditWindowEx('wnd_TaskEdit', Attributes, DefaultValues);
           
        }  
// конец моей правки

        scr_BaseDBEdit.btnOKOnClick(Control);
}

и система вываливается ...
Подскажите что я не так делаю

Нравится

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

Обнаружил точно из-за чего не работает...

function btnOKOnClick(Control) {
	if (!CheckAccountData()) {
	    return;
	}
//Начало моей правки
debugger;
//  	var Dataset = DataField.ParentDataFields.ParentDataset;
//    if (Dataset.DisplayValues ('edtAccountTypeID') == 'Потенциальный клиент'){
   if (edtAccountType.DataField.DisplayValue=='Потенциальный клиент') {
        var Attributes = new ActiveXObject('Scripting.Dictionary');
        var DefaultValues = new ActiveXObject('Scripting.Dictionary');
        DefaultValues.Add('Title','Первоначальный звонок клиенту');
        var CurrentTime = new Date(System.Now());
        CurrentTime.setMinutes(CurrentTime.GetMinutes+2);     
//        DefaultValues.Add('DueDate',CurrentTime.getVarDate());
        var prior = GetDictionaryIDByName('Tasks\\Dictionaries\\Priority\\ds_TaskPriority', '2.Средний');
		DefaultValues.Add('PriorityID', prior);
        var statusid=GetDictionaryIDByName('Tasks\\Dictionaries\\Status\\ds_TaskStatus', 'Выполнена');
        DefaultValues.Add('StatusID',statusid);
//        DefaultValues.Add('AccountID',edtName.DataField.Value);
  	    ShowEditWindowEx('wnd_TaskEdit', Attributes, DefaultValues);
 
  	}  
// конец моей правки
 
	scr_BaseDBEdit.btnOKOnClick(Control);
}

Вот так работает... но соответственно не все заполняет...

//        DefaultValues.Add('AccountID',edtName.DataField.Value);

Это просто глупость... ;-))

Сделал для контрагента вот так:

 var AccountID = GetAttribute(Self, 'RecordID');
 DefaultValues.Add('AccountID',AccountID);

все проходит, но Контрагент не заполняется...

C датами тожке разобрался

        var CurrentTime = new Date(System.Now());
         CurrentTime.setMinutes(CurrentTime.getMinutes()+2);     
        DefaultValues.Add('DueDate',CurrentTime.getVarDate());

Вобщем осталось две проблемы.
1. Так и не заполняется Контрагент.
2. Как сделать так, чтобы окно с зачачей закрывалось само с сохранением.

Контрагент заполняется... проблема была в том что
строка
scr_BaseDBEdit.btnOKOnClick(Control);

должна быть перед

ShowEditWindowEx('wnd_TaskEdit', Attributes, DefaultValues);

Осталось только закрывать задачу.
Копать наверное нужно в сторону Notify. ???

В вашем случае не надо показывать карточку, достаточно создать Dataset для таблицы задач, сделать ему Append, заполнить нужные поля значениями и сделать Post.

Примерно, это должно выглядеть следующим образом:

// AccountTypeID - константа из справочника типа контрагентов.
	if (Dataset('AccountTypeID') == AccountTypeID){
		var TaskDataset = Services.GetNewItemByUSI('ds_Task');
                var AccountID = Dataset('ID');
		ApplyDatasetFilter(TaskDataset, 'ID', GUID_NULL, true);
		TaskDataset.Open();
		TaskDataset.Append();
			//Здесь  заполняете все необходимые Вам поля
			TaskDataset('AccountID') = AccountID; 
			TaskDataset('StatusID') = 
		TaskDataset.Post();
		TaskDataset.Close();
	}
Показать все комментарии

БП продажи
Задача: Создать N-счетов, для каждого созданного счета создать задачу, переводить продажу в состояние "Завершена" только после завершения всех задач, если хотя бы одна задача с отрицательным результатом - отменять продажу.

Решил обернуть это все в подпроцесс, которому на вход передаю количество счетов(вводится пользователем), а результат будет храниться в параметре подпроцесса. В элементе "script" создаю нужное кол-во сущностей. Вопрос - как теперь заставить БП ожидать все созданные задачи?

Нравится

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

Вам нужен элемент "Слияние" (треугольник) в редакторе БП.

Я бы точно мог его использовать, если бы количество задач было заранее известной константой. я бы нарисовал, допустим, 10 задач и направил бы это в слияние - отлично. Но я не знаю сколько будет задач, так как это указывает пользователь для каждого договора в процессе выполнения БП

Добрый день!

Занимался когда-то похожей задачей.
нашел сервисы процесса (во вложении).
Суть в том, чтобы проверять количество завершенных и не завершенных подпроцессов.
services.rar
сервисы для версии 3.3.1.148 (MSSQL)

Спасибо за ответы, уже натолкнули коллеги на решение - В элементе "Скрипт" создать в цикле все задачи и перейти в следующий элемент "Скрипт", где запросом проверять статус задач и по результатам выставлять текущему WorkflowItem(наш элемент "Скрипт") параметр IsCompleted в true или false. Запускать этот элемент каждый раз когда изменяем задачу данного БП.

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

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

Нравится

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

Надо открыть в TSAdmin сервис ds_Contact, полю JobID поставить галку "Поле для отображения" и сохранить.

Спасибо, Александр! Получилось!:smile:

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

Добрый день!
Есть бизнес-процесс, в ходе которого создаются когда последовательно, когда параллельно
ряд задач.
Необходимо после создания каждой задачи, а также после ее выполнения посылать
e-mail уведомления ответственному и автору.

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

Спасибо.

Нравится

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

Здравствуйте, Дарья.

Отправил ответ Вам на e-mail.

"Олейник Дмитрий" написал:

Отправил ответ Вам на e-mail.

С уважением,
Олейник Дмитрий
Эксперт 3-й линии поддержки


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

В качестве решения предлагается использовать SendEmailByTemplate из scr_MailUtils:

Отправлять примерно так:

var AddressList = [];
var OwnerID = Dataset.Values('OwnerID');
GetMailAddressesByContactID(OwnerID, AddressList);
var TemplateID = GetSystemParameterValueEx('IncidentEmailByContactTemplateID');
if (IsEmptyGUID(TemplateID)) {
   return;
}
var ID = Dataset('ID');
SendEmailByTemplate(TemplateID, {RecordID: ID, Address: AddressList,
    Silent: true, AutoSend: true});
Показать все комментарии

В бизнес-процессе используется 2 слияния. Примерная схема вот:
ошибка слияния
одно слияние работает корректно (левое), а второе -- не срабатывает, то есть при выполнении обеих задач процесс дальше не идет.
в чем может быть причина? или нельзя в бп использовать 2 слияния?
test.rar

версия бд-- 3.4.0.81,
бинарные файлы -- 3.4.0.114
субд -- скьель 2005

Нравится

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

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

Попробуйте следующим образом: (сервис во вложении)

1

Дмитрий, спасибо за Ваш ответ!

Но в Вашем примере 2 "первых" задачи идут последовательно, тогда как в моем случае нужно параллельно, к тому же "конкретный" результат (а не "любой").

я немного по-другому решила проблему (как всегда -- стоит задать вопрос -- так сразу приходит решение:smile:):
решение:)
то есть, я просто использовала элемент "скрипт" (ничего в него не прописывала, он пустой)
test.rar

Здравствуйте, Ольга.

Ветка результата "любой" после создания первой задачи и моделирует "параллельность" создания задач, т.е. в моем примере обе задачи будут при любых обстоятельствах созданы. И дальше, в зависимости от статуса по ним, БП пойдет по разным веткам до разных точек слияния.
Рад что у Вас получилось реализовать Вашу задачу самостоятельно и спасибо за публикацию решения!

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

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

Нравится

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

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

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

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

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

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

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

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

У меня была не одна задача, поэтому использована конструкция switch. Некоторые задачи "зависели" от ключевой даты не "прямо", а, например, нужно было их поставить за 1 или 2 дня до нужной даты. Это тоже описано в примере.

Примечания. Имя ActionItem.Name-- элемент задачи в диаграмме, для которой дату “отсчета” начала задачи (ExecuteDate) нужно поменять. Дата берется из параметров диаграммы (TaskStartDate). По умолчанию дата вычисляется "стандартно”.

Что интересно -- все механизмы вычисления окончания задачи остаются такими же, то есть из карточки задачи (в бп) можно настроить продолжительность задачи.

switch (ActionItem.Name) {
   case  ('Task1'):   //задача, для которой началом есть дата1 --  дата из параметра  
        var Diagram = GetDiagramByItem(ActionItem);
        var ExecuteDate = WFGetParamValue(Diagram, 'TaskStartDate');
   break;
   case ('Task2'):   //дата2 -- за 2 дня до предыдущей даты
        var Diagram = GetDiagramByItem(ActionItem);
        var ExecuteDate = WFGetParamValue(Diagram, 'TaskStartDate');
        ExecuteDate = AddDateDays(new Date(ExecuteDate), -2, true).getVarDate();
   break;
   default:
        var ExecuteDate = ItemDataset.ValAsDateTime('ExecuteDate');
   break;
}

этот "кусок" кода нужно вставить вместо строчки

var ExecuteDate = ItemDataset.ValAsDateTime('ExecuteDate');

в скрипте wa_TaskAction.

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

в функции BuildDataControl(Window, ParentComponent, DatasetLink, DataField)
добавить (где-то в конце, после создания компонента)

//----для даты -- тип контрола дата/время
        if (ComponentType == 'DateTimeDataControl') {
                Component.Kind = dtkDateTime;  
        }
//----

Нравится

Поделиться

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