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

Подскажите кто нибудь сталкивался с такой реализацией, в модальном окне есть справочное поле с типом Terrasoft.ContentType.LOOKUP?

Если задаю данный тип то не работает, при нажатии на лупу открывается модуль справочника но в нем пусто: http://prntscr.com/m0klnc http://prntscr.com/m0kmde

если делать через Terrasoft.ContentType.ENUM то все работает.

 

{
					"operation": "insert",
					"name": "Contact",
					"parentName": "WaChangeResponsibleModulePageSelectionEditContainer",
					"propertyName": "items",
					"values": {
						"layout": {
							"colSpan": 23,
							"rowSpan": 1,
							"column": 0,
							"row": 0,
							"layoutName": "WaChangeResponsibleModulePageSelectionEditContainer"
						},
						"bindTo": "Contact",
						"contentType": Terrasoft.ContentType.ENUM,
						"labelConfig": {"visible": false},
						"hasClearIcon": false,
						"enableRightIcon": true,
						"controlConfig": {
							"placeholder": "$Resources.Strings.WaContactPlaceholderText",
							"classes": ["placeholderOpacity"],
						},
						"minSearchCharsCount": 1,
						"searchDelay": 50
					}
				},

 

Нравится

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

Все всплывающие окна реализованы через ModalBox и, грубо говоря, нельзя ими спамить. Активно всегда только 1 окно. Именно поэтому в миникарточках одни ENUM-ы)

Все всплывающие окна реализованы через ModalBox и, грубо говоря, нельзя ими спамить. Активно всегда только 1 окно. Именно поэтому в миникарточках одни ENUM-ы)

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

понял, благодарю

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

Добрый день!



Решаем следующую задачу:

Имеется таблица контактов с полями (6 штук). Необходимо по каждому контакту запустить БП со всеми значениями. Пока посмотрели в пример на академии и ничего не выходит. Идея простая - идти по строчкам таблицы и запускать БП со значениями полей. Но как это реализовать абсолютно непонятно. Как "превратить" классический select в что-то понятное?

Нравится

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

Быстров Сергей,

Не все так строго. Можно создать пустой объект без наследований, добавить UsrId (указать его в качестве Индентификатора в св-вах объекта, во вью генерить через newId), накидать других полей через Usr как и во вью. Ну и проставить галку "Представление в БД".

В таком случае мало мусорных полей и из C# работать с объектом можно. Но. Такие объекты нельзя использовать в аналитике. Т.к. там в каком-то генераторе зашито(!!!), что у объектов первичный ключ всегда называется "Id". Такие пироги.

"Как "превратить" классический select в что-то понятное?" - Что, простите?))

Попробуйте так в скрипттаске:

var connection = Get<UserConnection>("UserConnection");
var esq = new EntitySchemaQuery(connection.EntitySchemaManager, "Contact");
esq.AddAllSchemaColumns();
//esq.Filters.Add(esq.CreateFilterWithParameters(FilterComparisonType.Equal, "Name", somename));
EntityCollection entities = esq.GetEntityCollection(connection);
foreach (Entity contact in entities) {
    connection.ProcessEngine.ProcessExecutor.Execute("MyCoolProcess",
    new Dictionary<string, string> {
 
        { "ContactId", contact.PrimaryColumnValue.ToString() },
        { ".....", .... }
 
    });
}

 

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

Забыл сказать, объекта у меня нет - обращаюсь к view таблице. Поэтому и использовал селект - он работах хорошо.

Быстров Сергей,

Сделайте объект под view. Все лучше, чем dbexecutor-ами ковыряться)

Так создайте объект и привяжите к view (в свойствах есть галочка).

А если хотите именно Select, там тоже можно цикл и читать несколько колонок:

string schemaName = string.Empty;
Guid objectId = Guid.Empty;
Guid groupId = Guid.Empty;
var selectObjectSchemaName = new Select(userConnection)
	.Column("VwSysSchemaInfo", "Name")
	.Column("MonitoringIndicators", "Object")
	.Column("MonitoringIndicators", "MonitoringGroup")
	.From("MonitoringIndicators")
	.LeftOuterJoin("VwSysSchemaInfo").On("VwSysSchemaInfo","SysSchemaId").IsEqual("MonitoringIndicators", "Object")
	.Where("VwSysSchemaInfo", "SysSolutionId").IsEqual(Column.Parameter(userConnection.Solution.Id))
	.And("MonitoringIndicators","Id").IsEqual(Column.Parameter(Id)) 
