Здравствуйте community,

 

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

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

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

 

Изображение удалено.

 

Заранее спасибо за ваши идеи.

Нравится

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

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

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

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

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

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

Подскажите как при изменении состояния визы в разделе запустить функцию в клиентском модуле.

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

Может есть другой способ, так как

onDetailChanged: function() {
	this.callParent(arguments);
	this.sameFun();
},

не работает в разделе продажи

Нравится

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

Коновалов Игорь,

 сделал через бизнеспроцес в объекте наблицы, подписался на изменения записей и отправляю об этом сообщения, на фронте сделал на них подписку

В кл. схеме OpportunityPage

в блоке details переопределите деталь:

"Название детали":{

               schemaName: "<Название схемы детали>",

               entitySchemaName: "<Название объекта детали>",

               subscriber: {

                      methodName: "<Название метода, отрабатывающего при                        изменении детали>"},

}

Очистите кэш.

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

После этого проверьте не затрётся ли subscriber

Коновалов Игорь,

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

onDetailChanged. А так как onDetailChanged не срабатывает то и если добавить при замещении функции с добавлением этого поля все равно работать отказываеться

 

Коновалов Игорь,

 сделал через бизнеспроцес в объекте наблицы, подписался на изменения записей и отправляю об этом сообщения, на фронте сделал на них подписку

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

При создании портального сообщения из БП происходит его создание во вкладке "Хронология" обращения, но само сообщение не появляется во вкладке "Обработка".

Каким образом перенести сообщение в обработку? (как я понимаю, оно просто не публикуется, хотя признак установлен)

Изображение удалено.

Нравится

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

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

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

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

"Хронология" (поле опубликован так же выставлял как "Да"). Сообщение не отображается в "Обработке" нигде (ни в системе, ни на портале, ни под один пользователем)

Проблема найдена - не было указано значение поля

"Уникальный идентификатор схемы". Нет ли ни у кого решения как можно получать данный идентификатор стандартными методами из БП?

Это UId схемы раздела, в котором должны появляться сообщения. Когда Вы строите БП, то уже знаете, куда его хотите добавить. Посмотрите у существующей записи и вставьте как константу в параметр процесса, затем используйте.

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

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

Так он же везде одинаковый для одинакового раздела, независимо от версии и даже вертикали.

Если Вам нужно именно программно по названию объекта, то:

var ContactSchemaUId = UserConnection.EntitySchemaManager.GetInstanceByName("Contact").UId;

 

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

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

 

Столкнулся с проблемой - не могу найти параметр отвечающий за доступ к сообщениям в обращениях. Сотрудники в обращениях видят только свои сообщения. 

Нравится

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

Добрый день!

Скорее всего в разделе прав доступа у вас включено администрирование по записям. Подробнее тут

 

Этот параметр по операциям администрируется, вроде. Возможно, где-то в режиме администратора есть настройка? 

Нашёл вот такую статью, но решение не помогает.

https://community.terrasoft.ru/articles/cto-delat-esli-cast-menedzerov-perestala-videt-soobsenia-drugih-menedzerov

Sunrise challenge,

По умолчанию все пользователи видят все сообщения. Ограничения накладываются на правах объектов. Это можно увидеть, взяв чистую демо версию Service Enterprice.

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

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

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

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

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

 

Подскажите, пожалуйста, как  изменить цвет фона и шрифтов сообщений и комментариев во вкладке "обработка" в обращениях? 

 

 

Нравится

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

Посмотрите эту тему и эту статью. Для деталей тоже должно работать

Посмотрите эту тему и эту статью. Для деталей тоже должно работать

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

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

Нравится

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

Для вывода сообщения используется функция:

Terrasoft.MessageBox.Show({message:'текст',title:'заголовок'})

 

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

Это понятно как выводить сообщения. Интересует вывод после завершения синхронизации данных.

Определить, загружались ли вообще по синхронизации данные, можно посредством:

!Ext.isEmpty(Terrasoft.CurrentUserInfo.lastSyncDate)

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

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

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

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

Нравится

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

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

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

 

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) &amp;&amp; message2 === "UpdateDetail") {
					this.updateDetail();
				}
			}

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

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

 

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

В БП

var userConnection = Get&lt;UserConnection&gt;("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) &amp;&amp; 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"});

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

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

Нашел несколько примеров по сообществу применения функционала сообщений через SandBox.

Вот здесь: http://www.academy.terrasoft.ru/documents/docs/technic/SDK/7.4.1/ModuleDevelopmentInBPMonline.html
Содержится обещание

Более подробно механизм обмена сообщениями между модулями системы будет рассмотрен в отдельной статье SDK.

Статья не обнаружена. Просьба ткнуть носом или сообщить, что искать бесполезно..

