Вопрос

Добрый день. 

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

У меня такой же вопрос

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

Уточните к какой версии относится ваш вопрос, я смутно догадываюсь что это 3.х?

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

Чем настраивать его для карточки детали, проще добавить обычное поле посредством TSAdmin или установив утилиту  FieldMaker.

Григорий Чех, она самая.

версия 3.4 

Григорий Чех пишет:

Уточните к какой версии относится ваш вопрос, я смутно догадываюсь что это 3.х?

спасибо, буду пробовать. 

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

Добрый день!

Имеется такой кейс: после автоматической отправки email через элемент "Отправить email" в БП необходимо записать Дату отправки в некий объект.

Вопрос: Как можно получить дату отправки email?

У меня такой же вопрос

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

Как вариант создать БП со стартовым сигналом слушающим изменение состояния активности с типом исходящее Email на отправлено или самостоятельно реализовать механизм отправки на C#

Если письмо отправляется мгновенно, можно попробовать просто в следующем за отправкой элементе БП писать в то поле текущую дату-время (стандартная функция в дизайнере БП).

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

Доброго дня,

столкнулся с проблемой, прошу вашей помощи.

при попытке обновлении guid("UsrRegistrationStatusId") с помощью odata используя json формат полезной нагрузки получаю ошибку 

"message": "Cannot convert a primitive value to the expected type 'Edm.Guid'. See the inner exception for more details."
"message": "Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)."

 привожу пример

http метод put,

передаваемый json  

{
"UsrRegistrationStatusId":"a9d44061-de29-4578-9df6-d2f226573a06",
"UsrTitle":"myvalue",
"UsrFirstName":"myvalue",
"UsrLastName":"myvalue",
"UsrPreferredEmail":"myvalue@mm.mm",
"UsrDateOfBirth":"2019-04-18T11:14:26.697Z",
"UsrOccupation":"myvalue",
"UsrJobTitle":"myvalue",
"UsrCompanyPersonal":"myvalue",
"UsrComment":"myvalue",
"UsrModifiedOn":"2019-04-18T11:14:26.697Z",
"UsrPassportNumber":"myvalue",
"UsrContactNumber":"myvalue",
"UsrDateOfExpiry":"2019-04-18T11:14:26.697Z",
"UsrNationality":"myvalue",
"UsrGuestTypeId":"myvalue",
"UsrMainGuestId":"myvalue",
"UsrIsAccompanyingPerson":"myvalue",
"UsrFlightsModifiedOn":"2019-04-18T11:14:26.697Z"
}

Возможно ли сформировать поля в json  с определенным типом например Edm.Guid ? Было бы круто если покажите пример с описанием типа данных.

Спасибо за внимание!

 

 

У меня такой же вопрос

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

Представьте Id  Guid в вашем Json как

guid'9d44061-de29-4578-9df6-d2f226573a06'

Спасибо за ответ!

но не помогло  ошибка таже,

urn запроса 0/ServiceModel/EntityDataService.svc/UsrGuestCollection(guid'3b42f755-1f62-4358-878c-47f460ab9e57')
json

{
"UsrRegistrationStatusId":"guid'a9d44061-de29-4578-9df6-d2f226573a06'"
}
полный ответ 

