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



Тогда из БП приходится посылать message, прописывать методы его обработки на странице и т.п.



Можно это сделать универсально, создав User task, указав в нём элемент для обновления (деталь или поле), а также новое значение для поля? А дальше уже базовые механизмы выполнят всё, что нужно на странице

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

Это было бы супер!)

Владимир, уже давно заведена идея, чтобы это происходило автоматически: «Данные, которые изменяются при выполнении бизнес-процесса, не актуализируются/обновляются на странице редактирования, если пользователь в текущий момент находится на ней». Она принята, но пока не реализовывалась. Зафиксировал и в том виде, как предлагаете Вы, чтобы обновлять принудительным запуском действия. Спасибо за идею!

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

Всем привет!

 

Столкнулся со странным поведением: не всегда отрабатывает метод this.reloadEntity(); в карточке. Заметил, что при открытии страницы в режиме редактирования он отрабатывает корректно, но если создавать новую сущность и сохранить карточку ("тихое" сохранение без выхода их карточки через isSilent) метод не отрабатывает: поля не обновляются, ошибок в консоле нет. Вижу, что контекст отличается от контекста страницы в режиме редактирования, но как это победить непонятно. Кто-нибудь сталкивался?

 

Заранее благодарен за ваши ответы.

Нравится

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

Дмитрий, а если воспользоваться вместо reloadEntity способом из дополнения, упомянутого в этой теме? Там в итоге получили нужное поведение.

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

Как можно из клиентского модуля обновить полоску "бизнес-кейса"?

Суть такая - в бизнес процессе выполняется действие, он переводит на другой статус продажу отправляя в конце сообщение которое ловит продажа и проверяет на номер. Если номер продажи совпадает он обновляет полоску "бизнес-процесса". Так вопрос, с сообщением понятно, а вот как заставить принудительно обновить полоску?

Нравится

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

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

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

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

Добрый день!

Суть такова. В системе есть справочник в который занесены номера недель и соответствующие им календарные даты. (Например: Номер недели: 3; Дата: 14.01.2019 - 18.01.2019). 



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

Нравится

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

Возможность есть 

1 БП запускайте по расписанию

2 С помощью элемента формула можно получить номер текущей неделе дальше обновить или что вам нужно сделать с этой записью

По работе в формуле с датами более подробно смотри тут

Возможность есть 

1 БП запускайте по расписанию

2 С помощью элемента формула можно получить номер текущей неделе дальше обновить или что вам нужно сделать с этой записью

По работе в формуле с датами более подробно смотри тут

Накидал на C# скрипт, который выдает список с данными (неделя, начало, конец, год). осталось вызывать раз в год

var data = WeekWorker.GetYearWeekData(2019);

и данные парсить в справочник

using System;
using System.Collections.Generic;
using System.Globalization;
 
namespace TestApp
{
    public class WeekData
    {
        public int year { get; set; }
        public int week { get; set; }
        public DateTime weekStart { get; set; }
        public DateTime weekEnd { get; set; }
    }
 
    public class WeekWorker
    {
        public static List<WeekData> GetYearWeekData(int year)
        {
            var weeksdata = new List<WeekData>();
 
            int weeks = GetWeeksInYear(year);
            for (int i = 1; i <= weeks; i++)
            {
                var firstDay = FirstDateOfWeekISO8601(year, i);
                var lastDay = firstDay.AddDays(6);
 
                weeksdata.Add(new WeekData() { year = year, week = i, weekStart = firstDay, weekEnd = lastDay });
            }
 
            return weeksdata;
        }
        public static int GetWeeksInYear(int year)
        {
            DateTimeFormatInfo dfi = DateTimeFormatInfo.CurrentInfo;
            DateTime date1 = new DateTime(year, 12, 31);
            Calendar cal = dfi.Calendar;
            int weeks = cal.GetWeekOfYear(date1, dfi.CalendarWeekRule, dfi.FirstDayOfWeek);
            return weeks;
        }
 
