Добрый день.

Суть вопроса заключается в том,что можно ли вычитать информацию из тела письма,для ее дальнейшего распределения в БП

Нравится

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

Добрый день!

Письмо с creatio сохраняется в активность. Вам можно сделать БП со стартовым сигналом [Создание активности с типом Email] и в поле Body (Тело) будет тело письма

Добрый день!

Письмо с creatio сохраняется в активность. Вам можно сделать БП со стартовым сигналом [Создание активности с типом Email] и в поле Body (Тело) будет тело письма

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

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

Задача:

На странице продуктового каталога (ProductSelectionSchema) необходимо для справочного поля [Прайс-лист] (PriceList) добавить логику фильтрации значений.

https://www.screencast.com/t/KGWpnt5Ab

 

Что попробовал:

"Классический" вариант, объявленный на замещённой странице ProductSelectionSchema. Попробовал просто скрыть "Базовый" прайс-лист.

https://academy.terrasoft.ru/documents/technic-sdk/7-15/primenenie-filtracii-k-spravochnym-polyam

Не помогло.

 

Подскажите, пожалуйста, как именно можно реализовать дополнительную логику фильтрации?

Возможно свойство filters для атрибута нужно объявить в другой схеме/модуле?

Или подскажите на какие методы обратить внимание?

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

 

Нравится

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

Титаев Александр Николаевич,

Покопался еще в коде. Именно получение запроса на выборку списка прайс-листов осуществляется в методе applyProductPriceItemsEsq (ProductSelectionQueryUtilitiesMixin).

Этот метод глобально вызывается в методе getLookupQuery (модуль

ProductSelectionSchema) по клику по лукапному полю (берется обработчик заполнения списка лукапного поля в методе getLookupColumnHandlers).

Что можно сделать:

1) Реализовать свой метод applyProductPriceItemsEsq с нужной вам фильтрацией в ProductSelectionSchema

2) Указать новый метод в getLookupColumnHandlers

3) Указать новый метод в getGridRecordByItemValues

 

Добрый день!

В указанное вами поле попадают записи с детали "Цены" объекта "Продукт" (вкладка "Цены и остатки").

Логика отбора записей реализована в ProductSelectionQueryUtilitiesMixin (метод getProductInBasePriceListEsq), который скорее всего переопределить не получится (модули переопределять нельзя в системе).

Как вариант, удалять записи "Основной" из детали "Цены" продукта. Но это крайне не рекомендуется делать, даже запрещено на уровне системы.

Спасибо за "Наводку", Александр! Думаю можно поработать с методом initCurrencies в ProductSelectionSchema. Хотя тоже не лучший вариант. Попробую всё же разобраться, как именно можно навесить обработчик с фильтром на справочную колонку, так как отключение логики пересчёта, при наличии пункта меню справочника, как вы отметили, не лучшая идея..

Титаев Александр Николаевич,

Покопался еще в коде. Именно получение запроса на выборку списка прайс-листов осуществляется в методе applyProductPriceItemsEsq (ProductSelectionQueryUtilitiesMixin).

Этот метод глобально вызывается в методе getLookupQuery (модуль

ProductSelectionSchema) по клику по лукапному полю (берется обработчик заполнения списка лукапного поля в методе getLookupColumnHandlers).

Что можно сделать:

1) Реализовать свой метод applyProductPriceItemsEsq с нужной вам фильтрацией в ProductSelectionSchema

2) Указать новый метод в getLookupColumnHandlers

3) Указать новый метод в getGridRecordByItemValues

 

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

Добрый день!

Не могу установить приложение из файлового архива.

В дебаггере браузера видно сообщение от сервера:

errorInfo: {errorCode: "NLogRuntimeException", message: "Asynchronous exception has occurred.", stackTrace: null}

Перезапускал пул и приложение - не помогло. Что делать?

Нравится

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

