Коллеги, 

а почему в справочнике "Часовые пояса" значения недоступны для добавления, редактирования и удаления? 



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

Нравится

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

Владимир, здравствуйте!

В базовый справочник "Часовые пояса" добавлены все часовые пояса из справочника Windows. Это системный справочник и он не доступен для редактирования с помощью базового функционала, так как при добавлении кастомного часового пояса и выборе его в личном профиле, пользователь не сможет зайти в систему. Для выбора часового пояса мы рекомендуем использовать только базовое наполнение.

Кстати, а как в системе отслеживается переход (и не переход) на летнее-зимнее время? Летом с Москвой одна разница, а зимой другая.

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

для понимания того, как bpm'online работает с датами, нужно помнить следующее:

  • В базе даты хранятся в UTC, т.е. "по Гринвичу"
  • При создании соединения приоритет использования часового пояса следующий (по убыванию):
  1. Часовой пояс из профиля пользователя.

    При этом используется колонка "TimeZoneId" из таблицы "SysAdminUnit".

     
  2. Системная настройка «DefaultTimeZone».

    По умолчанию заполняется значением "(GMT) Coordinated Universal Time" (в пакете Base есть соотв. привязка данных), т.е. с нулевым смещением.

     
  3. Клиентский часовой пояс.

    Определяется по передаваемому с клиентского приложения UTC смещению.

     
  4. Часовой пояс сервера приложений.

Учитывая вышеизложенное, время будет отображаться правильно и при переходах на летнее\зимнее, так как в базе дата хранится в UTC и для ее отображения она приводится к "правильному" часовому поясу (В том случае, когда в системной настройке или в профиле пользователей установлены корректные часовые пояса).

 

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

Добрый день.

Есть самописный модуль, в параметры которого необходимо передать filterGroup для выполнения фильтрации внутри модуля.

Пробовал передать просто объект filterGroup - параметр с объектом не передается в модуль.

Пробовал передать 

filterGroup.serialize() 

- при десериализации строки получаю совершенно другую структуру объекта

Terrasoft.deserialize(filterGroup)

При добавлении этого фильтра в ESQ-запрос

происходит ошибка:

"Uncaught TypeError: a.on is not a function"

Подскажите, как корректно:

1. передать объект в параметры модуль?

2. провести сериализацию группы фильтров с последующим 



 

Нравится

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

ага. упирался уже в данный нюанс. Не могу найти пример с проекта, но фишка в serializationInfo. Вот пример из дефолтной конфигурации:

var serializationInfo = sectionFilters.getDefSerializationInfo();
serializationInfo.serializeFilterManagerInfo = true;
var deserializedFilters = Terrasoft.deserialize(sectionFilters.serialize(serializationInfo));

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



В консоли по быстрому накидал. Посмотрите, как различаются 2 результата десериализации (в моём примере v=Terrasoft.createFilterGroup()):

Варфоломеев Данила,

Огромное спасибо! Всё получилось.

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

Изменил маску ввода электронной почты, через системную настройку «EmailPattern», после этого перестали быть доступны все данные по Контрагентам, Контактам, Договорам и Системные настройки. Как исправить ситуацию? Спасибо

Нравится

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

Здравствуйте, Юрий!



Уточните, пожалуйста, Ваш кейс:

- все данные не доступны или только некоторые?

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

- какое значение системной настройки Вы установили?

Анна Журавель,

Добрый день, Анна!

- данные недоступны все

- не отображаются в реестре

- работал с системной настройкой «EmailPattern», пробовал разные варианты

Здравствуйте, Юрий!



Для решения этой проблемы, обратитесь в службу поддержки Terrasoft, написав нам на почтовый ящик support@terrasoft.ru

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

Добрый день.

Есть код фильтра:

define("PriceListReportFilter", ["PriceListReportFilterResources", "ConfigurationConstants"],
	function(resources, ConfigurationConstants) {
		var config = [
			{
				name: "Kind",
				caption: resources.localizableStrings.Kind,
				dataValueType: "LOOKUP",
				columnName: "Kind",
				parameterName: "KindId"
			},
			{
				name: "Name",
				caption: resources.localizableStrings.Name,
				dataValueType: "LOOKUP",
				columnName: "ParentProduct",
				parameterName: "ID"
			}
		];
		return config;
	});