Нравится

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

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

Вот пример общения между деталями через SandBox

define("AccountBillingInfoDetailV2", [], function() {
    return {
        entitySchemaName: "AccountBillingInfo",
        details: /**SCHEMA_DETAILS*/{
        }/**SCHEMA_DETAILS*/,
        diff: /**SCHEMA_DIFF*/[
            {
                "operation": "merge",
                "name": "DataGrid",
                "values": {
                    "selectRow": {
                        "bindTo": "rowSelected"
                    }
                }
            }
        ]/**SCHEMA_DIFF*/,
        methods: {
            rowSelected: function() {
                this.sandbox.publish("RowSelectedInFirstDetail", { test: "param anything" }, [this.sandbox.id]);
                console.log("rowSelected in first detail...");
            }
        },
        messages: {
            "RowSelectedInFirstDetail": {
                mode: Terrasoft.MessageMode.PTP,
                direction: Terrasoft.MessageDirectionType.PUBLISH
            }
        }
    };
});
define("AccountAddressDetailV2", [], function() {
    return {
        entitySchemaName: "AccountAddress",
        details: /**SCHEMA_DETAILS*/{
        }/**SCHEMA_DETAILS*/,
        diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,
        methods: {
            init: function() {
                this.sandbox.subscribe("RowSelectedInFirstDetail", function(arg) {
                    console.log("test " + arg.test);
                }, this, [this.getSenderSandboxId()]);
            },
            getSenderSandboxId: function() {
                return this.sandbox.id.replace("_AccountAddress", "_AccountBillingInfo");
            }
        },
        messages: {
            "RowSelectedInFirstDetail": {
                mode: Terrasoft.MessageMode.PTP,
                direction: Terrasoft.MessageDirectionType.SUBSCRIBE
            }
        }
    };
});

Так же, в конфигурации Вы можете найти дополнительные примеры.

То есть примерно так:
Заявляем в блоке messages {} сообщение с одним наименованием, но с разным параметром направления(MessageDirectionType).

Отправляем сообщение из нужного модуля так:
this.sandbox.publish (A1,B1,C1)
A1 - Наименование сообщения, зарегистрированного в messages
B1 - массив параметров
C1 - Id сообщения, обычно = this.sandbox.id

Ловим в нужном модуле сообщение так:
this.sandbox.subscribe(A2, B2, C2, D2);
A2 - Наименование сообщения, зарегистрированного в messages
B2 - Некая функция, принимающая массив параметров в "arg" и что-то делающая полезное
С2 - объект, содержащийся в модуле-получателе.. (в обычном случае this )
D2 - ссылка на метод, возвращающий чтото?

Вот насчет последнего - мне пока не понятно.. Можете дать пояснение?

Алексей, добрый день!

Отдельной статьи по сообщениям в SDK на данный момент нет.

Ок. А может, тогда подскажете иное решение, как передать Контрагента ( Account_id) В деталь Продукты в заказе?
Я пытаюсь сделать это через sandbox, правильно ли это и есть ли более правильные пути?

"Шестаков Алексей Владимирович" написал:

Ок. А может, тогда подскажете иное решение, как передать Контрагента ( Account_id) В деталь Продукты в заказе?

Я пытаюсь сделать это через sandbox, правильно ли это и есть ли более правильные пути?

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

"Мотков Илья" написал:D2 - ссылка на метод, возвращающий чтото?
Вот насчет последнего - мне пока не понятно.. Можете дать пояснение?

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

А поскольку "this.sandbox.id" у разных схем разный, то метод этот "getSenderSandboxId" призван сгенерировать такой же идентификатор, как и у схемы, которая публикует сообщение.

Что именно содержится в this.sandbox.id, для каждой их схем, вы можете посмотреть в режиме отладки (F12) в вашем браузере. И на основании увиденного, подумать, как привести Id песочницы слушателя, к Id песочницы схемы публикации.

"Щиголь Максим" написал:Если у вас возникнут трудности с этим, можем написать пример именно по общению через sandbox страницы детали и страницы карточки.

Надеюсь, справлюсь :)
Один только вопрос: сообщения хранятся в Sandbox пока его не прочитают, или только передается между модулями и они оба должны существовать в момент publish?

Спасибо, Максим..
Подскажите еще, пожалуйста, как правильно получить данные содержащиеся в this по пути в отладчике:

this.values.DefaultValues[0].value

this.get("Order"), а именно заказ я там вижу в данном случае, не помогает.. а указывать как выше сделано, явно некошерно.

"Шестаков Алексей Владимирович" написал:
Один только вопрос: сообщения хранятся в Sandbox пока его не прочитают, или только передается между модулями и они оба должны существовать в момент publish?

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

