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



Друзья, подскажите пожалуйста, можно ли включить кластерный режим планировщика в версии 7.2.2.707. У нас настроено горизонтальное масштабирование, но не работают веб сокеты если больше одной ноды. Есть документация по новым версиям: https://academy.terrasoft.ua/docs/user/razvertyvanie_onsite/nastroika_d…

Есть ли что-то подобное для нашей версии?

 

Нравится

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

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

В этой версии ещё нет полноценной поддержки веб-сокетов в ферме. Реализация этого функционала доступна в версии 7.12.1 и выше.

 

Что касается кластеризации планировщика, по умолчанию он и так должен быть включён, за это отвечает параметр \web.config:

 

<add key="quartz.jobStore.clustered" value="true" />

 

Но, чтобы это работало, нужно ещё исправить ключ:

<add key="quartz.scheduler.instanceId" value="auto" />

 

(написать в верхнем регистре)

<add key="quartz.scheduler.instanceId" value="AUTO" />

Спасибо, Олег.

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

Добрый день!

 

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

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

Второе - есть ли вариант использования не таймеров, обрабатываемых планировщиком, а каким-нибудь delay(sec); ?

Нравится

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

Добрый день!

Судя по Вашему описанию есть большое количество процессов, которые используют таймер (и, следовательно, планировщик), что можно выявить по количеству записей в таблице qrtz_triggers. В такой ситуации возможно, что очередь планировщика перегружена, и процессы ожидают освобождения очереди. Помочь в таком случае, может увеличение значения threadCount во внешнем Web.config с 5, например, до 10.

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

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

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

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

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

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

Также, в будущих версиях планируется смена планировщика с QUARTZ на другой механизм.

Добрый день, Игорь!

 

Данная задача в работе у ответственной команды.

 

 

С уважением,

Кучер Виталина

Оператор

Группа компаний Terrasoft

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

Добрый день.

 

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

 

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

 

Каким образом можно решить проблему? 

Нравится

3 комментария
Лучший ответ

Ксензов Егор,

RabbitMQ это брокер сообщений и к планировщику отношения не имеет, а от Quartz ни кто отказываться в системе не собирается (буквально не давно задавался этот вопрос разрабам и ответ был однозначным "Пока нет планов отказываться от него"). Скорее проблема в самом IIS а точнее что после перезапуска в нем не идет инициализация до первого http запроса (post, get не имеет значения). Это настраивается в IIS но все равно работает коряво, ждем переходя на Линукс, там проблемы такой у меня не было с net core

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

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

Ксензов Егор,

RabbitMQ это брокер сообщений и к планировщику отношения не имеет, а от Quartz ни кто отказываться в системе не собирается (буквально не давно задавался этот вопрос разрабам и ответ был однозначным "Пока нет планов отказываться от него"). Скорее проблема в самом IIS а точнее что после перезапуска в нем не идет инициализация до первого http запроса (post, get не имеет значения). Это настраивается в IIS но все равно работает коряво, ждем переходя на Линукс, там проблемы такой у меня не было с net core

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

Реализовал разделение календаря по сотрудникам в фильтре через кучу diff. Встал вопрос - как наполнить каждый разными данными?

По умолчанию activityCollection планировщика указан как ScheduleGridData. Соответственно, на каждый календарь на странице создаю ScheduleGridData0, ScheduleGridData1, ScheduleGridData2 и так далее и подставляю эти значения в каждый activityCollection, но календари становятся вообще пустыми. Я так понимаю, вопрос в методах отрисовки, но тогда придется переписывать половину CRM.

Подскажите, как каждый календарик наполнить своим содержимым или что нужно изменить?

Вот пример одного из календарей

