Добрый день!

Для того, чтобы процесс автоматически запускался раз в N минут, необходимо в процесс поместить элемент Сценарий вида:

string schedulerJobGroupName = "MyProcessGroupMyEmail1";//- Любое имя
string jobProcessName = "UsrProcess"; //- Название процесса
string schedulerJobName = "MyJobNameMyEmail1"; //- Любое имя
int startOffset = 3600; // интервал в секундах
AppScheduler.RemoveJob(schedulerJobName, schedulerJobGroupName);
var job = AppScheduler.CreateProcessJob(schedulerJobName, schedulerJobGroupName, jobProcessName, UserConnection.Workspace.Name, UserConnection.CurrentUser.Name);
var trigger = new SimpleTriggerImpl(schedulerJobName + "Trigger", schedulerJobGroupName, DateTime.UtcNow.AddSeconds(startOffset));
AppScheduler.Instance.ScheduleJob(job, trigger);
return true;

Это работает.

Скажите, пожалуйста, а можно ли сделать так, чтобы он запускался только в определенные часы
(например, с 8.00 до 20.00)

т.е. как можно здесь применить такую формулу ?
Если 20:00 - текущее время T (интервал запуска) то запуск установить в T+12 часов

Нравится

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

Дарья, добрый день!

Пример использования планировщика в указанном интервале.

string schedulerJobGroupName = "ScheduleTest";
string jobProcessName = "UsrScheduleTest";
string schedulerJobName = "ScheduleTestJob";
TimeSpan start = TimeSpan.Parse("11:31");
TimeSpan end = TimeSpan.Parse("11:46");
TimeSpan currentTime = DateTime.Now.TimeOfDay;

if ((currentTime > start) && (currentTime < end))
{
int startOffset = 30;
AppScheduler.RemoveJob(schedulerJobName, schedulerJobGroupName);
var job = AppScheduler.CreateProcessJob(schedulerJobName, schedulerJobGroupName, jobProcessName, UserConnection.Workspace.Name, UserConnection.CurrentUser.Name);
var trigger = new SimpleTriggerImpl(schedulerJobName + "Trigger", schedulerJobGroupName, DateTime.UtcNow.AddSeconds(startOffset));
AppScheduler.Instance.ScheduleJob(job, trigger);
} else {
int startOffset = 12;
AppScheduler.RemoveJob(schedulerJobName, schedulerJobGroupName);
var job = AppScheduler.CreateProcessJob(schedulerJobName, schedulerJobGroupName, jobProcessName, UserConnection.Workspace.Name, UserConnection.CurrentUser.Name);
var trigger = new SimpleTriggerImpl(schedulerJobName + "Trigger", schedulerJobGroupName, DateTime.UtcNow.AddHours(startOffset));
AppScheduler.Instance.ScheduleJob(job, trigger);
}
return true;

Спасибо

а можно как-то посмотреть, что записано в планировщике? какие задания когда стоят на автозапуске?

Дарья, добрый день!

Вы можете проверить существующие тригера выполнив запрос в БД:
select * from QRTZ_TRIGGERS
select * from QRTZ_SIMPLE_TRIGGERS

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

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

Разобравшись с механизмом автозапуска обнаружил, что в методе OnPrepare scr_Main инициализируется объект DatasetTriggers и на объект Services вешается обработчик события Deserialize, который в свою очередь проверяет, что десериализуемый объект является датасетом и входит в список автозапуска и вешает на события BeforePost и AfterPost датасета собственные обработчки.

Попробовал повторить тот же трюк при инициализации плагина Outlook. Не работает. Обработчик десериализации не срабатывает. Максимума удалось добиться с подобным кодом

при инициализации плагина
var Wnd = Services.GetSingleItemByUSI('wnd_Main');
Wnd.Prepare();
Connector.Atributes('MainWindow') = wnd;

потом в нужном месте вручную установить на нужный датасет обработчик
DatasetTriggers.Install(MyDataset);

Тогда срабатывает автозапуск процессов на этом датасете. Причём, если вместо wnd_Main использовать другое окно и инициализацию DatasetTriggers делать вручную, то вообще не работает.

Как заставить работать автозапуск процессов в плагине Outlook?
ServiceDesk 3.4

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

Нравится

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

Федор, автоматический запуск процессов реализовывался только для окна TSClient, он не будет работать из MSOutlook.
Для реализации данной функциональности нужно при инициализации плагина в его скрипте воссоздать всю необходимую логику, взять ее из scr_Main.
Приблизительный алгоритм (не окончательное решение):
1. Подключить в используемые скрипты scr_DatasetTriggers.
2. В момент инициализации прописать вызов:

DatasetTriggers.Load();
SetServicesEvents();

3. Добавить функции function SetServicesEvents() и function DoAfterDeserializeItem(Service):

function SetServicesEvents() { 	
	Services.EventSubscribedServiceTypeCodes.Add('DBDataset');
	SetObjectEventDispatcher(Self, Services, Services.UID,
		'OnAfterDeserializeItem', 'DoAfterDeserializeItem');
}
 
function DoAfterDeserializeItem(Service) {	
	var ServiceTypeCode = Service.ServiceTypeCode;
	if (ServiceTypeCode == 'DBDataset') {
		DatasetTriggers.Install(Service);
	}
}

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

