Вопрос

Добрый день.

Интересует следующее.

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

При этом после сохранения сущности необходимо каким-то образом актуализировать наполнение полей на открытой ранее странице редактирования. Вот тут начинаются танцы с бубном в виде прикручивания к методу onSaved всяких loadEntity или onDiscardChangesClick. как правило, сразу корректно эти варианты не работают в 90% случаев. Подскажите, пожалуйста, как наиболее корректно реализовать обновление полей?

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

PS. Использовать просто this.set... в колбэке EntitySchemaQuery не предлагать.

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

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

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

/**
 * Обновляет поля карточки для сущности страницы.
 * @param {Array} fields Список обновляемых полей.
 * @param {Function} callback Функция обратного вызова.
 * @param {Object} scope Контекст функции обратного вызова.
 */
var reloadCardFromPage = function (fields, callback, scope) {
	var showSaveButton = scope.get("ShowSaveButton");
	var showDiscardButton = scope.get("ShowDiscardButton");
	var showCloseButton = scope.get("ShowCloseButton");
	if (!scope.Ext.isArray(fields) || fields.length === 0) {
		return ;
	}
	var fieldsQuantity = fields.length;
	var selectNewValues = scope.Ext.create("Terrasoft.EntitySchemaQuery", {
		rootSchemaName: scope.entitySchemaName
	});
	for (var i = 0; i < fieldsQuantity; i++) {
		selectNewValues.addColumn(fields[i]);
	}
	var id = scope.get("Id");
	selectNewValues.getEntity(id, function(result) {
		var entity = result.entity;
		if (entity ) {
			fields.forEach(function(element) {
				var newValue = entity.get(element);
				scope.set(element, newValue);
			}, scope);
			scope.set("ShowSaveButton", showSaveButton);
			scope.set("ShowDiscardButton", showDiscardButton);
			scope.set("ShowCloseButton", showCloseButton);
			callback.call(scope);
		}
	}, scope );
};

Т.е. на вход подаем список полей для обновления.

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

Чубко Илья,

Добрый день.

Речь идёт не об актуализации перед сохранением, а об актуализации после сохранения, когда значение полей поменялось на стороне сервера, а нам надо продолжить работу с карточкой (значение может поменяться даже не при сохранении данной сущности, а при сохранении другой сущности. К примеру, Вы можете зайти в карточку другого объекта из детали основной карточки, что-то там сделать, сохранить, при сохранении сервер пересчитает поле основной сущности, и Вам нужно это поле обновить, отправив сообщение со страницы карточки, открытой из детали, при этом не потерять изменения, сделанные ранее на основной странице (см. мой пример из поста)).

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

 

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

 

PPS. Хотелось бы услышать ещё варианты.

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

Добрый день, 

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

После чего заместить ClientMessageBridge, и реализовать рассылку сообщений. И уже после, на необходимой странице, обрабатывать полученное по WebSocket сообщение необходимым образом, к примеру актуализировать значения на странице.

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

Пример: https://academy.terrasoft.ru/documents/technic-sdk/7-8/clientmessagebri…

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

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

Работа с объектами bpm'online по протоколу OData через WCF-клиент.
Версия продукта BPM Bank Customer Journey 7.7

Вызов происходит в Windows-приложении на удалённой машине:

// C#
  // Отрабатывает корректно:
    var sys = this.SysSettingsCollection.Where(x => x.Code.Equals(settingsCode)).FirstOrDefault();
    if (sys == null)
    {
        return false;
    }
 // Выбрасывает исключение:
    var val = this.SysSettingsValueCollection.Where(x => x.SysSettingsId.Equals(sys.Id)).FirstOrDefault();
    //var val = this.SysSettingsValueCollection.Where(x => x.SysSettingsId.Value.Equals(sys.Id)).FirstOrDefault();
    //var val = this.SysSettingsValueCollection.Where(x => x.SysSettingsId == sys.Id).FirstOrDefault();
    //var val = this.SysSettingsValueCollection.Where(x => x.SysSettingsId.Value == sys.Id).FirstOrDefault();