Существует ли способ выбора нескольких записей из справочника?

 

Нравится

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

Добрый день.

Можно. Например, в расширенном фильтре при выборе значения для сравнения, вызывается метод «Open» из «LookupUtilities», в config прописывается свойство «multiSelect». Можно посмотреть, как это реализовано там.

VladKapitanchyk,

ReportFilterModule хардкодом ставит multiSelect: false, поэтому в LookupUtilities уже попадает false.

Петроченко Максим,

В LookupUtilities передается конфиг (который не харкодится LookupUtilities ) на основании которых он работает, в справочном поле по умолчанию передается конфиг в котором стоит «multiSelect:false». Вам не кто не мешает в реализации своего поля вызвать LookupUtilities, и передать ваш конфиг.

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

Здравствуйте! Не могу найти пример как на C# использовать оператор CASE для такого запроса:

SELECT

    CASE

        WHEN ClosureDate IS NOT NULL THEN ClosureDate

        ELSE ScheduledClosureDate

    END AS EndDate

FROM Change

Нравится

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

 

QueryCase queryCase = new QueryCase();
//,CASE WHEN su.SxPhone != '' then  su.SxPhone else ResultSelect.MobilePhone end 
QueryCondition queryCondition = new QueryCondition(QueryConditionType.NotEqual) {
	LeftExpression = new QueryColumnExpression(Column.SourceColumn("su", "SxPhone"))
};
queryCondition.RightExpressions.Add(Column.Parameter(string.Empty));
queryCase.AddWhenItem(queryCondition, Column.SourceColumn("su", "SxPhone1"));
 
queryCase.ElseExpression = new QueryColumnExpression(Column.SourceColumn("ResultSelect","MobilePhone"));
 
 
var sel = (new Select(UserConnection)
			//.Top(1)
			.Column(queryCase)
			.From("Account")
 
 
            ) as Select;

 

Пащенко Александр Сергеевич,

спасибо за пример!

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

Добрый день,

Возможно ли создать и вызвать БДшную функцию на сервере,

Например создать функцию(Через CREATE FUNCTION ) и добавить ее в скрипты в пакете

и потом как нибудь вызвать ее и получить то что она возвращает?

 

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

Нравится

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

так вам нужна функция или хранимка? в любом случае вот тема. Как вызвать из js кода свой сервис можно посмотреть на sdk / как добавить кусок C# кода в БП - элемент "задание-сценарий". Ну и в C# коде вызываете хранимку, в хранимке делаете что угодно, результат читаете с помощью datareader'а и далее по бизнес логике...

Варфоломеев Данила,

Спасибо за ссылку, мне нужна функция, но по идее процедурой тоже можно обойтись

Можно вызвать хранимую процедуру. Правильный вызов процедуры (пример):

DataValueTypeManager dataValueTypeManager =UserConnection.DataValueTypeManager; 

