В мобильной версии приложение в пакете “Mobile”, в схеме MobileActivityModelConfig yстанавливаются значения по умолчанию:

Terrasoft.sdk.Model.setDefaultValuesFunc("Activity", function(config) {

   var coeff = 1000 * 60 * 5;

   var currentDate = new Date();

   var startDate = new Date(Math.round(currentDate.getTime() / coeff) * coeff);

   var dueDate = new Date(startDate.getTime() + 30 * 60000);

   config.record.set("StartDate", startDate);

   config.record.set("DueDate", dueDate);

   config.record.set("ShowInScheduler", true);

   Ext.callback(config.success, config.scope);

});

 

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

Terrasoft.sdk.Model.setDefaultValuesFunc('Activity', function(config) {

    var record = config.record;

    record.set('AnIsMobileSKU', true);

    Ext.callback(config.success, config.scope);

});

 

То получается, что выполняется только мой код, а код из схемы «MobileActivityModelConfig» не выполняется. Каким образом, в мобильной версии, можно расширить данную схему предустановленного пакета?

Нравится

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

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

Попробуйте в начало Вашей функции добавить строчку типа:

this.callParent(config)

Ответ службы поддержки:



В бизнес-правилах нет наследования.

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



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

Пировских Дмитрий,

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

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

Симптомы

Uncaught TypeError: Cannot read property 'PrimaryColumnName'

Причина

Добавлен раздел "Продукты" через мастер мобильного приложения

Решение

Необходимо внести правки в раздел "Продукты", а именно решается пересохранением настроек реестра и карточки

Необходимые условия и возможные ограничения

Права администратора

Нравится

Поделиться

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

Добрый день,подскажите пожалуйста,а в мобильном приложении есть функция автозаполнения поля ? Если да,то как это можно организовать ? Чтобы при создании новой записи в разделе,поле автоматически заполнялось значением,что то вроде счетчика записей. Например у меня в разделе есть 10 записей - запись 1,запись 2,запись 3 ... 10. При создании новой чтобы поле Название сразу заполнялось как запись 11. Подскажите примерный ход действий(на данный момент беру запросом с базы,сортируя и беру следующее число,но такой подход не очень хороший). Может быть есть более правильный вариант ? Спасибо!

Нравится

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

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

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

Terrasoft.sdk.Model.setModelEventHandler("ActivitySKU", 
    Terrasoft.ModelEvents[Terrasoft.ModelEventKinds.Before].update,
    function(config) {
        var record = config.scope.eventConfig.records[0];
        record.set("UsrIsChecked", true);
        Ext.callback(config.success, config.scope);
});

Или с помощью Custom бизнес правила:

Terrasoft.sdk.Model.addBusinessRule("ModelName", {
    name: "RuleName",
    ruleType: Terrasoft.RuleTypes.Custom,
    events: [Terrasoft.BusinessRuleEvents.Load, Terrasoft.BusinessRuleEvents.ValueChanged],
    executeFn: function(record, rule, column, customData, callbackConfig) {
        record.set("UsrColumn", "some value");
        Ext.callback(callbackConfig.success, callbackConfig.scope);
    }
})

Третий вариант - в кастомной странице повесить на загруженную запись дополнительный обработчик на изменение записи:

onLoadRecord: function(loadedRecord) {
    this.callParent(arguments);
    loadedRecord.on("columnchanged", this.onRecordColumnChanged, this);
},

Но я ещё столкнулся проблемой, что при изменении значения в записи не обновляется значение в соотвествующем поле на странице, приходилось доставать контрол и вручную в нём дублировать значение.

var control = Ext.getCmp("control_id");
control.setValue("some value");

 

Такое есть смысл на стороне сервера. Есть специальное действие в БП для получения номера по порядку.

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

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

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

Terrasoft.sdk.Model.setModelEventHandler("ActivitySKU", 
    Terrasoft.ModelEvents[Terrasoft.ModelEventKinds.Before].update,
    function(config) {
        var record = config.scope.eventConfig.records[0];
        record.set("UsrIsChecked", true);
        Ext.callback(config.success, config.scope);
});

Или с помощью Custom бизнес правила:

Terrasoft.sdk.Model.addBusinessRule("ModelName", {
    name: "RuleName",
    ruleType: Terrasoft.RuleTypes.Custom,
    events: [Terrasoft.BusinessRuleEvents.Load, Terrasoft.BusinessRuleEvents.ValueChanged],
    executeFn: function(record, rule, column, customData, callbackConfig) {
        record.set("UsrColumn", "some value");
        Ext.callback(callbackConfig.success, callbackConfig.scope);
    }
})

Третий вариант - в кастомной странице повесить на загруженную запись дополнительный обработчик на изменение записи:

onLoadRecord: function(loadedRecord) {
    this.callParent(arguments);
    loadedRecord.on("columnchanged", this.onRecordColumnChanged, this);
},

Но я ещё столкнулся проблемой, что при изменении значения в записи не обновляется значение в соотвествующем поле на странице, приходилось доставать контрол и вручную в нём дублировать значение.

var control = Ext.getCmp("control_id");
control.setValue("some value");

 

Спасибо!

 

Бершеда Д. Н. пишет:

Но я ещё столкнулся проблемой, что при изменении значения в записи не обновляется значение в соотвествующем поле на странице, приходилось доставать контрол и вручную в нём дублировать значение.

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

 

Данная проблема, скорее всего, решается передачей в метод .set третьего параметра true.

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

Симптомы

Настраиваю мобильное приложение, все объекты работают,кроме Активностей, при попытке зайти в Активность выходит сообщение:Uncaught TypeError:Cannot read property “modelName”

of undefined. Пробовала все колонки удалить, заново добавить, думала проблема в колонке Тип, не помогло ее удаление (после изменения настроек, заново раздавала права пользователям, чистила кэш и заново проводила синхронизацию с базой).

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

Решение

В карточке активности была убрана часть полей, а главное – убрана деталь «Участники активности». Почему «главное». На эту деталь есть завязки при работе самого раздела. В частности, по умолчанию, когда при синхронизации забираются активности из bpm’online, то забираются только те активности, в детали «Участники активности» которых есть текущий пользователь.

Как раз из-за того, что была удалена группа колонок «Связи» и деталь «Участники», возникала ошибка, поскольку мы на них завязались. 

Убрав эту деталь, возможно, не будут «правильно» забираться активности.

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

Создать кастомную схему (Исходный код) (например, "MobileUtilitiesCustom")

Ext.define("Terrasoft.sdk.RecordPageMetadataApplier.Override", {
 
                override: "Terrasoft.sdk.RecordPageMetadataApplier",
 
 
 
                addEmbeddedDetail: function(modelName, operation) {
 
                               this.embeddedDetails[operation.name] = operation.values;
 
                               var values = operation.values;
 
                               var filter = values.filter;
 
                               var detailName = operation.name;
 
                               Terrasoft.sdk.RecordPage.addEmbeddedDetail(modelName, {
 
                                               name: detailName,
 
                                               title: values.caption,
 
                                               position: values.position,
 
                                               modelName: values.entitySchemaName,
 
                                               primaryKey: filter.masterColumn,
 
                                               foreignKey: filter.detailColumn,
 
                                               hidden: values.hidden
 
                               });
 
                },
 
 
 
                applyMetadata: function() {
 
                               this.callParent(arguments);
 
                               for (var itemName in this.removedMetadataItems) {
 
                                               if (!Terrasoft.util.isGuid(itemName) && Terrasoft.util.String.contains(itemName, "EmbeddedDetail")) {
 
                                                               this.addEmbeddedDetail(this.modelName, {
 
                                                                              name: itemName,
 
                                                                              values: {
 
                                                                                              entitySchemaName: itemName.substring(0, itemName.indexOf("Detail")),
 
                                                                                              filter: {
 
                                                                                                              masterColumn: "Id",
 
                                                                                                              detailColumn: "Id"
 
                                                                                              },
 
                                                                                              hidden: true
 
                                                                              }
 
                                                               });
 
                                               }
 
                               }
 
                }
 
});
 
 
 