Первый запрос отрабатывает нормально, а любой вариант из 4х последних строк выбрасывает исключение:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
    <code>4</code>
    <message xml:lang="">The MaxDataServiceVersion '2.0' is too low for the response. The lowest supported version is '3.0'.</message>
    <innererror>
    <message>The MaxDataServiceVersion '2.0' is too low for the response. The lowest supported version is '3.0'.</message>
    <type>System.Data.Services.DataServiceException</type>
        <stacktrace>   в System.Data.Services.RequestDescription.VerifyAndRaiseResponseVersion(Version version, IDataService service)&#xD;
           в System.Data.Services.RequestDescription.UpdateVersions(String acceptTypesText, ResourceSetWrapper resourceSet, IDataService service)&#xD;
           в System.Data.Services.RequestUriProcessor.ProcessRequestUri(Uri absoluteRequestUri, IDataService service, Boolean internalQuery)&#xD;
           в System.Data.Services.DataService`1.HandleRequest()
       </stacktrace>
   </innererror>
</error>

Где отрегулировать и какие настройки?

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

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

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

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

Вы можете явно указать какую версию протокола использовать при инициализации DataService. Попробуйте явно указать версию.

Пример: 

var ctx = new DataServiceContext(uri, DataServiceProtocolVersion.V3);

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

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

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

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

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

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

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

Denys Diachenko, вы имеете в виду через отдельную схему а не замещающий клиентский модуль?

Богдан Гриценко,

Вам необходимо в конфигурации создать модуль → унаследоваться от 

LeftPanelTopMenuModule → перенести весь код из родительской схемы → перенести LESS(стили) из исходной схемы. после измените видимость кнопки.

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

После создания и привязки детали к странице невозможно сделать привязку данных в объекте "Карточка раздела" в поле "Объект раздела" (в поле отображается <Нет доступа>). Есть ли какой-то способ разблокировать это поле и сделать доступным для привязки, либо всегда необходимо делать ручной скрипт обновления таблицы?

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

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

Здравствуйте, Сергей!

При создании детали вручную необходимо привязывать страницу к объекту (добавить запись в объект SysModuleEdit) только скриптом. выполнение этих действий через интерфейс не предусмотрено. 

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

https://academy.terrasoft.ru/documents/technic-sdk/7-11/sozdanie-detali…

 

Новак Руслан,

сами записи в таблицах SysModuleEdit, SysModuleEntity уже существуют. Проблема в инструменте привязки данных,
где по каким-то причинам невозможно привязаить поле "Объект раздела", хотя данные для него уже есть в БД. В результате отображается надпись <Нет доступа>

 

 

 

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

Максим Цынгаев,

SysModuleEntity, соответсвующее объекту раздела, уже привязано

Букало Сергей Сергеевич,

А в чем собственно заключается основная проблема? Для чего Вам эта привязка? Сколько переносил детали через привязку в Data - никогда не было проблем, даже если там проставлено, что объект секции недоступен.

Максим Цынгаев,

Деталь переносится, но после переноса не отображается кнопка добавления новой записи. Эмпирическим способом выяснили, что это зависит от наличия значения поля "Объект раздела", поэтому хочется, чтобы это поле тоже переносилось. Если это не так, то буду благодарен за пояснения

Я привязываю к пакету SysDetail, SysModuleEdit и SysModuleEntity (т.е. ровно то, что прописано в инструкции по добавлению детали вручную) - кнопка добавления новой записи вполне удачно показывает (мы же говорим про плюсик у детали?). На сколько я помню, на наличие этого плюсика влияет наличие записи о странице редактирования для детали, но никак не объект раздела. Чтобы перенести настройки колонок детали, еще привязываю данные из SysProfileData.

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

Добрый день!

В рамках интеграции сайта клиента с bpm`online появилась необходимость добавлять с сайта файлы на деталь "Файлы и ссылки" обращения. Для этого был написал веб-сервис для добавления файла, так выглядит метод добавления:

 [OperationContract]
        [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped,
        ResponseFormat = WebMessageFormat.Json)]
      public string InserCaseFile(CaseFileData data)
    {
      try
      {
        var appConnection = HttpContext.Current.Application["AppConnection"] as AppConnection;
        var userConnection = HttpContext.Current.Session["UserConnection"] as UserConnection;
        var caseFile = new Terrasoft.Configuration.CaseFile(userConnection);
 
    //    byte[] bytes = Convert.FromBase64String(data.File);
     ASCIIEncoding ascii = new ASCIIEncoding();
    var t = ascii.GetBytes(data.File);
	Stream stream = new MemoryStream(t);
 
          var id = Guid.NewGuid();
          caseFile.SetDefColumnValues();
           caseFile.Id = id;
           caseFile.Name = data.Name;
           caseFile.Size = (int)stream.Length;
           caseFile.SetStreamValue("Data", stream);
           caseFile.CaseId = new Guid(data.CaseId);
          caseFile.Save();
          return "Ok";
      }
      catch(Exception er)
      {
        return er.ToString();
      }
 
    }