Сегодня попытался еще раз установить приложение - получилось. Странно. Может на сервере что-то выполнялось что мешало установить приложение?

Руслан, судя по сообщению, ошибку выдавал механизм логирования NLog. Потом, видимо, его настроили правильно (или помогла переустановка). См. похожие симптомы тут.

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

Решал ли кто-то задачу смена типа результата активности? Поделитесь опытом.

Это цвет покраски кнопок результатов активности в задачах по БП.

Нравится

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

В справочнике Результат Активности, есть 3 категории.

В зависимости от того, какая категория указана, такой цвет кнопки и будет.

Нейтральный - серый

Отрицательный - красный

Успех - зеленый


 В коде зашиты только эти три цвета и это касается задач созданных через элемент Выполнить задачу в БП



Литвинко Павел,

это прозрачно.Может можешь подсказать где зашито?

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

Добрый день! 

Пытаюсь создать уведомление: 

ISchemaManagerItem<Terrasoft.Core.Entities.EntitySchema> reportSchemaItem = UserConnection.EntitySchemaManager.GetItemByName("Contact");
Terrasoft.Core.Entities.EntitySchema remindingSchema = UserConnection.EntitySchemaManager.GetInstanceByName("Reminding");
Entity reminding = remindingSchema.CreateEntity(UserConnection);
reminding.SetDefColumnValues();
reminding.SetColumnValue("AuthorId", UserConnection.CurrentUser.ContactId);
reminding.SetColumnValue("ContactId", UserConnection.CurrentUser.ContactId);
reminding.SetColumnValue("SourceId", RemindingConsts.RemindingSourceAuthorId);
reminding.SetColumnValue("RemindTime", UserConnection.CurrentUser.GetCurrentDateTime());
reminding.SetColumnValue("SysEntitySchemaId", reportSchemaItem.UId);
reminding.SetColumnValue("LoaderId", reportSchemaItem.UId);
reminding.SetColumnValue("SubjectId", Guid.Empty);
reminding.SetColumnValue("SubjectCaption", "Caption");
reminding.Save();

