Добрый день!
Столкнулся с проблемой перехвата события TreeGridDblClick: при создании пустого скрипта с кодом "return true;" окно редактирования открывается. Если вместо true вовзращать false - открывет 2 окна редактирования.
Соседние темы смотрел, GetRegisterTreeGridDblClickScript пробовал переопределять.
Подсткажите, в чём может быть проблема?
Версия 5.2.0.660

Нравится

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

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

Здравствуйте, Андрей.

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

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

Андрей, в 5.2 Вы можете переопределить GetRegisterEditPageScript для запрета обработки двойного нажатия по реестру, но нажатие на кнопку тоже обрабатываться не будет.

Его переопределять в базовом классе?
Или наследовать и переопределять?

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

returm string.Empty;

и публикуете.

Спасибо, работает.

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

Добрый день.
Подскажите и пожалуйста, как можно отключить на проверку прав ка примеру в DataSource –е можно таким образом

Terrasoft.Core.DB.QueryJoinRightLevel.Disabled;

Мне нужно отключать в

EntitySchemaQuery
, примерный скрипт ниже:

var entitySchemaManager = UserConnection.EntitySchemaManager;
var activitySchema = entitySchemaManager.GetInstanceByName("Activity");
var callEntity = activitySchema.CreateEntity(UserConnection);
if (callEntity.FetchFromDB(NewCallId))

Версия 5.1.1.159

Нравится

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

Здравствуйте, Баглан.

Отключить проверку прав доступа на основной запрос нельзя. Можно воспользоваться insert-ом:

var now = System.DateTime.Now;
var insert = new Insert(UserConnection).Into("Activity")
	.Set("Title", Column.Const("My Activity"))
	.Set("StartDate", Column.Parameter(now));
insert.Execute();

Прямые инсерты игнорируют права доступа.

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

Подскажите, пожалуйста - иногда, при сохранении контакта через OData получаем вот такую ошибку: Для параметра "P2" со значением null необходимо указать тип данных.
Подскажите, чего ей не хватает?