Для тестирования с помощью SelectQuery веб-службы DataService был получен уже существующий в bpm файл *.txt, при получении значения из колонки Data в json возвращалась строка в кодировке 7-bit ASCII. 

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

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

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

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

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

Посмотрите, как передается файл в ConfigurationFileApi, метод upload.

И принимается в схеме FileApiService, метод public string Upload(Stream fileContent)

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

Добрый день, коллеги.  Проблема была в TypeId, как и написал Максим. Спасибо.

я имею в виду поле TypeId='529BC2F8-0EE0-DF11-971B-001D60E938C6' (это тип File из таблицы FileType)

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

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

 

Столкнулись с проблемой при разворачивании bpm'online для работы с Oracle.

Подскажите, где можно прочитать процесс установки с использование СУБД Oracle. Версия сервера 11g2.

Разворачивали аналогично инструкции для MSSql server.

По итогу получили следующий экран: http://joxi.ru/DrlzMjjU4nq4b2

При этом запросы через developer для аналогичных настроек из connectionstrings проходят без проблем: http://joxi.ru/KAgYJjjhgeygDm

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

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

Огромная благодарность тех. поддержке.

 

При разворачивании онсайт под Oracle необходимо указывать в web.config в корне схему бд.

 

<db>
    <general securityEngineType="Terrasoft.DB.Oracle.OracleSecurityEngine, Terrasoft.DB.Oracle" executorType="Terrasoft.DB.Oracle.OracleExecutor, Terrasoft.DB.Oracle" isCaseInsensitive="true" maxAnsiJoinCount="0" engineType="Terrasoft.DB.Oracle.OracleEngine, Terrasoft.DB.Oracle" metaEngineType="Terrasoft.DB.Oracle.OracleMetaEngine, Terrasoft.DB.Oracle" metaScriptType="Terrasoft.DB.Oracle.OracleMetaScript, Terrasoft.DB.Oracle" typeConverterType="Terrasoft.DB.Oracle.OracleTypeConverter, Terrasoft.DB.Oracle" connectionStringName="db" binaryPackageSize="1048576" useOrderNullsPosition="true" currentSchemaName="BPMONLINE770RUS" maxEntitySchemaNameLength="30" />
</db>

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

"Amount": {
    dataValueType: Terrasoft.DataValueType.FLOAT,
    type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN
}

Поле: 

{
    "operation": "insert",
    "name": "Amount",
    "values": {
        "layout": {
            "column": 0,
            "row": 2,
            "colSpan": 12
        },
        "bindTo": "Amount"
    },
    "parentName": "FinApplicationContent",
    "propertyName": "items"
}

Находятся на преднастроенной странице, не привязанной к какому-либо объекту. Страница показывается пользователю в ходе БП. Поля виртуальные,т.е. по результату ввода введенные данные просто попадают в процесс, без записи в какой-либо объект. 

Проблема: нельзя ввести с клавиатуры никакие символы, только ctrl+v.