{
  "error": {
    "code": "4",
    "message": {
      "lang": "",
      "value": "An error occurred while processing this request."
    },
    "innererror": {
      "message": "An error occurred while processing this request.",
      "type": "System.Data.Services.DataServiceException",
      "stacktrace": "   at System.Data.Services.Serializers.ODataMessageReaderDeserializer.Deserialize(SegmentInfo segmentInfo)\r\n   at System.Data.Services.Serializers.Deserializer.HandlePutRequest()\r\n   at System.Data.Services.DataService`1.HandlePutOperation(RequestDescription description, IDataService dataService)\r\n   at System.Data.Services.DataService`1.ProcessIncomingRequest(RequestDescription description, IDataService dataService)\r\n   at System.Data.Services.DataService`1.HandleNonBatchRequest(RequestDescription description)\r\n   at System.Data.Services.DataService`1.HandleRequest()",
      "internalexception": {
        "message": "Cannot convert a primitive value to the expected type 'Edm.Guid'. See the inner exception for more details.",
        "type": "Microsoft.Data.OData.ODataException",
        "stacktrace": "   at Microsoft.Data.OData.Json.ODataJsonReaderUtils.ConvertValue(Object value, IEdmPrimitiveTypeReference primitiveTypeReference, ODataMessageReaderSettings messageReaderSettings, ODataVersion version, Boolean validateNullValue)\r\n   at Microsoft.Data.OData.Json.ODataJsonPropertyAndValueDeserializer.ReadPrimitiveValueImplementation(IEdmPrimitiveTypeReference expectedValueTypeReference, Boolean validateNullValue)\r\n   at Microsoft.Data.OData.Json.ODataJsonPropertyAndValueDeserializer.ReadNonEntityValueImplementation(IEdmTypeReference expectedTypeReference, DuplicatePropertyNamesChecker duplicatePropertyNamesChecker, CollectionWithoutExpectedTypeValidator collectionValidator, Boolean validateNullValue)\r\n   at Microsoft.Data.OData.Json.ODataJsonEntryAndFeedDeserializer.ReadEntryProperty(IODataJsonReaderEntryState entryState, IEdmProperty edmProperty)\r\n   at Microsoft.Data.OData.Json.ODataJsonEntryAndFeedDeserializer.ReadEntryContent(IODataJsonReaderEntryState entryState, IEdmNavigationProperty& navigationProperty)\r\n   at Microsoft.Data.OData.Json.ODataJsonReader.ReadAtEntryStartImplementation()\r\n   at Microsoft.Data.OData.ODataReaderCore.ReadImplementation()\r\n   at Microsoft.Data.OData.ODataReaderCore.InterceptException[T](Func`1 action)\r\n   at System.Data.Services.Serializers.EntityDeserializer.ReadEntry(ODataReader odataReader, SegmentInfo topLevelSegmentInfo)\r\n   at System.Data.Services.Serializers.EntityDeserializer.Read(SegmentInfo segmentInfo)\r\n   at System.Data.Services.Serializers.ODataMessageReaderDeserializer.Deserialize(SegmentInfo segmentInfo)",
        "internalexception": {
          "message": "Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).",
          "type": "System.FormatException",
          "stacktrace": "   at System.Guid.GuidResult.SetFailure(ParseFailureKind failure, String failureMessageID, Object failureMessageFormatArgument, String failureArgumentName, Exception innerException)\r\n   at System.Guid.TryParseGuidWithDashes(String guidString, GuidResult& result)\r\n   at System.Guid.TryParseGuid(String g, GuidStyles flags, GuidResult& result)\r\n   at System.Guid..ctor(String g)\r\n   at Microsoft.Data.OData.Json.ODataJsonReaderUtils.ConvertStringValue(String stringValue, Type targetType)\r\n   at Microsoft.Data.OData.Json.ODataJsonReaderUtils.ConvertValue(Object value, IEdmPrimitiveTypeReference primitiveTypeReference, ODataMessageReaderSettings messageReaderSettings, ODataVersion version, Boolean validateNullValue)"
        }
      }
    }
  }
}

Так же обратите внимание, на формирование строка запроса, в примере изменения имени контакта с идентификатором 00000000-0000-0000-0000-000000000000 из коллекции контактов ContactCollection.

// Строка запроса:
// PUT <Адрес приложения BPMonline>/0/ServiceModel/EntityDataService.svc/ContactCollection(guid'00000000-0000-0000-0000-000000000000')
// или
// MERGE <Адрес приложения BPMonline>/0/ServiceModel/EntityDataService.svc/ContactCollection(guid'00000000-0000-0000-0000-000000000000')

Григорий Чех,

