Добрый день!



Хочу сделать актуализацию курсов валют, указывая актуальные значения, полученные через веб-сервис. Возникает проблема с сохранением значения курса. Пишу новое значение как новую запись в таблицу CurrencyRate, заполняю поля CurrencyId, Rate, StartDate. Проблема в том, что система обрабатывает значения Rate, вычисляя обратный курс, мантиссу и на выходе в интерфейсе имею совсем другой курс и при расчетах получаю неверные значения. Подскажите каким образом корректно сохранить полученное прямое значение курса в системе и корректно вывести его в интерфейсе в справочнике Валюты.

Нравится

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

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

Пример реализации логики можете посмотреть тут https://marketplace.terrasoft.ru/app/exchange-rate-update-bpmonline

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

Пример реализации логики можете посмотреть тут https://marketplace.terrasoft.ru/app/exchange-rate-update-bpmonline

Добрый день!

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

System.ServiceModel.EndpointNotFoundException: Прослушивание на http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx не выполняла ни одна конечная точка, которая могла бы принять сообщение. Среди прочих причин это могло быть вызвано неправильным адресом или действием SOAP. Подробнее см. в описании InnerException (если имеется). ---> System.Net.WebException: Невозможно соединиться с удаленным сервером ---> System.Net.Sockets.SocketException: Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера 212.40.192.49:80
   в System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)
   в System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state, IAsyncResult asyncResult, Exception& exception)
   --- Конец трассировки внутреннего стека исключений ---
   в System.Net.HttpWebRequest.GetRequestStream(TransportContext& context)
   в System.Net.HttpWebRequest.GetRequestStream()
   в System.ServiceModel.Channels.HttpOutput.WebRequestHttpOutput.GetOutputStream()
   --- Конец трассировки внутреннего стека исключений ---
 
Server stack trace: 
   в System.ServiceModel.Channels.HttpOutput.WebRequestHttpOutput.GetOutputStream()
   в System.ServiceModel.Channels.HttpOutput.Send(TimeSpan timeout)
   в System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.SendRequest(Message message, TimeSpan timeout)
   в System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout)
   в System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout)
   в System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
   в System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
   в System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)
 
Exception rethrown at [0]: 
   в System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   в System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
   в Terrasoft.Configuration.CbrfDI.DailyInfoSoap.GetCursOnDate(DateTime On_date)
   в Terrasoft.Configuration.TscCbrfLoader.Load()
   в Terrasoft.Core.Process.TscLoadCurrencyRateMethodsWrapper.RunLoadCurrencyRateExecute(ProcessExecutingContext context)
   в Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)

Сталкивались ли вы с этим? В чем может быть причина?

Этот механизм реализован компанией «Техносерв консалтинг», лучше связаться с ними. А по тексту в журнале, может, с Вашего веб-сервера не было доступа к адресу http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx.

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

Добрый день! Производил привязку данных по правам на администрируемые операции. Написал скрипт по предварительному удалению записей по фильтру и привязал данные. При обновлении из свн на другом сайте, после обновления сайт перестал работать. В логах приложения ошибка. Будьте добры, подскажите как решить данную проблему.

 

2018-10-26 17:22:07,220 [5] ERROR IIS APPPOOL\ArdshinBank7102-3 Terrasoft.WebApp.FileWebEventProvider ProcessEvent - Date: 26.10.2018 17:22:07
Date (UTC): 26.10.2018 13:22:07

Exception Message: Вложенный запрос вернул больше одного значения. Это запрещено, когда вложенный запрос следует после =, !=, , =, >, >= или используется в качестве выражения.
Exception Type: System.Data.SqlClient.SqlException
Exception Source: .Net SqlClient Data Provider

