В версии bpm'online 7.7 real estate в карточках сущности "Объект недвижимости" есть деталь Параметры, на которую нужно бизнес-процессом добавить значения параметров.

Процесс стартует при ручном запуске. В бизнес-процессе используем только элемент "Добавление данных". В свойствах элемента пишем:

В какой объект добавить данные : Параметры.
Режим добавления данных: результат выборки
Выборка по объекту: значения параметров объекта или листинга.

После запуска процесса значения на деталь "Параметры "в карточках не добавляются. Что неправильно в процессе?

Нравится

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

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

Неправильный объект, в который записываются данные.

Пробовали также выбирать записывать в объект "Значения параметра объекта или листинга" с различными выборками и значениями полей. Все равно процесс не работает.

Как бы понять, в чем ошибка. В журнале процессов статусы процессов - Завершен.

Добрый день!

Интересуют два момента:
1) Каким образом процесс понимает к какому объекту необходимо прикрепить параметры выборки?
2) Какие настройки элемента "Добавить данные"?

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

1 вариант.
В какой объект добавить данные : Подтип параметра.
Режим добавления данных: результат выборки
Выборка по объекту: Параметр.

Условие фильтрации выборки:
Название равно Номер квартиры
Раздел Объекты Да

2 вариант.
В какой объект добавить данные : Подтип параметра.
Режим добавления данных: результат выборки
Выборка по объекту: Значение параметра объекта или листинга.

Условие фильтрации выборки:
Параметр равно Номер квартиры
Объект недвижимости.Тип равно Квартира

Анастасия, добрый день!

Перед тем как строить бизнес-процесс рекомендую предварительно посмотреть в каком виде хранятся параметры и связь между параметрами и объектами недвижимости в БД.
1. Параметры – таблица Amenity.
2. Значения параметров – AmenitySubtype (AmenityId – ссылка на Amenity).
3. Объекты недвижимости – Property.
4. Связь между параметрами и объектами недвижимости – AmenityInObject. (AmenityId – ссылка на Amenity, PropertyId – ссылка на Property)

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

Добрый день коллеги!
Подскажите пожалуйста, как можно реализовать пункт в Бизнесс процессе, который бы переводил пользователя на страницу раздела, например на страницу раздела "Активности" с активным View - Расписание, при чем передавая некоторые параметры (например с определенной датой для фильтра).
Подскажите пожалуйста, какие есть возможности по реализации данной задачи? Спасибо!

Нравится

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

Добрый день!

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

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

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

Нравится

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

Добрый день!
После 7.5 было внесено много исправлений/изменений. Напишите в support для детального анализа.

Оказалось что при сохранении объекта при определенных условиях отрабатывает несколько запросов. Отрабатывают без ошибок, но бп дальше не идет. Если запросы не выполняются - все отлично.

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

Добрый день!

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

Судя по всему, ID активности для сигнала не обновляется, поэтому он и не отрабатывает.
Подскажите пожалуйста, как решить данную проблему.
Заранее спасибо.

Нравится

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

Как-то подозрительно это выглядит. Я бы там настроил добавление Задачи и открытие ее (открыть карту редактирования, объект "Задача", ИД - ваш из создания задачи) с ожиданием изменения статуса. И тогда не надо париться с сигналами.

p.s. русской версии нету, сорри.

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

UPD: сделал я такое как у вас, все ок :) только у меня не генерирующий сигнал, а обрабатывающий. Оно во вложении (7.7, чешская локаль)

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

тут по другому не сделать

"Дмитрий Степанов" написал:Я бы там настроил добавление Задачи и открытие ее (открыть карту редактирования, объект "Задача", ИД - ваш из создания задачи) с ожиданием изменения статуса.

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

"Дмитрий Степанов" написал:

UPD: сделал я такое как у вас, все ок :) только у меня не генерирующий сигнал, а обрабатывающий. Оно во вложении (7.7, чешская локаль)

Действительно, пересоздал процесс заново и все заработало:)
В любом случае спасибо за помощь!

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

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

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

Добрый день! Создал БП, который начинает выполняться по сигналу создания или сохранения карточки. Чтобы пользователь не ждал окончания БП, использую элемент "Таймер". В логе все элементы БП отмечены как выполненные, но результатов выполнения нет. Без таймера все работает, но достаточно длительное время. Версия 7.5.0.1328.

Нравится

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

Добрый день!
Покажите диаграмму процесса с таймером и без.

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

Добрый день!

Покажите диаграмму процесса с таймером и без.

"Медведев Валентин Николаевич" написал:
Зарицкий Олег пишет:

Добрый день!

Покажите диаграмму процесса с таймером и без.

Прикрепленный файлРазмер

