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

В мобильном приложении необходимо логировать некоторые данные. В приложении есть свой логгер -  http://prntscr.com/noti8j

Подскажите где смотреть логи если назначение будет Terrasoft.LogDestination.Analytics?

 

Нравится

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

Логи Terrasoft.LogDestination.Analytics не предназначены для просмотра пользователем. Можно посмотреть только Terrasoft.LogDestination.File, сформировав письмо с отчётом для отправки.

 

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

 Благодарю.

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

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

Подскажите, пожалуйста, как в системе реализовано 2 задачи:

 

1) Шаблоны ответов представлены на английском(почему только на нём?), как сменить язык пакетно? Почему при добавлении русской локализации шаблон не переводится или не предоставляется аналог ? 

2) Если первая функция не реализована, почему нельзя выбрать весь пул ответов и сменить локализацию(пусть и пустую)? 

Нравится

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

Стандартные шаблоны предоставлены на обоих языках. Нужно открыть шаблон на редактирование и сверху будет переключение в виде двух вкладок:

chapter_content_designer.png

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

Вопрос связан с задачей загрузки курсов валют из 1С в bpmonline.

Мы написали для этого веб-сервис на стороне 1С, который в формате JSON выдает текущие курсы валют (имеется виду наши внутрикорпоративные управленческие курсы).

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

Проблема возникла с тем, что bpmonline, по каким-то неизвестным нам алгоритмам, одновременно добавляет в CurrencyRate, кроме нашей записи, еще и другие строки – «закрывает» курс с незаполненной датой окончания, добавляет еще одну запись где дата начала и дата окончания равны текущей дате и т.п.. В результате табличка курсов валют (сущность bpmonline CurrencyRate) становится нечитабельной.

Вы не подскажете, как нам правильно добавить курсы валют в сущность CurrencyRate, чтобы не срабатывали эти скрытые механизмы?

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

Нравится

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

Посмотрите это обсуждение

И если изменения вносить через Insert или Update  то БП не будут их чувствовать и срабатывать, но это не корректно зато быстро.

Посмотрите это обсуждение

И если изменения вносить через Insert или Update  то БП не будут их чувствовать и срабатывать, но это не корректно зато быстро.

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

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

Нравится

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

Добрый день!

Посмотрите тут

Сидоров Александр В.,

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

 

На esq реализовать это довольно сложно. Предлагаю сделать представление (view) и фильтровать уже на уровне представления

Либо сделать в объекте ещё одно числовое поле и при добавлении/изменении номера в БП/встроенном БП/триггере вычислять и записывать туда его длину.

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

Благодарю ваш вариант и использовали.

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

Добрый день! Прошу помочь со следующим кейсом:

В обращении при наступлении события X запускается бизнес-процесс и отправляется email. Необходимо прикрепись к нему все вложения с детали Файлы и ссылки.

Какие есть пути реализации? Заранее спасибо!

Нравится

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

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

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

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

Реализация следующая: создал активность типа Activity, заполнил обязательными для отправки письма полями, сохранил, создал несколько сущностей типа ActivityFile, ссылающихся на мою активность Activity, отправил письмо методом .Send(activityid) класса ActivityEmailSender. Тщательно продебажил метод, убедился что в собранном письме хранится коллекция из двух вложений.

Как мне отправить все вложения? Где я ошибся?

Кто-нибудь может подсказать почему выполняя отправку письма способом ниже из ActivityFile привязывается только один файл вложением, вместо двух?

var emailClientFactory = ClassFactory.Get<EmailClientFactory>(new ConstructorArgument("userConnection", UserConnection));
 
var activityEmailSender = new ActivityEmailSender(emailClientFactory, userConnection);
 
activityEmailSender.Send(activity.Id);

 

 

Отбой, все работает, одно из вложений блокировалось почтовым клиентом)

Алла Савельева, спасибо вам большое)

Омельянюк Михаил,

А можете, пожалуйста, поэтапно расписать, как Вы это реализовали?

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

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

Добрый день!



Существует следующая необходимость - изменить в уведомлениях по активностям ФИО связанного контакта на номер обращения (потому что все равно на то с кем общаться, главное знать по какому обращению надо сделать задачу и быстро перейти в это обращение). Можно ли вообще осуществить такое изменение в версии 7.13 и выше? Если до, то как это осуществить? Может кто делал что-то подобное?Изображение удалено.

Нравится

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

Можно попробовать в схеме ActivityNotificationProvider переделать функцию GetBody и остальные, где формируется список колонок.

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

Доброе утро!

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

Примечание: нужно завершать процессы группы 1 только в рамках выбранного объекта (например задолженность), при этом все процессы группы 1 должны работать по остальным записям объекта.

Нравится

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

Добрый день!

Вам нужно в процессы группы 1 вставить блок "Привязать данные к процессу". Тогда по заданной сущности сможете находить бизнес процессы (через объект SysProcessEntity: SysProcessId - ссылка на БП, EntityId - ссылка на сущность).

Завершить бизнес процессы можно через ProcessEngine (есть в UserConnnection).

Добрый день!

Вам нужно в процессы группы 1 вставить блок "Привязать данные к процессу". Тогда по заданной сущности сможете находить бизнес процессы (через объект SysProcessEntity: SysProcessId - ссылка на БП, EntityId - ссылка на сущность).

Завершить бизнес процессы можно через ProcessEngine (есть в UserConnnection).

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

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

