Есть проблема: При удалении записи(допустим контакта) нужно сделать обработку контрагента этого контакта. Можно ли в БП как то узнать контрагента этого контакта? И если нет, то как вообще это сделать? Только на стороне клиента?

Нравится

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

В объекте можно отловить событие Deleted (После удаления записи). В БД записи уже не будет, но из текущей Entity вы еще сможете получить контрагента.

Entity.GetTypedColumnValue<Guid>("AccountId");

Добрый день. Нужно на уровне объекта Контакт (в данном случае) создать событийный процесс сигналом для начала которого будет сообщение "Перед удалением записи" (ContactDeleting) , там считать данные этой записи (контрагента) и выполнить какую-то логику, это будет происходить все на сервере



Либо в БП просто началом процесса назначить сигнал "Удаление записи" 

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

Колодяжный Владислав Эдуардович,

перед удалением - это 100% удаление потом будет?

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

В БП после события удаления я могу влепить элемент чтения(прочитать поле контрагент) потом посчитать к примеру кол-во контактов в контрагенте - посчитает с удаленным или без?

В объекте можно отловить событие Deleted (После удаления записи). В БД записи уже не будет, но из текущей Entity вы еще сможете получить контрагента.

Entity.GetTypedColumnValue<Guid>("AccountId");

Радчук Виталий Владимирович,

В БП посчитает с "удаленным". Как раз недавно столкнулся. (Физически запись еще не удалена). Оптимальным решением будет написание логики в объекте на событии "После удаления записи".

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

Пащенко Александр Сергеевич пишет:

то что нужно! 

Радчук Виталий Владимирович пишет:

В БП после события удаления я могу влепить элемент чтения(прочитать поле контрагент) потом посчитать к примеру кол-во контактов в контрагенте - посчитает с удаленным или без?

Считайте количество контактов, без учёта (AND Id <>...) Id удаляемой записи , получаемого в сигнале

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

Привет всем !,

возникает ошибка при создании нового раздела,

Ошибка: Ссылка на объект не указывает на экземпляр объекта..



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

Нравится

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

1. Какой пакет у Вас указан в системной настройке 'CurrentPackageId'?

2. Какие права у пользователя, под которым создается новый раздел?

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

1. Значение по умолчанию: Custom

2. Права Системного Администратора

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

Либо превышена максимальная длина названия объекта, ограничения были в старых версиях везде, а сейчас оставлены при работе с Oracle.

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

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

Создавал со всеми возможными вариантами ...

Решение: переключится на вкладку "Страница" потом на "Раздел" и сохранить, и это вроде сработало

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

Добрый день!

Не обессудьте первый день рою bpm.

Увидел две таблицы: "Пользователь портала" и "Пользователи/роли (Представление)". В чем разница?

Я так понимаю чтобы добавить пользователя портала нужно добавить запись в таблицу "Пользователи/роли (Представление)"

Делаю через действия системы "Добавить данные" и он мне выдает ошибку: System.NullReferenceException: Object reference not set to an instance of an object.

Ошибка сама по себе понятна после выполнения результат данного действия равен NULL, вопрос почему? Или Таблица "Пользователи/роли (Представление)" вовсе не таблица, а как и написано в скобках это View и пользователя портала (системы) нужно добавлять как-то по другому.

И самый главный вопрос где прочитать? про это все можно искал в академии: толи там нет, толи искалка еще не выросла

Нравится

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

Да, это - view. На основе SysAdminUnit.

Не нашел таблицу "Пользователь портала", но примерный алгоритм работы ролей и пользователей в bpm:

1) все роли и пользователи хранятся в SysAdminUnit (да, это помойка из кучи записей, с разными типами)

2) в SysUserInRole задаётся связь роли (из SysAdminUnit) с контактом (из того же SysAdminUnit)

Как-то так. И да, почитать - нигде. У нас тут практикуется исключительно хождение по граблям. Странный способ получения экспириенса, но какой есть...

Чисто для примера: я вот тут вчера узнал, что система в деталях возвращает UsrDate(поле типа DateTime из карточки родителя, подтягивал через аттрибуты) в виде строки. А при заходе в страницу редактирования той же самой записи, тот же самый код возвращает UsrDate, но уже в типе DateTime. Так и живем ¯\_(ツ)_/¯

Да, это - view. На основе SysAdminUnit.

