Симптомы

У меня проблемы / вопросы с мобильной версией:

  1. Если я что-то добавлю (контакт, учетная запись и т. Д.) в bpm'online эти данные экспортируются в мобильное приложение после выполнения синхронизации (это нормально. Но когда я удаляю что-то в bpm'online, эти данные не удаляются  в мобильном приложении после синхронизации, почему?
  2. В Mobile Wizard у меня нет вкладки Dashboard, но в bpm'mobile у меня есть эта вкладка, почему?
  3. Во вкладке Продажи Супервизор не видит продажи. Как я помню, вы написали мне, что это нормально, но как я могу это изменить? Я хочу, чтобы супервизор увидел все продажи.

Решение

1. К сожалению, мобильное приложение не синхронизирует информацию об удаленных записях в bpm'online. Мы знаем об этой ошибке и планируем ее исправить в одном из будущих выпусков. 

2. Вы не можете настроить диаграмму Dashboard в Mobile Wizard, эта функция доступна только в планах.

3.  Если вы хотите, чтобы каждый пользователь видел все возможности, мы можем удалить текущий фильтр для вас (приложение получает возможность фильтровать их по колонке Владелец).

Нравится

Поделиться

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

Вопрос

Есть ли возможность на странице сделать группу полей по умолчанию "свернутой"?

Ответ

У групп полей есть свойство collapsed. При описании группы полей в секции diff необходимо задать этому свойству признак true:

 

Пример для схемы OrderPageV2 для группы полей "Информация о получателе":

diff: /**SCHEMA_DIFF*/[
    {
        "operation": "merge",
        "parentName": "OrderResultsTab",
        "name": "OrderReceiverInformationResultsControlBlock",
        "values": {
            "controlConfig": {"collapsed": true}
        }
    },
]/**SCHEMA_DIFF*/

 

Нравится

Поделиться

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

По умолчанию система подгружает 15 записей в реестр.

Вот пример, как загрузить все данные (с учетом установленного быстрого фильтра(или его отсутствия) или фильтров дин. папки (или их отсутствия)):

this.methods.sayHello = function(){            
    this.pageRowsCount = 1000000;
    this.load(this.get('currentTabName'), 'QuickFilterChanged');
};
this.actions = [
{
    caption: 'getJSON_response',
    methodName: 'sayHello'
}
];

А вот пример того, как работать с коллекцией подгруженных данных (переопределяется базовая функция modifyItems (из SectionViewModelGenerator), в качестве параметра a - приходят нужные нам данные):

var actionStarted = false;
this.methods.modifyItems = function(a) {
    if(actionStarted) {
        alert(a.collection.items.length);
        //тут выполняете нужные вам действия с a.collection.items
    }
}
this.methods.sayHello = function(){
    actionStarted = true;
    this.pageRowsCount = 100;
    this.load(this.get('currentTabName'), 'QuickFilterChanged');
};
this.actions = [
{
    caption: 'getJSON_response',
    methodName: 'sayHello'
}
];

 

Нравится

Поделиться

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

Вопрос

Как скрыть фильтр "тег" в разделах/карточках?

Ответ

Для того чтобы убрать теги во всех разделах нужно:

Вариант 1. -  "Не красивый"

За отображаение тегов отвечает метод " UseTagModule" (Рис. 1).

Для скрытия тегирования в разделе необходимо заместить схему "BaseSectionV2", переопределить метод "UseTagModule" и поменять свойство на "false".

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

Рис. 1

Вариант 2. - "Красивый"

  1. Переопределить BaseSection
  2. Переопределить ф-цию getFolderEntitiesNames и установить аттрибут UseTagModule в false

     
getFolderEntitiesNames: function() {
   this.set("UseTagModule"false);
   return this.callParent(arguments);
}

Для страниц редактирования ситуация аналогичная, только данный метод необходимо заместить в "BaseModulePageV2".

 

 

Нравится

Поделиться

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

Симптомы

Message: Запрос на сервер вернул ошибку 