bp.jpg
15.59 кб

ой, вообще не разобрать

в процессе используются элементы "Изменить права". Без таймера записи в детали "Изменить права доступа" появляются, с таймером - нет

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

В более ранних версиях элемент "Изменить права доступа" не отрабатывает после элемента "Таймер". Есть два решения:

    • Обновиться на 7.8.0.
    • Использовать элемент "Задание-сценарий" для раздачи прав. В этом элементе необходимо выполнить insert в таблицу Sys[#Object#]Right
Показать все комментарии

Добрый день!

Подскажите, пожалуйста, примерную (или еще лучше точную) инструкцию изменения стандартного процесса корпоративной продажи в 7.8.

1) Изменение одной из стадий
2) Удаление одной из стадий из процесса
3) Добавление новой стадии в процесс

Спасибо!

Нравится

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

Добрый день, Владимир!

Как и раньше в базовый процесс нет возможности вносить правки пользовательскими средствами. Изначально необходимо заместить его и уже свой можно править. В версии 7.8 это делать гораздо легче - по нажатию на кнопку "Действия" - "Копировать диаграмму". Прикрепил для наглядности скриншот 1.
Что касается отдельной стадии, то здесь никаких изменений по сравнению с предыдущей версией нет. Аналогично можно найти в разделе "Конфигурация" схему (так как отдельные стадии идет как отдельными схемами процесса), заместить и редактировать в зависимости от потребностей. Прикрепил скриншот 2 для наглядности. Что касается удаления существующей/добавления новой, то в версии 7.8 изменен справочник "стадии продаж" и теперь там есть возможность проставлять признак "Показывать на индикаторе стадий". Соответственно, нужно убрать из нужной стадии этот признак, чтоб у пользователей не было возможности переходить на эту стадию по клику на прогресбар. Также, в самом процессе необходимо внести некоторые исправления, например, в в элементе процесса, который идет перед удаляемым нами в последнем элементе "изменение данных" необходимо указать, что при выполнении условий нужно переходить уже на другую стадию (действия аналогичны как для добавления своей стадии, так и для отмены использования уже существующей).

Владимир, добрый день! Я бы советовал свой создать :)

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

Коллеги, подскажите:
Как конфигурировать или изменять процессы выполняемые системой по нажатию стандартных кнопок процессов в гридах и на формах? Например кнопка "Распределить" в сущности Лид.

Нравится

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

Павел,
Подход следующий: определить в какой схеме добавлена кнопка – найти в схеме реализацию кнопки – найти обработчик на кнопку.
Кнопка “Распределить” реализована в преднастроенной странице LeadManagementDistributionPageV2(видно по адресной строке браузера). Страница открывается по процессу LeadManagementDistribution.
Базовые схемы/процессы изменить не получится, они не доступны для редактирования.
Как вариант можно деактивировать базовые процессы, сделать их копию и редактировать в соответствии с задачами.

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

Коллеги, подскажите, как создать из процесса уведомление пользователю в центр уведомлений?

Нравится

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

Павел,
Задача решается с помощью элемента “Добавить данные”. Записи хранятся в таблице Reminding. Самый простой способ – добавить уведомление из приложения, посмотреть какие поля заполнены в таблице БД и по аналогии заполнить эти поля в процессе.
Также следует учитывать – в системе существуют провайдеры, которые считают и обновляют кол-во уведомлений в зависимости от объекта привязки и типа уведомления. Для основных разделов такие провайдеры уже реализованы. При необходимости следует создать пользовательский провайдер. Пример в системе – ActivityNotificationProvider.

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

Павел,

Задача решается с помощью элемента “Добавить данные”. Записи хранятся в таблице Reminding. Самый простой способ – добавить уведомление из приложения, посмотреть какие поля заполнены в таблице БД и по аналогии заполнить эти поля в процессе.


Здравствуйте, а где можно посмотреть эти поля? В самом объекте Reminding?

Добрый день!
Reminding – развязочная таблица, которая хранит внешние ключи на разные сущности.
Название полей и их тип легче посмотреть в объекте [Уведомление/ Reminding].
Какие значения там хранятся можно посмотреть в таблице БД – Reminding.

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

Добрый день.

Версия BPM 7.2

Есть ли возможность запускать бизнес-процесс в фоновом режиме? Сейчас использую такой код при нажатии на кнопку:

ProcessModuleUtilities.executeProcess(processArgs);

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

Спасибо!

Нравится

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

Добрый день!