Не нашел таблицу "Пользователь портала", но примерный алгоритм работы ролей и пользователей в bpm:

1) все роли и пользователи хранятся в SysAdminUnit (да, это помойка из кучи записей, с разными типами)

2) в SysUserInRole задаётся связь роли (из SysAdminUnit) с контактом (из того же SysAdminUnit)

Как-то так. И да, почитать - нигде. У нас тут практикуется исключительно хождение по граблям. Странный способ получения экспириенса, но какой есть...

Чисто для примера: я вот тут вчера узнал, что система в деталях возвращает UsrDate(поле типа DateTime из карточки родителя, подтягивал через аттрибуты) в виде строки. А при заходе в страницу редактирования той же самой записи, тот же самый код возвращает UsrDate, но уже в типе DateTime. Так и живем ¯\_(ツ)_/¯

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

Спасибо

Но я так понимаю в эти таблицы нельзя добавить данные через элемент бизнес-процесса "Добавить данные" (не представлены в выборе объектов для добавления) и нужно писать скриптом?

Красильников Аександр,

Есть, просто называются "Объект администрирования" и "Вхождение пользователя в роли"

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

Где можно узнать, "Понятное имя" таблиц БД?

В разделе «Конфигурация».

Или в базе в свойствах таблицы:

Красильников Аександр,

Используются для выбора заголовки таблиц

Всем спасибо за оперативные ответы

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

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

Нравится

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

Добрый день! вот ссылка на статью https://academy.terrasoft.ru/documents/technic-bpms/7-12/element-proces…

 

Метод Get возвращает значение параметра элемента или процесса.

Сигнатура метода:

Get<T>(string path)

где:

T — тип значения параметра;

path — строка, определяющая путь к параметру или свойству. Путь формируется согласно правилам:

•“имя параметра”,

•“имя свойства”,

•“имя элемента.имя параметра”,

•“имя элемента.имя свойства”

Добрый день! вот ссылка на статью https://academy.terrasoft.ru/documents/technic-bpms/7-12/element-proces…

 

Метод Get возвращает значение параметра элемента или процесса.

Сигнатура метода:

Get<T>(string path)

где:

T — тип значения параметра;

path — строка, определяющая путь к параметру или свойству. Путь формируется согласно правилам:

•“имя параметра”,

•“имя свойства”,

•“имя элемента.имя параметра”,

•“имя элемента.имя свойства”

Вы можете нужные Вам значения из элемента "Читать данные" добавить в параметры бизнес-процесса (БП), а потом в элементе "Задание-сценарий" вычитать их из параметров БП с помощью метода Get

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

В Terrasoft CRM 3.X был раздел опросы, в котором можно было вносить информацию по опросам целевой аудитории.

Хотелось бы уточнить есть ли в bpm'online marketing возможность вносить информацию по опросам целевой аудитории, по заранее преднастроенной анкете, потому что в документации такую информацию не нашла.

Если нет, то, возможно, есть расширение на marketplace или у кого-то был опыт подобного решения?

Нравится

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

Привет, думаю что тебе подойдет  решение Google Forms connector for bpm'online

 

решение Inbook Connector for bpm'online

решение SurveyMonkey Connector for bpm'online

или дополнение для управления анкетами и опросами в bpm'online Questionnaire management for bpm'online

 

 

Привет, думаю что тебе подойдет  решение Google Forms connector for bpm'online

 

решение Inbook Connector for bpm'online

решение SurveyMonkey Connector for bpm'online

или дополнение для управления анкетами и опросами в bpm'online Questionnaire management for bpm'online

 

 

Очень странно, что в базовой версии bpm'online marketing, нет такой нужной для маркетологов функциональной возможности.

Более того, даже ПО для программ лояльности, каковым было bpm'online Loyalty 5.3, сейчас представлено сторонними Loyalty on bpm'online от ПТ и TSI Loyalty on bpm'online от TSI.

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

Выше представлены коннекторы к готовым платформа, однако имеется опыт разработки локального решения. 

Все сводилось к restAPI (получение информации от сервиса о совершенных опросах), json ответ парсился вставлялся в подготовленный раздел (простая карточка, правда с кучей деталей а-ля: Вопросы, Ответы. В записях с вопросами/ответами - тип вопроса, варианты, вес и т.п) Выглядело Громоздко и непонятно для пользователя. Однако если натянуть данные на view и на её основании строить график, то в принципе читаемо

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

