Здравствуйте. Пытаюсь запустить приложение site-on на bpm 7.9. Приложение разворачивается на ISS Windows 7. Приложение на IIS поставил, путь к базе данных вроде корректно прописано, НО при старте приложения, после ввода логина и пароля, в полях входа, после нажатия кнопки "вход", появляется логотип "bpm'online", и дальше ничего не происходит, страница не грузится, просто висит логотип "bpm'online". Может кто-нибудь подскажет в чем может быть проблема? Спасибо.

Нравится

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

Проверьте, все ли необходимые компоненты IIS установлены, особенно по части net framework, было бы неплохо взглянуть на ошибки из консоли браузера при логине.

Плюс иногда помогает чистка кеша Redis, хоть это и странно для нового приложения.

"Мотков Илья" написал:

Проверьте, все ли необходимые компоненты IIS установлены, особенно по части net framework, было бы неплохо взглянуть на ошибки из консоли браузера при логине.

Плюс иногда помогает чистка кеша Redis, хоть это и странно для нового приложения.


[URL=https://hostingkartinok.com/show-image.php?id=8aa269cb6025aa7be39230db1…]

А по поводу компонентов, а какие вообще нужны ещё кроме стандартных, при включении IIS?
asp.net устанавливал дополнительно

Все компоненты IIS установлены

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

На странице https://academy.terrasoft.ru/documents/sales-enterprise/7-10/ustanovka-… есть пункт "Проверка обязательных компонентов Windows". Убедитесь что все необходимые компоненты установлены и полностью пройдитесь по данной инструкции, возможно не произвели какую то настройку.

"Мотков Илья" написал:

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

На странице https://academy.terrasoft.ru/documents/sales-enterprise/7-10/ustanovka-b... есть пункт "Проверка обязательных компонентов Windows". Убедитесь что все необходимые компоненты установлены и полностью пройдитесь по данной инструкции, возможно не произвели какую то настройку.


Компонента Microsoft .Net Framework 4.5 Advanced Services, и соответсвенно WCF службы тоже нету,хотя .Net Framework 4.6 стоит

Здравствуйте, Александр!

Попробуйте, пожалуйста, с помощью веб-установщика произвести обновление .Net Framework.

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

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

Добрый день! Столкнулся с проблемой. В моем БП имеется некий с# код, который выполняется около 10 секунд (сервер быстрее не дает) и мой БП не идет дальше и замораживает страницу на эти 10 секунд. Не подскажите возможно ли выполнить мой c# код в отдельном потоке?
Версия 7.7

Нравится

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

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

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

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

Коллеги, добрый день!
При создании активности с типом "Визит" после ее сохранения, в виде представления раздела "Расписание" в карточке изначально пишется время визита. Как его можно убрать?
Прикрепляю скриншоты, на которых видно, что сам заголовок активности формируется как и требуется. А в представлении "Расписание" перед заголовком указывается время визита, что необходимо убрать.

Нравится

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

Владимир, рекомендую обратить внимание на схему MobileActivityGridPageControllerV2 в пакете Mobile.

"Мотков Илья" написал:

Владимир, рекомендую обратить внимание на схему MobileActivityGridPageControllerV2 в пакете Mobile.


Подскажите еще, как можно, чтобы при создании активности, время назначалось не текущее как у телефона, а серверное?

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

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

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

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

iNSERT INTO SysAccountRight([Id], [RecordId], [SysAdminUnitId], [Operation], [RightLevel],SourceId)
SELECT newid(), '5BF886F2-169D-4EFF-801A-4068DA93F59F', 'ABD2896B-5212-4A7E-B371-5BE17F3DAF30', 0, 1,'{4220CFBA-0514-44CE-ADD0-109B54B52084}'

iNSERT INTO SysAccountRight([Id], [RecordId], [SysAdminUnitId], [Operation], [RightLevel],SourceId)
SELECT newid(), '5BF886F2-169D-4EFF-801A-4068DA93F59F', 'ABD2896B-5212-4A7E-B371-5BE17F3DAF30', 1, 0,'{4220CFBA-0514-44CE-ADD0-109B54B52084}'

после отработки скрипта новые записи в таблице SysAccountRight появляются , но когда выполняю изменение под этим пользователем система позволяет изменить.
Можете подсказать что я делаю не так?

Нравится

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

Само администрирование по записям включено на объекте "Контрагент"?
upd. Стоп. Натупил)
Operation:

  1. 0-чтение
  2. 1-изменение
  3. 2-удаление

