Вопрос

Здравствуйте! При написании кода в "сценарии" бизнес-процесса, и попытке его отладить, увидел следующую "особенность". Вот код запроса данных:
 

var esqResult = new EntitySchemaQuery(userConnection.EntitySchemaManager, "City");
            esqResult.AddColumn("Name");
            esqResult.AddColumn("CreatedOn");
            esqResult.AddColumn("ModifiedOn"); 
            esqResult.AddColumn("Country");
            esqResult.AddColumn("Country.Code");
            esqResult.AddColumn("TimeZone");
            esqResult.AddColumn("TimeZone.Code");
            var entities = esqResult.GetEntityCollection(userConnection);

Но вот запрос, категорически не хочет видеть мое поле "Code" поля "Country", вот типа того.

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

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

Добрый день. Подскажите, пожалуйста, как разрешить следующую проблему.

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

 

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

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

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

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

Запуск механизма массового удаления осуществляется при помощи GridUtilitiesService. метод DeleteRecordsAsync который принимает массив идентификаторов записей, название сущности и словарь, который отвечает за конфигурирование параметров, так же метод подготавливает параметры и запускает MultiDeleteExecutor. Особенностью метода является управляемый запуск операции удаления при помощи системной настройки с кодом DefaultNumberItemsReturned, которая отвечает за запуск операции в фоне или в общем потоке.

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

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

Коллеги, требуется помощь!

Программирую регулярное выполнение бизнес-процесса через планировщик таким образом:
первый элемент бизнес-процесса проверяет наличие триггера, и в случае отсутствия - создаёт триггер в БД. Т.е. при первом ручном запуске БП - он формирует себе "расписание" последующих запусков.

Пробовал использовать несколько способов, но все они не работают, в Библиотеке БП процесс присутствует, триггеры в БД заводятся. Но последующих запусков не происходит.

В чём может быть причина?

Доп. инфоормация:

Версия BPM 7.7 Bank Customer Journey. БД Oracle.
Триггеры находятся в состоянии WAITNG.
Пользователь для выполнения системных операций (SystemUser) Supervisor.
IIS перезапускал. Application Pool находится в режиме Универсальный.

Способы, которые я пробовал использовать:

CronTriggerImpl:

var cronExp = "0 0/5 * ? * * *";
 
if (!AppScheduler.DoesJobExist(jobName, jobGroup))
{
	var job = AppScheduler.CreateProcessJob(jobName, jobGroup, procName, userConnection.Workspace.Name, userConnection.CurrentUser.Name);
	var trigger = new CronTriggerImpl(jobName + "Trigger", jobGroup, cronExp);
	AppScheduler.Instance.ScheduleJob(job, trigger);
}

 

CronTriggerImpl:

var cronExp = "0 0/5 * ? * * *";
 
if (!AppScheduler.DoesJobExist(jobName, jobGroup))
{
	var job = AppScheduler.CreateProcessJob(jobName, jobGroup, procName, userConnection.Workspace.Name, userConnection.CurrentUser.Name);
	var trigger = new CronTriggerImpl(jobName + "Trigger", jobGroup, cronExp);
 
	trigger.MisfireInstruction = MisfireInstruction.CronTrigger.FireOnceNow;
	trigger.TimeZone = TimeZoneInfo.Utc;
 
	AppScheduler.Instance.ScheduleJob(job, trigger);
}

 

ScheduleMinutelyProcessJob:

int periodInMinutes = 3;
 
if (!AppScheduler.DoesJobExist(jobName, jobGroup))
{
	AppScheduler.ScheduleMinutelyProcessJob(jobName, jobGroup, procName,
		userConnection.Workspace.Name, userConnection.CurrentUser.Name, periodInMinutes);
}

 

SimpleTriggerImpl:

int startOffset = 4;
 
if (AppScheduler.DoesJobExist(jobName, jobGroup))
{
   AppScheduler.RemoveJob(jobName, jobGroup);
}
 
var job = AppScheduler.CreateProcessJob(jobName, jobGroup, procName, userConnection.Workspace.Name, userConnection.CurrentUser.Name);
var trigger = new SimpleTriggerImpl(jobName + "Trigger", jobGroup, DateTime.UtcNow.AddMinutes(startOffset));
AppScheduler.Instance.ScheduleJob(job, trigger);

 