А мне как раз такой раздел нужен не для аналитики, а для внесения информации.

То есть меня интересует инструмент для удобного ведения и внесения данных.

В службе поддержки мне ответили, что я первая спрашиваю о такой функциональности, поэтому вероятность её реализации в одной из следующих версий очень низкая)))

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

Добрый день! На демо-версии решил ознакомится с прогнозированием пола контакта. В модели машинного обучения его активировал. А как запустить прогнозирование? На академии не нашел информации.

Спасибо!

Нравится

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

Добрый день, а вы переобучили модель? и достаточно ли ей данных для обучения?

Колодяжный Владислав Эдуардович,

Там написано, что обучения завершено. Я так понимаю, что данная модель обучена в коробке. Или я не прав?

Модель по полу по умолчанию отключена.

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

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

Добрый день!

 

Версия 7.12.3.

Столкнулся с проблемой, одному из пользователей (upd: на самом деле не одному, проблемы точно нет у cупервизора) система не позволяет менять/удалять инфу на детали Средства связи в Контакте (добавлять разрешает). Происходит это не у всех контактов, только на некоторых, системы еще не обнаружил (upd: обнаружил - сбой на контактах, заведенных после 16 августа сего года включительно).

BatchQuery возвращает сообщение об ошибке из темы, сама CRM показывает:

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

Права на объект вроде по умолчанию.

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

Что это за глюк?

Нравится

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

Попробуйте перераздать права на через решение Access rights setup wizard for bpm'online

А объект "Контакт" администрируется?

Судя по настройкам, нет.

Хотя на вкладке "Доступ к записям по умолчанию:" есть записи.

Тогда странно. Я бы попробовал встать дебаггером в функцию getValidationMessage. Сообщение похоже на то, что данная функция должна возвращать.

Не, сообщение приходит в ответ на 0/DataService/json/SyncReply/BatchQuery.

"Трасформируется" (неправильно) для вывода на экран в методе onSaved от BaseCommunicationDetail.

 

Борис Леонов,

Добрый день! В объекте детали ContactCommunication в свойстве "Доступ" у вас стоят где нибудь выбранные пункты?("По операциям, по колонкам и др."). Для полного доступа галочки напротив данных полей должны отсутствовать.

 

engineer7,

нет, галочки не установлены

Борис Леонов,

возможно данная статья сможет Вам помочь: https://academy.terrasoft.ru/documents/sales-enterprise/7-10/detal-dostup-k-obektu-razdela-dostup-k-obektam

engineer7,

на детали, указанной в статье, пусто, нет ни одной записи

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

А нет другой логики на сигналы с детали (в том числе на уровне объектных бп)?

Если есть доступ в базу, можно посмотреть скрытые в интерфейсе таблицы прав SysContactRight и SysContactCommunicationRight, если они есть. Отфильтровать по Id контактов и записей на детали средств связи, взяв примеры, созданные до и после 16. Может, права почему-то всё же выдались. Например, если тогда кто-то менял настройки прав для объекта и вернул как было.

Также можно попробовать включить по объектам Contact и/или ContactCommunication права по записям, а потом обратно выключить. Возможно, при прошлом выключении был сбой и не выключилось полностью. Лучше перед этим сделать бекап или проверять на копии базы.

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

 

 

Попробуйте перераздать права на через решение Access rights setup wizard for bpm'online

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

Коллеги доброго времени суток!

Реализовал деталь с редактируемым реестром и карточкой редактирования записи код ниже:

define("AbAccountProductDetail",
	["ConfigurationEnums", "ConfigurationGrid", "ConfigurationGridGenerator", "ConfigurationGridUtilities"],
	function (enums) {
		return {
			entitySchemaName: "AbAccountProduct",
			attributes: {
				"IsEditable": {
					dataValueType: Terrasoft.DataValueType.BOOLEAN,
					type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
					value: true
				}
			},
			mixins: {
				ConfigurationGridUtilities: "Terrasoft.ConfigurationGridUtilities"
			},
			methods:{
				init: function() {
					this.callParent(arguments);
					this.sandbox.subscribe("[AbAccountProductEntityEventListner]:[RequestToPlatform]:[Exception]", this.accountProductEntityListnerMsgHandler, this);
				},
 
				/*Overrided "BaseGridDetailV2"*/
				editRecord: function(record) {
					var activeRow = record || this.getActiveRow();
					if (!activeRow) {
						return;
					}
					if (!this.getIsCardValid()) {
						return;
					}
					var isCardChanged = this.getIsCardChanged();
					var primaryColumnValue = typeof activeRow === "object" ? activeRow.get(activeRow.primaryColumnName) : activeRow;
					var typeColumnValue = this.getTypeColumnValue(activeRow);
					this.setLastActiveRow(primaryColumnValue);
					if (isCardChanged) {
						this.set("CardState", enums.CardStateV2.EDIT);
						this.set("EditPageUId", typeColumnValue);
						this.set("PrimaryValueUId", primaryColumnValue);
						var args = {
							isSilent: true,
							messageTags: [this.sandbox.id]
						};
						this.sandbox.publish("SaveRecord", args, [this.sandbox.id]);
					} else {
						this.openCard(enums.CardStateV2.EDIT, typeColumnValue, primaryColumnValue);
					}
				},
 
				accountProductEntityListnerMsgHandler: function() {
					Terrasoft.ServerChannel.on(Terrasoft.EventName.ON_MESSAGE,
					function(scope, message){
							if (!message || message.Header.Sender !== "[AbAccountProductEntityEventListner]:[RequestToPlatform]:[Exception]") {
							return;
						}
						var message2 = message.Body;
						if (!this.Ext.isEmpty(message2)) {
							window.console.info(message2);
							this.Terrasoft.showInformation(message2);
						}
					}, this);
				}
			},
			diff: [
				{
					"operation": "merge",
					"name": "DataGrid",
					"values": {
						"className": "Terrasoft.ConfigurationGrid",
						"generator": "ConfigurationGridGenerator.generatePartial",
						"generateControlsConfig": { "bindTo": "generateActiveRowControlsConfig" },
						"changeRow": { "bindTo": "changeRow" },
						"unSelectRow": { "bindTo": "unSelectRow" },
						"onGridClick": { "bindTo": "onGridClick" },
						"activeRowActions": [
							{
								"className": "Terrasoft.Button",
								"style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
								"tag": "save",
								"markerValue": "save",
								"imageConfig": { "bindTo": "Resources.Images.SaveIcon" }
							},
							{
								"className": "Terrasoft.Button",
								"style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
								"tag": "card",
								"markerValue": "card",
								"imageConfig": { "bindTo": "Resources.Images.CardIcon" }
							},
							{
								"className": "Terrasoft.Button",
								"style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
								"tag": "cancel",
								"markerValue": "cancel",
								"imageConfig": { "bindTo": "Resources.Images.CancelIcon" }
							},
							{
								"className": "Terrasoft.Button",
								"style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
								"tag": "remove",
								"markerValue": "remove",
								"imageConfig": { "bindTo": "Resources.Images.RemoveIcon" }
							}
						],
						"initActiveRowKeyMap": { "bindTo": "initActiveRowKeyMap" },
						"activeRowAction": { "bindTo": "onActiveRowAction" },
						"multiSelect": false
					}
				}
			]
		};
	});

Пришлось переопределить editRecord():

 

var primaryColumnValue = typeof activeRow === "object" ? activeRow.get(activeRow.primaryColumnName) : activeRow;

т.к. дальше не срабатывало.

сейчас работает - http://prntscr.com/lfe61n

но при переходе на страницу редактирования поле для связи не заполняется - http://prntscr.com/lfe6k4

Подскажите в чем может быть дело?

Заранее благодарен.

Нравится

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

Попробуйте например вызывать openCardInChain и передавать туда значения по умолчанию

 

addChildRecord: function(typeColumnValue, date) {
var selectedItem = this.get("ActiveRow");
var defaultValues = [];
defaultValues.push({
	name: "ParentId",
	value: typeColumnValue
});
defaultValues.push({
	name: "UsrDate",
	value: date
});
var config = {
	sandbox: this.sandbox,
	schemaName: this.getEditPageSchemaName(typeColumnValue),
	operation: ConfigurationEnums.CardStateV2.ADD,
	moduleId: this.getChainCardModuleSandboxId(typeColumnValue),
	defaultValues: defaultValues
};
this.openCardInChain(config);
},

 

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

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

Попробуйте например вызывать openCardInChain и передавать туда значения по умолчанию

 

