Заружал пакет, который при загрузке выдал сообщение о том, что не может загрузиться, в логах сказали обращаться за более подробной инфой в конфу, зашел в конфу нажал скомпилировать и выдало ряд ошибок, который не совсем понимаю с чем связаны(скриншот)Изображение удалено.

Нравится

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

Добрый день, Дмитрий!

 

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

 

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

Есть необходимость записывать в объект File поля Name и Notes через всплывающее окно. Не могу определить что нужно использовать, ModalBox или MiniPage. Вкратце задача состоит в том, чтобы при вводе поля Name генерировать ссылку и записывать её в поле Notes. 

Получилось создать ModalBox, но не удалось найти как сохранять поля в базу данных, также как через метод this.save(); в BasePage.

А вызывать MiniPage своей же кнопкой, совсем не удалось

Буду благодарен за подробный ответ и конкретные статьи с примерами. Спасибо.

Нравится

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

Здравствуйте, Илья!

 

Как программно открыть мини-карточку описано тут. Но для того, чтобы этом метод работал, Вам необходимо зарегистрировать мини-карточку - это описано тут

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

Посоветуйте, пожалуйста, как управлять доступностью (запрещать переходить на них) отдельных стадий ActionsDashboard в зависимости от значений полей в карточке?

Нравится

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

Если только на заполнение полей, то с этим справятся бизнес-правила типа делать поле обязательным, если стадия ="требуемое значение". Кликнуть на стадию дает, но не сохраняет без заполнения полей.

Нет, к сожалению, необходим запрет перехода на стадию в некоторых случаях. (Что-то похожее на то, как сделан запрет для некоторых ролей в коробке)

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

К сожалению, базовыми, "коробочными", средствами, такое сделать невозможно.

Можно же не коробочными. 



Есть идеи по тому, как сделать это кодом?

А если на уровне встроенного БП объекта (или событийного слоя) на событии Saving проверять новую и старую стадию и значения других полей и если нет, то отменять путём установки IsCanceled? Сохранить так дать не должно, но нужно смотреть, к чему приведёт в интерфейсе карточки с кейсом.

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

Имею в наличии замещающую схему раздела базы знаний.

define("PortalKnowledgeBaseSection", ["HtmlEditModule", "PortalKnowledgeBaseSectionStructure", "PortalKnowledgeBaseSectionResources", "ckeditor-base", "jQuery"],
function (HtmlEditModule, structure, resources) {
    return {
        /* #region  Схема. */
        entitySchemaName: "KnowledgeBase",
        /* #endregion */
        //...
        /* #region  Методы. */
        methods: {
        //...
            /* #region  Клик по кнопке "Полноэкранный режим". */
            onFullscreenModeClick: function () {
                let control = structure;  // ok
                let schema = structure.schema;  // ok
                let rightPanel = structure.schema.rightPanel;  // ok
                // let find = structure.schema.rightPanel.find("ckeditor");  // not ok
                // let item = structure.schema.rightPanel.items[itemIndex];  // not ok
                // //перебором ищем нужный контрол по имени
                // while (item.name !== "...") {
                // ...
                // }
                let editor = $("#MyFieldHtmlEdit-html-edit"); // ok
                // htmlEdit.height(200);
                //...
                let editor = this.editor;  // not ok
                if (editor) {
                    editor.execCommand("maximize");
                }
            },
            /* #endregion */
        },
        /* #endregion */
    };
});

Вопрос: Не получается получить доступ к контролу "ckeditor", для последующей передачи в него команды максимизации окна.

Нравится

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

Добрый день.

Я рекомендую вам использовать вместо jquery:

let editor = $("#MyFieldHtmlEdit-html-edit");

 

Нашу конструкцию, получения компонента:

var container = Ext.getCmp("MyFieldHtmlEdit")

И у данного контейнера есть свойство editor которым уже можно свободно оперировать.