RightLevel:

  1. 0-разрешено
  2. 1-разрешено с делегированием

Вы скриптом раздаёте права, а не запрещаете. Чтобы запретить, надо просто ничего не добавлять)

Коллеги, здравствуйте!

Немного о правах:
1) Права действительно забираются такими скриптами.
Разгадка почему в результате запроса:

select * from SysEntitySchemaRecOprRightLvl

2) У объекта Account должны быть включены запрещающие права (но я бы этого не рекомендовал делать)
3) Значение поля Position - играет роль:
если пользователь входит в роль, которой "Разрешено" и Position этой записи меньше Position записи пользователя, которому явно запрещено, то у пользователя будут права на запись.

P.S. Если контрагентов немного, то можно действием "Настроить права доступа" на странице контрагента настроить нужные права.

"Варфоломеев Данила" написал:

Само администрирование по записям включено на объекте "Контрагент"?

upd. Стоп. Натупил)

Вы скриптом раздаёте права, а не запрещаете. Чтобы запретить, надо просто ничего не добавлять)


если ничего не добавлять то пользователи вносят изменения.

RightLevel:

0 запрещено
1 разрешено
1 разрешено с правом делегирования

"Демьяник Алексей" написал:

Коллеги, здравствуйте!

Немного о правах:

1) Права действительно забираются такими скриптами.

Разгадка почему в результате запроса:

SELECT * FROM SysEntitySchemaRecOprRightLvl

2) У объекта Account должны быть включены запрещающие права (но я бы этого не рекомендовал делать)

3) Значение поля Position - играет роль:

если пользователь входит в роль, которой "Разрешено" и Position этой записи меньше Position записи пользователя, которому явно запрещено, то у пользователя будут права на запись.

P.S. Если контрагентов немного, то можно действием "Настроить права доступа" на странице контрагента настроить нужные права.

на обьекте Account стоит признак Администрирование по операциям
пользователь входит в группу у Все пользователи и доступ на операции Чтение Добавление Изменения

на странице контрагента нет пункта Настроить права доступа.
да и потом этих контрагентов не мало.

пробовал ставить значение Position больше и меньше , все равно изменения сохраняются.

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

Возвращаемся к основам администрирования. Есть три типа настройки прав:
1) По операциям - влияет на все записи объекта (не решает задачу)
2) По полям - определяет доступ к конкретным полям объекта
3) По записям.

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

На обьект Контрагент включено Администрирование по операциям
Хотелось бы все так скриптом решить эту задачу.

"Евдокимов Евгений" написал:Проверьте включенное администрирование по записям для объекта "Контрагент"

Повторюсь:
"Проверьте включенное администрирование по записям для объекта "Контрагент""

"Демьяник Алексей" написал:
Евдокимов Евгений пишет:

Проверьте включенное администрирование по записям для объекта "Контрагент"

Повторюсь:

"Проверьте включенное администрирование по записям для объекта "Контрагент""


оно отключено
см вложение

На пересечении названия объекта "Контрагент" и столбика "Администрируется по записям" стоит крестик.

Это значит, что администрирование по записям отключено...

"Демьяник Алексей" написал:

На пересечении названия объекта "Контрагент" и столбика "Администрируется по записям" стоит крестик.

Это значит, что администрирование по записям отключено...


"Демьяник Алексей" написал:

На пересечении названия объекта "Контрагент" и столбика "Администрируется по записям" стоит крестик.

Это значит, что администрирование по записям отключено...

Здравствуйте!
Это значит что скриптом не получиться решить эту задачу?

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

Для того, чтобы решить Вашу задачу скриптом необходимо включить "Администрирование по записям" для объекта "Контрагент".

Если администрирование по записям отключено, то при попытке изменения записи контрагента не учитываются права, которые Вы добавили скриптом в таблицу "SysAccountRight"

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

Для того, чтобы решить Вашу задачу скриптом необходимо включить "Администрирование по записям" для объекта "Контрагент".

Если администрирование по записям отключено, то при попытке изменения записи контрагента не учитываются права, которые Вы добавили скриптом в таблицу "SysAccountRight"

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

версия: 7.8
Каким образом и где можно установить фильтр грида в секции раздела в мобильном приложении? Статей по мобильной разработке мало, ничего подходящего не нашел...

Нравится

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

Можно посмотреть вот эту тему - http://www.community.terrasoft.ru/forum/topic/15395

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

"Мотков Илья" написал:

Можно посмотреть вот эту тему - http://www.community.terrasoft.ru/forum/topic/15395

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


Может сможете подсказать. В той теме хотя бы понял где и как устанавливать фильтр, но у меня не работает, и не совсем понятны некоторые моменты.
Мне надо отфильтровать Обращения, по состоянию, которые НЕ закрыты. Или хотя бы для примера SolutionOverdue, который означает "закрытие".
Добавляю в манифест фильтр:

"SyncFilter": {
					"property": "Status",
// Название модели, для которой выполняется фильтрация.
					//"modelName": "Case",
// Колонка связанной модели, по которой осуществляется связь с основной моделью.
					//"assocProperty": "Id",
					//"operation": "Terrasoft.FilterOperations.Any",
					"compareType": "Terrasoft.ComparisonType.NotEqual",
					//"value": {
						//"value": "3e7f420c-f46b-1410-fc9a-0050ba5d6c38",
						//"displayValue": "Закрыт"}
                                        "value": "3e7f420c-f46b-1410-fc9a-0050ba5d6c38"
				},

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

"SyncFilter": {
					"type:" "Terrasoft.FilterTypes.Simple",
					"property": "SolutionOverdue",
					"compareType": "Terrasoft.ComparisonType.Equal",
					"value": true
				},

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

Подскажите что не так делаю, и вообще объясните моменты с modelName и assocProperty - для чего эти значения. Коммент в примере совсем не понятно что имеется ввиду.

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

Добрый день.

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

Если возможно то как?

Нравится

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

Здравствуйте!
Такой возможности нет, если процесс завершается с ошибкой – информация об этом будет доступна только в журнале процессов.
Зарегистрировали ваше пожелание в отделе разработки.

Евгений, каким образом письмо отправляете? Если через элемент отправить E-Mail, то не получится, но можно отправлять письмо кодом на C# и обрабатывать ошибку там. Если нужно могу скинуть пример кода.

Олег, если не сложно, буду признателен.

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

Добрый день!

Столкнулся с такой проблемой: пытаюсь отправить письмо из бизнес процесса, а получаю ошибку.
Ошибка следующая:
Terrasoft.Mail.Sender.EmailException: Плохие данные.
---> System.Security.Cryptography.CryptographicException: Плохие данные.