Exception Stack Trace:
   в System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   в System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   в System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   в System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   в System.Data.SqlClient.SqlDataReader.TryHasMoreRows(Boolean& moreRows)
   в System.Data.SqlClient.SqlDataReader.TryReadInternal(Boolean setTimeout, Boolean& more)
   в System.Data.SqlClient.SqlDataReader.Read()
   в Terrasoft.Core.DB.DBSecurityEngine.GetCurrentUserAdminOperationsFromDB()
   в Terrasoft.Core.DB.DBSecurityEngine.InitializeCurrentUserAdministratedOperations(String code)
   в Terrasoft.Core.DB.DBSecurityEngine.GetCanExecuteOperation(String code)
   в Terrasoft.Core.DB.DBSecurityEngine.GetEntitySchemaOperationsRightLevels(String schemaName)
   в Terrasoft.Core.DB.DBSecurityEngine.GetEntitySchemaOperationsRightLevel(String schemaName)
   в Terrasoft.Core.DB.DBSecurityEngine.GetIsEntitySchemaReadingAllowed(String schemaName)
   в Terrasoft.Core.Entities.EntitySchemaQuery.CreateSelect()
   в Terrasoft.Core.Entities.EntitySchemaQuery.GetSelectQuery(UserConnection userConnection)
   в Terrasoft.Core.Entities.EntitySchemaQuery.GetEntityCollection(UserConnection userConnection)
   в Terrasoft.Configuration.FeatureUtilities.GetFeatureState(UserConnection source, String code)
   в Terrasoft.Configuration.FeatureUtilities.GetIsFeatureEnabled(UserConnection source, String code)
   в Terrasoft.Configuration.ConfigurationSectionHelper.GetModuleStructure(UserConnection userConnection)
   в Terrasoft.Configuration.ConfigurationSectionHelper.GetConfigurationScript(UserConnection userConnection)
   в Terrasoft.Configuration.SectionHelper.GetConfigurationScript(UserConnection userConnection)
   в Terrasoft.WebApp.Nui.ViewModuleHelper.CreateModulesConfigScript(UserConnection userConnection, HttpResponse response)
   в Terrasoft.WebApp.Nui.ViewModule.SetupModulesConfig()
   в Terrasoft.WebApp.Nui.ViewModule.Page_Load(Object sender, EventArgs e)
   в System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
   в System.Web.UI.Control.OnLoad(EventArgs e)
   в System.Web.UI.Control.LoadRecursive()
   в System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

Нравится

6 комментариев
Лучший ответ
SELECT SysAdminOperationId, SysAdminUnitId, COUNT(*)
FROM dbo.SysAdminOperationGrantee
GROUP BY SysAdminOperationId, SysAdminUnitId
HAVING COUNT(*) > 1
 
 
SELECT SysAdminOperationId, Position, COUNT(*)
FROM dbo.SysAdminOperationGrantee
GROUP BY SysAdminOperationId, Position
HAVING COUNT(*) > 1

Если любой из этих запросов вернул что-то, то в этом проблема. Необходимо почистить данную таблицу дублирующих данных.

Без ошибок из лога  и сообщений в консоли броузера трудно чтото сказать. Разве что посоветовать обратится в тех поддержку.

Запросите у поддержке sql скрипты для перераздачи прав на существующие обекты и выполните их для тех объектов что вы меняли! Свежий бэкап есть или вы делали на среде разработки?

Есть приложение на маркет плэйсе  которое раздает права на созданные записи (актуальнот если изминили права и хотите распространить это на существующие объекты)  но если входа не происходит это вам не поможет!

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

Где именно, можно увидеть, записав в профайлере запрос, происходящий перед падением.

вот же

TOP (1) ставьте 

Я так понимаю что это из-за неправильно разданных прав происходит ошибка, в явном виде никто sql не корректировал. Так что  про TOP 1 єто не в тему 

SELECT SysAdminOperationId, SysAdminUnitId, COUNT(*)
FROM dbo.SysAdminOperationGrantee
GROUP BY SysAdminOperationId, SysAdminUnitId
HAVING COUNT(*) > 1
 
 
SELECT SysAdminOperationId, Position, COUNT(*)
FROM dbo.SysAdminOperationGrantee
GROUP BY SysAdminOperationId, Position
HAVING COUNT(*) > 1

Если любой из этих запросов вернул что-то, то в этом проблема. Необходимо почистить данную таблицу дублирующих данных.

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

День добрый всем, может кто либо сталкивался или знает, суть задачи такова:

Нужно отфильтровать стандартный фильтр, а именно оставить лишь пару колонок из множества в section, что бы в глаза не бросались остальные. Ковырялся в сторону QuickFilterModuleV2, но что-то не разобрался с ним.

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

Нравится

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

Надо было искать не в QuickFilterModuleV2, а в CustomFilterViewModelV2.

Список колонок получает функция:

function getSimpleFilterColumnList(filters, list) {
	list.clear();
	var columnList = {};
	var columnNames = [];
	var columns = this.entitySchema.columns;
	Terrasoft.each(columns, function(column) {
if (column.dataValueType !== Terrasoft.DataValueType.GUID &&
	column.dataValueType !== Terrasoft.DataValueType.TIME &&
	column.dataValueType !== Terrasoft.DataValueType.BLOB &&
	column.dataValueType !== Terrasoft.DataValueType.IMAGELOOKUP &&
	column.usageType !== ConfigurationEnums.EntitySchemaColumnUsageType.None) {
	if (this.isColumnDeprecated(column)) {
return;
	}
	columnNames.push({
name: column.name,
caption: column.caption
	});
}
	}, this);
	var sortedColumnNames = columnNames.sort(function(a, b) {
if (a.caption === b.caption) {
	return 0;
} else {
	return a.caption > b.caption ? 1 : -1;
}
	});
	Terrasoft.each(sortedColumnNames, function(item) {
var column = columns[item.name];
columnList[column.name] = {
	value: column.name,
	displayValue: column.caption,
	dataValueType: column.dataValueType,
	referenceSchemaName: column.referenceSchemaName
};
	});
	list.loadAll(columnList);
}

 

Я попробовал переопределить этот модуль, просто сделать пустым выпадающий список. Этот модуль в версии 7.13 нельзя заместить обычным способом, я использовал материал . Раскройте пожалуйста подробнее как удалось переопределить эту функцию?

Так это тема 2018 года, тогда в 7.11 ещё было можно.

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

Добрый день!

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

Нравится

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

нет, точнее так:

1. Если запускаете из пользовательского интерфейса - там только на запуск, нельзя отследить окончание выполнения.

2. Если есть преднастроенные страницы (кастомные), то можно в них последовательно включать и выключать маску.

3. Никто не помешает пользователю нажать рефреш :)

нет, точнее так:

1. Если запускаете из пользовательского интерфейса - там только на запуск, нельзя отследить окончание выполнения.

2. Если есть преднастроенные страницы (кастомные), то можно в них последовательно включать и выключать маску.

3. Никто не помешает пользователю нажать рефреш :)

Дмитрий Степанов,

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

Спасибо за предложенные варианты.

Мне не совсем они подходят, возможно я не совсем точно описал кейс.

Кейс состоит в том, что:

последовательно выполняются три подпроцесса:

1) Первый заканчивается

преднастроенной страницей, далее идет переход во 2-й подпроцесс

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

3) После выполнения 2-го процесса запускается 3-й процесс с преднастроенной страницей. 



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

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

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

 

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

Александр, спасибо за идею. Похоже на самый реалистичный вариант.

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

Добрый день!

Есть БП с элементом преднастроенная страницы. Список параметров страницы в процессе работы изменился. Часть параметров была удалена (знаю, что так нельзя, но уже свершившийся факт). Тем не менее в процессе удаленные параметры закешировались и при настройке отображения страницы отображаются. Но при добавлении нового параметра на страницу, в списке параметров в БП новые параметры не отображаются. При создании нового элемента процесса новые параметры подтягиваются, но при попытке сохранения выдает ошибку.

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

Открываю метаданные страницы и вижу что с этим ID как раз прописан удаленный параметр данной страницы. Вопрос: как решить данную проблему и обновить список параметров для страницы?

Нравится

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

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



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

Пробовали удалить из процесса и добавить заново элемент с данной преднастроенной страницей?

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

Добрый день!

В процессе использую параметр с типом Коллекция объектов. Значение данного параметра передается в процесс из родительского процесса. Далее в элементе с типом задание сценарий происходит некая работа с коллекцией (по сути коллекция передается в другой метод, сами ее значения не меняются). После чего по условию БП либо идет дальше, либо возвращается в данный же кубик задание сценарий и должен снова вызвать метод и передать данную коллекцию в качестве параметра. Однако, при повторном заходе в задание сценарий, БП падает с ошибкой 

Terrasoft.Common.ItemNotFoundException: Элемент с идентификатором "00000000-0000-0000-0000-000000000000" не найден
   в Terrasoft.Core.ManagerItemCollection`1.GetByUId(Guid uid)
   в Terrasoft.Core.Manager`2.GetInstanceByUId(Guid uid)
   в Terrasoft.Core.Process.GetGoldWarrantyAmountProcess.get_ProductConditionCollection()
   в Terrasoft.Core.Process.GetGoldWarrantyAmountProcess.ScriptTask1Execute(ProcessExecutingContext context)
   в Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)

Насколько я понимаю, это именно ошибка чтения параметра - коллекции объектов. 

В связи с этим у меня возникает вопрос: как корректно передавать параметр с типом коллекция объектов в другой БП, чтобы цикл его жизни не был равен одному запуску дочернего БП, а был доступен на всем протяжении работы данного БП?

Нравится

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

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

Наконец, если причину выяснить не получится, можно хранить сами данные в хранилище, а в параметре передавать на них ссылку.

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

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

День добрый.

пишу сюда так как техподдержка не реагирует....



Досталась в управления древняя версия 7.2

Не могу настроить доступ по https