{
            "operation": "insert",
            "name": "Schedule0",
            "parentName": "DataViewsContainer",
            "propertyName": "items",
            "values": {
                 "id": "ActivitySectionV2Scheduler0",
                 "selectors": {"wrapEl": "#ActivitySectionV2Scheduler0"},
                 "itemType": Terrasoft.ViewItemType.SCHEDULE_EDIT,
                 "visible": {"bindTo": "isSchedulerVisible0"},
                 "startHour": Terrasoft.SysSettings.cachedSettings.SchedulerTimingStart,
                 "displayStartHour": Terrasoft.SysSettings.cachedSettings.SchedulerDisplayTimingStart + "-00",
                 "dueHour": Terrasoft.SysSettings.cachedSettings.SchedulerTimingEnd,
                 "timeScale": {"bindTo": "getTimeScale"},
                 "period": {"bindTo": "getSchedulerPeriod"},
                 "timezone": [{}],
                 "startDate": null,
                 "dueDate": null,
	         "activityCollection": {"bindTo": "ScheduleGridData0"},
                 "selectedItems": {"bindTo": "SelectedRows"},
                 "changeSelectedItems": {"bindTo": "onChangeSelectedItems"},
                 "scheduleItemDoubleClick": {"bindTo": "onScheduleItemDoubleClick"},
                 "scheduleItemTitleMouseOver": {"bindTo": "scheduleItemTitleMouseOver"},
                 "scheduleItemTitleClick": {"bindTo": "scheduleItemTitleClick"},
                 "change": {"bindTo": "changeScheduleItem"},
                 "selection": {"bindTo": "SchedulerSelection"},
                 "floatingItemsCollection": {"bindTo": "SchedulerFloatItemsCollection"},
                 "selectionKeyPress": {bindTo: "onSelectionKeyPress"},
                 "floatingItemReady": {"bindTo": "onFloatingItemReady"},
                 "selectionKeyPressSymbols": {"bindTo": "SchedulerSelectionPressedKeys"},
                 "itemBindingConfig": {
                     "itemId": {"bindTo": "Id"},
                     "title": {"bindTo": "getScheduleItemTitle"},
                     "changeTitle": {"bindTo": "onTitleChanged"},
                     "startDate": {"bindTo": "StartDate"},
                     "changeStartDate": {"bindTo": "onStartDateChanged"},
                     "dueDate": {"bindTo": "DueDate"},
                     "changeDueDate": {"bindTo": "onDueDateChanged"},
                     "status": {"bindTo": "getScheduleItemStatus"},
                     "changeStatus": {"bindTo": "onStatusChanged"},
                     "background": {"bindTo": "Background"},
                     "fontColor": {"bindTo": "FontColor"},
                     "isBold": {"bindTo": "IsBold"},
                     "isItalic": {"bindTo": "IsItalic"},
                     "isUnderline": {"bindTo": "IsUnderline"},
                     "markerValue": {"bindTo": "getScheduleItemHint"}
                   },
                   "floatingItemBindingConfig": {
                        "caption": {"bindTo": "getSimpleModuleCaption"},
                        "width": {"bindTo": "getSimpleModuleWidth"}
                   }
}

 

Нравится

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

Смотрите, как реализовано расписание для нескольких пользователей в дополнении «Advanced schedule for bpm'online». 

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

Добрый день. Возникла необходимость запускать единоразово БП в указанное время. Задание для планировщика добавляется (появляется в бд), но не срабатывает в указанное время. В бд можно увидеть, что задание остаётся по-прежнему в режиме ожидания (устанавливал запуск через 5 минут при тесте). Ниже код, добавляющий задание для планировщика. В чём может быть проблема?

 

            
startDateTime = startDateTime.AddHours(-3);
string jobName = string.Format(jobNameTemplate, id);
 
var parameters = new Dictionary<string, object>();
parameters.Add("Id", id.ToString());
AppScheduler.RemoveJob(jobName, jobGroupName);
var job = AppScheduler.CreateProcessJob(
     jobName, 
     jobGroupName, 
     processName, 
     userConnection.Workspace.Name, 
     userConnection.CurrentUser.Name,
     parameters);
 
string cronExpresson = string.Format("{0} {1} {2} {3} {4} ? {5} ", 
    dt.Second, dt.Minute, dt.Hour, 
    dt.Day, dt.Month, dt.Year);
 
var trigger = new CronTriggerImpl(
     jobName + "Trigger", 
     jobGroupName, 
     cronExpresson);
 
trigger.MisfireInstruction = MisfireInstruction.CronTrigger.DoNothing;
trigger.TimeZone = TimeZoneInfo.Utc;
 
AppScheduler.Instance.ScheduleJob(job, trigger);



 

 

Нравится

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

У меня была такого рода проблема, ниже привожу ответ с поддержки:

 

Описанное поведение может возникать из-за некорректных настроек пула приложения в IIS. Как следствие процесс не запускается по расписанию, так как планировщик на прямую связан с пулом.

Для того, чтобы убедится в этом достаточно создать процесс с 1 элементом таймер. Указать в таймере 10 сек. Запустить процесс. Если по истечению времени (10 сек) экземпляр процесса (в журнале процессов) по прежнему находится в состоянии “Выполняется” (не “Завершен”) – необходимо настроить удостоверение в свойствах пула.

В расширенных настройках пула в параметре Удостоверение (identity) необходимо указать пользователя, от имени которого запущен IIS

Советы по конфигурированию выявленные опытным путем:

1) Использовать отдельный пул для каждого приложения в рамках отдельного IIS сервера.