as Select;
using (var dbExecutor = userConnection.EnsureDBConnection()) {
	using (IDataReader dr = selectObjectSchemaName.ExecuteReader(dbExecutor)) {
		while (dr.Read()) {
			schemaName = dr[0] == DBNull.Value ? string.Empty : dr.GetString(0);
			objectId = dr[1] == DBNull.Value ? Guid.Empty : UserConnection.DBTypeConverter.DBValueToGuid(dr[1]);
			groupId = dr[2] == DBNull.Value ? Guid.Empty : UserConnection.DBTypeConverter.DBValueToGuid(dr[2]);
		}
	}

 

Вариант с объектом мне нравится, но есть два нюанса:

- таблица view и поля должны быть названы с префиксом Usr (а то ругается)?

- делается наследование от базового объекта, добавляются все колонки из таблицы и ставится галочка "представление в базе". Все так?

Да. Смотрите, как сделаны существующие схемы в конфигурации, начинающиеся на «Vw».

Быстров Сергей,

Не все так строго. Можно создать пустой объект без наследований, добавить UsrId (указать его в качестве Индентификатора в св-вах объекта, во вью генерить через newId), накидать других полей через Usr как и во вью. Ну и проставить галку "Представление в БД".

В таком случае мало мусорных полей и из C# работать с объектом можно. Но. Такие объекты нельзя использовать в аналитике. Т.к. там в каком-то генераторе зашито(!!!), что у объектов первичный ключ всегда называется "Id". Такие пироги.

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

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

Быстров Сергей,

Можно пример кода, как вы пытаетесь UsrId получить?

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

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

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

Добрый день!



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



Может у кого есть понятный пример или такое реализовать проблемно?

Нравится

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

Добрый день,

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

 

UserConnection.ProcessEngine.ProcessExecutor.Execute("SxRecalcPotentialInOppNeed", 
new Dictionary<string, string> {
 
	{ "OpportunityId", opportunityId.ToString() }
 
});

 

Добрый день,

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

 

UserConnection.ProcessEngine.ProcessExecutor.Execute("SxRecalcPotentialInOppNeed", 
new Dictionary<string, string> {
 
	{ "OpportunityId", opportunityId.ToString() }
 
});

 

UserConnection.ProcessEngine.ProcessExecutor.Execute("SxRecalcPotentialInOppNeed", new Dictionary<string, string> {   { "OpportunityId", opportunityId.ToString() }   });

Пащенко Александр Сергеевич,

Я правильно понимаю, что параметры указываются в

{ "OpportunityId", opportunityId.ToString() }

а сам процесс в примере называется "SxRecalcPotentialInOppNeed"?

Это один параметр и его значение. Второй был бы следующим элементом внутри этого Dictionary, через запятую.

Быстров Сергей,

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

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

Добрый день!



Подскажите, пожалуйста, возможное решение. Может кто-нибудь сталкивался с подобной задачей. Необходимо распознать текст во входящем письме и подтянуть данные из данного письма в созданные внутри системы поля. Данные могут находиться как в теле письма (например, в созданной отправителем таблице), так и во вложении. Каким образом этот функционал внедрить в СRM, существуют ли подобного рода расширения для BPM'online?

Нравится

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

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

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

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

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

Если входящее письмо создаётся по шаблону, то это не такая сложная задача. Например, мы читаем из письма в поддержку некоторые параметры (из тела письма ищем номер после текста "Serial number:"):

string description = Get&lt;string&gt;("UsrDescription");
string usrSerialNumber = "";
Regex RegexHtml = new Regex("&lt;[^&gt;]+&gt;", RegexOptions.IgnoreCase);
 
Regex firstRegex = new Regex(@"(?&lt;=Serial number:)(.*?)(?=&lt;o:p&gt;)");
 
Match firstMatch = firstRegex.Match(description);
if (firstMatch.Success)
{
    usrSerialNumber = firstMatch.Value;
    usrSerialNumber = RegexHtml.Replace(usrSerialNumber, " ");
    usrSerialNumber= usrSerialNumber.Replace("&amp;nbsp;", " ");
    usrSerialNumber = usrSerialNumber.Trim();
}
 
Set("UsrSerialNumber", usrSerialNumber);
return true;



Если же письмо абсолютно произвольное, то это уже задача для AI

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

Cпасибо за ответ и совет, но как вы верно поняли, нужен продукт иного рода.

Владимир Соколов,

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

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

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

Добрый день!

Есть конф.сервис, метод которого вызывает сторонняя система, добавляет обращение. У обращения есть даты (регистр, реакц, решения и тд). Даты хранятся в БД в формате UTC 0.

Дата приходит ко мне по Москве (+3 часа), я из нее вычитаю эти три часа и кладу в базу.

НО потом оказывается что в базе лежит дата на два часа меньше пришедшей. (и в карточках отображается на час больше, чем нужно) Ну т.е. при сохранении в какой-то момент ТС делает плюс час, хотя у пользователя, под которым происходит авторизация, часовой пояс установлен UTC 0. 

Что это?! Объясните, как это работает О_о

Пример:

Сервис отдает то, что сохранил в базу:

и там "dateCreate\":\"2018-12-25T16:33:18Z\"

Делаю select в базу, а там:

25.12.2018 17:33:18

Но по Москве это 19:33:18

 

Нравится

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

Добрый день, если вы записываете данные в базу через Entity.Save(), то время конвертируется в UTC автоматически.

При выборке данных

- Через ESQ - получаете в часовом поясе текущего пользователя. Entity.GetTypedColumnValue<DateTime>();

- Через Select - получаете так, как хранится в базе.

 

Касательно вопроса отображения в карточке - проверьте часовой пояс в профиле пользователя и на клиентском ПК.

Если время приходит в JSON и происходит десерриализация, проверьте, какое время вы получаете в режиме отладки.

Добрый день, если вы записываете данные в базу через Entity.Save(), то время конвертируется в UTC автоматически.

При выборке данных

- Через ESQ - получаете в часовом поясе текущего пользователя. Entity.GetTypedColumnValue<DateTime>();

- Через Select - получаете так, как хранится в базе.

 

Касательно вопроса отображения в карточке - проверьте часовой пояс в профиле пользователя и на клиентском ПК.

Если время приходит в JSON и происходит десерриализация, проверьте, какое время вы получаете в режиме отладки.

Пащенко Александр Сергеевич,

есть ли разница в этом случае между 

caseItem.Save(false) и caseItem.Save()?

Пащенко Александр Сергеевич,

 у меня у пользователя часовой пояс стоит время в формате UTC 0. А сохраняет он в другом. Какая функция делает преобразования чп? Где отлаживать?

Отлаживайте код своего сервиса.

Зверев Александр, теперь я там ничего не прибавляю и не вычитаю. Время сохраняется в некорректном поясе. 

причем select getdate() на облаке возвращает время по Киеву

Если нужно чтобы дата при сохранении не конвертировалась в UTC, установите значение Kind в UTC,

например:

var caseEntity = new Case(UserConnection);
caseEntity.SetDefColumnValues();
var yourDateTime = DateTime.Parse("2018-12-25T16:33:18");
yourDateTime = DateTime.SpecifyKind(yourDateTime, DateTimeKind.Utc);
caseEntity.RegisteredOn = yourDateTime;
caseEntity.Save(false);

 

В базе должно храниться по Гринвичу, киевское время — время пользователя, под которым запущена эта серверная логика. Узнать этот пояс можно в свойстве UserConnection.CurrentUser.TimeZone. По идее, преобразовывать должны одинаково оба класса, и ESQ, и Select/Insert/Update.

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

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

Добрый день!

Bpm'online customer center. Предполагается использовать стандартный кейс в разделе [Обращения]. Так же существует около 10 категорий обращений. В зависимости от категории обращения на каждой стадии кейса должны создаваться разные задачи. Сейчас вижу один вариант решения: Создать под каждую категорию обращения свой кейс и настроить условие запуска кейса, например "Категория=Инцидент". Возможно ли решать поставленную задачу проще и не создавать такое большое количество кейсов?

Заранее спасибо!

Нравится

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

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

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

Да, стадии одинаковые. Спасибо за идею!!

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

Здравствуйте, уважаемые члены сообщества!

Подскажите, пожалуйста, как в таблице Excel перед импортом сослаться на Контакт, с которым хотелось бы связать импортируемую сделку?

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

 

Заранее благодарен за помощь! Спасибо!

 

Нравится

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

Павел, в вашей таблице с Продажами из другой CRM должен быть столбец с этими контактами. При импорте если значение Контакта в таблице Продажи совпадет со значением Контакта из bpm, то тогда они будут связаны. Если не совпадет, то тогда будет создан новый контакт в bpm

Павел, в вашей таблице с Продажами из другой CRM должен быть столбец с этими контактами. При импорте если значение Контакта в таблице Продажи совпадет со значением Контакта из bpm, то тогда они будут связаны. Если не совпадет, то тогда будет создан новый контакт в bpm

Если в таблице сделок (вероятно, Opportunity), куда загружаете данные, есть справочная колонка «Контакт» и хотите привязать по ней, то можно и в XLSX-файле с данными сделать такую колонку и наполнить её значениями, совпадающими с первичным поле (ФИО) контакта. При загрузке в справочное поле добавится Id подходящей записи.

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

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

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

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

Реализовал следующим образом

loadOrderPage: function(contact) {
				debugger;
				var requestUrl = "CardModuleV2/OrderPageV2/edit/" + Terrasoft.generateGUID();
				var params = this.sandbox.publish("GetHistoryState");
					var parameters = {
						viewModelConfig: {
							Contact: contact
						}
					};
					var stateObj = {
						operation: enums.CardStateV2.ADD,
						parameters: parameters
					};
 
					this.sandbox.publish("PushHistoryState", {
						hash: requestUrl,
						stateObj: stateObj
					});
			}

Но параметры не передаются. и не заполняются поля. Подскажите как реализовать данный кейс?

Благодарю!

Нравится

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

Алексей,

Если нужно создать сущность из карточки другой сущности, почему нельзя просто сделать esq-запрос в БД или дернуть БП/Сервис, который это сделает на бэке? Наверное, у Вас есть какие-то особые условия созданий этой сущности? 

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

Коллеги благодарю за помощь. Задача была без использования БП. Реализовал следующим образом. 

loadOrderPage: function(contact) {
				var openCardConfig = {
					hash: this.sandbox.id,
					id: "Id",
					operation: enums.CardStateV2.ADD,
					schemaName:"OrderPageV2",
					moduleId: this.sandbox.id + "_AddOrderSuccessAction",
					defaultValues: [
						{ name: "Contact", value: contact.value },
						{ name: "uphType", value: "1AC347DB-DC55-4BA9-AC59-EF23041E891B" }, //"B2B"
						{ name: "WaOrderType", value: "79BF282E-87CC-42CD-8A2A-E1147ECC4CB8" }, //"Физю лицо"
						{ name: "Owner", value: Terrasoft.core.enums.SysValue.CURRENT_USER_CONTACT.value },
						{ name: "CreatedOn", value: new Date() }
					]
				};
				this.sandbox.publish("OpenCard", openCardConfig, [this.sandbox.id]);
			}

 

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

Всем привет!

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

Пробовал через С# скрипт с кодом: MessageBox.Show("text");

Но почему-то такой возможности в bpm online нет.

Нравится

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

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

Для этого служат элементы «Вопрос пользователю», «Автогенерируемая страница» или «Преднастроенная страница».

Не совсем подходит. Это должно выгладить как уведомление, что плохо заполнено поле.  

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

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

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

Может кто-то сталкивался с функционалом выбора справочного поля из реестра с группами (то есть из раздела), на подобии подбора продуктов в заказе?

Нравится

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

Вы хотите такой же функционал повторить?

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

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

спасибо! Надеюсь, эта идея перерастет в реализацию на продуктиве.

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