На сайте у вас документация полько с 7.8

Соответственно не работают рекомендации.



Как мне с ней быть?

Как вариант я пытался через nginx c https запустить, тоже не работает. Точнее вроде работает, но как то криво, некоторые пункты меню не открываются вообще.



Посоветуйте как со всем этим быть?

Обновляться? Или может дадите документацию на настройку https для этой версии.

Спасибо.

Нравится

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

Добрый день. А в чем именно возникли сложности? 

Для перевода сайта для работы по протоколу https, после настройки IIS, необходимо внести изменения в конфигурационные файлы.

В секции <system.serviceModel> файла web.config загрузчика, заменить ServiceModel\http на ServiceModel\https:

&lt;system.serviceModel&gt;

&nbsp;&nbsp;&nbsp; ...

&nbsp;&nbsp;&nbsp; &lt;behaviors configSource="Terrasoft.WebApp\ServiceModel\<strong>https</strong>\behaviors.config" /&gt;

&nbsp;&nbsp;&nbsp; &lt;bindings configSource="Terrasoft.WebApp\ServiceModel\<strong>https</strong>\bindings.config" /&gt;

&lt;/system.serviceModel&gt;

 

В секции <system.serviceModel> файла web.config приложения (который находится в папке Terrasoft.WebApp), убрать <bindings configSource="ServiceModel\http\Bindings.config" /> (если есть) и заменить ServiceModel\http на ServiceModel\https:

&lt;system.serviceModel&gt;

&nbsp;&nbsp;&nbsp; ...

&nbsp;&nbsp;&nbsp; &lt;services configSource="ServiceModel\<strong>https</strong>\services.config" /&gt;

&nbsp; &nbsp; -------&lt;bindings configSource="ServiceModel\http\Bindings.config" /&gt;-------

&lt;/system.serviceModel&gt;

 

В файле Terrasoft.WebApp\ServiceModel\https\bindings.config из секции <webHttpBinding> убрать  maxReceivedMessageSize (если есть) и добавить новую секцию для <basicHttpBinding>:

&lt;basicHttpBinding&gt;

&nbsp;&nbsp; &nbsp;&lt;binding&gt;

&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;security mode="Transport"&gt;

&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;transport clientCredentialType="None" /&gt;

&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/security&gt;

&nbsp;&nbsp; &nbsp;&lt;/binding&gt;

&nbsp;&nbsp; &nbsp;&lt;binding name="ReportServiceBinding"&gt;

&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;security mode="Transport"&gt;

&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;transport clientCredentialType="None" /&gt;

&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/security&gt;

&nbsp;&nbsp; &nbsp;&lt;/binding&gt;

&lt;/basicHttpBinding&gt;

&lt;webHttpBinding&gt;

&nbsp;&nbsp; &nbsp;&lt;binding&gt;

&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;security mode="Transport" -------maxReceivedMessageSize="10485760"-------&gt;

&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;transport clientCredentialType="None" /&gt;

&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/security&gt;

&nbsp;&nbsp; &nbsp;&lt;/binding&gt;

&lt;/webHttpBinding&gt;

спасибо.

сделал как сказали. Но все равно какие то проблемы - некоторые ссылки не открываются. Тыкаешь по ним, ничего не происходит.

Также все как через nginx когда пробовал.

 

Ash,

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



Если сертификат нормальный - нужно смотреть настройки IIS и логи консоли. Но для этого лучше, чтобы техподдержка подключилась посмотрела все онлайн.

 

сертификат самоподписанный. И добавил исключение....

В браузере все работает нормально, за исключением нескольких ссылок, которые просто не открываются.

Нужно смотреть логи и скриншот ошибки в консоли. Лучше всего прислать их в техподдержку - по необходимости можно организовать удаленное подключение.

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

Добрый день!

При сохранении записи в детали средства связи возникают странные ошибки. Метод сохранения вызывает BatchQuery для Update сохраняемой записи. 

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

Однако при исполнении данного скрипта возникает следующая ошибка:

Конфликт инструкции DELETE с ограничением REFERENCE "FK4eIKa4vC33vluosjyKmFjgDPk3o". Конфликт произошел в базе данных "ArdshinBank7102-2", таблица "dbo.AppFormCommunication", column 'ContactCommunicationId'. ↵Выполнение данной инструкции было прервано."

Непонятно, каким образом возникло удаление, если выполнялся скрипт на модификацию записи.

 

Посмотрел событийные процессы объекта ContactCommunication, нигде нет удаления.

Подскажите, в какую сторону смотреть для решения ошибки.

 

Нравится

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

вот вам скрипт поиска зависимостей по ключу

 