var dateTimeValue = new DateTime(2009, 01, 02, 22, 12, 0);

                    Stream stream = newMemoryStream(Encoding.Unicode.GetBytes("Тест большого бинарного объекта"));

                    var textDataValueType = newTextDataValueType(dataValueTypeManager);

                    var guidDataValueType = newGuidDataValueType(dataValueTypeManager);

                    var integerDataValueType = newIntegerDataValueType(dataValueTypeManager);

                    var floatDataValueType = newFloat2DataValueType(dataValueTypeManager);

                    var booleanDataValueType = newBooleanDataValueType(dataValueTypeManager);

                    var dateTimeDataValueType = newDateTimeDataValueType(dataValueTypeManager);

                    var idValue = new Guid("{BCDB8392-55BC-472A-A49D-22A975E0BEF6}");



                    StoredProcedure storedProcedure =

                           new StoredProcedure(Page.UserConnection,"tsp_TestStoredProcedure")

                           .WithParameter("IdParameter", idValue)

                           .WithVarParameter("VarIdParameter", idValue, guidDataValueType)

                           .WithParameter("TextParameter", "Украина")

                           .WithVarParameter("VarTextParameter", "Украина", textDataValueType)

                           .WithParameter("IntegerParameter", 10)

                           .WithVarParameter("VarIntegerParameter", 10, integerDataValueType)

                           .WithParameter("FloatParameter", 3.14)

                           .WithVarParameter("VarFloatParameter", 3.14, floatDataValueType)

                           .WithParameter("BooleanParameter", true)

                           .WithVarParameter("VarBooleanParameter", false, booleanDataValueType)

                           .WithParameter("DateTimeParameter", dateTimeValue)

                           .WithVarParameter("VarDateTimeParameter", dateTimeValue, dateTimeDataValueType)

                           .WithParameter("BinaryParameter", stream)

                           .WithVarParameter("VarBinaryParameter", stream)

                           .WithOutputParameter("ResultParameter", textDataValueType) as StoredProcedure;

storedProcedure.PackageName = Page.UserConnection.DBEngine.SystemPackageName;

storedProcedure.Execute();



Функция вызывается аналогично.

Add comment

Антон Малий,

Я понял, большое спасибо

Вот для функции:

public virtual string GenerateCardCVC(Guid cardId) {
	var udf = new UserDefinedFunction(UserConnection, "fn_GenerateCardCVC");
	udf.WithParameter("pCardId", cardId);
	return udf.ExecuteScalar<string>();
}

 

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

Подозреваю что должно выглядеть это как то так, но не получается:

 

$url = 'https://MYSITE.bpmonline.com/0/DataService/json/reply/UpdateQuery';

                $arr = [

                    'RootSchemaName' => "Contact",

                    'OperationType' => "Delete",

                    'ColumnValues' => [

                        'Items' => [

                            'Skype' => [

                                'ExpressionType' => 'Parameter',

                                'Parameter' => [

                                    'DataValueType' => 'Text',

                                    'Value' => 'skype_login_4'

                                ]

                            ]                

                        ]

                    ],

                    'Filters' => [

                        'RootSchemaName' => 'Contact',

                        'FilterType' => 'FilterGroup',

                        'Items' => [

                                'FilterByUsrMainMail' => [

                                    'FilterType' => 'CompareFilter',

                                    'ComparisonType' => 'Equal',

                                    'LeftExpression' => [

                                        'ExpressionType' => 'SchemaColumn',

                                        'ColumnPath' => 'UsrMainMail'

                                    ],

                                    'RightExpression' => [

                                        'ExpressionType' => 'Parameter',

                                        'Parameter' => [

                                            'DataValueType' => 'Text',

                                            'Value' => contactemail@example.com

                                        ]

                                    ]

                                ]

                        ]

                    ]

                ];

$this->crm_curl($url, $arr, 10);

Нравится

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

Добрый день.

Рекомендую сначала попробовать отправлять запросы через Fiffler. Например, запрос с телом 

{
   "QueryType":2,
   "Filters":{
      "FilterType":6,
      "ComparisonType":0,
      "Items":{
         "FilterByName":{
            "FilterType":1,
            "ComparisonType":3,
            "LogicalOperation":0,
            "LeftExpression":{
               "ExpressionType":0,
               "ColumnPath":"Number",
            },
            "RightExpression":{
               "ExpressionType":2,
               "Parameter":{
                  "DataValueType":1,
                  "Value":"Skup4",
               },
            },
         }
      },
   },
   "RootSchemaName":"ContactCommunication",
   "OperationType":0
}

удалит скайп "Skup4". И не забывайте про куки, и заголовки, более подробно на академии (запрос изменится для DataService) https://academy.terrasoft.ua/documents/technic-sdk/7-12/vypolnenie-zapr…

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

Добрый день

методом POST добавляю строку в таблицу SysImage

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

{

    "Name": "Тестовая картинка"

    "Data": "X'23AB............ и так далее'"

}

{

    "Name": "Тестовая картинка"

    "Data": "binary'23AB............ и так далее'"

}