        public static DateTime FirstDateOfWeekISO8601(int year, int weekOfYear)
        {
            DateTime jan1 = new DateTime(year, 1, 1);
            int daysOffset = DayOfWeek.Thursday - jan1.DayOfWeek;
 
            // Use first Thursday in January to get first week of the year as
            // it will never be in Week 52/53
            DateTime firstThursday = jan1.AddDays(daysOffset);
            var cal = CultureInfo.CurrentCulture.Calendar;
            int firstWeek = cal.GetWeekOfYear(firstThursday, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
 
            var weekNum = weekOfYear;
            // As we're adding days to a date in Week 1,
            // we need to subtract 1 in order to get the right date for week #1
            if (firstWeek == 1)
            {
                weekNum -= 1;
            }
 
            // Using the first Thursday as starting week ensures that we are starting in the right year
            // then we add number of weeks multiplied with days
            var result = firstThursday.AddDays(weekNum * 7);
 
            // Subtract 3 days from Thursday to get Monday, which is the first weekday in ISO8601
            return result.AddDays(-3);
        }
    }
 
}

 

Григорий Чех пишет:

Возможность есть 

1 БП запускайте по расписанию

2 С помощью элемента формула можно получить номер текущей неделе дальше обновить или что вам нужно сделать с этой записью

По работе в формуле с датами более подробно смотри тут

Расскажите, пожалуйста, подробнее про то как построить такой БП, а то я не понимаю какие элементы там должны присутствовать.

Все доступные в дизайнере элементы процесса описаны в руководстве.

Если Вы хотите заказать разработку такой логики полностью «под ключ», лучше будет заказать её у одной из компаний, зарегистрированных в маркете в каталоге услуг

Добавить комментарий

Зверев Александр пишет:

Все доступные в дизайнере элементы процесса описаны в руководстве.

Если Вы хотите заказать разработку такой логики полностью «под ключ», лучше будет заказать её у одной из компаний, зарегистрированных в маркете в каталоге услуг

Мало ли кто-то из комьюнити уже реализовывал схожий процесс и поделится опытом на безвозмездной основе. За деньги вообще, мне кажется, все связанное с CRM можно решить.

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

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

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

В последних версиях bpm'online предусмотрено обновление реестра при клике на названии раздела в области реестра https://prnt.sc/hq5dd7.

Логично было бы продолжение идеи - обновлять данные страницы при клике на названии страницы. http://prntscr.com/hq5hs8.

 

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

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

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

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

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

Нравится

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

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

Добавьте элемент "Открыть страницу редактирования". В результате выполнения элемента у пользователя откроется страница с новыми значениями.

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

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

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

:smile:

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

ну на то он и сервер :) клиентские ресурсы само приложение и так "не слабо" задействует :)

Вот типичный пример илюстрирующий проблему.
К типовым обращениям добавлена некая логика, которой кстати непонятно почему нет в типовом решении, ну да ладно.
Реализуем статус "Прочитано/Не прочитано" на сообщениях, а так-же вводим сущность которая описывает содержит ли обращение одно или несколько непрочитанных сообщений.
Итого получаем некое поле для объекта Case для удобства пользователей значение которого выведено в колонке реестра:

Ну соответственно поле у активности с типом Email, которое так-же выведено в колонках соответствующей детали.

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

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

Вариант решения:
1. В процессе сгенерировать сообщение по Web-socket.
2. В схеме страницы редактирования подписаться на сообщения.
3. В методе “прослушки” сообщения вызывать метод который обновит страницу и отобразит актуальные данные.
Обновить страницу редактирования:
reloadEntity() – refresh page
Обновить реестр детали:
- this.updateDetails()
- this.updateDetail({detail: "DetailName"}); - где DetailName имя детали

Пример генерации и подписки на сообщение рассмотрен на форуме - http://www.community.terrasoft.ru/forum/topic/11784

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