в System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr)
в System.Security.Cryptography.Utils._DecryptData(SafeKeyHandle hKey, Byte[] data, Int32 ib, Int32 cb, Byte[]& outputBuffer, Int32 outputOffset, PaddingMode PaddingMode, Boolean fDone)
в System.Security.Cryptography.CryptoAPITransform.TransformFinalBlock(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount)
в System.Security.Cryptography.CryptoStream.FlushFinalBlock()
в System.Security.Cryptography.CryptoStream.Dispose(Boolean disposing)
в System.IO.Stream.Close()
в Terrasoft.Core.SecureTextDataValueType.GetValueForLoad(UserConnection userConnection, Object value)
в Terrasoft.Core.Entities.EntityColumnValue.LoadValue(Object value)
в Terrasoft.Core.Entities.EntityColumnValueCollection.ForceLoadColumnValue(String name, Object value)
в Terrasoft.Core.Entities.Entity.LoadShallow(IDataReader dataReader, Dictionary`2 columnMap)
в Terrasoft.Core.Entities.EntityCollection.LoadShallow(IDataReader dataReader, Dictionary`2 columnMap, Boolean needClear)
в Terrasoft.Core.Entities.EntitySchemaQuery.GetEntitySchemaEntityCollection(UserConnection userConnection, IDataReader dataReader)
в Terrasoft.Core.Entities.EntitySchemaQuery.GetEntityCollection(UserConnection userConnection)
в Terrasoft.Mail.SmtpClient.CreateMailCredentialByAddress(String address, Boolean ignoreRights)
в Terrasoft.Mail.SmtpClient.CreateSmtp(String address, Boolean ignoreRights)
в Terrasoft.Mail.SmtpClient.Send(EmailMessage emailMessage, Boolean ignoreRights)
--- Конец трассировки внутреннего стека исключений ---
в Terrasoft.Mail.SmtpClient.Send(EmailMessage emailMessage, Boolean ignoreRights)
в Terrasoft.Core.Process.Configuration.AutoEmailUserTaskSender.Execute(IEmailUserTaskMessageProvider messageProvider, ProcessExecutingContext context)
в Terrasoft.Core.Process.Configuration.EmailTemplateUserTask.InternalExecute(ProcessExecutingContext context)
в Terrasoft.Core.Process.ProcessActivity.Execute(ProcessExecutingContext context)

При разборе полётов определил что исключение вываливается в методе CreateMailCredentialByAddress класса SmtpClient, строка mailboxESQ.GetEntityCollection(_userConnection);

private MailCredentials CreateMailCredentialByAddress(string address, bool ignoreRights = false) {
var mailboxESQ = new EntitySchemaQuery(_userConnection.EntitySchemaManager, "MailboxSyncSettings");
EntitySchemaQueryColumn userNameColumn = mailboxESQ.AddColumn("UserName");
EntitySchemaQueryColumn userPasswordColumn = mailboxESQ.AddColumn("UserPassword");
EntitySchemaQueryColumn isAnonymousAuthentication = mailboxESQ.AddColumn("IsAnonymousAuthentication");
EntitySchemaQueryColumn sendEmailsViaThisAccountColumn = mailboxESQ.AddColumn("SendEmailsViaThisAccount");
EntitySchemaQueryColumn smtpHostColumn = mailboxESQ.AddColumn("MailServer.SMTPServerAddress");
EntitySchemaQueryColumn smtpPortColumn = mailboxESQ.AddColumn("MailServer.SMTPPort");
EntitySchemaQueryColumn smtpSslColumn = mailboxESQ.AddColumn("MailServer.UseSSLforSending");
EntitySchemaQueryColumn smtpTimeoutColumn = mailboxESQ.AddColumn("MailServer.SMTPServerTimeout");
IEntitySchemaQueryFilterItem senderEmailAddressFilter = mailboxESQ
.CreateFilterWithParameters(FilterComparisonType.Equal, "SenderEmailAddress", address);
mailboxESQ.Filters.Add(senderEmailAddressFilter);
if (ignoreRights) {
mailboxESQ.UseAdminRights = false;
} else {
mailboxESQ.AddRightsFilters(_userConnection.CurrentUser.Id);
}
EntityCollection mailboxEntities = mailboxESQ.GetEntityCollection(_userConnection);
var mailCredentials = new MailCredentials();
if (mailboxEntities.Count == 0) {
throw new Sender.EmailException("ErrorOnSend", MailboxDoesNotExist);
}

Entity mailbox = mailboxEntities[0];
if (!mailbox.GetTypedColumnValue(sendEmailsViaThisAccountColumn.Name)) {
throw new Sender.EmailException("ErrorOnSend", NotAllowedSendingFromThisMailbox);
}
mailCredentials.Host = mailbox.GetTypedColumnValue(smtpHostColumn.Name);
mailCredentials.Port = mailbox.GetTypedColumnValue(smtpPortColumn.Name);
mailCredentials.UserName = mailbox.GetTypedColumnValue(userNameColumn.Name);
mailCredentials.UserPassword = mailbox.GetTypedColumnValue(userPasswordColumn.Name);
mailCredentials.UseSsl = mailbox.GetTypedColumnValue(smtpSslColumn.Name);
mailCredentials.Timeout = mailbox.GetTypedColumnValue(smtpTimeoutColumn.Name) * 1000;
mailCredentials.IsAnonymousAuthentication = mailbox.GetTypedColumnValue(isAnonymousAuthentication.Name);
return mailCredentials;
}

