Вопрос

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

Есть следующая ситуация:

Заходим в деталь карточки раздела, добавляя туда запись отрабатывает БП который меняет значение поля в Entity, но при возвращении в карточку остается старое значение.
Поэтому возникает необходимость актуализировать данные в карточке, к примеру, при помощи метода this.reloadEntity(), но непонятно как отправить message из БП в схему карточки и там уже запустить обновление.

Есть идеи?

У меня такой же вопрос

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

На сервере через Элемент скрипты делаете так:
 

string messageText = "{\"любой текст, если хотите\"}";
string sender = "NeedUpdatedGrid";
MsgChannelUtilities.PostMessageToAll(sender, messageText);

Затем создаете клиентский модуль, такого содержания:
 

define("ClientMessageBridge", ["ConfigurationConstants"],
function(ConfigurationConstants) {
    return {
        messages: {
            "NeedUpdatedGrid": {
                "mode": Terrasoft.MessageMode.BROADCAST,
                "direction": Terrasoft.MessageDirectionType.PUBLISH
            }
        },
        methods: {
            init: function() {
                this.callParent(arguments);
                this.addMessageConfig({
                    sender: "NeedUpdatedGrid",
                    messageName: "NeedUpdatedGrid"
                });
            },
            afterPublishMessage: function(
                sandboxMessageName,
                webSocketBody,
                result,
                publishConfig) {
                if (sandboxMessageName === "NeedUpdatedGrid") {
                    var name = webSocketBody.name;
                }
            }
        }
    };
});

А там, где хотите обновить грид, делаете так:

init: function() {
  this.callParent(arguments);
  this.sandbox.subscribe("NeedUpdatedGrid", this.myNameMethod, this);
},
myNameMethod: function(args) {
    this.reloadEntity();
}

Ну и соответственно не забудьте в схеме дописать 
блок messages, сообщение можете принимать как BROADCAST
 

Литвинко Павел,

Спасибо, попробую.
А зачем эта функция?

afterPublishMessage: function(
                sandboxMessageName,
                webSocketBody,
                result,
                publishConfig) {
                if (sandboxMessageName === "NeedUpdatedGrid") {
                    var name = webSocketBody.name;
                }
                }

И модуль этой же функции должен от кого-то наследоваться?

Литвинко Павел,

На сервере через Элемент скрипты делаете так:

Под - "...Элемент скрипты..." , вы имели ввиду элемент задание сценарий?
Если это так, то следующий код там неприменим:

MsgChannelUtilities.PostMessageToAll(sender, messageText);

Так как объект MsgChannelUtilities отсутствует в данном контексте.

Андреев Андрей Сергеевич пишет:

Литвинко Павел,

На сервере через Элемент скрипты делаете так:

Под - "...Элемент скрипты..." , вы имели ввиду элемент задание сценарий?
Если это так, то следующий код там неприменим:

MsgChannelUtilities.<span>PostMessageToAll</span><span>(</span>sender, messageText<span>)</span><span>;</span>

Так как объект MsgChannelUtilities отсутствует в данном контексте.

ЕщеСвернуть

Да, задание сценарий 

Андреев Андрей Сергеевич пишет:

Литвинко Павел,

Спасибо, попробую.
А зачем эта функция?


 
afterPublishMessage: function(
                sandboxMessageName,
                webSocketBody,
                result,
                publishConfig) {
                if (sandboxMessageName === "NeedUpdatedGrid") {
                    var name = webSocketBody.name;
                }
                }

И модуль этой же функции должен от кого-то наследоваться?

https://academy.terrasoft.ua/documents/technic-sdk/7-13/clientmessagebr… 

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

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

У меня такой же вопрос

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

Обсуждалось тут описано тут

Григорий Чех,

 

Можно найти эту запись в базе в таблице Reminding и посмотреть значение поля NotificationTypeId и других интересующих полей.

Григорий Чех,

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

Нет, поле «Кому» ссылается только на контакт.

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

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

Почему Вы считаете, что такая возможность есть? Список полей объекта виден в дизайнере, там поля «Группа пользователей» нет.

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

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