AdditionalInfo: {"request":{"id":18,"headers":{"X-Terrasoft-Mobile":"true","Accept":"application/json","Content-Type":"application/json","Authorization":"Cookie","X-Requested-With":"XMLHttpRequest"},"options":{"url":"http://xxx.xxxxx.xxxxx/0/Mobile/Services/MobileCodeService.ashx?functio…","scope":{"asyncOperation":{"initialConfig":{},"config":{},"_isCancelable":true,"asyncManagerIsDisabled":true},"initialConfig":{"url":"http://xxx.xxxxx.xxxxx/0/Mobile/Services/MobileCodeService.ashx?functio…","headers":{"X-Terrasoft-Mobile":"true","Accept":"application/json","Content-Type":"application/json","Authorization":"Cookie"},"method":"GET","disableCaching":false},"performanceCounterKey":"db7a27d6-eb6f-4e84-b32a-e0f21b3e0c73"},"headers":{"X-Terrasoft-Mobile":"true","Accept":"application/json","Content-Type":"application/json","Authorization":"Cookie"},"method":"GET","disableCaching":false},"async":true},"requestId":18,"status":500,"statusText":"Internal Server Error","responseText":"System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта.\r\n   в Terrasoft.Mobile.MobileUtilities.GetImageListItems(CultureInfo culture, String workplaceCode)\r\n   в Terrasoft.Mobile.MobileUtilities.GetStructureElement(HttpContextBase context)\r\n   в Terrasoft.WebApp.Mobile.Services.MobileCodeService.ProcessRequest(HttpContext context)","responseXML":null,"responseBytes":null} 

Stack trace:

Причина

Не отображаются права на рабочие места мобильного приложения

Решение

1) создать в пакете Custom sql скрипт

2) скопировать туда этот текст

3) сохранить

4) нажать кнопку применить в БД

Текст запроса:

UPDATE [SysProfileData]
SET [ObjectData] = 0x7B224461746147726964223A7B2274696C6564436F6E666967223A227B5C22677269645C223A7B5C22726F77735C223A312C5C22636F6C756D6E735C223A32347D2C5C226974656D735C223A5B7B5C2262696E64546F5C223A5C22537973526F6C652E4E616D655C222C5C2263617074696F6E5C223A5C22526F6C652E4E616D655C222C5C22747970655C223A5C22746578745C222C5C22706F736974696F6E5C223A7B5C22636F6C756D6E5C223A302C5C22636F6C5370616E5C223A32302C5C22726F775C223A317D2C5C226461746156616C7565547970655C223A312C5C226167677265676174696F6E547970655C223A5C225C222C5C2269734261636B776172645C223A66616C73652C5C226D65746143617074696F6E506174685C223A5C22526F6C652E4E616D655C222C5C226D657461506174685C223A5C22537973526F6C652E4E616D655C222C5C22706174685C223A5C22537973526F6C652E4E616D655C222C5C2273657269616C697A656446696C7465725C223A5C227B5C5C5C22636C6173734E616D655C5C5C223A5C5C5C225465727261736F66742E46696C74657247726F75705C5C5C222C5C5C5C226974656D735C5C5C223A7B7D2C5C5C5C226C6F676963616C4F7065726174696F6E5C5C5C223A302C5C5C5C226973456E61626C65645C5C5C223A747275652C5C5C5C2266696C746572547970655C5C5C223A362C5C5C5C226B65795C5C5C223A5C5C5C225C5C5C227D5C222C5C2263617074696F6E436F6E6669675C223A7B5C2276697369626C655C223A66616C73657D7D5D7D222C226C6973746564436F6E666967223A227B5C226974656D735C223A5B5D7D222C226B6579223A225379734D6F62696C65576F726B706C61636550616765537973526F6C65496E4D6F62576F726B706C61636544657461696C222C22697354696C6564223A747275652C2274797065223A2274696C6564227D2C226973436F6C6C6170736564223A66616C73652C2274696C6564436F6C756D6E73436F6E666967223A227B7D222C226C6973746564436F6C756D6E73436F6E666967223A227B7D222C226B6579223A225379734D6F62696C65576F726B706C61636550616765537973526F6C65496E4D6F62576F726B706C61636544657461696C227D
WHERE [Key] LIKE '%SysRoleInMobWorkplaceDetail%'

 

Нравится

Поделиться

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

Вопрос

Как поменять Caption детали для конкретной страницы редактирования?

То есть, чтобы одна и та же деталь в контактах называлась например "Деталь1", а в контрагентах "Деталь2".

Ответ

Необходимо в схеме детали в секции diff добавить следующий код:

diff: /**SCHEMA_DIFF*/[
{
   "operation": "merge",
   "name": "Detail",
   "values": {
      "caption": {"bindTo": "getDetailCaption"}
   }
}
]/**SCHEMA_DIFF*/

А в методе анализировать имя карточки, в которую загружена деталь, и менять caption на необходимый. Например так:

getDetailCaption: function() {
   var cardPageName = this.get("CardPageName");
   if (cardPageName === "ActivityPageV2") {
      return "Name 1";
   }
   return "Name 2";
}

Можно использовать локализируемые строки.

В типовых конфигурациях, аналогичный пример есть в схеме OpportunityContactDetailV2.

/**
 * Устанавливает заголовок детали в зависимости от открытой страницы.
 * @protected
 * @return {String}
 */
getDetailCaption: function() {
   var cardPageName = this.get("CardPageName");
   if (cardPageName === "OpportunityPageV2") {
      return this.get("Resources.Strings.InOpportunityCaption");
   }
   return this.get("Resources.Strings.InContactCaption");
},