BPMO Service Enterprise, версия 7.14.0.597

Нравится

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

Логика интеграции конкретных полей реализована в схеме LDAPUtilities, там есть структуры LdapUser и LdapGroup:

public struct LdapUser
{
	#region Fields: Public
 
	public string Id;
	public string Name;
	public string FullName;
	public string Company;
	public string Email;
	public string Phone;
	public string JobTitle;
	public bool IsActive;
	public string Dn;
	public DateTime ModifiedOn;
 
	#endregion
}
 
public struct LdapGroup
{
	#region Fields: Public
 
	public string Id;
	public string Name;
	public string Dn;
	public DateTime ModifiedOn;
 
	#endregion
 
	#region Constructors: Public
 
	public LdapGroup(string id, string name, string dn) {
		Id = id;
		Name = name;
		Dn = dn;
		ModifiedOn = DateTime.MinValue;
	}
 
#endregion
}

 И дальше есть методы, с ними работающие. Например:

private LdapUser CreateLdapUser(SearchResultEntry entry, string attributeDefValue) {
	LdapUser ldapUser = new LdapUser();
	ldapUser.Id = GetEntryIdentityAttribute(entry, _ldapUserIdentityAttribute);
	ldapUser.Name = GetEntryRequiredAttributeStringValue(entry, _ldapUserLoginAttribute);
	ldapUser.FullName = GetEntryAttributeStringValue(entry, _ldapUserFullNameAttribute, attributeDefValue);
	ldapUser.Company = GetEntryAttributeStringValue(entry, _ldapUserCompanyAttribute, attributeDefValue);
	ldapUser.Email = GetEntryAttributeStringValue(entry, _ldapUserEmailAttribute, attributeDefValue);
	ldapUser.Phone = GetEntryAttributeStringValue(entry, _ldapUserPhoneAttribute, attributeDefValue);
	ldapUser.JobTitle = GetEntryAttributeStringValue(entry, _ldapUserJobTitleAttribute, attributeDefValue);
	string accountControlAttributeValue =
		GetEntryAttributeStringValue(entry, LdapUserAccountControlAttributeName, string.Empty);
	ldapUser.IsActive = string.IsNullOrEmpty(accountControlAttributeValue) ||
		IsActive(accountControlAttributeValue);
	bool useLoginUserLDAPEntryDN = _userConnection.AppConnection.UseLoginUserLDAPEntryDN;
	ldapUser.Dn = useLoginUserLDAPEntryDN ? entry.DistinguishedName : attributeDefValue;
	ldapUser.ModifiedOn = GetEntryDateTimeAttributeValue(entry, _ldapEntryModifiedOnAttribute);
	return ldapUser;
}
 
private LdapGroup CreateLdapGroup(SearchResultEntry entry) {
	LdapGroup ldapGroup = new LdapGroup();
	ldapGroup.Id = GetEntryIdentityAttribute(entry, _ldapGroupIdentityAttribute);
	ldapGroup.Name = GetEntryRequiredAttributeStringValue(entry, _ldapGroupNameAttribute);
	ldapGroup.Dn = entry.DistinguishedName;
	ldapGroup.ModifiedOn = GetEntryDateTimeAttributeValue(entry, _ldapEntryModifiedOnAttribute);
	return ldapGroup;
}

Для добавления новых атрибутов потребуется дорабатывать по аналогии с существующими. Сами названия атрибутов, а также параметры подключения к LDAP не жёстко зашиты, а хранятся в системных настройках (все можно найти по «LDAP» в их коде) и считываются на ходу тут же в конструкторе класса LdapUtilities.

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

А можно ли замещать исходный код c#, который касается интеграции Ldap, в случае, если требуется добавить несколько новых атрибутов?

Или потребуется на уровне БП "Синхронизировать данные о пользователях с LDAP" переключаться на дублирующую логику с расширенным числом атрибутов?

Можно создать UsrLdapUtilities, скопировать базовую логику, внести свои доработки, а затем найти все использования оригинальной LdapUtilities и подменить.

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

Я верно понимаю, что замена будет идти в БП и js, а коробочный C# заменять таким образом нельзя (можно только создавать свое рядом)?

В БП можно создавать изменённые версии стандартных, они попадут с таким же именем в пакет Custom (или другой свой). Для JS есть ограничения, схемы-модули замещать нельзя.

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

Всем доброго времени суток.

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

Создал ModuleConfig, прописал в нем фильтрацию, название модуля добавил в манифест, но при отработке вываливается ошибка - http://prntscr.com/nns86h

 

Terrasoft.sdk.Module.addFilter("Activity", Ext.create("Terrasoft.Filter", {
	property: "Owner",
	value: Terrasoft.CurrentUserInfo.contactId
}));

так же не работает сортировка - http://prntscr.com/nns8sc

 

Terrasoft.sdk.GridPage.setOrderByColumns("Activity", {
	column: "StartDate",
	orderType: Terrasoft.OrderTypes.DESC
});

В чем может быть проблема?

Нравится

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

Судя по тексту сообщения, код пытается сделать вставку (push) элемента в массив, а массив равен null. Где именно и почему это происходит, можно увидеть, открыв скрипты filter.js, sdk-utils.js и module-sdk.js в указанных на экране номерах строк.

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

Добрый день, подскажите при осуществлении звонка из разных объектов (физ. лицо, активность, задолженность) звонок проходит но не устанавливается связь с объектом.

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

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

Нравится

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