Нравится

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

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

Судя по ошибке в поле UserPassword (таблица MailboxSyncSetting) хранится хэш, который не может быть расшифрован. Судя по всему там записано некорректное значение.

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

А по поводу алгоритма получения хэша можете сориентировать?

"Сурмачевский Евгений Александрович" написал:

А по поводу алгоритма получения хэша можете сориентировать?


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

Данные колонки необходимо использовать исключительно через EntitySchemaQuery используя формат "Secure Text"

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

Подскажите, пожалуйста, возможно ли в конфиге отфильтровать набор данных для Lookup по определенному полю. В моем случае - "BTNumber".
Вот текст конфига:
var config = {
entitySchemaName: "BTVwPCManifest",
multiSelect: true
};

Нравится

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

Разобралась самостоятельно :exclaim:
Возможно, кому-то пригодится эта информация.

Это можно реализовать таким образом:
var config = {
entitySchemaName: "BTVwPCManifest",
multiSelect: true,
sortedColumns: [{
name:"BTNumber",
orderPosition: 0,
orderDirection: Terrasoft.OrderDirection.ASC
}]
};

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

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

PS: Возможно существуют специализированные методы JS/C# ?

Нравится

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

Добрый день, Илья.

Можем предложить вам следующее решение:

UserConnection.ResetSettingsCache() – сбрасывает все кэшируемые системные настройки.
UserConnection.ResetSettingsCache(string settingsCode) - сбрасывает все кэш определенной системной настройки.

Это C# или JS имплементация методов ?

Илья, уточняю - С#

Для JS аналога нет ?
Просто вроде как изменение системной переменной которое происходит из UI, тоже корректно обновляет кешь, предполагаю что для JS в API есть аналогичные методы.

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

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

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

Всем привет!:smile:

Коллеги, кто использовал систему для расчета KPI сотрудников?
Какие использовали KPI, какие ресурсы системы использовали?

Буду очень признателен за ваши идеи и рабочие кейсы.:smile:

Нравится

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

Здравствуйте, Станислав!

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

Если речь идет о продуктах Service, то можно оценивать по:

  • количеству решенных обращений
  • % просроченных обращений
  • % обращений, решенных с первого раза
  • % просроченных обращений
  • количество обработанных звонков

Для линейки Sales можно оценивать абсолютно разные показатели:

  • количество лидов, переведенных в продажу
  • сумма оплаченных счетов
  • сумма продаж
  • вовремя завершенные проекты
  • сумма проектов

Все зависит от целей, которые ставятся перед менеджерами. Если где-то идет проседание, то на это проседание ставится упор в KPI.

Да, все верно.
Но меня интересуют реальные кейсы.
Какие критерии выбрали?
Что конкретно было сделано?
Каким образом реализован подсчет баллов?
Как это отразилось на эффективности?
Какие подводные камни?

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