Самый простой пример - зайдите на страничку редактирования KnowledgeBase и в консоль выполните следующую команду:Ext.getCmp("KnowledgeBasePageV2NotesHtmlEdit").editor.execCommand("maximize")

Григорьев Михаил Алексеевич,

Спасибо, это то, что нужно.

// KnowledgeBasePageV2NotesHtmlEdit - обычная версия 
// PortalKnowledgeBasePageNotesHtmlEdit - портальная версия
var container = Ext.getCmp("PortalKnowledgeBasePageNotesHtmlEdit")
if (container && container.editor) {
  container.editor.execCommand("maximize");
}

 

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

Добрый день!

В дизайнере системы есть возможность создать веб-сервис.

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

такая аутентификация Bearer :

`Authorization`:` Bearer 19efbdc8ee723b7eb9e6dae1f7a20ca4378b288c`

где `19efbdc8ee723b7eb9e6dae1f7a20ca4378b288c` - ваш уникальный ключ (токен) авторизации.

Пример запроса:

`https://my.prom.ua/api/v1/products/list?limit=5`

Можно в этом конструкторе так аутентифицироваться? Если да, какой метод использовать из предложенных?

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

Нравится

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

В параметрах вызова добавить метод. В методе указать что это Параметр заголовка, код Authorization, значение 19efbdc8ee723b7eb9e6dae1f7a20ca4378b288c.

В вашем варианте авторизация осуществляет просто передачей токена в headers.

Такого способа сейчас стандартно, к сожалению, не предусмотрено. Ранее была зарегистрирована идея о добавлении новых способов авторизации, в том числе и Bearer​​​​​​.

 

По вопросу интеграции с Prom обратите внимание на дополнение, умеющее с ним работать, я писал в соседней теме.

 

Если так, как предложил Евгений, полноценно работает, можно использовать.

 

Полозюков Евгений Петрович,Спасибо, но не совсем. значение надо было указать c припиской метода авторизации, вот так - Bearer 5430b**********315955c2754





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



А какая у Вас версия системы? В 7.16.4 расширили возможности работы с коллекциями:

Добавлена возможность пользовательскими средствами создать параметр процесса типа “Коллекция записей” и настроить его структуру (создать вложенные параметры). Например, параметр “Коллекция записей” можно использовать в следующих случаях:

 

Если при выполнении элемента [Задание сценарий] была сформирована коллекция записей, то можно ее передать в параметр процесса и далее обработать пользовательскими средствами.

 

При запуске бизнес-процесса из C# или JS-кода коллекцию записей можно передать во входящий параметр и обработать в ходе процесса.

 

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

Пример настройки структуры параметра “Коллекция записей”

mi_subprocess_parameters.png

Больше о том, как работать с коллекциями, см. тут и тут

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

Доброго времени суток! Коллеги, помогите пожалуйста с переводом запроса SQL на С# для использования в конфигурационном веб-сервисе. Необходимо через запрос к веб-сервису по ИНН контакта получать в ответе перечень Id заявок и Названий их статусов. SQL запрос выглядит так:

 

SELECT a.Id, s.Name

FROM dbo.Application a

INNER JOIN dbo.Contact c ON a.ContactId = c.Id

INNER JOIN dbo.AppStatus s ON a.StatusId = s.Id

WHERE c.INNN='1234567890'

 

Нравится

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

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

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

Сделал согласно информации в указанных статьях:

        public string UsrGetAppInfoByINN(string INN) {
            // Результат по умолчанию.
            var result = "";
            // Экземпляр EntitySchemaQuery, обращающийся в таблицу Application базы данных.
            var esqQuery = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "Application");
            // Добавление колонок в запрос.
            esqQuery.AddColumn("Id");
            esqQuery.AddColumn("[AppStatus:Id:StatusId].Name");
            esqQuery.AddColumn("[Contact:Id:ContactId].INN");
               // Фильтрация данных запроса.
            var esqFilter = esq.CreateFilterWithParameters(FilterComparisonType.Equal, "INN", INN);
            esq.Filters.Add(esqFilter);
            // Получение результата запроса.
            string esqSqlText = esqQuery.GetSelectQuery(UserConnection).GetSqlText(); 
            // Возвратить результат.
            return result;

