7.11
sales

Изменил маску ввода электронной почты, через системную настройку «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;

 

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

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

Показать все комментарии
хранимая функция
функции
7.7
sales

Добрый день,

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

Например создать функцию(Через 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. Тогда не нужны будут никакие обратные связи.

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

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

Неистово глючит стартовый таймер. Уже нашел, что он не работает в компилируемом процессе.

Сделал для таймера интерпретируемый процесс, который посылает сообщение, которое должно ловиться в другом компилируемом процессе.

В итоге процесс таймера запустился и висит в состоянии Выполняется. При этом ни на диаграмме, ни на странице процесса нет ни одного выполненного элемента.

Что с этим можно сделать?

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

Нравится

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

Алексей, здравствуйте!

Запуск компилируемых процессов по стартовому таймеру реализован в версии 7.11.3 и выше.

По поводу элемента Генерация сообщения, данный элемент работает в рамках отдельного экземпляра процесса, подробнее на Академии. Обработать сигнал в другом процессе не удастся.

Для версии 7.11.2 Вы можете при необходимости в элементе Задание-сценарий в расширенных настройках снять признак Для интерпретируемого процесса, снять признак Компилируемого процесса и выполнить деактивацию\активацию процесса. При этом будет пересоздан триггер для процесса.

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

Логвин Андрей Витальевич,

За 2 абзац спасибо, не знал.

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

Есть хеш логотипа компании. Пробую вывести изображение на сайте по URL https://epo.bpmonline.com/0/img/entity/hash/SysImage/Data/MYHASH, но там 401 ошибка (доступ запрещен). Как можно этот доступ разрешить? Или может есть другой способ вывести лого компании на сайта?

Нравится

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

Возможно, будет достаточно просто сначала залогиниться на сайте bpm'online через веб-форму логина. Если после этого по URL грузится нужное изображение, то стоит в серверной логике Вашего сайта логиниться программно через AuthService и далее работать с выданной кукой.

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

Вообще, каждый раз тянуть из bpm'online картинки для сайта, доступного извне — плохая идея, потенциальная уязвимость при DDOS-е. Лучше кешировать.

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