на Save() возникает ошибка:

   at Ninject.KernelBase.Resolve(IRequest request, Boolean handleMissingBindings)
   at Ninject.KernelBase.Resolve(IRequest request)
   at Ninject.ResolutionExtensions.GetResolutionIterator(IResolutionRoot root, Type service, Func`2 constraint, IEnumerable`1 parameters, Boolean isOptional, Boolean isUnique)
   at Ninject.ResolutionExtensions.Get[T](IResolutionRoot root, IParameter[] parameters)
   at Terrasoft.Core.Factories.ClassFactory.<>c__DisplayClass15_0`1.<Get>b__0()
   at Terrasoft.Core.Factories.ClassFactory.GetInstance[T](Func`1 action)
   at Terrasoft.Core.Factories.ClassFactory.Get[T](ConstructorArgument[] constructorArguments)
   at Terrasoft.Configuration.RemindingEventsProcess`1.SendNotification() in C:\inetpub\BPMdevelopment\Terrasoft.WebApp\Terrasoft.Configuration\Autogenerated\Src\Reminding.NUI_Entity.cs:line 278
   at Terrasoft.Configuration.Reminding_Base_Entity_TerrasoftEventsProcess`1.OnInsertedHandle() in C:\inetpub\BPMdevelopment\Terrasoft.WebApp\Terrasoft.Configuration\Autogenerated\Src\Reminding.Base_Entity.cs:line 1229
   at Terrasoft.Configuration.Reminding_Base_Entity_TerrasoftEventsProcess`1.RemindingInsertedScriptTaskExecute(ProcessExecutingContext context) in C:\inetpub\BPMdevelopment\Terrasoft.WebApp\Terrasoft.Configuration\Autogenerated\Src\Reminding.Base_Entity.cs:line 1158
   at Terrasoft.Core.Process.ProcessScriptTask.InternalExecute(ProcessExecutingContext context)
   at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)
   at Terrasoft.Core.Process.ProcessScriptTask.Execute(ProcessExecutingContext context, Func`2 internalExecute)
   at Terrasoft.Configuration.Reminding_Base_Entity_TerrasoftEventsProcess`1.ProcessQueue(ProcessExecutingContext context) in C:\inetpub\BPMdevelopment\Terrasoft.WebApp\Terrasoft.Configuration\Autogenerated\Src\Reminding.Base_Entity.cs:line 1081
   at Terrasoft.Configuration.RemindingEventsProcess`1.ProcessQueue(ProcessExecutingContext context) in C:\inetpub\BPMdevelopment\Terrasoft.WebApp\Terrasoft.Configuration\Autogenerated\Src\Reminding.NUI_Entity.cs:line 225
   at Terrasoft.Configuration.Reminding_Base_Entity_TerrasoftEventsProcess`1.OnExecuted(Object sender, ProcessActivityAfterEventArgs e) in C:\inetpub\BPMdevelopment\Terrasoft.WebApp\Terrasoft.Configuration\Autogenerated\Src\Reminding.Base_Entity.cs:line 1032
   at Terrasoft.Core.Process.ProcessFlowElement.OnExecuted(ProcessActivityAfterEventArgs e)
   at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)
   at Terrasoft.Configuration.Reminding_Base_Entity_TerrasoftEventsProcess`1.ProcessQueue(ProcessExecutingContext context) in C:\inetpub\BPMdevelopment\Terrasoft.WebApp\Terrasoft.Configuration\Autogenerated\Src\Reminding.Base_Entity.cs:line 1086
   at Terrasoft.Configuration.RemindingEventsProcess`1.ProcessQueue(ProcessExecutingContext context) in C:\inetpub\BPMdevelopment\Terrasoft.WebApp\Terrasoft.Configuration\Autogenerated\Src\Reminding.NUI_Entity.cs:line 225
   at Terrasoft.Configuration.BaseEntity_Base_Entity_TerrasoftEventsProcess`1.ThrowEvent(ProcessExecutingContext context, String message) in C:\inetpub\BPMdevelopment\Terrasoft.WebApp\Terrasoft.Configuration\Autogenerated\Src\BaseEntity.Base_Entity.cs:line 1251
   at Terrasoft.Configuration.BaseEntityEventsProcess`1.ThrowEvent(ProcessExecutingContext context, String message) in C:\inetpub\BPMdevelopment\Terrasoft.WebApp\Terrasoft.Configuration\Autogenerated\Src\BaseEntity.LocalMessage_Entity.cs:line 257
   at Terrasoft.Configuration.Reminding_Base_Entity_TerrasoftEventsProcess`1.ThrowEvent(ProcessExecutingContext context, String message) in C:\inetpub\BPMdevelopment\Terrasoft.WebApp\Terrasoft.Configuration\Autogenerated\Src\Reminding.Base_Entity.cs:line 1345
   at Terrasoft.Configuration.RemindingEventsProcess`1.ThrowEvent(ProcessExecutingContext context, String message) in C:\inetpub\BPMdevelopment\Terrasoft.WebApp\Terrasoft.Configuration\Autogenerated\Src\Reminding.NUI_Entity.cs:line 285
   at Terrasoft.Core.Entities.Entity.ThrowEvent(String message, EventArgs eventArgs)
   at Terrasoft.Configuration.Reminding_Base_Entity_Terrasoft.<InitializeThrowEvents>b__90_2(Object s, EntityAfterEventArgs e) in C:\inetpub\BPMdevelopment\Terrasoft.WebApp\Terrasoft.Configuration\Autogenerated\Src\Reminding.Base_Entity.cs:line 741
   at System.EventHandler`1.Invoke(Object sender, TEventArgs e)
   at Terrasoft.Core.Entities.Entity.OnInserted(EntityAfterEventArgs e)
   at Terrasoft.Core.Entities.Entity.InsertToDB(Boolean skipLookupColumnValues, Boolean validateRequired)
   at Terrasoft.Core.Entities.Entity.InternalSave(Boolean validateRequired, Boolean setColumnDefValue)
   at Terrasoft.Core.Entities.Entity.Save(Boolean validateRequired, Boolean setColumnDefValue)