2) В настройке пула Identity задать значение LocalSystem

в правах NTFS на каталог приложения - должна присутствовать роль SYSTEM (СИСТЕМА) и иметь полынье права, рекурсивно включая все вложенные каталоги.



3) В конфигурационном файле ConnectionStrings необходимо установить авторизацию по конкретному пользователю

 (желательно создать отдельного пользователя SQL (авторизация средствами SQL-сервера, т.е. не пользователь ОС) имеющего права владельца на БД используемую приложением)

режим "сквозной авторизации" через пользователя ОС (Integrated Security=SSPI (атрибут узла add name="db" в теге connectionStrings))

вызывает проблемы с планировщиком, лучше использовать прямую авторизацию пользователем SQL-сервера.

 

Методику проверки, Вам подсказывают верно:

необходимо создать БП в котором между точками старта и окончания необходимо разместить элемент "Таймер" (на одну или несколько секунд задержки).

после сохранения такого БП, принудительно вызвать его на исполнение, после чего в журнале БП убедиться что БП успешно выполнился, а не находится в состоянии "Выполняется" или "Ошибка"

Шарипов Ильмир Ирекович,

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

&lt;add key="quartz.scheduler.batchTriggerAcquisitionMaxCount" value="5" /&gt;
&lt;add key="quartz.scheduler.threadCount" value="10" /&gt;

 

Чтобы запустить планировщик после перезапуска вэб-приложения, нужно зайти именно на страницу логина. То есть пока кто-нибудь не зайдет на страницу логина, планировщик не запустится. Планировщик живет в верхнем квадратике. Если пользователь аутентифицирован до перезапуска вэб-приложения, то можно сразу выйти на страницы .../0/..., но это не запустит планировщик.

 

 

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

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

Нравится

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

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

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

qrtz_with_param.txt

Здравствуйте, Олег!
Как я поняла, этот метод запустит бизнес процесс сразу после создания джобы. Или там есть какой то анализ параметра starttime в словаре, как даты запуска процесса?

"Родионова Ольга Валентиновна" написал:запустит бизнес процесс сразу после создания джобы

в случае ScheduleImmediateProcessJob, да. всё, что в параметрах - кидается в процесс.

А есть ли какой то способ запустить бизнес процесс в указанное время и при этом передать в него параметр?

В своё время суппорт террасофта кидал мне такое решение

string userName = ....; //- Имя пользователя, от которого запускается бп
var userConnection = ....;
string schedulerJobGroupName = "MyProcessGroup";//- Любое имя группы триггеров
string jobProcessName = "MyBusinessProcess"; //- Название процесса, который нужно запустить
string schedulerJobName = "MyJobName"; //- Любое имя
int startOffset = 100; //- Количество секунд до старта
IDictionary<string, string> parameters = new Dictionary<string, string>();
parameters["Param1"] = ....;
 
var job = AppScheduler.CreateProcessJob(schedulerJobName, schedulerJobGroupName, jobProcessName, userConnection.Workspace.Name, userName, parameters);
var trigger = new SimpleTriggerImpl(schedulerJobName + "Trigger", schedulerJobGroupName, DateTime.UtcNow.AddSeconds(startOffset));
AppScheduler.Instance.ScheduleJob(job, trigger);

Если вам не подойдёт, посмотрите в VisualStudio параметры создания триггера

new Quartz.Impl.Triggers.SimpleTriggerImpl(...)

Там куча вариантов. И единоразовый, и с повторениями, и который запускается в определённое время и повторяется с определённым интервалом.

Буду пробовать. Большое спасибо!

Коллеги, добрый день!

Для установки параметров запуска бизнес-процессов по расписанию через пользовательский интерфейс, мы выпустили соответствующее дополнение к bpm'online. Надеюсь, будет полезным:)

Подробнее здесь https://marketplace.terrasoft.ru/app/extended-business-process-scheduler

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

Подскажите, люди добрые!
Начинаем осваивать планировщик в 7.7. Пытаюсь запустить его сценарием из БП:

var userConnection = GetUserConnection>("UserConnection");
string schedulerJobGroupName = "GroupName";
string jobProcessName = "ISSendContacts";
string schedulerJobName = "JobISSendContacts";
int startOffset = 20;
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;

При условии, что подключил библиотеки в Usings:

Quartz.Impl
Quartz
Quartz.Impl.Triggers
Terrasoft.Core.Scheduler