При публикации получаю ошибки "The name 'esq' does not exist in current context в строках:   

            var esqFilter = esq.CreateFilterWithParameters(FilterComparisonType.Equal, "INN", INN);
            esq.Filters.Add(esqFilter);

            esq.Filters.Add(esqFilter);

Так у Вас переменная называется esqQuery, а не esq.

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

заменил esq на esqQuery. Схема публикуется, но на запрос приходит ошибка: 

The server encountered an error processing the request. The exception message is 'Элемент коллекции с именем StatusId не найден'. 

Если убрать эту строку из кода - ругается на следующую ContactId, хотя обе эти колонки есть в таблице Application

        public string UsrGetAppInfoByContactINN(string INN) {
            // Результат по умолчанию.
            var result = "";
            // Экземпляр EntitySchemaQuery, обращающийся в таблицу Application базы данных.
            var esqQuery = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "Application");
            // Добавление колонок в запрос.
            esqQuery.AddColumn("INN");
            esqQuery.AddColumn("[AppStatus:Id:StatusId].Name");
            esqQuery.AddColumn("[Contact:Id:ContactId].INN");
               // Фильтрация данных запроса.
            var esqFilter = esqQuery.CreateFilterWithParameters(FilterComparisonType.Equal, "INN", INN);
            esqQuery.Filters.Add(esqFilter);
            // Получение результата запроса.
            string esqSqlText = esqQuery.GetSelectQuery(UserConnection).GetSqlText(); 
            // Возвратить результат.
            return result;

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

Нужно писать названия полей без Id, см. примеры по ссылке выше.

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

не понимаю почему без Id, если колонки в таблице так и называются: ContactId, StatusId, но это помогло, спасибо.

 

Правда теперь после отправки запроса - я получаю пустой ответ на запрос:

{"UsrGetAppInfoByContactINN":""}

 

Александр О,

здравствуйте! Далее Вам необходимо получить коллекцию

var collection = esqQuery.GetEntityCollection(UserConnection);
if(collection.Count > 0)
{
  foreach(var entity in collection)
  {
     var name = entity.GetTypedColumnValue<string>("Name");
  }
}

 Примерно так.

Только еще один момент, Вам необходимо получить названия колонок  в esqQuery, что бы потом можно было выбирать из коллекции по имени.

var appColName = esqQuery.AddColumn("[AppStatus:Id:StatusId].Name").Name;
 
var collection = esqQuery.GetEntityCollection(UserConnection);
if(collection.Count > 0)
{
  foreach(var entity in collection)
  {
     var name = entity.GetTypedColumnValue<string>(appColName);
  }
}



 

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

не понимаю почему без Id, если колонки в таблице так и называются

Оно в этом случае не пишется, при генерации запроса подставляется автоматически.

Нигрескул Алексей,

с помощью Ваших рекомендаций и дополнительных танцев с бубном схема видоизменилась на:

        public string UsrGetAppInfoByContactSSN(string ContactINN) {
            var result = "";
            var esqQuery = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "Application");
            var appColApplicationId = esqQuery.AddColumn("Id").Name;
            var appColStatus = esqQuery.AddColumn("Status.Name").Name;
            var appColINN = esqQuery.AddColumn("Contact.INN").Name;
            var esqFilter = esqQuery.CreateFilterWithParameters(FilterComparisonType.Equal, "Contact.INN", ContactINN);
            esqQuery.Filters.Add(esqFilter);
            var collection = esqQuery.GetEntityCollection(UserConnection);
                if(collection.Count > 0)
                    {
                      foreach(var entity in collection)
                        {
            var name = ("ApplicationId:").ToString() + entity.GetTypedColumnValue<string>(appColApplicationId)
                   +(", Status:").ToString() + entity.GetTypedColumnValue<string>(appColStatus)
                   +(", INN:").ToString() + entity.GetTypedColumnValue<string>(appColINN);
            return name;
                        }
                     }
            return result;

 В результате в ответ на запрос получаю:

{"UsrGetAppInfoByContactSSNResult":"ApplicationId:cee41684-295b-4384-8dfb-1fa3fdd835cc, Status:Підтверджена, INN:4562378478"}

Но это только одна запись.

Что нужно изменить в схеме чтобы в ответе приходили все найденные записи? Например так:

{"UsrGetAppInfoByContactSSNResult":
"ApplicationId:a913e1c5-6e83-428c-b095-0cf1b3aca5bf, Status:Підтверджена, INN:4562378478"
"ApplicationId:cee41684-295b-438e-8dfb-1fa3fdd835cc, Status:В роботі, INN:4562378478"
"ApplicationId:47a7a0be-4c21-430f-9da9-7d1b658cff92, Status:Відмовлено, INN:4562378478"
}

 

Александр О,

здравствуйте! В таком случае я бы сделал так:

public class AppInfoByContactSSN
{
 public Guid ApplicationId {get;set;}
 public string StatusName {get;set;}
 public string Inn {get; set;}
}
 
public List<AppInfoByContactSSN> UsrGetAppInfoByContactSSN(string ContactINN) {
            var result = new List<AppInfoByContactSSN>();
            var esqQuery = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "Application");
            var appColApplicationId = esqQuery.AddColumn("Id").Name;
            var appColStatus = esqQuery.AddColumn("Status.Name").Name;
            var appColINN = esqQuery.AddColumn("Contact.INN").Name;
            var esqFilter = esqQuery.CreateFilterWithParameters(FilterComparisonType.Equal, "Contact.INN", ContactINN);
            esqQuery.Filters.Add(esqFilter);
            var collection = esqQuery.GetEntityCollection(UserConnection);
                if(collection.Count > 0)
                {
                      foreach(var entity in collection)
                        {
                           result.Add(new AppInfoByContactSSN {
					ApplicationId = entity.GetTypedColumnValue<Guid>(appColApplicationId),
					StatusName = entity.GetTypedColumnValue<string>(appColStatus),
					Inn = entity.GetTypedColumnValue<string>(appColINN)
				});
                        }
                 }
 
             return result;  
}

 

Нигрескул Алексей,

пришлось еще добавить в using System.Collections.Generic;

Но при публикации на строку:

public List<AppInfoByContactSSN> UsrGetAppInfoByContactSSN(string ContactINN) {

выдает ошибку: a namespace cannot directly contain members such us fields or methods.

 

Полный код:

namespace Terrasoft.Configuration.UsrCustomNamespace
{
    using System;
    using System.ServiceModel;
    using System.ServiceModel.Web;
    using System.ServiceModel.Activation;
    using Terrasoft.Core;
    using Terrasoft.Web.Common;
    using Terrasoft.Core.Entities;
    using System.Collections.Generic;
 
    [ServiceContract]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
     public class AppInfoByContactSSN
       {
        public Guid ApplicationId {get;set;}
        public string StatusName {get;set;}
        public string Inn {get; set;}
       }
 
        [OperationContract]
        [WebInvoke(Method = "GET", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped,
        ResponseFormat = WebMessageFormat.Json)]
 
        public List<AppInfoByContactSSN> UsrGetAppInfoByContactSSN(string ContactINN) {
            var result = new List<AppInfoByContactSSN>();
            var esqQuery = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "Application");
            var appColApplicationId = esqQuery.AddColumn("Id").Name;
            var appColStatus = esqQuery.AddColumn("Status.Name").Name;
            var appColINN = esqQuery.AddColumn("Contact.INN").Name;
            var esqFilter = esqQuery.CreateFilterWithParameters(FilterComparisonType.Equal, "Contact.INN", ContactINN);
            esqQuery.Filters.Add(esqFilter);
            var collection = esqQuery.GetEntityCollection(UserConnection);
             if(collection.Count > 0)
                {
                 foreach(var entity in collection)
                  {
                    result.Add(new AppInfoByContactSSN {
                    ApplicationId = entity.GetTypedColumnValue<Guid>(appColApplicationId),
                    StatusName = entity.GetTypedColumnValue<string>(appColStatus),
                    Inn = entity.GetTypedColumnValue<string>(appColINN)
                   });
                  }
                }
            return result;
     }
}

 