Prime Source,

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

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

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

во, отличная идея про канал. Теперь только нужно подумать как из процесса в канал отправить сообщение))

См. здесь.

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

Есть БП который вызывается через кнопку в клиентском модуле, он заполняет деталь. Как через сообщения сделать обновление детали после окончания работы БП что бы было видно наполнение детали? На форуме был такой вопрос но там было сделано через ивент в БП старого типа, в новых это не работает.

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

У меня такой же вопрос

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

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

В конце БП в элементе Задание-сценарий вставляете следующую строку:
 

MsgChannelUtilities.PostMessage(UserConnection, "MyMessage", "UpdateDetail");

В клиентском модуле детали реализовать следующий код:
 

init: function () {
				this.callParent(arguments);
				this.subscriptionFunction();
			},
subscriptionFunction: function() {
				Terrasoft.ServerChannel.on(Terrasoft.EventName.ON_MESSAGE,
				this.bpListenerMessage, this);
			},
bpListenerMessage: function(scope, message) {
				if (!message || message.Header.Sender !== "MyMessage") {
					return;
				}
				var message2 = message.Body;
				if (!this.Ext.isEmpty(message2) && message2 === "UpdateDetail") {
					this.updateDetail();
				}
			}

Примерно так.

Нигрескул Алексей,

 

Не обновляет, уже и не знаю в чем дело может быть

В БП

var userConnection = Get<UserConnection>("UserConnection");
Terrasoft.Configuration.MsgChannelUtilities.PostMessage(userConnection, "ReloadDetailConcert", "UpdateDetail");
return true;

На клиенте

init: function () {
	this.callParent(arguments);
	this.subscriptionFunction();
},
subscriptionFunction: function() {
	Terrasoft.ServerChannel.on(Terrasoft.EventName.ON_MESSAGE,
	this.bpListenerMessage, this);
},
bpListenerMessage: function(scope, message) {
	if (!message || message.Header.Sender !== "ReloadDetailConcert") {
		return;
	}
	var message2 = message.Body;
	if (!this.Ext.isEmpty(message2) && message2 === "UpdateDetail") {
		this.updateDetail();
	}
},

 

PostMessage отправляет конкретному юзеру. Поэтому надо быть уверенным, что бп запущен от нужного пользователя и он на нужной странице(где есть код для обработки обратного сигнала). 
Если не подходит, можно воспользоваться PostMessageToAll(string sender, string message). Рассылает сообщение по всей конфигурации всем пользователям.

Варфоломеев Данила,

Изменил на 

Terrasoft.Configuration.MsgChannelUtilities.PostMessageToAll("ReloadDetailConcert", "UpdateDetail");
return true;

не помогло

Нужно ли еще прописать?

messages: {
	"ReloadDetailConcert": {
		mode: Terrasoft.MessageMode.BROADCAST,
		"direction": Terrasoft.MessageDirectionType.SUBSCRIBE
	}
},

 

Prime Source,

Да нет. Должно и так работать. Даже subscriptionFunction не вызывается?

Варфоломеев Данила,

По дебагу срабатывает, и сообщение правильно ловит, и выполняет this.updateDetail(); ,но почему нет данных в детали не пойму. Может что в процессе не так? Вот его скрин, там идет цикл который делает 8 проходов, и когда в таблице 8 записей становится он выполняет скрипт сообщения и завершает

 

Prime Source,

//Relationships - название детали из details.
//пример:
this.updateDetail({detail: "Relationships"});

Проверьте код(указывается ли имя детали). Плюс должны быть настроены колонки

Войдите или зарегистрируйтесь, чтобы комментировать
Публикация

Вопрос:

Каким образом можно отправить email сообщение из бизнес-процесса с вложенными файлами?

Кейс такой: Есть раздел "Контрагенты", в нем есть деталь Файлы и ссылки, в данную деталь добавляю 2 файла.
Как только статус контрагента перейдет, допустим, в "Отправка", запускается процесс отправки письма с вложенными файлами из детали Файлы и ссылки. Кроме того, email будет отправляться вручную, после запуска бп, контакту текущего пользователя будет появляться сформированное письмо для выбора адресата (контакты контрагента).