А при компиляции он ругается на AppScheduler и SimpleTriggerImpl, типа, они не объявлены.
Пробовал перед ними добавлять альясы Usings, например "Terrasoft.Core.Scheduler.AppScheduler", но это тоже не помогло.
Связано ли это с тем, что БП, создающий Job находится в созданном мной отдельном пакете, в котором из зависимостей только базовые пакеты Base и UIv2?

Нравится

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

Повторил этот бизнес процесс с нуля и он заработал без ошибок :)
Вообще странно, но в любом случае, получается, что я сам где-то ошибся.

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

Добрый день!
Есть такой процесс в ITIL - процесс наполнения очередей единого окна,
который запускается автоматически ( когда пользователь в системе) каждые 5 минут ( в соответствии с указанным интервалом-системной настройкой "интервал обновления очередей единого окна")

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

Нравится

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

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

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

Вот такой он бессмертный!

Добрый день, Александр!
Спасибо за секрет бессмертия))
Видела элемент в процессе "актуализировать задание планировщика"
UserConnection userConnection = context.UserConnection;
Terrasoft.Configuration.QueuesUtilities.UpdateQueuesTrigger(userConnection);
return true;

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

Здравствуйте, Дарья!
Александр Вам в этом случае не поможет - будет помогать Алексей.:smile:

Добавьте в задание-сценарий код:

string schedulerJobGroupName = "MyProcessGroup";//- Любое имя
string jobProcessName = "ProcessingEmail"; //- Название процесса
string schedulerJobName = "MyJobName"; //- Любое имя
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);
return true;

Укажите в Usings Quartz.Impl.Triggers (с пустым псевдонимом), Quartz (с псевдонимом Quartz ), Terrasoft.Core.Scheduler (с пустым псевдонимом).

спасибо, Алексей))

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

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

спасибо, все получилось)

Добрый день, при использовании следующего кода

string schedulerJobGroupName = "MyProcessGroup";//- Любое имя
string jobProcessName = "ProcessingEmail"; //- Название процесса
string schedulerJobName = "MyJobName"; //- Любое имя
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);
return true;

В 7.5 все работает нормально, в 7.7 выдает следующую ошибку
1
В чем может быть ошибка и как ее исправить?

Добрый день!

Пример добавления триггера в планировщик для версии 7.7:
var userConnection = Get("UserConnection");
string schedulerJobGroupName = "MyProcessGroup";//- Любое имя
string jobProcessName = "UsrTestScheduler"; //- Название процесса
string schedulerJobName = "MyJobName"; //- Любое имя
int startOffset = 20; //- Количество секунд до старта
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;

Добрый день!
При попытке использовать следующий код, который привел Олег

var userConnection = Get("UserConnection");
string schedulerJobGroupName = "MyProcessGroup";//- Любое имя
string jobProcessName = "UsrTestScheduler"; //- Название процесса
string schedulerJobName = "MyJobName"; //- Любое имя
int startOffset = 20; //- Количество секунд до старта
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;

Выдает следующую ошибку:
1

Олег,

Извиняюсь, глаз замылился;) Текст в треугольных скобках в комментах опускается.

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

"Зарицкий Олег" написал:Пример добавления триггера в планировщик для версии 7.7:

Пора в документацию вставлять

Владимир, скоро появится.

"Зарицкий Олег" написал:

Владимир, скоро появится.

Здравствуйте! Каким образом можно в бизнес-процессе не только создавать триггер в планировщик, но и во всех активностях, где Завершение < DateTime.Now, устанавливать “Просроченная активность” = true?
(чекбокс “Просроченная активность” - пользовательское поле, созданное нами)

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

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

В фильтре укажите "Завершение" <= "Текущий час" и "Завершение" <= "Сегодня".

"Демьяник Алексей" написал:

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

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

В фильтре укажите "Завершение" <= "Текущий час" и "Завершение" <= "Сегодня".

Поясню немного: задача в том, чтобы реализовать процесс отправки уведомления ответственному за задачу, если задача просрочена (как только дата завершения задачи становится меньше текущей даты и времени).
Таким образом, нужно создать процесс, который вы описали, и запускать его планировщиком каждые несколько минут или раз в минуту? Будет ли это нести особую нагрузку на систему?

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

"Демьяник Алексей" написал:

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

Планировщик на каждые, допустим, 5 минут + описанный вами процесс - единственно возможное решение кейса, Алексей? Или можете подсказать еще какое-то решение?

Здравствуйте!
Не получается в sales team 7.8 реализовать в бизнес-процессе, чтобы активности отмечались просроченными, если Завершение <= Текущие дата и время.