Сейчас выполняется запрос вида 

 PUT <Адрес приложения BPMonline>0/ServiceModel/EntityDataService.svc/UsrGuestCollection(guid'3b42f755-1f62-4358-878c-47f460ab9e57')

А если без двойных кавычек

Json

{
"UsrRegistrationStatusId":guid'a9d44061-de29-4578-9df6-d2f226573a06'
}

Григорий Чех,

Без двойных кавычек сработает ошибка парсинга json 

{
"UsrRegistrationStatusId":guid'a9d44061-de29-4578-9df6-d2f226573a06'
}

 "message": "Invalid JSON. A token was not recognized in the JSON content."

 

В принципе должно быть

{
"UsrRegistrationStatusId":"a9d44061-de29-4578-9df6-d2f226573a06"
}

А если попробовать поменять простое текстовое поле например Name (если оно есть в вашем объекте) запрос корректно отработает?

Григорий Чех,

Да если менять обычное текстовое поле всё проходит успешно.

Были проблемы с типами данных - числами и датой, та же ошибка с преобразованием типов, на дату решилось преобразованием строки к виду "2019-04-18T11:14:26.697Z" , с числом не получается воспроизвести.

{
"UsrRegistrationStatusId":"a9d44061-de29-4578-9df6-d2f226573a06"
}

На такой формат выводит ошибку приведенную во  2 коментарии 

Привидите полный код формирования запроса с установкой всех служебных заголовков и обратите внимание на примеры для c# 

Прошу прощёния, данном формате запрос работает корректно.
{
"UsrRegistrationStatusId":"a9d44061-de29-4578-9df6-d2f226573a06"
}
Извините что ввёл в заблуждение.
Проявилось не сразу.. запросы выполнял в rest api клиенте после перезапуска клиента данный формат успешно обновил запись.

Премного вам благодарен! Огромное спасибо за ваше время!

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

{
    Name: 'John',
    BirthDate: new Date(123321123321),
    Gender: {__metadata: { uri: 'GenderCollection(guid\'FC2483F8-65B6-DF11-831A-001D60E938C6\')' }}
}

И в таком случае справочное поле пишется без Id в конце.

Больше примеров в этом обсуждении.

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

Коллеги,

Читаю в документации по бизнес-процессам как можно обрабатывать параметры типа "коллекция". В частности такой фрагмент "...Также обработать параметры типа “коллекция” можно с помощью элемента [Задание-сценарий]. Например, можно использовать сценарий для преобразования коллекций записей в отдельные записи, которые можно передать в другие элементы процесса...". Но, к сожалению, не нашел примеров такого сценария. Не может ли кто-то привести пример кода элемента бизнес-процесса [Задание-сценарий] для работы с параметром типа "коллекция"?

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

У меня такой же вопрос

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

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

 

Добрый день!
Пример работы с коллекцией (после элемента "Считать данные"):

var entities = Get<ICompositeObjectList<ICompositeObject>>("ReadDataUserTask1.ResultCompositeObjectList");
 
var result = "";
 
foreach(var entity in entities) 
{
    	var Name = "";
    	if (entity.TryGetValue<string>("Number", out Name))
    	{
    		result = result + Name + ", ";  
    	}
}
 
return true;

 

Григорий Чех,

Большое спасибо.

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

 Большое спасибо.

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

Здравствуйте, коллеги!

Создал по аналогии с CreateInvoiceFromOrder создание счета из договора - CreateInvoiceFromContract

Все работает отлично, за исключением одного момента

В новом счете не заполняется поле Supplier (подразумевается, что это наша компания), всегда пустое после открытия карточки.

Ранее обнаружил, что и CreateInvoiceFromOrder не работал, ибо что то там foreign key в таблице Account, оказалось, что в в объекте Invoice по умолчанию стояло заполнять это поле каким то левым гуидом e308b781-3c5b-4ecb-89ef-5c1ed4da488e. Я это дело исправил в одном из своих пакетов, но видно все равно это как то сказывается.