Ответ:

Для Вашей задачи можно воспользоваться следующим подходом:
- Создать активность с типом email
- Добавить для нее вложение, например, открыв страницу редактирования пользователю и прикрепив нужные файлы
- Установить с помощью элемента Формула значение для параметра paractivityid
- В рамках задания сценария выполнить отправку:
var activityId = Get<Guid>("paractivityid");
var emailClientFactory = ClassFactory.Get(new ConstructorArgument("userConnection", UserConnection));
var activityEmailSender = new ActivityEmailSender(emailClientFactory, UserConnection);
activityEmailSender.Send(activityId);
return true;

При этом необходимо в usings добавить следующие библиотеки:
- Terrasoft.Mail.Sender
- Terrasoft.Mail
- Terrasoft.Core.Factories
- Terrasoft.Configuration

Пример использования данного кода можно найти в базовом процессе "Отправка email сообщения контакту обращения".
 

Поделиться

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

Добрый день Ксения.

Вариантов реализации данной задачу очень много. Но если нам требуется отправить Емайл с фложениями, я бы пошел по пути создания своего Элемента процесса, вывода его в "Элементы процесса" и далее его бы использовал для выполнения своих Кейсов. Если внимательно на это посмотреть, то элемент "Отправить email" практические все это умеет и даже есть вставить C# код по событию "После сохранения активности" для пост обработки.

я бы взял за основу данных Элемент процесса и переделал под себя.

Войдите или зарегистрируйтесь, чтобы комментировать
Публикация

Вопрос:

Как отправить уведомление через элемент процесса Добавить данные. Элемент Notification с типом Remindingотрабатывает, но уведомление не приходит.

Ответ:

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

Объект: [#Справочник.Объект раздела (представление).Activity#]
Источник: объект, с которым должно быть создано напоминание ( к примеру, продажа)
Уникальный идентификатор записи: id записи источника

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

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

В качестве обходного решения Вы можете создавать Активность (например, проконтролировать обработку записи из кастомного раздела № Х.), и создавать в рамках процесса напоминание по Активности:


В данном варианте в элементе "Уникальный идентификатор записи" необходимо выполнить маппинг на id из элемента "Читать данные Активности".

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

 

Поделиться

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

Добрый день.

Подскажите пожалуйста как выбрать из объекта бизнес-процесса "Изменение данных" уникальные поля записей, которые были изменены? 

Есть объект Акции и Партнеры. У акции есть справочное поле с типом акции. Есть бизнес-процесс, который по определённому алгоритму изменяет акции. Изменение акций выполняется  через элемент "Изменить данные".

Как мнем выбрать уникальные типы акции, которые были изменены?

У меня такой же вопрос

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

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

Второй вариант - сделать БП, который реагирует на изменение акции

Третий вариант - дождаться обещанного массового запуска подпроцессов, который будет в одной из следующих версий :)

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

Второй вариант - сделать БП, который реагирует на изменение акции

Третий вариант - дождаться обещанного массового запуска подпроцессов, который будет в одной из следующих версий :)

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

Не совсем понял условие, но если интересуют те значения справочника, которые недавно были использованы в записях раздела, то можно в справочник добавить поле типа «дата и время» и писать туда текущее время одновременно с изменением записи в разделе.

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

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

Войдите или зарегистрируйтесь, чтобы комментировать
Публикация

Вопрос: 

Какой бизнес процесс обеспечивает рассылку е-майл сообщений?

Ответ:

Если Вас интересует функционал маркетинга, в базовой версии рассылки email-сообщений для компаний выполняются с помощью отдельного функционала рассылок. Подробно он описан на Академии: https://academy.terrasoft.ru/documents/marketing/7-9/kak-rabotat-s-massovymi-rassylkami

Если же Вас интересует настройка бизнес-процесса, то для выполенения рассылки Вы можете использовать элемент "Отправить email". Работа элемента описана по ссылке: https://academy.terrasoft.ru/documents/technic-bpms/7-10/element-processa-otpravit-email