Terrasoft.sdk.RecordPage.configureColumn = function(model, columnSetName, columnName, columnConfig) {
 
                var modelConfig = Terrasoft.ApplicationConfig.getModelConfig(model);
 
                var columnSetConfig = modelConfig.columnSets.get(columnSetName);
 
                if (!columnSetConfig) {
 
                               return;
 
                }
 
                var columnSetColumns = Terrasoft.sdk.RecordPage.getColumns(model, columnSetName);
 
                if (!columnSetColumns) {
 
                               return;
 
                }
 
                var columnSetColumn = columnSetColumns.get(columnName);
 
                var columnOriginalConfig;
 
                if (columnSetColumn) {
 
                               columnOriginalConfig = columnSetColumn.columnOriginalConfig;
 
                } else {
 
                               columnOriginalConfig = {};
 
                               columnConfig.hidden = true;
 
                               var modelInstance = Ext.ClassManager.get(columnSetConfig.modelName || model);
 
                               var realModelColumnConfig = modelInstance.ColumnConfigs.get(columnName);
 
                               columnConfig.columnType = realModelColumnConfig.columnType;
 
                               columnConfig.name = columnName;
 
                }
 
                Ext.merge(columnOriginalConfig, columnConfig);
 
                var contextModel = columnSetConfig.modelName || model;
 
                if (columnConfig.hidden) {
 
                               var columns = this.getColumnSetColumns(model, columnSetName);
 
                               columns.remove(columnName);
 
                } else {
 
                               var resolvedColumnConfig = this.resolveColumnConfig(contextModel, columnOriginalConfig,
 
                                                               !!columnSetConfig.modelName);
 
                               columnSetConfig.columns.configure(columnName, resolvedColumnConfig);
 
                }
 
};
 
 
 
Terrasoft.sdk.RecordPage.addColumn = function(model, columnConfig, columnSetName) {
 
                var modelConfig = Terrasoft.ApplicationConfig.getModelConfig(model);
 
                if (!columnSetName) {
 
                               columnSetName = modelConfig.primaryColumnSetName;
 
                }
 
                var columnSetConfig = modelConfig.columnSets.get(columnSetName);
 
                if (!columnSetConfig) {
 
                               return;
 
                }
 
                var contextModel = columnSetConfig.modelName || model;
 
                var isEmbeddedDetail = !!columnSetConfig.modelName;
 
                if (!columnConfig.hidden) {
 
                               columnSetConfig.columns.add(this.resolveColumnConfig(contextModel, columnConfig, isEmbeddedDetail));
 
                }
 
                this.addColumnToQueryConfig(model, columnConfig.name, columnSetName, isEmbeddedDetail);
 
                if (columnConfig.displayColumn) {
 
                               this.addColumnToQueryConfig(model, columnConfig.displayColumn, columnSetName, isEmbeddedDetail);
 
                }
 
};

В манифесте мобильного приложения (например, "UsrMobileApplicationManifestCustomMobile") указать кастомную схему

{
 
"CustomSchemas": [
"MobileUtilitiesCustom"
]
}

 

Нравится

Поделиться

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

Симптомы

При подключении к серверу происходит ошибка:

Сообщение: В процессе получения текущего времени произошла ошибка 

Дополнительная информация: 

{"request":{"id":6,"headers":{"X-Terrasoft-Mobile":"true","Accept":"application/json","Content-Type":"application/json","Authorization":"Cookie","X-Requested-With":"XMLHttpRequest"},"options":{"url":"http://xxx.xxx.xxx.xxx/0/Mobile/Services/MobileDataService.ashx?functio…","scope":{"initialConfig":{"url":"http://xxx.xxx.xxx.xxx/0/Mobile/Services/MobileDataService.ashx?functio…","scope":{},"headers":{"X-Terrasoft-Mobile":"true","Accept":"application/json","Content-Type":"application/json","Authorization":"Cookie"},"method":"GET","disableCaching":false},"performanceCounterKey":"d0bdde84-6a5e-4855-bdd0-e7dafea8f9a1"},"headers":{"X-Terrasoft-Mobile":"true","Accept":"application/json","Content-Type":"application/json","Authorization":"Cookie"},"method":"GET","disableCaching":false},"async":true},"requestId":6,"status":500,"statusText":"Internal Server Error","responseText":"{\r\n  \"Code\": -1,\r\n  \"Exception\": \"System.Net.Sockets.SocketException (0x80004005): Обычно разрешается только одно использование адреса сокета (протокол/сетевой адрес/порт) 127.0.0.1:6379\\r\\n  в System.Net.Sockets.Socket.Connect(IPAddress[] addresses, Int32 port)\\r\\n  в System.Net.Sockets.Socket.Connect(String host, Int32 port)\\r\\n  в ServiceStack.Redis.RedisNativeClient.Connect()\"\r\n}","responseXML":null,"responseBytes":null}