Проблема может заключатся в логике выполнения самого процесса (нет прав доступа на записи, некорректная обработка записи).
Если логика процесса не подразумевает взаимодействие с пользователем(отобразить страницу редактирования, вопрос пользователю и т.д.) то процесс по умолчанию будет отрабатывать в фоновом режиме.
Вы верно указали, для запуска процесса используется метод executeProcess(processArgs).
Начните с простого, запустите процесс по кнопке, который обработает 1 запись и посмотрите результат.

Бизнес-процесс не взаимодействует с пользователем. Там нет элементов взаимодействия с пользователем. БП считывает правила синхронизации из БД, выполняет запросы к удаленному стороннему web-сервису, разбирает ответ и затем обновляет данные в БД. При возникновении любой ошибки, процесс записывает информацию в лог и переходит к другому правилу синхронизации из набора.

На текущий момент удаленный web-сервис недоступен, возникает ошибка соединения, сообщение об ошибке попадает в лог - но во время всего этого страница пользователя блокируется, до тех пор, пока процесс не прекратит работу.

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

В какую сторону мне посмотреть?

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

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

При выполнении бизнес - процесса возникает ошибка в элементе Задание-сценарий:

System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта.
в Terrasoft.Core.Entities.Entity.Save(Boolean validateRequired)
в Terrasoft.Core.Process.UsrComingOnOrder.ScriptTask4Execute(ProcessExecutingContext context)
в Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)

Код сценария представляю ниже:

//берем все продукты из прихода

var stringVariable = "";
        EntitySchema ProductInSHOperationschema = UserConnection.EntitySchemaManager.GetInstanceByName("UsrProductInSHOperation");// товары в складском документе
        EntitySchemaQuery ProductInSHOperationesq = new EntitySchemaQuery(ProductInSHOperationschema);
        ProductInSHOperationesq.AddAllSchemaColumns();
        ProductInSHOperationesq.Filters.Add(ProductInSHOperationesq.CreateFilterWithParameters(FilterComparisonType.Equal, "UsrStoreHouseOperation", IdComing));
        EntityCollection ProductInSHOperationentities = ProductInSHOperationesq.GetEntityCollection(UserConnection);
       
        decimal kolvoComing=0.0m;//количество продукта в приходе
       
       
       
                foreach (Entity ProductInSHOpEntity in ProductInSHOperationentities) {
                                       
                        kolvoComing = ProductInSHOpEntity.GetTypedColumnValuedecimal>("UsrQuantity");//количество продукта в приходе
                        var ProductComing = ProductInSHOpEntity.GetTypedColumnValueGuid>("UsrProductId");//продукт в приходе
                         stringVariable = "ИД который получили:" + Convert.ToString(ProductComing)+"\n" + "Заказ который получили:" + Convert.ToString(OrderId);
                        //Получим строки продуктов из нашего заказа
                        Custom.UsrDebug.Utils.SendMessage(UserConnection, "mishutina-julja@rambler.ru", stringVariable);
                       
                        //берем  продукты из заказа поставщика по приходу (номер заказа, по которому создан приход = номеру заказа поставщика, сортипрвка по дате заказа поставщика)-скрытая деталь
                        EntitySchema OrderProvidersProductschema = UserConnection.EntitySchemaManager.GetInstanceByName("UsrOrderProvidersProduct");// товары из заказа поставщика
                        EntitySchemaQuery OrderProvidersProductesq = new EntitySchemaQuery(OrderProvidersProductschema);
                       
                        OrderProvidersProductesq.AddColumn("UsrQuantity");
                        OrderProvidersProductesq.AddColumn("UsrProduct");
                        OrderProvidersProductesq.AddColumn("UsrMust");
                        OrderProvidersProductesq.AddColumn("UsrOrderId");
                        OrderProvidersProductesq.AddColumn("UsrShipped");
                        OrderProvidersProductesq.AddColumn("UsrClientsOrderId");
                        OrderProvidersProductesq.AddColumn("UsrClientsOrderId.CreatedOn").OrderByAsc();
                       
                        OrderProvidersProductesq.Filters.Add(OrderProvidersProductesq.CreateFilterWithParameters(FilterComparisonType.Equal, "UsrOrderId", OrderId));
                        OrderProvidersProductesq.Filters.Add(OrderProvidersProductesq.CreateFilterWithParameters(FilterComparisonType.Equal, "UsrProduct", ProductComing));
                       
                        EntityCollection OrderProvidersProductentities = OrderProvidersProductesq.GetEntityCollection(UserConnection);
                                       
                        foreach (Entity OrderProvidersProductEntity in OrderProvidersProductentities) {
                                 
                                if (kolvoComing == 0) break;
                               
                                decimal kolvoProvider = OrderProvidersProductEntity.GetTypedColumnValuedecimal>("UsrQuantity");//количество в заказе поставщику
                                var OrderProvidersProduct = OrderProvidersProductEntity.GetTypedColumnValueGuid>("UsrProductId");//продукт в скрытой детали
                               
                                stringVariable = "ИД OrderProvidersProduct который получили:" + Convert.ToString(OrderProvidersProduct);
                                Custom.UsrDebug.Utils.SendMessage(UserConnection, "mishutina-julja@rambler.ru", stringVariable);
                               
                                decimal Must =  OrderProvidersProductEntity.GetTypedColumnValuedecimal>("UsrMust");// надо
                                decimal Shipped = OrderProvidersProductEntity.GetTypedColumnValuedecimal>("UsrShipped");//отгружено
                                decimal kolvoRealNeed = Must - Shipped; //надо - отгружено
                               
                                stringVariable = "Must:  " + Convert.ToString(Must)+"  Shipped:" + Convert.ToString(Shipped)+"  kolvoRealNeed:" + Convert.ToString(kolvoRealNeed);
                                Custom.UsrDebug.Utils.SendMessage(UserConnection, "mishutina-julja@rambler.ru", stringVariable);
                               
                                //распределение количества из прихода в скрытую деталь   
                                        if  (OrderProvidersProduct == Guid.Empty) break;
                                        else {
                                        if (kolvoComing >= kolvoRealNeed) {
                                                OrderProvidersProductEntity.SetColumnValue("UsrShipped", Shipped + kolvoRealNeed);
                                                OrderProvidersProductEntity.Save();
                                                kolvoComing -= kolvoRealNeed;
                                        } else {
                                                OrderProvidersProductEntity.SetColumnValue("UsrShipped", Shipped + kolvoComing);
                                                OrderProvidersProductEntity.Save();
                                                kolvoComing = 0;
                                        }
                                        }//конец else
                        }//цикл по скрытой детали заказ поставщика
                }//цикл по приходу
                return true;