А ещё при работе из Аутлука объект Connector имеет значительно меньше атрибутов, чем тот же Connector при обычном запуске TC. И если в карточке (например, задачи) открытой по лукапу в окне связей добавлена логика, работающая с этими атрибутами и не проверяющая их наличие, можно получить ошибку.

Есть реализация запуска БП по ссылке. (Также как мы переходим в раздел или открываем карточку).

Формат ссылки: terrasoft://WFStart/Workflow/%7b8C91E8A4-942C-4F39-BCB3-0C7D5D9C5779%7d/AccountID|%7b04B25C6A-9336-42DD-838F-E686D83B882C%7d
где «%7b8C91E8A4-942C-4F39-BCB3-0C7D5D9C5779%7d» – идентификатор диаграммы,
«AccountID|%7b04B25C6A-9336-42DD-838F-E686D83B882C%7d» – параметер/значение передаваемое в БП. Все параметры в ссылке разделяются «/».

1) Изменена функция RunHyperlink(…) (scr_HyperlinkUtils)

function RunHyperlink(Action, Params) {
         Action = Action.toLowerCase();
         switch (Action) {
                   case 'goto':
                            HyperlinkGotoWorkspace(Params);
                            break;
                   case 'open':
                            return HyperlinkOpenCard(Params);
                            break;
                            //Add this
                   case 'wfstart':
                            return HyperlinkStartWorkflow(Params);
                            break;
         }
}

2) И добавлена функция запуска БП HyperlinkStartWorkflow(…) (scr_HyperlinkUtils)

function HyperlinkStartWorkflow(Params) {
         if (Params.length < 2) {
                   return;
         }
         var Module = Params[0];
         var IDValue = Params[1].replace(/%7b/g, '{').replace(/%7d/, '}'); //Diagram ID
         var ParameterHash = Params.slice(2, Params.length);
         var ParamNames = new Array();
         var ParamValues = new Array();
         for (var i = 0, iLength = ParameterHash.length; i < iLength; i++) {
                   var tmp = new String(ParameterHash[i]).split('|');
                   if (('length' in tmp) && (tmp.length > 1)) {
                            ParamNames.push(tmp[0]);
                            ParamValues.push(tmp[1]);
                   }
         }
         WFStartByID(IDValue, ParamNames, ParamValues);
}
Показать все комментарии

Здравствуйте.
Хотим настроить регулярный запуск интеграции по расписанию в конце рабочего дня.
Дано:
Terrasoft XRM 3.3.2.43, в которой настроена интеграция с 1С7.7.

Как удобнее всего настроить регулярный запуск этой интеграции по расписанию?
Если я и могу запустить с помощью sheduler'а террасофт, то как стартовать саму интеграцию?
Спасибо.

Нравится

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

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

Прежде всего, не совсем понятно, что Вы имеете ввиду под sheduler Terrasoft, если имеются ввиду Задачи, то там возможности такой нет.
Начиная с версии 3.4 для таких целей можно будет использовать утилиту TSJobManagerService.

На данный момент можем предложить Вам следующие варианты:

1. Реализовать выполнение синхронизации из окна Terrasoft:
- в качестве утилиты для запуска используем некий scheduler ОС, который способен выполнить командную строку;
- в Terrasoft нужно будет реализовать окно(назовем его wnd_1CAutoSynchro), которое на подготовке будет запускать нужную интеграцию. Скрипт самого запуска будет примерно такой:
var Attributes = GetNewDictionary();
Attributes('IsMain') = true;
Attributes('IsShowError') = true;
ImportAllObject(DataflowID, Attributes); // в скрипте scr_Dataflow1CUtils
- командная строка будет выглядеть примерно так:
“[путь к terrasoft]\bin\tsclient” /wnd=wnd_1CAutoSynchro /usr=??? /pwd=??? /cfg=???
или для windows авторизации
“[путь к terrasoft]\bin\tsclient” /wnd=wnd_1CAutoSynchro /wauth=true /cfg=???
- в любом случае здесь возникает вопрос, так как в командной строке нужно будет хранить пароль, это плохо. В случае же windows-авторизации - такая проблема отпадает.

2. Реализовать вызов синхронизации из обычного js-скрипта
- из js-скрипта (обычный текстовый файл, обычно с расширением js) можно создать COM-объект подключения к Terrasoft (назовем файл Auto1CSynchro.js);
- в этом скрипте будет выполняться подключение, получение скрипта scr_Dataflow1CUtils и вызов его функции ImportAllObject с передачей нужных параметров.
- как и в первом варианте в scheduler-е операционной системы выполнять командную строку вида:
cscript “[путь к js файлу]\Auto1CSynchro.js”
cscript – стандартная команда Windows,
- вопрос с хранением пароля остается, но теперь его можно будет куда-то спрятать\зашифровать и в js-файле считывать.

Инна Безверхняя,
II линия службы поддержки Terrasoft.

Третий вариант, не дотягивает до первых двух, но может быть проще в реализации для новичков и проблемы с паролем отпадают. Для этого нужно добавить Timer и на его событие OnTimer отрабатывать необходимую синхронизацию из самого СРМ.

Если проблема с паролем критична, то можно создать маленькое приложение, на каком-нибудь C# и из него так же как и во 2ом варианте Инны использовать СОМы террасофта, ну а пароль захаркодить. Ну и запускать его все тем же ОСевым sheduler, хотя возможно лучше сделать его на автозагрузке и уже внутри по таймеру запускать синхранизацию, но думаю это не принципиально ...

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