Поделиться

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

Добрый день!

Необходимо отправлять email-оповещение при назначении обращения по шаблону из справочника.

Сообщение из раздела обращений которое нужно прочитать:

Upd. Процессом считывания данных и заполнением шаблона занимается бизнес-процесс "SendEmailToSROwner", пакет "CaseService". 

Есть ли возможность вытащить из ленты в бизнес-процессе последнее сообщение?

У меня такой же вопрос

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

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

Лента — это обычный объект ESNNotification и связанный с ним SocialMessage. Можно читать стандартными элементами чтения данных.

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

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

Можно ли как-то прочитать название если в объекте в колонке указан справочник, так как там указан Guid?

Пример:

[#Читать данные контакта.Первый элемент результирующей коллекции.Страна#] узнать название страны при чтении из "Читать данные"

У меня такой же вопрос

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

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

Можно получить нужное вам значение 2 вариантами.

1. Первый способ - 2-мя элементами 'Чтение данных'. Одним вычитываете Id города из Вашего объекта, а вторым название города по его Id из предыдущего элемента.

2. Второй способ сразу вычитать данные в элементе скрипт таск с помощью EntitySchemaQuery.

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

Можно получить нужное вам значение 2 вариантами.

1. Первый способ - 2-мя элементами 'Чтение данных'. Одним вычитываете Id города из Вашего объекта, а вторым название города по его Id из предыдущего элемента.

2. Второй способ сразу вычитать данные в элементе скрипт таск с помощью EntitySchemaQuery.

Алла Савельева,

Первый способ не подходит, там 18 справочником, выйдет многовато читать. Второй способ я использовал, но руководство не совсем приветствует использование C# скриптов

Придётся делать подряд 2 элемента чтения данных: в первом читать из контакта Id страны, во втором — из справочника стран, отфильтрованного по этому Id, получать название.

Зверев Александр у меня 6 таблиц которые нужно заполнить данными. Для каждой таблицы порядка 20 справочников читать. Выйдет адский труд

Если таких слишком много и писать скрипты не хотите, можно ещё сделать view с текстовыми колонками, потом создать по нему объект и работать с ним.

Prime Source,

Prime Source пишет:
руководство не совсем приветствует использование C# скриптов

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

К сожалению, пока вычитать данные из связанных таблиц в элементе 'Чтение данных' невозможно.

Как вариант, можно реализовать представление, которое содержит все нужные данные и обращаться к нему из элемента 'Чтение данных', но это такой вариант костыля и потом, так как мне не до конца известна Ваша задача, то не факт, что представление будет лучше, чем C# код.

Алла Савельева,

Спасибо, мне нужно было что бы люди тоже подтвердили мое мнение начальству. Скрипт я написал, он сам чиатет и сам пишет все в таблице трансферную которую мне нужно

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

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

Добрый день!

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

У меня такой же вопрос

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

нет, точнее так:

1. Если запускаете из пользовательского интерфейса - там только на запуск, нельзя отследить окончание выполнения.

2. Если есть преднастроенные страницы (кастомные), то можно в них последовательно включать и выключать маску.

3. Никто не помешает пользователю нажать рефреш :)

нет, точнее так:

1. Если запускаете из пользовательского интерфейса - там только на запуск, нельзя отследить окончание выполнения.

2. Если есть преднастроенные страницы (кастомные), то можно в них последовательно включать и выключать маску.

3. Никто не помешает пользователю нажать рефреш :)

Дмитрий Степанов,

Дмитрий, добрый день!
Спасибо за предложенные варианты.
Мне не совсем они подходят, возможно я не совсем точно описал кейс.
Кейс состоит в том, что:
последовательно выполняются три подпроцесса:
1) Первый заканчивается

преднастроенной страницей, далее идет переход во 2-й подпроцесс

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

3) После выполнения 2-го процесса запускается 3-й процесс с преднастроенной страницей. 

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

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

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

 

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

Александр, спасибо за идею. Похоже на самый реалистичный вариант.

Войдите или зарегистрируйтесь, чтобы комментировать