Для проверки используемых данных вставили код, по которому получаем сообщения на почту. Данные не пустые, сообщения приходят. Ошибка вылетает на само сохранение данных в процессе. Подскажите, пожалуйста, в чем может быть причина такой ошибки? Заранее огромное спасибо!!!

Нравится

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

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

Сообщение "System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта" возникает, если система не может найти какой-то объект.
Здесь два варианта:
Выполните действие "Компилировать все". Если это действие не помогло, значит где-то в коде встречается ссылка на несуществующий объект (проверьте названия объектов, к которым Вы обращаетесь в коде).

Юлия,

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

Когда появится ошибка, у Вас будет возможность понять, какой именно объект не может найти система.

Спасибо большое, разбираемся

Заменили Save на Update...и все данные сохранились))

var update = new Update(userConnection, "UsrOrderProvidersProduct")
.Set("UsrShipped", Column.Parameter((Shipped + kolvoRealNeed)))
.Where("UsrProductId").IsEqual(Column.Parameter(ProductComing))
.And("UsrOrderIdId").IsEqual(Column.Parameter(OrderId));
update.Execute();

Хоть вопрос и решен, но все же отпишусь, вдруг пригодится кому-нибудь.
Была такая же проблема. Ошибка при вызове метода Save() для Entity
Было сделано следующее наблюдение:
Код:

var esqNumeration = new EntitySchemaQuery(userConnection.EntitySchemaManager, "UsrObjectNumeration");
//esqNumeration.AddColumn("UsrNumber");
esqNumeration.AddAllSchemaColumns();
var entitiesNumeration = esqNumeration.GetEntityCollection(userConnection);
number = entitiesNumeration[0].GetTypedColumnValue<int>("UsrNumber") + 1;
entitiesNumeration[0].SetColumnValue("UsrNumber", number);
entitiesNumeration[0].SetColumnValue("UsrNumber", number);
entitiesNumeration[0].Save();

Прошу обратить внимание на строки:

//esqNumeration.AddColumn("UsrNumber");
esqNumeration.AddAllSchemaColumns();

При такой записи ошибки при вызове метода нет.
Но если сделать наоборот, т.е. добавить только одну колонку, без вызова метода AddAllSchemaColumns(), то получим ошибку "Ссылка на объект не указывает на экземпляр объекта" при вызове entitiesNumeration[0].Save()

Эмин, большое спасибо за Ваш комментарий.

Таким образом, получается, что нам нужно было выбрать все колонки в запросе, а не только те, которые нам необходимы были. И тогда Save() бы сработал. Я Вас правильно поняла?

"Юлия Мишутина" написал:

Таким образом, получается, что нам нужно было выбрать все колонки в запросе, а не только те, которые нам необходимы были. И тогда Save() бы сработал. Я Вас правильно поняла?


Да, все верно. Save() работает только если вызвать AddAllSchemaColumns().

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