Бизнес-процесс состоит из элемента "Задание-сценарий" (там размещен код планировщика) и из элемента "Изменить данные активности", где Данные какого объекта изменить: Активность, а в фильтре указано, что менять нужно активности, у которых Состояние не равно "Завершена" И Завершение <=Текущие дата и время (Текущие дата и время - это параметр процесса со значением "[#Системная переменная.Текущее значение даты и времени#]").

Проблема: планировщик запускается с нужным интервалом, но меняет все незавершенные активности, игнорируя фильтр по дате завершения в элементе "Изменить данные активности". Что делаю неправильно?
Предложенный Алексеем вариант условия "Завершение" <= "Текущий час" и "Завершение" <= "Сегодня" также не работает.

Также пробовали в элементе "Изменить данные активности" в фильтре указывать условия:

Состояние не равно Завершена
И
Завершение<Текущие дата и время (где Текущие дата и время - параметр процесса со значением "[#Системная переменная.Текущее значение даты и времени#]").

С данными настройками процесс вообще перестал менять активности.

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

Как известно, в администраторе не все работает так, как должно (другая платформа, отсутствует окружение и т.д.)...
Делал задание для планировщика и столкнулся именно с этой заминкой (в датасете не заполнялся UpdateQuery). Надо скрипт запускать из клиента. Т.к. скрипт для планировщика - добавил задание и сел ждать...

Ждать не понравилось. Кому также не хочется ждать, тому пригодится:

1. Добавляем CheckBox (или отдельную кнопку - я сделал на событие btnOKOnClick)

2. Меняем в wnd_JobMethodsEditScript
2.1. Подключаем scr_JobManagerUtils
2.3. Вносим изменения в function btnOKOnClick

function btnOKOnClick(Control) {
        if (!dlData.Dataset('ProcedureName')) {
                ShowInformationDialog(FormatStr(RequiredFieldError, "Метод"));
                return;
        }
        SaveParams(dlData.Dataset); // если делаете отдельную кнопку добавьте эту функцию
// Start
        if (chbTest.IsChecked) {
                var Dataset = dlData.Dataset;
                var Params = GetActivitiesParams(Dataset.Datafields('MethodParameters'));
                var MethodName = edtMethodList.Value;
                ExecFunction(Dataset.DisplayValues('ScriptUSI'), MethodName, Params);
                return;
        }
// End
        scr_BaseDBEdit.btnOKOnClick(Control);
}

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

Я делал только для скриптов, если хотите для остальных типов тоже - добавьте аналогичную логику в окнах из раздела JobManager\Activities\, используя function ExecuteJobStep(Dataset), либо - на событие BeforePost датасета ds_JobMethods (нужно добавлять в окно не CheckBox а булево поле - и с него запускать или нет)

Нравится

Поделиться

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

Дополнение:

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

Надо:

1. В wnd_Main в невизуальных компонентах добавить ActionMenuItem в нужное вам место и определить для него событие OnExecute:

2. В скрипте scr_Main:
2.1. Чтобы пункт меню был доступен только админам, надо в function InitializeAdminMenuItems() добавить строку amiRunScipt.IsVisible = IsAdmin;
2.2. Описать добавленное событие:

function amiRunSciptOnExecute(ActionMenuItem, Sender) {  // sfera
	var Attributes = GetNewDictionary();
	Attributes.Add('IsTest', true);
	ShowEditWindowEx('wnd_JobMethodsEdit', Attributes, null, null, true);
}

3. В wnd_JobMethodsEditScript
3.1. исправить function wnd_JobMethodsEditOnPrepare(Window):

function wnd_JobMethodsEditOnPrepare(Window) {
    JobMethodsEdit.IsPreparing = true;
 
	var IsTest = !!Window.Attributes('IsTest'); //признак запуска из созданного нами пункта меню
	if (IsTest) Window.Attributes('RecordID') = GUID_NULL; //нужно, чтобы BaseDBEdit воспринял это как добавление записи, а не как редактирование
 
	wnd_BaseDBEditOnPrepare(Window);
	Initialization(Window);
	JobMethodsEdit.IsPreparing = false;
 
	if (IsTest) { // от греха подальше, запрещаем возможность снять галочку "Потестим"
		chbTest.IsChecked = true;
		chbTest.IsEnabled = false;
		edtCaption.DataField.Value = 'test';
	}
	edtCaption.IsVisible = !IsTest; // и скрываем поле "Название", т.к. не надо
}

PS. Можно не замарачиваться с окошком - а вызывать function ExecFunction, передавая ей нужные параметры, но это не очень удобно.

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