что я делаю не так?

Нравится

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

А какой сам текст ошибки? Он где-то над стеком.

 

Error creating an instance of the "Terrasoft.Configuration.INotificationSender" class
 
Error activating INotificationSender
No matching bindings are available, and the type is not self-bindable.
Activation path:
  1) Request for INotificationSender
 
Suggestions:
  1) Ensure that you have defined a binding for INotificationSender.
  2) If the binding was defined in a module, ensure that the module has been loaded into the kernel.
  3) Ensure you have not accidentally created more than one kernel.
  4) If you are using constructor arguments, ensure that the parameter name matches the constructors parameter name.
  5) If you are using automatic module loading, ensure the search path and filters are correct.

 

Руслан, на объекте Reminding во встроенном БП ничего не менялось? В частности, функция SendNotification у Вас стандартная?

На объекте Reminding ни чего не менялось. Хотя из приложения уведомления создаются, а из Visual Studio выбрасывается исключение. 

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

 var notificationSender = ClassFactory.Get&lt;INotificationSender&gt;( 

в функции SendNotification() встроенного БП объекта Reminding, не совместима с запуском извне. По самому сообщению обсуждают здесь.

 

Если обойти не получится, создавать запись можно внутри системы, а если нужно извне — по OData, обращением к веб-сервису или запуском БП.

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

Добрый день!

Подскажите, пожалуйста, как реализовать данный ESQ запрос:

select c.Id, c.Name, count(1) as AmountOfLeadHandled
from Lead l inner join Contact c on c.Id=l.OwnerId 
where exists (select 1 from Activity a
	where a.LeadId=l.id
	and not (a.TypeId='E2831DEC-CFC0-DF11-B00F-001D60E938C6' 
		and a.MessageTypeId='7F9D1F86-F36B-1410-068C-20CF30B39373')
	and a.StatusId in ('4BDBB88F-58E6-DF11-971B-001D60E938C6'))
	Group by c.Id, c.Name

Есть такой код:

var schema = _userConnection.EntitySchemaManager.GetInstanceByName("Lead");
EntitySchemaQuery esqTotal = new EntitySchemaQuery(schema);
esqTotal.AddColumn("=Owner.Id");
esqTotal.AddColumn("=Owner.Name");
esqTotal.AddColumn(esqTotal.CreateAggregationFunction(Terrasoft.Common.AggregationTypeStrict.Count, "Id"));
var activityTypeId = new Guid("E2831DEC-CFC0-DF11-B00F-001D60E938C6");
var activitymessageTypeId = new Guid("7F9D1F86-F36B-1410-068C-20CF30B39373");
var activityStatusId = new Guid("4BDBB88F-58E6-DF11-971B-001D60E938C6");
var esqActivity = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "Activity");
esqActivity.AddColumn("Lead");
var filtersByExisting = new EntitySchemaQueryFilterCollection(esqActivity);
filtersByExisting.IsNot = true;
filtersByExisting.Add(esqActivity.CreateFilterWithParameters(FilterComparisonType.Equal, "Type", activityTypeId));
filtersByExisting.Add(esqActivity.CreateFilterWithParameters(FilterComparisonType.Equal,                 "MessageType", activitymessageTypeId));
esqActivity.Filters.Add(filtersByExisting);
esqActivity.Filters.Add(esqActivity.CreateFilterWithParameters(FilterComparisonType.Equal,                "Status", activityStatusId));
esqTotal.Filters.Add(esqTotal.CreateFilter(FilterComparisonType.Exists, "Id", esqActivity));