Конкретный пример (реализована логика в ContactCommunicationDetail и AccountCommunicationDetail):

define("AccountCommunicationDetail", ["AccountCommunicationDetailResources", "terrasoft"],
    function(resources, Terrasoft) {
        return {
            entitySchemaName: "AccountCommunication",
            methods: {
                init: function() {
                    this.callParent(arguments);
                },
                getDetailCaption: function() {
                    var cardPageName = this.get("CardPageName");
                    if (cardPageName === "AccountPageV2") {
                        return "Средства связи";
                    }
                    return "Средства связи контрагента";
                }
            },
            diff: /**SCHEMA_DIFF*/[
                {
                    "operation": "merge",
                    "name": "Detail",
                    "values": {
                        "caption": {"bindTo": "getDetailCaption"}
                    }
                }
            ]
        };
});
define("ContactCommunicationDetail", ["ContactCommunicationDetailResources", "terrasoft"],
    function(resources, Terrasoft) {
        return {
            methods: {
                init: function() {
                    this.callParent(arguments);
                },
                getDetailCaption: function() {
                    var cardPageName = this.get("CardPageName");
                    if (cardPageName === "ContactPageV2") {
                        return "Средства связи";
                    }
                    return "Средства связи контакта";
                }
            },
            diff: /**SCHEMA_DIFF*/[
                {
                    "operation": "merge",
                    "name": "Detail",
                    "values": {
                        "caption": {"bindTo": "getDetailCaption"}
                    }
                }
            ]
        };
});

Необходимо почистить кеш браузера.

Нравится

Поделиться

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

Вопрос

Как отключить фоновую синхронизацию, которая запускается при сворачивании приложения?

Ответ

Создать схему с типом "Модуль" (например, "MobileUtilitiesCustom")

и написать в ней следующий код:

/* Отключение фоновой синхронизации при сворачивании приложения */
Terrasoft.Sync.BackgroundSyncManager.setMode(Terrasoft.BackgroundSyncModes.Never);

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

{
    ...
   "CustomSchemas": [
      ...
      "MobileUtilitiesCustom"
   ]
   ...
}

Смотрите также

В мобильном приложении также есть фоновая синхронизация по расписанию, она отключается с установкой системной настройки MobileDataSyncFrequency в 0

Эти два варианта запуска синхронизации работают только при включенной системной настройке RunMobileSyncInService

Нравится

Поделиться

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

Вопрос

Когда мы пытаемся синхронизировать данные, этого похоже не происходит. Мы не можем пользоваться телефонами во время синхронизации, но даже после того как мы оставляем их на 3-4 часа, ничего похоже не происходит. Нет сообщения об ошибке или чего-то такого. Возможно это связано с количеством данных, которые мы хотим передать. Есть ли способ выбрать определенные данные для каждого пользователя? Если мы сможем фильтровать данные для импорта, это ускорит синхронизацию.

Ответ

Период синхронизации зависит от объема данных в системе.

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

Для этого:

1) Откройте настройку системы «Режим работы мобильного приложения»

2) Установите значение «Online»

Этот вариант обычно рекомендуется, если у вас есть постоянный доступ к Интернету.

Нравится

Поделиться

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

Вопрос

Как установить сортировку (порядок отображения) нескольких страниц редактирования в выпадающем списке раздела

Ответ

define("AccountSectionV2", [], function() {
    return {
        entitySchemaName: "Account",
        details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
        methods: {
            initEditPages: function() {
                this.callParent(arguments);
                var editPages = this.get("EditPages");
                editPages.sortByFn(this.editPagesSortFunction);
            },
            editPagesSortFunction: function(elA, elB) {
                var valueA = elA.values.SchemaName;
                var valueB = elB.values.SchemaName;
                var sortRule = function(schemaName) {
                    //the direction will be 1-2-3...
                    if (schemaName === "UsrAccount1Page") {//Partner (in my case)
                        return 3;
                    }
                    if (schemaName === "UsrAccount2Page") {//Our company
                        return 1;
                    }
                    if (schemaName === "UsrAccount3Page") {//Customer
                        return 2;
                    }
                    return 0;
                };
                return sortRule(valueA) > sortRule(valueB);
            }
        },
        diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/
    };
});

 

Нравится

Поделиться

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

Вопрос

Как убрать или отредактировать заставку при отображении страницы пустого реестра:

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

Ответ

Для решения задачи необходимо изменять базовую логику приложения. Данный функционал реализован в схеме «BaseSectionV2» (пакет «NUI») (рис. 1).

Вам необходимо в схеме раздела (например, «ContactSectionV2») переопределить метод «getDefaultEmptyGridMessageProperties».

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

Рис. 1

Нравится

Поделиться

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