addChildRecord: function(typeColumnValue, date) {
var selectedItem = this.get("ActiveRow");
var defaultValues = [];
defaultValues.push({
	name: "ParentId",
	value: typeColumnValue
});
defaultValues.push({
	name: "UsrDate",
	value: date
});
var config = {
	sandbox: this.sandbox,
	schemaName: this.getEditPageSchemaName(typeColumnValue),
	operation: ConfigurationEnums.CardStateV2.ADD,
	moduleId: this.getChainCardModuleSandboxId(typeColumnValue),
	defaultValues: defaultValues
};
this.openCardInChain(config);
},

 

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

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



У меня такой кейс:

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



Вопрос:

Вопрос в том где происходит просчет продолжительности нахождения на стадии, и где эти просчеты добавляются в деталь ?



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

Нравится

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

Это реализовано в БП объекта Case пакета SLM на событии после сохранения. См. функцию SaveLifecycle и вызываемые из неё функции ClosePreviousInterval и OpenNewInterval.

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

Спасибо огромное, нашел

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

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

Все работает

Terrasoft.sdk.Model.addBusinessRule("Account", {

    ruleType: Terrasoft.RuleTypes.Visibility,

    conditionalColumns:

        [

            {name: "UsrStage", value: "a5d0ceac-3ef4-45e0-be25-af3a1190f6f9"}

        ],

        triggeredByColumns: ["UsrStage"],

        dependentColumnNames: ["UsrInstalationDate"]

    }

);

Как сделать такое же правило, но для признака "обязательно для заполнения".

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

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

 

 

Нравится

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

Requirement правило не поможет в данном случае. Нужно использовать Custom. Что-то вроде этого.

Terrasoft.sdk.Model.addBusinessRule("UsrMyModel", {
    name: "RuleName",
    ruleType: Terrasoft.RuleTypes.Custom,
    triggeredByColumns: [/*Список колонок, которые активируют правило*/],
    events: [Terrasoft.BusinessRuleEvents.Load, Terrasoft.BusinessRuleEvents.ValueChanged, Terrasoft.BusinessRuleEvents.Save],
    executeFn: function(record, rule, column, customData, callbackConfig) {
        var hasError = false; //булевая переменная, указывающая корректность поля.
        var errorMessage = "Необходимо указать значение."; // Сообщение об ошибке.
        //Выполняем нужный код, определяющий наличие ошибки
        record.changeProperty("UsrMyColumn", {
            isValid: {
                value: hasError,
                message: errorMessage
            }
        });
        Ext.callback(callbackConfig.success, callbackConfig.scope);
    }
});

 

Обязательность задаётся как Terrasoft.RuleTypes.Requirement. В конфигурации есть много примеров использования. Например, в MobileContactAddressModelConfig так:

Terrasoft.sdk.Model.addBusinessRule("ContactAddress", {
    name: "ContactAddressRequirementRule",
    ruleType: Terrasoft.RuleTypes.Requirement,
    requireType: Terrasoft.RequirementTypes.OneOf,
    triggeredByColumns: ["Address", "City", "Country"],
    position: 3
});

 

Поясните, что сделает это правило? Все колонки указанные в triggeredByColumns буду обязательные? Мне примерно также нужно, только в зависимости от значения определенного поля.

Requirement правило не поможет в данном случае. Нужно использовать Custom. Что-то вроде этого.

Terrasoft.sdk.Model.addBusinessRule("UsrMyModel", {
    name: "RuleName",
    ruleType: Terrasoft.RuleTypes.Custom,
    triggeredByColumns: [/*Список колонок, которые активируют правило*/],
    events: [Terrasoft.BusinessRuleEvents.Load, Terrasoft.BusinessRuleEvents.ValueChanged, Terrasoft.BusinessRuleEvents.Save],
    executeFn: function(record, rule, column, customData, callbackConfig) {
        var hasError = false; //булевая переменная, указывающая корректность поля.
        var errorMessage = "Необходимо указать значение."; // Сообщение об ошибке.
        //Выполняем нужный код, определяющий наличие ошибки
        record.changeProperty("UsrMyColumn", {
            isValid: {
                value: hasError,
                message: errorMessage
            }
        });
        Ext.callback(callbackConfig.success, callbackConfig.scope);
    }
});

 

Бершеда Д. Н.,

Спасибо за ответ.

Можно, пожалуйста, на простом примере объяснить?

 

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