Но он выдает не совсем то что надо. Мне надо выполнить условие:  

where a.LeadId=l.id

Не могу ни как добиться результата. Может кто нибудь подсказать?

Нравится

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

Добрый день!

 

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

В любой непонятной ситуации советуй view.wink

Руслан, а с чем связано требование именно при помощи ESQ?

На сервере есть класс Select, покрывающий почти все возможности его синтаксиса.

И смотрю на Ваш запрос, его точно ли нельзя «вывернуть», чтобы выборка шла из Activity, с join остальных таблиц без всяких exists? Как тут.

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

В любой непонятной ситуации советуй view.

Точно) Дешево и сердито... 

 

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

Если требование именно через ESQ нужно ради учёта прав доступа, то view как раз их все обойдёт.

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

Ну, можно специальную view тогда написать)))

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

Представление не подойдет.

1.Мне нужны агрегированные данные за определенный период, т.е. мне во вьюшку надо было бы передать диапазон дат и чтобы она вернула агрегированные данные за этот диапазон. Я не знаю как это сделать. 

2. Мне нужно встроиться в существующий механизм, который как раз использует ESQ.

3. Ну и права не помешают.

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

Хорошо, я подумаю как вывернуть запрос. Может что то получится. Спасибо за совет.

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

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

Кто-нибудь встречался с проблемой переноса функциональности между стендами? Мне надо было в детали "Связи объекта системы" сделать 2 поля только для чтения. Эта деталь коробочная, формируется по значениям из справочника в БД. Клиентские схемы загружаются не напрямую, а при помощи модуля "SectionBundleModule". Я заместил схему EntityConnectionsDetailV2 в своём пакете и добавил свойство Ensbled = false. На моём стенде все заработало отлично. А при переносе на другой стенд схема перенеслась, но она не подгружается модулем SectionBundleModule.

define("EntityConnectionsDetailV2", ["terrasoft", "EntityConnectionsDetailV2Resources", "EntityConnectionViewModel",
	"ConfigurationItemGenerator", "BaseDetailV2", "EntityConnectionLinksUtilities"],
	function(Terrasoft) {
		return {
			methods: {
 
				/**
				 * Переопределил метод получения дефолтного конфига.
				 * Добавил условие для колонок Контакт и Контрагент.
				 */
				getDefaultItemConfig: function(columnName, dataValueType) {
					var defaultItemConfig = this.callParent(arguments);
					if (columnName === "Contact" || columnName === "Account") {
						defaultItemConfig.controlConfig.enabled = false;
					}
					return defaultItemConfig;
				}
			}
		};
	});

 

Нравится

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

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

 

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

 

Сравните, совпадает ли на обеих системах наполнение в таблицах SysSchem и SysSchemaContent. Например, записи для «коробочной» схемы EntityConnectionsDetailV2 можно увидеть так:

select top 100 * from sysschema where name = 'EntityConnectionsDetailV2'
select top 100 * from SysSchemaContent where sysschemaid = '2CA8C908-28A3-4505-AE9A-69A2018E5467'--EntityConnectionsDetailV2

У Вас, соответственно, строк будет больше. При корректном переносе всё должно было автоматически перенестись и быть одинаковым. Возможно, есть ещё какие-то таблицы, где нужно было прописывать вручную. 

 

Также см. обсуждения похожих случаев.

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

После установки пакета не добавляет раздел в Рабочее место.

Установил пакет на 15.2, попытался добавить раздел в рабочее место - раздел не добавился, но выбило эту ошибку:

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

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

Потом это пакет поставил на 15.3 и ошибка повторилась, полная компиляция не помогла. Кто сталкивался с таким? Если вручную добавить запись в SysModuleInWorkplace - раздел появляется на месте и работает, в чем может быть проблема?

Нравится

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

Добрый день. Вы добавляете раздел в рабочее место через данные?

Чубко Илья,