version="1.0" encoding="utf-8"?> xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"> /> xml:lang="ru-RU">An error occurred while processing this request.>>>Для параметра "P2" со значением null необходимо указать тип данных>>Terrasoft.Common.InvalidObjectStateException>>   at Terrasoft.DB.MSSql.MSSqlExecutor.AddQueryParameterToSqlParameters(SqlParameterCollection sqlParameters, QueryParameter queryParameter)
   at Terrasoft.DB.MSSql.MSSqlExecutor.QueryParametersToDBParameters(QueryParameterCollection queryParameters, DbParameterCollection dbParameters)
   at Terrasoft.Core.DB.DBExecutor.Execute(String sqlText, QueryParameterCollection parameters)
   at Terrasoft.Core.DB.Query.Execute()
   at Terrasoft.Configuration.ContactEventsProcess`1.UpdateCampaignTargetCustomerScriptExecute(ProcessExecutingContext context)
   at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)
   at Terrasoft.Configuration.ContactEventsProcess`1.ProcessQueue(ProcessExecutingContext context)
   at Terrasoft.Configuration.ContactEventsProcess`1.OnExecuted(Object sender, ProcessActivityAfterEventArgs e)
   at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)
   at Terrasoft.Configuration.ContactEventsProcess`1.ProcessQueue(ProcessExecutingContext context)
   at Terrasoft.Configuration.ContactEventsProcess`1.OnExecuted(Object sender, ProcessActivityAfterEventArgs e)
   at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)
   at Terrasoft.Configuration.ContactEventsProcess`1.ProcessQueue(ProcessExecutingContext context)
   at Terrasoft.Configuration.ContactEventsProcess`1.OnExecuted(Object sender, ProcessActivityAfterEventArgs e)
   at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)
   at Terrasoft.Configuration.ContactEventsProcess`1.ProcessQueue(ProcessExecutingContext context)
   at Terrasoft.Configuration.ContactEventsProcess`1.OnExecuted(Object sender, ProcessActivityAfterEventArgs e)
   at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)
   at Terrasoft.Configuration.ContactEventsProcess`1.ProcessQueue(ProcessExecutingContext context)
   at Terrasoft.Configuration.ContactEventsProcess`1.OnExecuted(Object sender, ProcessActivityAfterEventArgs e)
   at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)
   at Terrasoft.Configuration.ContactEventsProcess`1.ProcessQueue(ProcessExecutingContext context)
   at Terrasoft.Configuration.ContactEventsProcess`1.ThrowEvent(ProcessExecutingContext context, String message)
   at Terrasoft.Core.Entities.Entity.ThrowEvent(String message, EventArgs eventArgs)
   at System.EventHandler`1.Invoke(Object sender, TEventArgs e)
   at Terrasoft.Core.Entities.Entity.OnSaved(EntityAfterEventArgs e)
   at Terrasoft.Core.Entities.Entity.Save(Boolean validateRequired)
   at Terrasoft.Core.Entities.Services.EntityLazyProxy.SaveChanges()
   at Terrasoft.Core.Entities.Services.ServiceContext.SaveChanges()
   at System.Data.Services.DataService`1.BatchDataService.HandleBatchContent(Stream responseStream)>>>

Нравится

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

Здравствуйте, Леонид!
Во-первых ,обращаю Ваше внимание, что Вы создаете темы в форуме "Terrasoft CRM 2.8", что несколько сбивает с толку.
Во-вторых, по поводу самого сообщения. Судя по тексту ошибки, это исключение SQL-сервера. Нужно смотреть, какой запрос идет на сервер, чтобы понять, что не так.

Простите, Андрей, не туда запостил.
Так вот, я создаю новый контакт через Odata, а судя по тексту ошибки в этот момент зачем-то пытается вызваться некий UpdateCampaignTargetCustomerScriptExecute, хотя никаких кампаний/воздействий e нас нет.

Леонид, этот скрипт выполняется каждый раз при сохранении контакта. в нем создается запрос, в котором, вероятно, возникает ошибка:

var contactId   = Entity.GetTypedColumnValue<string>("Id"); 
new Update(UserConnection, "CampaignTarget")
	.Set("Customer", Column.Parameter(contactName))
	.Where("ContactId").IsEqual(Column.Parameter(contactId))
	.Execute();

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

var contactId   = Entity.GetTypedColumnValue<string>("Id");
if (contactId != string.Empty)
{ 
new Update(UserConnection, "CampaignTarget")
	.Set("Customer", Column.Parameter(contactName))
	.Where("ContactId").IsEqual(Column.Parameter(contactId))
	.Execute();
}
Показать все комментарии

Добрый день
Есть задача на основе существующего объекта "договоры" сделать новое рабочее место с разделом, где колонки будут другие в реестре по умолчанию.

Я как понял такая связь:
Рабочее место-Раздел-Реестр

Моя идея динамически подменять в разделе страницу реестра в зависимости от параметра.
Сейчас в private метода UpdateGrid есть:
Grid.PageSchemaUId = new Guid("dbb0c287-e452-4d51-99c1-6cd55f1fe1a8");
Хочу PageSchemaUId динамически ставить.

На какое событие лучше всего это делать?
Или есть проще варианты?

Нравится

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

Здравствуйте, Антон!
Подменять страницу реестра нужно в обработчике события "Init". Как вариант, можно создать новую страницу раздела, унаследовав ее от базовой страницы раздела договоров, в ней поменять страницу реестра на свою, и при регистрации раздела в рабочем месте уже использовать свою страницу раздела.

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

Антон, посмотрите "ScriptFindSelectedModuleSubProcess" в странице "MainPage". Там есть получение вкладки рабочего места:

var entitySchemaManager = Page.Schema.SchemaManagerProvider.GetManager("EntitySchemaManager") as Terrasoft.Core.Entities.EntitySchemaManager;
var entitySchemaQuery = new EntitySchemaQuery(entitySchemaManager, "SysModule");
EntitySchemaQueryColumn pageColumn = entitySchemaQuery.AddColumn("SysPageSchema.Id");
entitySchemaQuery.Filters.Add(entitySchemaQuery.CreateFilterWithParameters(FilterComparisonType.Equal, "Id", SelectedModuleId.ToString()));
var modulesCollection =	entitySchemaQuery.GetEntityCollection(userConnection);
if (modulesCollection.Count > 0)
{
	var selectedPageSchemaId = modulesCollection[0].GetColumnValue(pageColumn.Name);
	var workspaceId = Page.MultiLevelTabs.ActiveTab.Tag.Split('|')[0];
....

Думаю, это должно подойти.

Спасибо, разобрался.
Еще один вопрос:
Пытаюсь настроить колонки в дизайнере у реестра DataSource, но в нем не отображаются подчиненные объекты, а мне нужна колонка из него.
При этом, когда делаю настройку реестра через настроить колонки, там они есть.
Как то можно отобразить подчиненные объекты в дизайнере у DataSource ? Или как можно добавить в DataSource колонку из подчиненного объекта?

Антон,
1:

2:

"Андрей Каспаревич" написал:

Антон,

1:

2:

С уважением,

Каспаревич Андрей

Эксперт 3-й линии поддержки


Это понятно, я не об этом)
У datasource нет выбора колонок подчиненных объектов (напр Мониторинг).

Елси я правильно понял посыл Ваших скриншотов, то Мониторинг - это колонка обратной связи, поэтому ее нельзя вытащить в реестр. Как Вы себе представляете должен выглядеть реестр, если для одной записи главного объекта будет 1000 записей связанного?

"Андрей Каспаревич" написал:

Елси я правильно понял посыл Ваших скриншотов, то Мониторинг - это колонка обратной связи, поэтому ее нельзя вытащить в реестр. Как Вы себе представляете должен выглядеть реестр, если для одной записи главного объекта будет 1000 записей связанного?

С уважением,

Каспаревич Андрей

Эксперт 3-й линии поддержки


Я предполагал поведение, как если настраивать не через дизайнер колонки, т.е. идет агрегация данных(max, min, avg и т.п.).

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

"Андрей Каспаревич" написал:

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

Если Вам нужно эти данные использовать в коде, то их можно легко получить с помощью EntitySchemaQuery, например, или класса Select.

С уважением,

Каспаревич Андрей

Эксперт 3-й линии поддержки

А можете подсказать пример реестра в базовой конфигурации где DataSource определялся на основе EntitySchemaQuery?

Антон, источник данных не определяется на основе EntitySchemaQuery. С помощью EntitySchemaQuery Вы можете считать данные из БД. Зачем они Вам непосредственно в источнике данных?

Я думал у DataSource страницы на основе базовой страницы реестра как то можно привязать к EntitySchemaQuery.
Ок не будем углубляться) Сейчас я нашел решение на базе объектов-представлений и их уже к DataSource цепляю.

Спасибо.

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

Добрый день!
В процессе создается звонок и ее надо сразу же завершить, с результатом который я вставляю сам как константу?
Версия 5.1.1.159

Нравится

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

Здравствуйте, Баглан!
Можно сразу создавать активность в стадии "Завершена", либо использовать элемент "Изменить данные" для изменения стадии, или получать нужный экземпляр объекта с помощью "FetchFromDB", менять в нем нужные поля и сохранять.

"Андрей Каспаревич" написал:

Здравствуйте, Баглан!

Можно сразу создавать активность в стадии "Завершена", либо использовать элемент "Изменить данные" для изменения стадии, или получать нужный экземпляр объекта с помощью "FetchFromDB", менять в нем нужные поля и сохранять.

С уважением,

Каспаревич Андрей

Эксперт 3-й линии поддержки


либо использовать элемент "Изменить данные" для изменения стадии ----- не понял, как это сделать можно, есть примеры

Баглан, пошу прощения, в 5.1 такого элемента как "Изменить данные" нет, поэтому этот вариант отпадает.
Вы можете модифицировать действие "CallUserTask", добавив в него параметр "Состояние активности" и при создании экземпляра объекта устанавливать свойство "Status" из этого параметра. Таким образом можно будет создавать звонок сразу в состоянии "Завершен".

Спасибо большое Андрей, получилось сделать.

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

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

Мы перешли на летное время. На Windows сервере время автоматически поменялось. Но вот почему то текущая время на BPMOnline-не применяется. Дата регистрации запроса все еще указывает на зимнее время. Не значит ли это что, где-то на BPMOnline нужно поменять настройки?

Заранее спосиба.
C уважением,
Гюнель

Нравится

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

Здравствуйте, Гюнель!

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

Здравствуйте, Гюнель.

Проверьте значения в базе данных, выбрав запросом. Если там все корректно, то скорее всего необходимо просто очистить ключи на сервере сессий (Redis) и кеш/куки файлы браузеров. Так как информация по региону и часовому поясу хранится там.

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

Добрый день. При добавлении поля в объект и последующей публикации возникает следующая ошибка:

Вопрос: Как убрать эту ошибку?

Нравится

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

Обновление структуры предлагает при наличии разности в объектной модели и табличной.
Удалив новое поле в дизайнере удается опубликовать объект? Если нет, рекомендую сравнить структуру в студии и в дизайнере.
Помочь будет проще, если Вы предоставите обезличенную копию БД в техническую поддержку.

Удалив новое поле также не удалось опубликовать, публикация прошла только после того как на проблемном поле установил галочку "не проверять целостность"

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

Подскажите, как правильно добавить пользователя портала через Odata?

Я делаю так

SysAdminUnit() sau = new SysAdminUnit();
sau.LDAPEntry = stripedLogin;
sau.Name = stripedLogin;
sau.SynchronizeWithLDAP = true;
contextWin.AddToSysAdminUnitCollection(sau);
responces = contextWin.SaveChanges();

при сохранении получаю ошибку Forbidden

xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
  >4>
  xml:lang="">Forbidden>
  >
    >Forbidden>
    >System.Data.Services.DataServiceException>
    >
      at System.Data.Services.Serializers.Deserializer.HandlePostRequest()
      at System.Data.Services.DataService`1.HandlePostOperation(RequestDescription description, IDataService dataService)
      at System.Data.Services.DataService`1.ProcessIncomingRequest(RequestDescription description, IDataService dataService)
      at System.Data.Services.DataService`1.HandleNonBatchRequest(RequestDescription description)
      at System.Data.Services.DataService`1.HandleRequest()
    >
  >
>

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

Нравится

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

упс, видимо нужно создавать не SysAdminUnit а SysSSPUser, но по-прежнему возвращается ошибка Forbidden

Здравствуйте, Леонид!
Дело в том, что при работе через OData на уровне ядра запрещен доступ к системным таблицам, поэтому создавать пользователей таким образом не представляется возможным.

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

Добрый день!
Пытаюсь добавить SelectedValues в LookupEdit с помощью метода .AddValues(), но получаю ошибку:

Exception Message: Unsupported type: System.Guid. Use the JsonSerializer class to get the object's JSON representation.
Exception Type: System.ArgumentException
Exception Source: Newtonsoft.Json

Exception Stack Trace:
at Newtonsoft.Json.JsonWriter.WriteValue(Object value)
at Terrasoft.UI.WebControls.Utilities.Json.Converters.LookupSelectedValuesJsonConverter.WriteJson(JsonWriter writer, Object value, JsonSerializer serializer)
at Terrasoft.UI.WebControls.ClientConfig.ToExtConfig(PropertyInfo property, ClientConfigAttribute attr, Object objValue, Object defValue)
at Terrasoft.UI.WebControls.ClientConfig.Process(Object obj)

Кусок кода, вызывающий ошибку:
Dictionary LoadedSelectedValues = new Dictionary();
LoadedSelectedValues.Add(accountColumnName, text);
LoadedSelectedValues.Add("schemaUId", schemaUId);
Page.LookupEditSprRiskPremium.AddSelectedValue(riskRationaleId.ToString(), LoadedSelectedValues);

Terrasoft BPM 5.2.660

Нравится

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

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

Что записывается в accountColumnName?

У меня работает такое:

         var entitySchema = userConnection.EntitySchemaManager.GetInstanceByUId(schemaUId);
            string primaryDisplayColumnName = entitySchema.GetPrimaryDisplayColumnName();
            foreach (Entity entity in entityCollection)
            {
                Guid entityId = entity.GetTypedColumnValue<Guid>(entityIdColumnName);
                string entityName = entity.GetTypedColumnValue<string>(entityNameColumnName);
                Dictionary<string, object> values = new Dictionary<string, object>();
                values.Add(primaryDisplayColumnName, entityName);
                values.Add("schemaUId", schemaUId);
                multiLookupEdit.SelectedValues.Add(entityId.ToString(), values);
            }

Обратите внимание на тип переменной values, дело может быть в ней.

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

BPM 5.4.0.317
Когда пытаюсь сделать рассылку, на кнопку "Запустить рассылку", то письма не отсылаются, а появляется ошибка "The server rejected the specified sender email address. The server responded: 530 5.7.1 Client was not authenticated". Точно такая же ошибка на отправку обычного письма.
Все параметры для отправки почты занесены в системные настройки. На всякий случай, пользователю делающему рассылку указал тот же e-mail, что и в настройках.
Скрипт

var Smtp = new SmtpClient(GetSysSettingsValue("SmtpHost"), Convert.ToInt32(GetSysSettingsValue("SmtpPort")));
Smtp.Credentials = new NetworkCredential(GetSysSettingsValue("SmtpUserName"), GetSysSettingsValue("SmtpUserPassword"));
Smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
       
MailMessage Message = new MailMessage();

Message.From = new MailAddress(GetSysSettingsValue("MassMailingFromAddress"));
Message.To.Add(new MailAddress("xxx@xxx.xxx"));
Message.Subject = "test subject";
Message.Body = "test body";
Message.IsBodyHtml = true;

Smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
try
{
   Smtp.Send(Message);
}
catch (SmtpException e)
{
}
return true;

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

Нравится

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

Здравствуйте, Александр Владимирович!

В ходе удаленного подключения проблема была решена исправлением в методе SendMessage объекта
SmtpClient создания объекта server.

var server = new SmtpServer(_credentials.Host, _credentials.UserName, _credentials.UserPassword) {
		  Port = _credentials.Port,
		  SslMode = _credentials.UseSsl ? SslStartupMode.OnConnect : SslStartupMode.Manual,
		  Timeout = _credentials.Timeout,
};

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

Напишу тут.
Андрей, помните у нас после этой письмо отправлялось, но возникла другая ошибка.
Дело в том, что в скрипте smtp после отправления письма bpm пытался найти status(состояние)
активности с кодом Finish и кое-где напрямую id

activity.SetColumnValue("StatusId", "4BDBB88F-58E6-DF11-971B-001D60E938C6");

Но с таким id и кодом "Finish" не было в базе (уж не знаю наши молодцы удалили или же terrasoft забыл добавить), но изменил "Finish" на "Done" и этот id поменял на другой и теперь все в порядке.

Здравствуйте, Александр Владимирович!

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

Если данная ошибка и имела место быть, то в самых ранних сборках BPMonline 5.4.

В более поздних релизах подобных ошибок замечено не было.

В любом случае, спасибо!

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