SELECT
    C.CONSTRAINT_NAME,
    PK.TABLE_NAME,
    CCU.COLUMN_NAME,
    FK.TABLE_NAME,
    CU.COLUMN_NAME,
    C.UPDATE_RULE,
    C.DELETE_RULE
FROM
    INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C INNER JOIN
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME INNER JOIN
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME INNER JOIN
    INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME INNER JOIN
    INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE CCU ON PK.CONSTRAINT_NAME = CCU.CONSTRAINT_NAME
WHERE
    FK.CONSTRAINT_TYPE = 'FOREIGN KEY' AND c.[CONSTRAINT_NAME] like '%KEY'
ORDER BY
    PK.TABLE_NAME, 
    FK.TABLE_NAME;

Вместо '%Key' -> '%FK4eIKa4vC33vluosjyKmFjgDPk3o' и смотрите какая колонка от какой зависит.

И насколько я понимаю update = delete->insert в sql

Так откуда зависимость, как раз понятно из сообщения: в другой таблице AppFormCommunication есть ссылка ContactCommunicationId. Но почему при изменении ContactCommunication связь сломалось — надо разбираться.

Update — это не Delete с Insert. Ведь при переименовании какого-нибудь контакта система не ругается на связи с ним.

Тут одно из двух: либо скрипт автора темы затирает первичный ключ Id в этих записях новыми значениями (что маловероятно), либо есть какая-то логика на изменении этой таблицы в виде отдельного БП, встроенного БП объекта или триггера в базе.

Понять можно либо изучением всех упоминаний объекта ContactCommunication во всех схемах, либо, если есть доступ к БД, запустить профайлер и смотреть, что за Delete.

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

Добрый день!

На странице настройки синхронизации с LDAP одно из обязательных полей [Уникальный идентификатор пользователя]. По умолчанию заполняется значением ObjectSid. У меня возник вопрос: значения данного атрибута из AD хранятся где-нибудь в системе BPM Online? Если да, то в каком объекте и в каком поле. Насколько я понял, данные о пользователе AD хранятся в системе в объекте LDAPElement.

Нравится

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

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

Верно, это значение хранится в таблице LDAPElement - колонка LDAPEntryId.

Антон Малий,

Антон, добрый день! А подскажите, поле LDAPEntryDN в каком случае заполняется и как настроить его заполнение, если оно пустое?

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

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

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

Добрый день!

На кастомной странице редактирования в БП разместил обычную деталь с карточкой редактирования (наследует от Базовая схема детали с реестром). На onRender карточки повесил метод updateDetails(). Однако при добавлении записи в деталь обновления не происходит. Добавленная запись отображается в гриде только после настройки колонок. Подскажите, пожалуйста, как решить проблему обновления грида детали.

Нравится

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

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

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

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

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

subscriber пробовали повесить?

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

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

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

Вот код добавления детали, методы filterMethod и subscriber. Подскажите пожалуйста, возможно, есть идеи что не так. 

"DepositInFinApplicationDetail": {
	"schemaName": "snGoldDepositDetail",
	"filter": {
		"masterColumn": "Id",
		"detailColumn": "Id"
	},
	"filterMethod": "goldDetailFilter",
	"subscriber": {
		"methodName": "updateGoldDetail"
	}
},
 
goldDetailFilter: function() {
	var finApplication =  this.get("Id");
	var goldType = ""
	var filterGroup = new this.Terrasoft.createFilterGroup();
	filterGroup.logicalOperation = this.Terrasoft.LogicalOperatorType.AND;
	filterGroup.add("DepositFilter", this.Terrasoft.createColumnFilterWithParameter(
			this.Terrasoft.ComparisonType.EQUAL, "[snDepositInFinApplication:Deposit:Id].FinApplication.Id", finApplication));
	filterGroup.add("DepositTypeFilter", this.Terrasoft.createColumnFilterWithParameter(
			this.Terrasoft.ComparisonType.EQUAL, "[snDepositInFinApplication:Deposit:Id].Deposit.Type.Id", this.goldTypeId));
	return filterGroup;
},
 
	updateGoldDetail: function() {
				var detailId = this.getDetailId("DepositInFinApplicationDetail");
				this.sandbox.publish("UpdateDetail", {
					reloadAll: true
				}, [detailId]);
	},

 

Может, вообще убрать дополнительный код, оставить только стандартную логику. В обычных разделах всё ведь работает.

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

Александр, дополнительная логика нужна для реализации бизнес-логики.

Бизнес-логику можно реализовать и на уровне объекта, серверной логикой.

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