{

    "Name": "Тестовая картинка"

    "Data": "'23AB............ и так далее'"

}

а так же без одинарных кавычек

даже пробовал сначала создавать запись без заполнения Data, а потом методом MERGE заполнять отдельно только это поле, но по всех случаях поле Data не может десериализоваться.

<?xml version="1.0" encoding="utf-8" standalone="yes"?>4An error occurred while processing this request.An error occurred while processing this request.System.Data.Services.DataServiceException   в System.Data.Services.Serializers.ODataMessageReaderDeserializer.Deserialize(SegmentInfo segmentInfo)&#xD;

   в System.Data.Services.Serializers.Deserializer.HandlePutRequest()&#xD;

   в System.Data.Services.DataService`1.HandlePutOperation(RequestDescription description, IDataService dataService)&#xD;

   в System.Data.Services.DataService`1.ProcessIncomingRequest(RequestDescription description, IDataService dataService)&#xD;

   в System.Data.Services.DataService`1.HandleNonBatchRequest(RequestDescription description)&#xD;

   в System.Data.Services.DataService`1.HandleRequest()A stream property was found in a JSON request payload. Stream properties are only supported in responses.Microsoft.Data.OData.ODataException   в Microsoft.Data.OData.Json.ODataJsonEntryAndFeedDeserializer.ReadStreamPropertyValue()&#xD;

   в Microsoft.Data.OData.Json.ODataJsonEntryAndFeedDeserializer.ReadEntryProperty(IODataJsonReaderEntryState entryState, IEdmProperty edmProperty)&#xD;

   в Microsoft.Data.OData.Json.ODataJsonEntryAndFeedDeserializer.ReadEntryContent(IODataJsonReaderEntryState entryState, IEdmNavigationProperty& navigationProperty)&#xD;

   в Microsoft.Data.OData.Json.ODataJsonReader.ReadAtEntryStartImplementation()&#xD;

   в Microsoft.Data.OData.ODataReaderCore.ReadImplementation()&#xD;

   в Microsoft.Data.OData.ODataReaderCore.InterceptException[T](Func`1 action)&#xD;

   в System.Data.Services.Serializers.EntityDeserializer.ReadEntry(ODataReader odataReader, SegmentInfo topLevelSegmentInfo)&#xD;

   в System.Data.Services.Serializers.EntityDeserializer.Read(SegmentInfo segmentInfo)&#xD;

   в System.Data.Services.Serializers.ODataMessageReaderDeserializer.Deserialize(SegmentInfo segmentInfo)

Нравится

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

Возможно, стоит попробовать для загрузки использовать стандартный FileApiService. Тут описываются примеры работы с ним. Ещё есть ImageAPIService для картинок. Примеров по нему не видно, но сам интерфейс системы при работе с картинками должен работать через него, можно попробовать отловить запросы в Fiddler.

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

Перестали запускаться БП по таймеру. В логах вижу

2018-03-16 10:00:38,970 [BPMonlineQuartzScheduler_Worker-1] ERROR CP-BPM2\bpmadmin Terrasoft.Core.Scheduler.ProcessJobStub Execute - Cross-domain process launch for workspace "Default" ended abnormally

System.AppDomainUnloadedException: The application domain in which the thread was running has been unloaded.

Server stack trace: 

   at System.Threading.Thread.InternalCrossContextCallback(Context ctx, IntPtr ctxID, Int32 appDomainID, InternalCrossContextDelegate ftnToCall, Object[] args)

   at System.Runtime.Remoting.Channels.CrossAppDomainSink.DoTransitionDispatch(Byte[] reqStmBuff, SmuggledMethodCallMessage smuggledMcm, SmuggledMethodReturnMessage& smuggledMrm)

   at System.Runtime.Remoting.Channels.CrossAppDomainSink.SyncProcessMessage(IMessage reqMsg)

Exception rethrown at [0]: 

   at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)

   at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)

   at Terrasoft.Core.Scheduler.ProcessJobProxy.Execute(IWebAppJob job, IJobExecutionContext context)

   at Terrasoft.Core.Scheduler.ProcessJobStub.Execute(IJobExecutionContext context)


 

Что это такое? Почему? И как с этим быть?

Нравится

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

Не помогает даже ребут сервера

2018-03-16 10:40:44,066 [9] INFO  CP-BPM2\bpmadmin Quartz.Core.QuartzScheduler Initialize - Scheduler meta-data: Quartz Scheduler (v2.3.2.0) 'BPMonlineQuartzScheduler' with instanceId 'auto'

  Scheduler class: 'Quartz.Core.QuartzScheduler' - running locally.

  NOT STARTED.

  Currently in standby mode.

  Number of jobs executed: 0

  Using thread pool 'Quartz.Simpl.SimpleThreadPool' - with 5 threads.

  Using job-store 'Quartz.Impl.AdoJobStore.JobStoreTX' - which supports persistence. and is clustered.

 

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

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

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

Добрый день, коллеги! Нужно просуммировать значения DurationInMitutes активностей контакта и поместить значение в поле контакта, для этого, как написано в академии, можно присоединить схему, в нашем случае Activity, но почему то вы результат приходит пустой ответ. Я попробовал упростить задачу и просто вывести диалоговой окно с заголовками всех активностей без фильтров, результат тот же, пустые ответы по каждому элементу коллекции (пример кода ниже)... Интересно что при построении пути колонке в виде esq.addColumn("Activity.Title", "ActivityName"); выдает диалоговое окно со значениями undefinedundefinedundefined...., то есть значение каждого элемента коллекции undefined, подскажите в чем может быть проблема?

                var message= "";

                // Создаем экземпляр класса Terrasoft.EntitySchemaQuery с корневой схемой [Contact].

                var esq = Ext.create("Terrasoft.EntitySchemaQuery", {

                    rootSchemaName: "Contact"

                });



                esq.addColumn("[Activity:Id:Owner].Title", "ActivityName");                



                esq.getEntityCollection(function (result) {

                    if (!result.success) {

                        // обработка/логирование ошибки, например

                        this.showInformationDialog("Ошибка запроса данных");

                        return;

                    }

                    result.collection.each(function (item) {

                        // Обработка элементов коллекции.

                        message += item.get("ActivityName");

                    });

                    this.showInformationDialog(message);

                }, this);

Нравится

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

Кочев Антон Сергеевич,

1. Вместо [Activity:Id:Owner] требуется писать [Activity:Owner:Id] (или [Activity:Owner]), т.к. на втором месте идет поле дочернего объекта по которому присоединяем, а на третьем поле текущего объекта.

2. У вас нет фильтра

Спасибо за совет! Сделал оба пункта - все равно пустые ответы, при этом если ставить вместо параметра CurrentContactId значение id контакта, то результаты приходят корректно... пробовал указывать тип данных фльтра Terrasoft.DataValueType.GUID, ничего не меняется, в чем может быть проблема?

                var CurrentContactId = this.get('Id');

                var message= "";

                var esq = Ext.create("Terrasoft.EntitySchemaQuery", {

                    rootSchemaName: "Contact"

                });

                esq.addColumn("[Activity:Owner:Id].Title", "ActivityName");

                var esqFirstFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, '[Activity:Owner:Id].Id', CurrentContactId);

                esq.filters.add("esqFirstFilter", esqFirstFilter);

                esq.getEntityCollection(function (result) {

                    if (!result.success) {

                        this.showInformationDialog("Ошибка запроса данных");

                        return;

                    }

                    result.collection.each(function (item) {

                        message += item.get("ActivityName");

                    });

                    this.showInformationDialog(message);

                }, this);

Антон,

Ваш фильтр:

esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, '[Activity:Owner:Id].Id', CurrentContactId);

Сравнивает Id активности и текущий Id сущности (предположительно контакт).

Вы же хотите сделать фильтр по контакту:

esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, 'Id', CurrentContactId);

Еще проще этот запрос бы смотрелся если бы вы использовали в качестве корневой схемы - схему Actvity, а не Contact. Тогда не нужны будут никакие обратные связи.

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

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