Примечание: Если установить contentType: Terrasoft.ContentType.TEXT - то можно ввести символы. На странице есть одноименный параметр типа "Дробное число"

Как решить проблему с вводом в данное поле? Что не так?

 

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

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

скорее всего вы обнаружили "дефект", надо бы отписать о нем в ТП
Тем временем, в вашем случае,:
1) попробуйте использовать

Terrasoft.DataValueType.MONEY

в сути то же самое FLOAT (может прокатить laugh)
2) попробуйте не задавать у атрибута явно тип

Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN

 

PS: Если что-то из этого Вам поможет, отпишитесь пожалуйста что именно.

 

 

Первое помогло! Огромная вам благодарность! Все еще стоит писать об этом в ТП?

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

"Amount": {
    dataValueType: Terrasoft.DataValueType.FLOAT,
    type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
    precision: 2,
    size: 18
}

говорим спасибо вот этому куску в генераторе

if (column) {
	Ext.apply(floatEdit, {
		decimalPrecision: column.precision
	});
}

В очередной раз ломаем ноги о код террасофта и его "универсальность" и идем дальше

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

При работе с платформой возникло несколько вопросов, которые никак не освещены в документации:

1 Как соотносятся схема раздела и модель раздела. В обычном модуле создается набор вложенных контейнеров, в схеме - набор объектов, которые как-то трансформируются в представление. Может есть общий модуль, отвечающий за работу со схемами?

2. В схеме в дочернем модуле необходимо переопределить методы, но bindTo не отрабатывает, такое ощущение, что происходит потеря контекста. К примеру, если в свойстве visible явно проставить false, то элемент не отображается, но если добавить bindTo: название метода, который определен в методах, то ничего не происходит

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

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

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

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

биндинг на методы "дело тонкое"  как Восток laugh

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

почему, см. 

https://community.terrasoft.ru/questions/binding-znacenia-pola-ili-ego-svoistva-na-metod-vyzvat-obrabotku-bindinga-prinuditelno

https://community.terrasoft.ru/questions/bindig-bindto-svoistva-pola-visible-na-metod

 

Отвечая на ваши остальные вопросы:
В приложении BPM Online хоть и используется паттерн MVVC

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

существует своя специфическая модель наследования и замещения (она конечно "под капотом" require.js)

но в общем подходе вы должны понять в первую очередь, что напрямую с моделью (Backbone.js) представлениями (Ext.JS) модулями (AMD require.js) в большинстве реализаций Ваших кейсов по расширению и дополнению функционала работать не будете

начните все таки с Академии

общее описание абстракций применяемых в конфигурации

https://academy.terrasoft.ru/documents/technic-sdk/7-10/paket-shema-obekt-modul

что касается UI, то вот это перечень примеров 

https://academy.terrasoft.ru/documents/technic-sdk/7-10/konfigurirovanie-stranicy

поможет понять общую концепцию и подход

ну и основной источник знаний это 

исходные коды и документация

https://academy.terrasoft.ru/jscoresdk/ (JS)

https://academy.terrasoft.ru/api/SDKNETAPI/7.10.0/NetCoreAPI_Help.html#GeneralSDK.html (C#)
вот тут можете почитать как выгрузить исходники:

https://academy.terrasoft.ru/documents/technic-sdk/7-10/razrabotka-v-faylovoy-sisteme

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

visible: {bindTo: "method"}

нужно использовать

customCongig: {visible: {bindTo: "method"}}

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

Букало Сергей Сергеевич пишет:
customCongig: {visible: {bindTo: "method"}}

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

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

11 февраля 2016 года группа компаний Terrasoft представила bpm’online bank customer journey 7.7 — новую версию CRM-платформы для автоматизации задач розничного фронт-офиса банка. В фокусе релиза — технологии для быстрого изменения процессов банка в ответ на трансформацию рынка, а также инструменты для формирования исключительного опыта взаимодействия клиента с банком.
bank
Совсем скоро будет доступна запись вебинара.
А пока узнать о возможностях новой версии можно на сайте.

Поделиться

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