Я написал insert запрос в SQL. Оно успешно добавляется. Я спрашиваю у людей, почему вручную добавление работает нормально, а через рабочее место выбивает ошибку!?

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

попробуйте и добавление раздела выполнить через привязку данных к пакету, предварительно привязав сопутствующие данные:

SysWorkplace - Рабочее место пользователя

SysModuleInWorkplace - Раздел в рабочем месте 

Вадим Косарев,

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

Судя по стеку, в функции sectionRepository.Get(sectionId) при получении информации по разделу возвращает пустое значение, когда при помощи .First(s => s.Id.Equals(sectionId)) к нему обращаются, происходит ошибка.

Значит, что-то не так с Вашим разделом, его регистрацией.

Если система развёрнута локально, можно в SQL-профайлере посмотреть, какой запрос с с получением списка разделов идёт в базу непосредственно перед ошибкой и возвращает среди результатов ни одного с GUID этого раздела. Сам запрос такой:

  protected Select GetSectionsSelect() {
   Select sectionSchemaSelect = GetClientUnitSchemaNameSelect("sm", "SectionSchemaUId");
   Select sectionModuleSchemaSelect = GetClientUnitSchemaNameSelect("sm", "SectionModuleSchemaUId");
   var select = new Select(UserConnection)
     .Column("sm", "Id")
     .Column("sm", "Caption")
     .Column("sm", "Type")
     .Column("sm", "Code")
     .Column("sm", "Attribute")
     .Column("sm", "SysModuleEntityId")
     .Column("smv", "VisaSchemaUId")
     .Column(sectionSchemaSelect).As("SectionSchema")
     .Column(sectionModuleSchemaSelect).As("SectionModuleSchema")
     .Column("sme", "SysEntitySchemaUId").As("EntityUId")
     .Column("sme", "TypeColumnUId").As("TypeColumnUId")
    .From("SysModule").As("sm")
    .InnerJoin("SysModuleEntity").As("sme")
     .On("sme", "Id").IsEqual("sm", "SysModuleEntityId")
    .LeftOuterJoin("SysModuleVisa").As("smv")
     .On("sm", "SysModuleVisaId").IsEqual("smv", "Id") as Select;
   return select;
  }

 

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

1. Изменяем пакет в дизайнере кейса.

2. Сохраняем

3. Выходим / заходим в схему кейса

В кейсе указан старый пакет.

Как перенести кейс между пакетами?

Нравится

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

Мне кажется, что это баг 7.15.X - мы тоже с таким столкнулись, но решения пока не нашли.

 

Здравствуйте, Игорь!

 

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

 

Если Вас интересует перенос в одном и том же разделе между пакетами, обратите внимание на настройку в ответе на Вашу идею. Возможно, и схему кейса так получится перенести.

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

При отправке запроса к удалённому серверу 

Получаю ошибку:

 The request was aborted: Could not create SSL/TLS secure channel.

Нравится

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

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

Обратите внимание сюда.

Мотков Илья,

Спасибо, но это не помогло.

У меня есть подозрение, что ошибка происходит на этапе обращения из клиентской части к web-сервису  bpmonline по ссылке

Мой кейс:

Есть кнопка "прослушать"  в р. Звонки. При отправке запроса при клике на кнопку нельзя передать данные для аутентификации.

Поэтому ссылка для кнопки формируется к web-сервису bpmonline, который в свою очередь отправляет авторизованный запрос к удалённому серверу на получение потока.

CallStack ошибки не отображает вызов метода, который отправляет запрос к удалённому серверу, значит делаю вывод, что ошибка происходит на этапе вызова web-сервиса bpmonline.

Как обойти данную, ошибку ума не приложу.



 

Не видя, кто именно выдал ошибку, сложно сказать наверняка. Если сервер 7.Х, то более подробно будет в логах, если пришла от сервера телефонии, это сообщение будет видно при мониторинге HTTP-траффика от него.

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