Так у Вас метод не внутри класса, а после, потому и ругается. Метод должен быть в классе, а не в окружающем его namespace.

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

так тоже пробовал, но на строку:

var esqQuery = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "Application");

выдает ошибку:

An object reference is required for t he non-static field, method, or property 'User.Connection.EntitySchemaManager'

 

и на строку:

var collection = esqQuery.GetEntityCollection(UserConnection);

выдает ошибку:

'UserConnection' is a type, which is not valid in the given context

 

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

 

Пример создания сервиса есть тут. Как минимум, у Вас не хватает наследования класса от BaseService.

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

Пытаюсь обратиться к сервису http://.../0/rest/ITdsBSC/CaseBSC методом POST, предварительно получил в GET cookies и явно передавал params, в т.ч. utf-8, но возвращается в неизвестной кодировке 403 ошибка, как через postman правильно посылать POST запросы? Делал по гайду с академии, какие могут быть идеи в чем проблема? P.S. url очистил т.к. NDA

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

Нравится

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

Если сервис не анонимный, то не прошли аутентификацию. Надо сначала вызвать авторизоваться через метод http://.../ServiceModel/AuthService.svc/Login получить куки и в заголовке своего запроса передать значение BPMCSRF

Если сервис не анонимный, то не прошли аутентификацию. Надо сначала вызвать авторизоваться через метод http://.../ServiceModel/AuthService.svc/Login получить куки и в заголовке своего запроса передать значение BPMCSRF

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

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

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

К примеру настроить интеграцию к новой почте или пром.юа.

Наверно гулпый вопрос, но я не знаю.

Каких знаний требовать от программиста для решения таких задач?

Нравится

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

Тут всё зависит от сложности и высоконагруженности интеграции. Есть стандартные способы, вообще не требующие программирования: блок «веб-сервис» в БП, позволяющий обратиться к сервисам на других сайтах, и наоборот, поддержка OData, позволяющая извне подключаться к сайту на 7.Х, читать и менять данные в его таблицах.

 