Но в вашем случае, когда вы открываете страницу редактирования детали из страницы карточки, страница карточки не удаляется, так что страница карточки и детали, могут общаться через sandbox.

На ваш второй вопрос, отвечу комментарием ниже.

"Шестаков Алексей Владимирович" написал:Подскажите еще, пожалуйста, как правильно получить данные содержащиеся в this по пути в отладчике:

Не совсем понятно задан вопрос, но постараюсь предположить что вас интересует, как в карточке заказа, получить id контрагента, что бы его передавать дальше по sandbox.

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

Второе, это не должен быть метод init, в нем еще не заполнены поля. Можете для целей отладки использовать метод onEntityInitialized, или onSaved, что бы посмотреть что за поля есть у заказа.

Так же учтите что в 7.7. в заказе можно покупателем указать как контакт, так и аккаунт, в зависимости от этого и получать их необходимо будет по разному,
так: this.get("Account") для контрагента,
и так: this.get("Contact") для контакта.

Вот, думаю по скриншоту станет понятно:

В точку! Именно на Init я и застрял. :smile:

Понимание происходящего так и не пришло.. Прошу о помощи... что было сделано... В карточке заказа:

define("OrderPageV2", ["OrderPageV2Resources", "GeneralDetails", "OrderConfigurationConstants",
	"BusinessRuleModule", "MoneyModule", "VisaHelper",  "ProcessModuleUtilities", "MaskHelper"],
function(Resources, GeneralDetails, OrderConfigurationConstants, BusinessRuleModule, MoneyModule,
	VisaHelper, ProcessModuleUtilities, MaskHelper) {
return {
...
methods: {
	onEntityInitialized: function() {
		this.sandbox.publish("GetAccountInOrderId", { AccId: this.get("Account").value, AccDisp: this.get("Account").displayValue}, [this.sandbox.id]);
		this.callParent(arguments);
	},			
	...
messages: {
	"GetAccountInOrderId": {
	mode: Terrasoft.MessageMode.PTP,
	direction: Terrasoft.MessageDirectionType.PUBLISH
}

В карточке добавляемого в заказ продукта:

define("OrderProductPageV2", ["BaseFiltersGenerateModule", "OrderProductPageV2Resources", "GeneralDetails", "ConfigurationConstants"],
function (BaseFiltersGenerateModule, resources, GeneralDetails, ConfigurationConstants) {
return {
...
methods : {
	onEntityInitialized : function () {
		var ContrId;
		var ContrName;
		this.sandbox.subscribe("GetAccountInOrderId", function (acc) {
			ContrId = acc.AccId;
			ContrName = acc.AccName
		}, this, [this.getSenderSandboxId]);
		this.callParent(arguments);
	},
	getSenderSandboxId : function () {
		return this.sandbox.id.replace("_SectionModuleV2_OrderSectionV2_CardModuleV2_detail_ProductOrderProductOrderProductPageV200000000-0000-0000-0000-000000000000", "_SectionModuleV2_OrderSectionV2_CardModuleV2");
	},
	...
messages : {
	"GetAccountInOrderId" : {
		mode : Terrasoft.MessageMode.PTP,
		direction : Terrasoft.MessageDirectionType.SUBSCRIBE
	}

Переменные Contr - не заполняются.. :cry:
Смущает Guid.Empty в sandbox.id карточки редактирования записи детали. Но он там есть в отладчике..
И, результата все нет.. Может, неправильно выбраны методы?

Понятно, что в случае добавления новой записи Контрагент не заполнен на onEntityInitialized, тестирую на редактировании.

Guid.Empty это нормально для не сохраненного объекта, он не должен Вас смущать, более того, Вы очень грубо приводите id песочниц к единому виду. Уверен там разница минимальна, буквально в "OrderProductOrderProductPageV2", а заменять все, вместе с Guid-ом, тем более когда у карточки заказа в id песочницы явно все это остается, не стоит.

Посмотрите в отладке, Ваши ключи песочниц по которым Вы в итоге сейчас пытаетесь связать эти две карточки, явно разные. Естественно сообщение не сработает.

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

Но и это не главная ошибка.
Главная ошибка сейчас в том что вы делаете publish в методе onEntityInitialized карточки заказа, а в этот момент у вас еще не открыта даже деталь.

Еще одна ошибка, что Вы зачем-то вынесли значения переменных в начало метода onEntityInitialized карточки схемы. Они не заполнятся значениями никогда. Т.к. даже когда у вас сработает колбек месседжа подписки, то контекст его выполнения будет равен контексту объекта карточки, а не метода.

Заведите себе атрибуты в карточке детали, и заполняйте их в колбеке subscribe метода.
Либо, заполняйте сразу через this.set("имя поля") необходимые вам поля. Вы же наверно хотите заполнить какие-то поля детали автоматически? Так реализуйте вначале их. Если получаете Вы это значение не для поля, то тогда используйте атрибут.

В общем вам нужно построить приблизительно такой алгоритм:

1. В карточке заказа сделайте метод: ДетальПроситДанные() в теле которой публикуйте сообщение в песочницу с именем к примеру "ДанныеПоКонтрагентуДляДетали", и данными по контрагенту.

2. В карточке заказа сделайте подписку на сообщение, с именем к примеру "ДетальПроситДанные", в колбеке которой, дергайте свой метод ДетальПроситДанные()

3. В карточке детали в методе onEntityInitialized вначале подпишитесь на сообщение "ДанныеПоКонтрагентуДляДетали", в теле которой заполняйте свои атрибуты или поля. (собственно это результат всей нашей работы)

4. Тут же, сразу после подписки, публикуйте сообщение ДетальПроситДанные, которая инициирует вашу карточку заказа, собрать всю информацию, и отправить вам в карточку детали.

Как-то так.
Если возникнут трудности, пишите свой код сюда.
Текущий явно не может выполнить поставленную цель. Так же обратите особое внимание еще раз на то что бы Id песочниц был одинаковым.

Максим, спасибо за терпение!
Уже почти результат достигнут :) Сейчас в Заказе такие методы:

sendAccountToOrderDetail: function() {
   this.sandbox.publish("GiveAccountToOrderDetail", {
      AccId: this.get("Account").value,
      AccDisp: this.get("Account").displayValue
   }, [this.sandbox.id]);
},
onEntityInitialized : function() {
   this.callParent(arguments);	
   this.sandbox.subscribe("AskAccountFromOrderDetail", this.sendAccountToOrderDetail(), this, [this.getSenderSandboxId]);
},
getSenderSandboxId : function() {
   return "SectionModuleV2_OrderSectionV2_CardModuleV2_detail_ProductOrderProductOrderProductPageV2";
},

sandbox.id Уже вставляю константой, скопировав из отладчика. пробовал как с Guid.Empty в конце id так и без него
Судя по всему именно с этим у меня сейчас проблема.
В детали так:

onEntityInitialized : function () {
   this.callParent(arguments);
   this.sandbox.subscribe("GiveAccountToOrderDetail", function (acc) {
      this.set("UsrContragents", {
         value : acc.AccId,
         displayValue : acc.AccDisp
      });
   }, this, [this.getSenderSandboxId]);
   this.sandbox.publish("AskAccountFromOrderDetail", null, [this.sandbox.id]);
},
 
getSenderSandboxId : function () {
   return "SectionModuleV2_OrderSectionV2_CardModuleV2";
},

И никак. :(

Воссоздал пример на своей базе.
Передаю на карточку детали "Продукт в заказе", сообщение из "Заказа". С значением Id контрагента заполненного в заказе.
Прилагаю полный листинг схем как карточки, так и детали.

define("OrderPageV2", ["OrderPageV2Resources", "GeneralDetails"],
function(resources, GeneralDetails) {
	return {
		entitySchemaName: "Order",
		details: /**SCHEMA_DETAILS*/{
		}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[
		]/**SCHEMA_DIFF*/,
		attributes: {},
		methods: {
			onEntityInitialized: function() {
				this.callParent(arguments);
 
				this.sandbox.subscribe("OrderProductPageAsksForData", function(arg) {
					console.log("OrderProductPageV2 запрашивает данные прямо сейчас,");
					console.log("по Id песочницы: " + arg.sandboxId);
					// Высылаем данные.
					this.sendDataToOrderProductPage(arg.sandboxId);
				}, this, [this.sandbox.id]);
 
				console.log("Мы(OrderPageV2) подписались на сообщение: OrderProductPageAsksForData.");
				console.log("Id песочницы в этой карточке(OrderPageV2) следующий:");
				console.log(this.sandbox.id);
			},
			sendDataToOrderProductPage: function(sandboxId) {
				this.sandbox.publish("DataToOrderProductPage", { accountId: this.get("Account").value }, [sandboxId]);
				console.log("AccountId отправлен сообщением для OrderProductPageV2 по Id: " + sandboxId);
			}
		},
		rules: {},
		messages: {
			"DataToOrderProductPage": {
				mode: Terrasoft.MessageMode.PTP,
				direction: Terrasoft.MessageDirectionType.PUBLISH
			},
			"OrderProductPageAsksForData": {
				mode: Terrasoft.MessageMode.PTP,
				direction: Terrasoft.MessageDirectionType.SUBSCRIBE
			}
		},
		userCode: {}
	};
});

Схема детали:

define("OrderProductPageV2", ["BusinessRuleModule", "OrderUtilities"],
	function(BusinessRuleModule) {
		return {
			entitySchemaName: "OrderProduct",
			mixins: {},
			attributes: {},
			methods: {
				onEntityInitialized: function() {
					this.callParent(arguments);
 
					this.sandbox.subscribe("DataToOrderProductPage", function(arg) {
						console.log("OrderPageV2 передает нам данные!");
						alert("accountId: " + arg.accountId);
					}, this, [this.sandbox.id]);
 
					console.log("Мы(OrderProductPageV2) подписались на сообщение: DataToOrderProductPage.");
					console.log("По нашему(OrderProductPageV2) Id песочницы:");
					console.log(this.sandbox.id);
 
					this.sandbox.publish("OrderProductPageAsksForData", { 
						sandboxId: this.sandbox.id
					}, [this.getOrderPageSandboxId()]);
 
					console.log("Запросили данные у OrderPageV2, по её Id песочницы: " + this.getOrderPageSandboxId());
				},
				getOrderPageSandboxId: function() {
					var index = this.sandbox.id.indexOf("_detail_ProductInProducts");
					return this.sandbox.id.substring(0, index);
				}
			},
			messages: {
				"DataToOrderProductPage": {
					mode: Terrasoft.MessageMode.PTP,
					direction: Terrasoft.MessageDirectionType.SUBSCRIBE
				},
				"OrderProductPageAsksForData": {
					mode: Terrasoft.MessageMode.PTP,
					direction: Terrasoft.MessageDirectionType.PUBLISH
				}
			},
			diff: /**SCHEMA_DIFF*/[
			]/**SCHEMA_DIFF*/,
			rules: {
			}
		};
	}
);

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

Что является немного другой схемой, а именно схемой детали (OrderProductDetailV2), но, передача сообщений туда, по сути не сильно бы и отличалась. Главное понять саму механику работы с sandbox.

P.S. В результате работы вышеуказанного кода, в консоли браузера можно будет видеть:

Мы(OrderPageV2) подписались на сообщение: OrderProductPageAsksForData.
Id песочницы в этой карточке(OrderPageV2) следующий:
CardModuleV2_b8978c7f-a094-4943-bd13-2846b0ecbec9_OrderPageV2

Мы(OrderProductPageV2) подписались на сообщение: DataToOrderProductPage.
По нашему(OrderProductPageV2) Id песочницы:
CardModuleV2_b8978c7f-a094-4943-bd13-2846b0ecbec9_OrderPageV2_detail_ProductInProductsTabOrderProductOrderProductPageV200000000-0000-0000-0000-000000000000

OrderProductPageV2 запрашивает данные прямо сейчас,
по Id песочницы:
CardModuleV2_b8978c7f-a094-4943-bd13-2846b0ecbec9_OrderPageV2_detail_ProductInProductsTabOrderProductOrderProductPageV200000000-0000-0000-0000-000000000000
OrderPageV2 передает нам данные!

Ну и значение выведено алертом:

Вот это уже тянет на мануал.. Спасибо, Максим, обещаю вскоре отчитаться об успехе :)

Максим, я отразил весь ваш пример на своей базе и перепроверил и

Мы (OrderPageV2), Подписались на AskAccountFromOrderDetail, наш Sandbox.id: CardModuleV2_OrderPageV2
Мы(OrderProductPageV2) подписались на сообщение: GiveAccountToOrderDetail.
По нашему(OrderProductPageV2) Id песочницы: CardModuleV2_OrderPageV2_detail_ProductOrderProductOrderProductPageV200000000-0000-0000-0000-000000000000 
Запросили данные у OrderPageV2, по её Id песочницы: CardModuleV2_OrderPageV2

И ответ не приходит, заказ не получает сообщение и не отсылает в ответ контрагента.

В глаза бросается то, что sandbox.id в ваших логах содержит guid заказа, а в моем случае он передается и выглядит именно так, как написано в логах - без Guid. Как на Init, так и на другие события.

Версия BPM 7.5 - может это как-то влияет... следующим постом пришлю код..

Заказ:

		messages: {
			"GiveAccountToOrderDetail": {
				mode: Terrasoft.MessageMode.PTP,
				direction: Terrasoft.MessageDirectionType.PUBLISH
			},
			"AskAccountFromOrderDetail": {
				mode: Terrasoft.MessageMode.PTP,
				direction: Terrasoft.MessageDirectionType.SUBSCRIBE
			}
		},
...
onEntityInitialized : function() { // OrderPageV2
	this.callParent(arguments);
	this.sandbox.subscribe("AskAccountFromOrderDetail", function(arg) {
	    console.log("OrderProductPageV2 запрашивает данные прямо сейчас,");
  	    console.log("по Id песочницы: " + arg.sandboxId);
	this.sendAccountToOrderDetail(arg.sandboxId);
	}, this, [this.sandbox.id]);
	console.log("Мы (OrderPageV2), Подписались на AskAccountFromOrderDetail, наш Sandbox.id: " + this.sandbox.id);
},
sendAccountToOrderDetail: function(sandboxId) {
	this.sandbox.publish("GiveAccountToOrderDetail", {
		AccId: this.get("Account").value,
		AccDisp: this.get("Account").displayValue
	}, [sandboxId]);
	console.log("AccountId отправлен сообщением GiveAccountToOrderDetail для OrderProductPageV2 по Id: " + sandboxId);
},

Продукт:

		messages : {
			"GiveAccountToOrderDetail" : {
				mode : Terrasoft.MessageMode.PTP,
				direction : Terrasoft.MessageDirectionType.SUBSCRIBE
			},
			"AskAccountFromOrderDetail" : {
				mode : Terrasoft.MessageMode.PTP,
				direction : Terrasoft.MessageDirectionType.PUBLISH
			}
		},
...
onEntityInitialized: function() { // Карточка продукта в заказе
	this.callParent(arguments);
	this.sandbox.subscribe("GiveAccountToOrderDetail", function(arg) {
		this.set("UsrContragents", { value: arg.AccId, displayValue: arg.AccDisp }) 
		}, this, [this.sandbox.id]);
	console.log("Мы(OrderProductPageV2) подписались на сообщение: GiveAccountToOrderDetail.");
	console.log("По нашему(OrderProductPageV2) Id песочницы:" + this.sandbox.id);
	this.sandbox.publish("AskAccountFromOrderDetail", { sandboxId: this.sandbox.id }, [this.getOrderSandboxId]);
	console.log("Запросили данные у OrderPageV2, по её Id песочницы: " + this.getOrderSandboxId());
},
getOrderSandboxId : function() {
	var index = this.sandbox.id.indexOf("_detail_ProductOrder");
	return this.sandbox.id.substring(0, index); // обрезаем 
},

Уточнил версию :
Версия 7.5.0.1122

иногда sandbox.id в заказе бывает таким:
SectionModuleV2_OrderSectionV2_CardModuleV2
В зависимости от того, открыта ли слева в карточке заказа секция со списком заказов.
правда, на результат это не влияет.

На 7.5 проблема наблюдалась только в другом составлении ид песочницы для детали.
Получилось добиться получения ид контрагента изменением только метода getOrderSandboxId, ну и на всякий случай добавлением this. к типу и направлению сообщений.

define("OrderPageV2", ["OrderPageV2Resources", "GeneralDetails"],
function(resources, GeneralDetails) {
        return {
                entitySchemaName: "Order",
                details: /**SCHEMA_DETAILS*/{
                }/**SCHEMA_DETAILS*/,
                diff: /**SCHEMA_DIFF*/[
                ]/**SCHEMA_DIFF*/,
                attributes: {},
                methods: {
                        onEntityInitialized: function() {
                                this.callParent(arguments);
 
                                this.sandbox.subscribe("OrderProductPageAsksForData", function(arg) {
                                        console.log("OrderProductPageV2 запрашивает данные прямо сейчас,");
                                        console.log("по Id песочницы: " + arg.sandboxId);
                                        // Высылаем данные.
                                        this.sendDataToOrderProductPage(arg.sandboxId);
                                }, this, [this.sandbox.id]);
 
                                console.log("Мы(OrderPageV2) подписались на сообщение: OrderProductPageAsksForData.");
                                console.log("Id песочницы в этой карточке(OrderPageV2) следующий:");
                                console.log(this.sandbox.id);
                        },
                        sendDataToOrderProductPage: function(sandboxId) {
                                this.sandbox.publish("DataToOrderProductPage", { accountId: this.get("Account").value }, [sandboxId]);
                                console.log("AccountId отправлен сообщением для OrderProductPageV2 по Id: " + sandboxId);
                        }
                },
                rules: {},
                messages: {
                        "DataToOrderProductPage": {
                                mode: this.Terrasoft.MessageMode.PTP,
                                direction: this.Terrasoft.MessageDirectionType.PUBLISH
                        },
                        "OrderProductPageAsksForData": {
                                mode: this.Terrasoft.MessageMode.PTP,
                                direction: this.Terrasoft.MessageDirectionType.SUBSCRIBE
                        }
                },
                userCode: {}
        };
});
define("OrderProductPageV2", ["BusinessRuleModule", "OrderUtilities"],
        function(BusinessRuleModule) {
                return {
                        entitySchemaName: "OrderProduct",
                        mixins: {},
                        attributes: {},
                        methods: {
                                onEntityInitialized: function() {
                                        this.callParent(arguments);
 
                                        this.sandbox.subscribe("DataToOrderProductPage", function(arg) {
                                                console.log("OrderPageV2 передает нам данные!");
                                                alert("accountId: " + arg.accountId);
                                        }, this, [this.sandbox.id]);
 
                                        console.log("Мы(OrderProductPageV2) подписались на сообщение: DataToOrderProductPage.");
                                        console.log("По нашему(OrderProductPageV2) Id песочницы:");
                                        console.log(this.sandbox.id);
 
                                        this.sandbox.publish("OrderProductPageAsksForData", { 
                                                sandboxId: this.sandbox.id
                                        }, [this.getOrderPageSandboxId()]);
 
                                        console.log("Запросили данные у OrderPageV2, по её Id песочницы: " + this.getOrderPageSandboxId());
                                },
                                getOrderPageSandboxId: function() {
                                        var index = this.sandbox.id.indexOf("_detail");
                                        return this.sandbox.id.substring(0, index);
                                }
                        },
                        messages: {
                                "DataToOrderProductPage": {
                                        mode: this.Terrasoft.MessageMode.PTP,
                                        direction: this.Terrasoft.MessageDirectionType.SUBSCRIBE
                                },
                                "OrderProductPageAsksForData": {
                                        mode: this.Terrasoft.MessageMode.PTP,
                                        direction: this.Terrasoft.MessageDirectionType.PUBLISH
                                }
                        },
                        diff: /**SCHEMA_DIFF*/[
                        ]/**SCHEMA_DIFF*/,
                        rules: {
                        }
                };
        }
);

Если не получится и так, остается только обращаться в support@terrasoft.ru, с предоставлением учетных данных для доступа к Вашему сайту, где будет написано все вышесказанное в замещающих схемах, и останется только найти проблему, почему в конкретно вашем случае messages не отрабатывают. т.к. выше указанный код работоспособен.

Заработало! Допилил присвоение в карточке, все закрутилось-завертелось!
Большое спасибо!
Заодно получился ПочтиМануал :)

P.S. Методом массированного научного тыка обнаружилось, что в 7.7 можно получить однократно при сбросе кеша и полной перезагрузке в Chrome sandbox.id с Guid заказа.
Но при повторных обновлениях страницы или переходах по модулям Guid больше не показывается до следующего хард релоада.

Мы (OrderPageV2), Подписались на AskAccountFromOrderDetail, наш Sandbox.id: CardModuleV2_65a22318-a5ad-41e2-85a9-8c25393381e8_OrderPageV2

на 7.5 даже такого эффекта добиться не удалось :)

Максим, Добрый день! Пытаюсь в BPM 7.7 в карточке Документы сделать передачу Id контрагента в деталь с редактируемым реестром. Id аккаунта необходим для фильтрации контактов, которые выбираются на детали. Использую Ваш пример. Но в моем случае, все что находится в methods не отрабатывает. Для теста добавил функцию init, а ней debugger, функция не была вызвана.
Но правило из rules работает. Т.е. добавляю атрибут Account, значение пишу туда руками и контакты фильтруются по этому значению.
Код карточки Документы:

define('DocumentPageV2', ['DocumentPageV2Resources', 'GeneralDetails', 'BusinessRuleModule'],
function(resources, GeneralDetails, BusinessRuleModule) {
	return {
		entitySchemaName: 'Document',
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[
 
]/**SCHEMA_DIFF*/,
		attributes: {
			"UsrType": {
				dependencies : [{
					columns : ["UsrDocumentType"],
					methodName : "onDocumentTypeChanged"
				}]
			},
		},
		messages: {
			"UsrDocumentTypeColumnChanged": {
				mode: Terrasoft.MessageMode.PTP,
				direction: Terrasoft.MessageDirectionType.PUBLISH
			},
			"DataToContactInDocumentPage": {
				mode: this.Terrasoft.MessageMode.PTP,
				direction: this.Terrasoft.MessageDirectionType.PUBLISH
			},
			"ContactInDocumentPageAsksForData": {
				mode: this.Terrasoft.MessageMode.PTP,
				direction: this.Terrasoft.MessageDirectionType.SUBSCRIBE
			}
		},
		methods: {
			onEntityInitialized: function() {
				this.callParent(arguments);
				this.sandbox.subscribe("ContactInDocumentPageAsksForData", function(arg) {
					// Высылаем данные.
					this.sendDataToContactInDocumentPage(arg.sandboxId);
				}, this, [this.sandbox.id]);
			},
			sendDataToContactInDocumentPage: function(sandboxId) {
				this.sandbox.publish("DataToContactInDocumentPage", { accountId: this.get("Account").value }, [sandboxId]);
			}
		},
		rules: {
 
		}
	};
});

Код карточки детали:

define("ContactInDocumentPageV2", ["BusinessRuleModule"], function(BusinessRuleModule) {
	return {
		entitySchemaName: "ContactInDocument",
		attributes: {
			"Account": {
				dataValueType: Terrasoft.DataValueType.STRING,
				type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
				value: ""
			},
		},
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,
		messages: {
			"DataToContactInDocumentPage": {
				mode: this.Terrasoft.MessageMode.PTP,
				direction: this.Terrasoft.MessageDirectionType.SUBSCRIBE
			},
			"ContactInDocumentPageAsksForData": {
				mode: this.Terrasoft.MessageMode.PTP,
				direction: this.Terrasoft.MessageDirectionType.PUBLISH
			}
		},
		methods: {
			onEntityInitialized: function() {
				this.callParent(arguments);
				this.sandbox.subscribe("DataToContactInDocumentPage", function(arg) {
					this.set("Account", arg.accountId);
				}, this, [this.sandbox.id]);
				this.sandbox.publish("ContactInDocumentPageAsksForData", { 
					sandboxId: this.sandbox.id
				}, [this.getDocumentPageSandboxId()]);
			},
			getDocumentPageSandboxId: function() {
				var index = this.sandbox.id.indexOf("_detail");
				return this.sandbox.id.substring(0, index);
			}
		},
		rules: {
			"UsrContact": {
				FiltrationUsrContactByAccount: {
					ruleType: BusinessRuleModule.enums.RuleType.FILTRATION,
					autocomplete: true,
					autoClean: true,
					baseAttributePatch: "Account",
					comparisonType: Terrasoft.ComparisonType.EQUAL,
					type: BusinessRuleModule.enums.ValueType.ATTRIBUTE,
					attribute: "Account"
				}
			}
		}
	};
});

Помогите, пожалуйста, разобраться.

"Эмин Юнусов" написал:Помогите, пожалуйста, разобраться.

Методы из пейджа действительно работать не будут. Но вы можете написать свою фильтрацию колонки, написав её в атрибуте пейджа, в методе фильтрации. Примерно так:
http://www.community.terrasoft.ua/forum/topic/14388
Этот метод вызывается из пейджа, при работе редактируемого реестра, в момент создания конфига текущей строки.

"Мотков Илья" написал:
Но вы можете написать свою фильтрацию колонки, написав её в атрибуте пейджа, в методе фильтрации

Не получается передать accountId в функцию метода фильтрации. Через сообщение не выходит, т.к. метод завершает свою работу и функция в subscribe

this.sandbox.subscribe("DataToContactInDocumentPage", function(arg) {
                                        this.set("Account", arg.accountId);
                                }, this, [this.sandbox.id]);

вообще не отрабатывает.

Попробуйте заставить метод подождать результата. Объявите какой-нибудь флаг, и цикл пока флаг «ложь», по возвращению результата песочницей, меняйте флаг, и только тогда метод фильтрации вернет результат, с учетом того что вернула песочница.

function(query) {
  var r;
  myApi.exec('SomeCommand', function(response) {
    r = response;
  });
  while (!r) {}
  return r;
}
Показать все комментарии

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

Нравится

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

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

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

Дарья, грубо говоря «Адресное» используется если Вы хотите обратиться к какому-то конкретно модулю, а «Широковещательное» всем , кто подписан на сообщение.

Спасибо

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

Добрый день!
Возможна ли реализация такой задачи в BPM Itil:
Необходима интеграция с Microsoft Link в плане обмена сообщений.
Например, при назначении ответственного посылать ему сообщение в MS Link.

Если возможна, то с помощью каких средств?

Нравится

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

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

В базовом продукте BPM'online ITIL не предусмотрена интеграция с Microsoft Lynс. Данный вопрос можно реализовать в рамках проектного решения. Если Вас интересует доработка функциональности мы передадим этот вопрос ответственному менеджеру для согласования деталей.

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

Во-первых, Microsoft Lync, который уже Skype for Business.
И bpm'online, и Skype for Business интегрируются с Exchange. Возможно, стоит копать в эту сторону.

А где именно реализована интеграция bpm'online с Exchange? В каких сервисах?

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

Возможно, синхронизируемые сущности (письма, задачи, контакты) можно потом «с той стороны» интегрировать из Exchange в Lync. Но не факт, нужно проверять. Вот видео об интеграции Lync с Exchange.

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