Причина

Порт, на который происходит редирект занят другим приложением

Решение

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

Необходимые условия и возможные ограничения

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

Нравится

Поделиться

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

Симптомы

Ошибка если добавить ленту в новое рабочее место. Текст поста пишется в поле CreatedBy

Решение

В схеме настроек грида раздела «Лента» UsrMobileSocialMessageGridPageSettingsSupervisorworkplace добавляем след.:

{
    "operation": "insert",
    "name": "e0de54d7-b417-42b1-8081-36337aa344a1",
    "values": {
        "row": 0,
        "content": "Created by",
        "columnName": "CreatedBy",
        "dataValueType": 1,
        "operation": "insert"
    },
    "parentName": "settings",
    "propertyName": "items",
    "index": 1
}

2. И в настройке выше, для колонки «Message» меняем ее свойство row на 1:

"row": 1,

 

Нравится

Поделиться

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

Вопрос

Периодичность автоматической синхронизации где-то настраивается?

Ответ

Мобильное приложение поддерживает три типа синхронизации:

Ofline – для выполнения синхронизации необходимо нажать кнопку синхронизации

Ofline синхронизация в фоне – запускается, в момент когда приложение bpm’online mobile сворачивается и только в случае, если настройка «Автоматическая синхронизация» соответсвует текущему статусу интернет-соединения.

Online – синхронизация происходит при каждом действии клиента с записями в приложении

 

О фильтрах, которые применяются к отображаемым активностям:

Активность не должна быть закрытой

Активность с типом не e-mail

Пользователь мобильного приложения состоит в активностях

Также применяются фильтры интерфейса мобильного приложения:

Дата активности - в зависимости от выставленного фильтра по дате

Признак "Отображать в расписании"

Нравится

Поделиться

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

Симптомы

Тип: Terrasoft.SyncException%0D%0AСообщение: В процессе синхронизации произошла ошибка%0D%0A%0D%0AТип: Terrasoft.FileException%0D%0AСообщение: В процессе открытия файла произошла ошибка%0D%0AДополнительная информация: %0D%0A%09Имя: BPMonline700/AppStructure/rev_29/src/MobileContactAnniversaryEditPage.js%0D%0A%0D%0AТип: Terrasoft.FileSystemException%0D%0AСообщение: Объект не найден%0D%0AДополнительная информация: %0D%0A%09Код: 1%0D%0A%0D%0A

Решение

В мобильном приложении выполнить действия:

  1. Очистить кэш.
  2. Повторно выполнить синхронизацию

Нравится

Поделиться

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

Доброго времени суток!

При разработке возникла необходимость в создании списка предопределённых фильтров для справочника. Подскажите пожалуйста существует ли такая возможность и если да, то как?

Спасибо.

Нравится

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

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

Где конкретно Вас интересует данная доработка? В справочном полем? 

Я правильно понимаю, что Вы хотите фильтровать записи по условию в справочной колонке?

Опишите, пожалуйста, бизнес-задачу более подробно.

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

Вопрос

Как реализовать поиск по нескольким колонкам в разделе в мобильном приложении. Например, в разделе Контакты через поле поиска искать и по фио, и по zip-коду (существующая в объекте Contact колонка) 

Ответ

- Запустить мастер мобильного приложения

- Открыть рабочее место по умолчанию («Основное рабочее место»)

- Перейти к настройкам раздела

- Нажать «Сохранить»

- Создать ClientUnit-схему

- Добавить в нее след. код:

Terrasoft.sdk.GridPage.setSearchColumns("Contact", [“Name”, “Zip”]);

- Открыть MobileApplicationManifestDefaultWorkplace в пакете Custom

- Прописать свою схему для раздела «Контакты»:

{
    “Models”: {
        “Contact”: {
            "PagesExtensions": [
                "Имя_созданной_схемы"
            ]
        }
    }
}

 

Нравится

Поделиться

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