SimpleTriggerImpl от системного пользователя:

int startOffset = 4;
 
if (AppScheduler.DoesJobExist(jobName, jobGroup))
{
   AppScheduler.RemoveJob(jobName, jobGroup);
}
 
var job = AppScheduler.CreateProcessJob(jobName, jobGroup, procName, userConnection.Workspace.Name, userConnection.CurrentUser.Name, null, true);
var trigger = new SimpleTriggerImpl(jobName + "Trigger", jobGroup, DateTime.UtcNow.AddMinutes(startOffset));
AppScheduler.Instance.ScheduleJob(job, trigger);

 

При использовании всех вариантов - триггеры создаются в БД, но повторно не срабатывают. Куда копать?

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

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

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

Сайт пингуется. Так же есть уже заведённые (не мной, до меня) Job'ы c триггерами, которые регулярно запускаются с периодичностью в 2 минуты. Мои же триггеры не запускаются

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

Для контроля запускал такой скрипт (БД Oracle) -

SELECT sched_name,
       trigger_group,
       job_name,
       job_group,
       trigger_state,
         TO_DATE ('03-jan-0001', 'dd-mon-yyyy')
       + next_fire_time / (10000000 * 60 * 60 * 24)
           AS next_fire_time,
       TO_DATE ('03-jan-0001', 'dd-mon-yyyy')
       + prev_fire_time / (10000000 * 60 * 60 * 24)
           AS prev_fire_time
  FROM qrtz_triggers

он показывает что у моих триггеров prev_fire_time - пустое, а next_fire_time, к примеру, "28.11.2017 8:41:49".  У работающих же триггеров - оба значения заполнены, и примерно например, prev_fire_time: "28.11.2017 8:40:48"

 

 

Проверьте что бы название (не заголовок) целевых процессов совпадал со значением в переменной procName (при создании джоба).

Если не поможет напишите в тех. поддержку.

Олег, спасибо)

Вроде перепроверил заголовки. Уже !!! параллельно написал в поддержку платную. Давайте вместе найдём в чём затык!

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

Добрый день.

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

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

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

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

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

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

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

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

/**
 * Обновляет поля карточки для сущности страницы.
 * @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…

Добрый день.
Это-то всё понятно, и про рассылку сообщений, и про подписку, вопрос как раз в этой вот обработке "должным образом", как её реализовать наиболее правильно и универсально, чтобы можно было обернуть функциональность в миксин, к примеру, и не опасаться, что на разных страницах будут возникать разные "косяки". Т.е. "научить" страницы заполнять свои поля актуальными значениями не только при открытии страницы...

Есть соображение, что это должно делаться похожим образом с тем, как это делается при начальной инициализации, но когда страница уже загружена - на ней начинают работать dependencies, бизнес-правила и прочее, что было бы, возможно, лишним в данной ситуации. Кроме того при начальном заполнении и изменении значений на загруженной странице, контролы (например, справочные поля, кнопки), ведут себя по-разному. Поэтому тут надо действовать "тонко". Понятно, что придётся использовать EntitySchemaQuery с this.set в цикле в кол-бэке для получения и присвоения значений, но какие-то системные атрибуты страницы, видимо, придётся приводить к значениям "до onEntityInitialized", чтобы, например, не менялось состояние объекта changedValues. Но, в то же время, надо понимать, что при этом могут пострадать "параллельно" работающие процессы в экземпляре страницы. Тут, наверняка, много подводных камней, поэтому задача представляется довольно комплексной.

Уффф... много текста...

Добрый день.

Для загрузки актуальных данных с сервера у наследников BasePage есть метод this.reloadEntity(). В системе есть примеры его вызова на onSaved.

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

Пример:
* меняем что-то на странице физ-лица (не сохраняем)
* заходим на страницу документа - меняем документ на основной
* сохраняем (при этом в физ. лице заполняется текстовое поле документа данными из сохранённой сущности документа)
* закрываем документ - возвращаемся на страницу физ. лица - вот тут надо обновить текстовое поле документ, и, если это сделать при помощи reloadEntity, потеряем сделанные ранее на странице изменения.

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

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

Работа с объектами 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
	});
}

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

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