Но если требуется более сложная интеграция, потребуется создание своих сервисов в конфигурации (пишутся на C#), шлюзовых таблиц в базе (понадобится понимание SQL). Или вообще, как сделано в 7.X Marketing для интеграции с рассылками, отдельный сервис, работающий на своём сервере. Или интеграция с почтой Exchange, где применяется Linux, Docker, Kubernetes.

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

добрый день!

Например к новой почте или пром.юа. Там есть апи для https запросов. На стороне Creatio если писать свой web-сервис, надо знать C# и SQL? C# ответвтление ASP.NET именно?

Если самому писать серверную логику, то нужно на C#. Возможно, получится и готовыми элементами вызова веб-сервиса, но их возможности покрывают не всё.

 

Ещё есть дополнение «ApiX-Drive connector», может, через них получится вообще без разработки. Там на их сайте упомянуты и НП, и Пром.

Интеграция в Apix-Drive

Калушка Д. пишет:

Например к новой почте

Тут пишут, что выпустили к ней коннектор

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

Пытаюсь переопределить метод GenerateSequenseNumber(EntitySchema entitySchema, UserConnection connection), дописав в него свою логику.

Создал схему с исходным кодом 

namespace Terrasoft.Core.Process.Configuration
{
	using System;
	using Terrasoft.Common;
	using Terrasoft.Core;
	using Terrasoft.Core.DB;
	using Terrasoft.Core.Entities;
	using Terrasoft.Core.Process;
	using CoreSysSettings = Terrasoft.Core.Configuration.SysSettings;
 
	#region Class: NavGenerateSequenseNumber
 
	/// <summary>
	/// Represents user task to generate ordinal number.
	/// </summary>
	public class NavGenerateSequenseNumber : GenerateSequenseNumberUserTask
	{
 
		#region Methods: Public
 
		/// <summary>
		/// Returns sequence number.
		/// </summary>
		/// <param name="entitySchema">Entity schema.</param>
		/// <param name="connection">User connection.</param>
		/// <returns>String that represents a generated sequence number.</returns>
		public override string GenerateSequenseNumber(EntitySchema entitySchema, UserConnection connection) {
			string mycode = base.GenerateSequenseNumber(entitySchema, connection) +"MyCode";
			return mycode;
		}
 
		#endregion
 
	}
 
	#endregion
 
}

вроде бы все должно работать, но при компиляции получаю "There is no argument given that corresponds to the required formal parametr 'userConnection' of 'GenerateSequenseNumberUserTask.GenerateSequenseNumberUserTask(UserConnection)'". Вижу где это, но обойти что то не получается. Есть варианты?

Конечно есть вариант создать своё действие процесса, но но не интересен

Нравится

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

Алексей, Вы забыли создать свой конструктор с параметром «userConnection», который вызывает базовый из ядерного класса ProcessUserTask.

Подробнее о такой ошибке см. эту тему.

 

Попробуйте в начале класса перед методами ещё:

#region Constructors: Public
 
public NavGenerateSequenseNumber(UserConnection userConnection)
	: base(userConnection) {
	SchemaUId = new Guid("308a276d-4de2-474b-9061-fd0b2ce6dc8a");
}
 
#endregion

Тут я подставил UId своей новой схемы, но нужно смотреть, как правильнее при Вашем использовании. По крайней мере, скомпилировалось. Возможно, надо будет вызывать напрямую конструктор ProcessUserTask, поскольку в конструкторе GenerateSequenseNumberUserTask тоже прописывают UId:

#region Constructors: Public
 
public GenerateSequenseNumberUserTask(UserConnection userConnection)
	: base(userConnection) {
	SchemaUId = new Guid("b9b23348-b89c-4836-8c5b-283ef5ed8666");
}
 
#endregion

 

Алексей, Вы забыли создать свой конструктор с параметром «userConnection», который вызывает базовый из ядерного класса ProcessUserTask.

Подробнее о такой ошибке см. эту тему.

 

Попробуйте в начале класса перед методами ещё:

#region Constructors: Public
 
public NavGenerateSequenseNumber(UserConnection userConnection)
	: base(userConnection) {
	SchemaUId = new Guid("308a276d-4de2-474b-9061-fd0b2ce6dc8a");
}
 
#endregion

Тут я подставил UId своей новой схемы, но нужно смотреть, как правильнее при Вашем использовании. По крайней мере, скомпилировалось. Возможно, надо будет вызывать напрямую конструктор ProcessUserTask, поскольку в конструкторе GenerateSequenseNumberUserTask тоже прописывают UId:

#region Constructors: Public
 
public GenerateSequenseNumberUserTask(UserConnection userConnection)
	: base(userConnection) {
	SchemaUId = new Guid("b9b23348-b89c-4836-8c5b-283ef5ed8666");
}
 
#endregion

 

Вот меня собственно и смутило только значение Guid в SchemaUId. Указал такой же, что и в GenerateSequenseNumberUserTask, основываясь на логике, что это UId действия процесса сгенерировать номер по порядку. Его то я не меняю, меняю только метод генерации кода. Все сгенерировалось и работает как надо.

Ясно, спасибо за уточнение.

Скомпилироваться удалось, но ничего не работает )))) 