Прошу помощи.

У меня такой же вопрос

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

В чем вы просите помощи?

Добрый день!
В БП  CreateInvoiceFromOrder есть метод

public virtual void CreateInvoice() {
	OrderInvoiceHelper helper = Factories.ClassFactory.Get<OrderInvoiceHelper>(new Factories.ConstructorArgument("userConnection", UserConnection));
CreatedInvoiceId = helper.CreateEntity("Order", "Invoice", CurrentOrder, new Dictionary<string, string> {
	{"Currency", "Currency"},
	{"CurrencyRate", "CurrencyRate"},
	{"Contact", "Contact"},
	{"Account", "Account"},
	{"Owner", "Owner"},
	{"Amount", "Amount"},
	{"Opportunity", "Opportunity"}
}, new Dictionary<string, object> { { "Order", CurrentOrder } });
}

который создает Invoice по Order. 3им параметром идет словарь-маппинг полей Invoice по Order, 4ым параметром (new Dictionary<string, object> { { "Order", CurrentOrder } }) предустановленные параметры. Вот ваш Supplier надо добавить туда

Григорий Чех пишет:

В чем вы просите помощи?

Победить глюк с незаполнением Supplier в новом счете.

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

Александр, мой вариант сейчас выглядит так:

public virtual void CreateInvoice() {
	OrderInvoiceHelper helper = Factories.ClassFactory.Get<OrderInvoiceHelper>(new Factories.ConstructorArgument("userConnection", UserConnection));
	var createdInvoiceId = helper.CreateEntity(
		"Contract", "Invoice", Get<Guid>("CurrentContract"), new Dictionary<string, string> {
			{"Currency", "Currency"},
			{"CurrencyRate", "CurrencyRate"},
			{"Contact", "Contact"},
			{"Account", "Account"},
			{"CustomerBillingInfo","CustomerBillingInfo"},
			{"OurCompany", "Supplier"},
			{"SupplierBillingInfo", "SupplierBillingInfo"},
			{"Owner", "Owner"},
			{"Amount", "Amount"},
			{"Order","Order"},
			{"Opportunity", "Opportunity"}
		},
		new Dictionary<string, object> {
			{"Contract", Get<Guid>("CurrentContract")},
			{"ZLPaymentType", Get<Guid>("PaymentType")}
		});
	Set("CreatedInvoiceId", createdInvoiceId);
}

 

Про левый Guid в значении по умолчанию для Supplier в Invoice имею в виду это:

я переопределил это безобразие на "не устанавливать значение по умолчанию" в своем пакете, CreateInvoiceFromOrder заработал, но лишь потому, что  в Заказе нет полей с нашей компанией (поставщиком), нечем в счете заполнять.

откуда лезет этот e308b781-3c5b-4ecb-89ef-5c1ed4da488e, причем у объектов в залоченных фирменных террасофтовских пакетах?

Борис Леонов,

namespace Terrasoft.Configuration
{
    public static class AccountConsts
    {
        public static readonly Guid OurCompanyAccountId = new Guid("E308B781-3C5B-4ECB-89EF-5C1ED4DA488E");
    }
}

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

Борис Леонов,

{"OurCompany", "Supplier"}, - это значит значение из поля OurCompany объекта Contract скопировать в поле Supplier объекта Invoice.
Если вам надо именно одно и то же значение всегда записывать, то вам надо добавить параметр в словарь 
new Dictionary<string, object> {
			{"Contract", Get<Guid>("CurrentContract")},
			{"ZLPaymentType", Get<Guid>("PaymentType")}
		}

Да, ни в коем случае не удаляйте эту "Нашу компанию". Она ещё в некоторых местах жёстко зашита. Например, в интеграции с AD

Григорий Чех,

Владимир Соколов,

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

Если я руками создам Account с нужным Id и объединю его с существующей «нашей компанией», проблема решится?

Да должно

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