Пробовал вариант и 

#region Constructors: Public
 
public NavGenerateSequenseNumber(UserConnection userConnection)
	: base(userConnection) {
	SchemaUId = new Guid("b9b23348-b89c-4836-8c5b-283ef5ed8666");
}
 
#endregion

и 

#region Constructors: Public
 
public NavGenerateSequenseNumber(UserConnection userConnection)
	: base(userConnection) {
	SchemaUId = base.SchemaUId;
}
 
#endregion

 Результат один. Приложение компилируется, но переопределенный метод не вызывается. В шаблон заложил 2 параметра что то типа "{1:yy}-{0:00000}"  и в форматирование номера добавил 

 string.Format(sysSettingsCodeMask, sysSettingsLastNumber, DateTime.Now);

Но в итоге получаю ошибку

System.FormatException: Index (zero based) must be greater than or equal to zero and less than the size of the argument list.
   at System.Text.StringBuilder.AppendFormatHelper(IFormatProvider provider, String format, ParamsArray args)
   at System.String.FormatHelper(IFormatProvider provider, String format, ParamsArray args)
   at Terrasoft.Configuration.SysSettingsService.SysSettingsService.GetIncrementValueVsMask(String sysSettingName, String sysSettingMaskName)
   at SyncInvokeGetIncrementValueVsMask(Object , Object[] , Object[] )
   at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]&amp; outputs)
   at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&amp; rpc)
   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc&amp; rpc)
   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc&amp; rpc)
   at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)

Что говорит что мой метод не вызывается. Сгенерировать все, компилировать все, чистка Redis и перезапуск приложения - все делал)

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

 

При выполнении процессов экземпляр класса элемента при его выполнении создается только для его класса (не через ClassFactory или другими словами только для класса элемента, а не для последнего класса по иерархии). То есть Ваш класс не вызывается из-за того, что не создается его экземпляр. 

 

Реализовано все верно, только проблема в том, что Вы не создаете экземпляр своего класса. Поэтому единственный верный вариант - это создание своего UserTask и в последующем вызывать именно его. 

 

Так же рекомендую вынести общую логику в source schema и наследовался от созданного класса.

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

В бизнес-процессе нужно было обнулить у контрагента поле-ссылку на другого клиента, имеющее тип Id. Для  этого выполнил запись в поле значения Guid.Empty. При этом поле пустым не стало, а в него записалось что-то вроде "00000-000000000-0000-00000".  И все бы ничего, можно и такое значение считать пустой ссылкой. Но при слиянии этого контрагента с другим,  система почему-то автоматически в поле ссылки результирующего контрагента проставила эти нули, а не вполне конкретную ссылку из второго контрагента. При этом не было даже запроса, какую из ссылок выбрать.

Вопрос: как в блоке Изменение данных бизнес-процесса записать в поле ссылки (ID) реально пустое значение?

Нравится

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

Илья, странно, что у Вас записалось «00000-000000000-0000-00000». Вы уверены, если посмотреть в базе, там тоже так?

Если именно так, то либо на этом поле отключена проверка целостности и в него можно писать любые Guid, либо в справочнике есть запись с Id «00000-000000000-0000-00000» и для системы такое значение не отличается от другого заполненного.

Пишите null

Дело в том, что в языке C# нет понятия NULL - для переменных разных типов NULL выражается по разному:

  1. Для справочных полей это Guid.Empty
  2. Для строковых полей это String.Empty
  3. Для полей с типом «Дата/время» это DateTime.MinValue
  4. Для логических полей «пустого»поля нет (нужно указывать значение false).

Но почему у Вас при вставке Guid.Empty реально в базу попал такой Guid, нужно разбираться. Если поле с ограничением целостности по связям и в справочнике такой записи нет, такого быть не должно.

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