По умолчанию система подгружает 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 комментариев
Показать все комментарии

Запуск эмулятора

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

  1. Открыть и скопироваь содержимое папки с исходниками мобильного приложения \\xxx.xxx.xxx.xxx\DeployedApplications\Android\Releases 

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

     
  2. Вставить скопированные данные на свой жесткий диск.

    Путь, по которому хранится мобильное приложение, не должен содержать кириллицы, цифр или пробелов в названии (например Mobile app).

    Путь должен быть вида: C:\MobileApp\

    Изображение удалено. 
  3. В папке с исходниками мобильного приложения запустить файл: startchrome.bat

    *Если вы подключаетесь к клиенту с версией 7.10+ то нужно запускать файл startchrome_withcookie.bat

    т.к. начиная с этой версии была включена защита от CSRF атак. (На демках она выключена и можно использовать первый файл)

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

    Этот файл запустит Chrome и откроет страницу appV2/MobileApp/MobileMainPage.html с параметром platform=webkit, т.е. адрес в браузере будет иметь примерно такой вид:

    file://ххх/appV2/MobileApp/LoginPage.html?platform=webkit

    Либо такой путь 

    file://ххх/appV2/MobileApp/LoginPage.html?platform=webkit&usecookie=true (если запускать вторым батником)

    Важно: в адресной строке значения LoginPage.html и platform=webkit должны быть разделены знаком "?", как показано в примере выше, т.к. на новой версии Chrome разделитель иногда имеет другой вид

    webkit и usecookie=true должны быть разделены знаком "&"
  4. В результате появится окно эмулятора мобильной версии нашего приложения в браузере Google Chrome

    Изображение удалено. 
  5. Переходим на вкладку «bpmonline mobile» и нажимаем кнопку "Разрешить"

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

  6. Заполняем поля:

    mysite.bpmonline.com – это адрес сервера 

    Username - имя пользователя

    Password - пароль

  7. Нажимаем «Войти»

 

Исправление ошибок

Исправление ошибки 'При обращении к директории произошла ошибка' при запуске эмулятора

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

  1. Закрыть все экземпляры Chrome

    - Нажать правой кнопкой мыши на иконке Chrome

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

    - Нажать "Выход"

    Изображение удалено. 
  2. В проводнике перейти по адресу: C:\Users\%USERNAME%\AppData\Local\Google\Chrome\User Data\Default\databases

    Изображение удалено.
  3. Удалить всё содержимое папки
  4. Обновить страницу браузера

     

 

Исправление ошибки 'Your file was not found' при запуске в новых версиях Chrome. 

 Требуется в адресной строке заменить символы  %3F  на ?. 

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

 

Исправление для версии Chrome 67.0+ (открывается страница bpmonline в новой вкладке и синхронизации не идет дальше)

1. Открываем эмулятор, открываем новую вкладку (комбинация Ctrl+T)

2. Вбиваем адрес chrome://flags/#site-isolation-trial-opt-out

3. Находим пункт Site isolation trial opt-out

4. Выбираем в нем значение Opt-out (not recomended)

5. Перезапускаем chrome / Relaunch now

Нравится

Поделиться

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

Вопрос

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

Подробнее: http://www.community.terrasoft.ru/forum/topic/13684

Ответ

Рекомендуется в случае связанных объектов использовать свойства attribute и attributePath в бизнес-правилах:

"attribute": "Order",
"attributePath":"SxPaymentFormula.SxPaymentDelay"

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

initEntity: function(callback, scope) {
        this.callParent([function() {
                if (!this.get("Order.SxPaymentFormula.SxPaymentDelay")) {
                        this.set("Order.SxPaymentFormula.SxPaymentDelay",
                                this.get("Order") && this.get("Order")["SxPaymentFormula.SxPaymentDelay"]);
                }
                callback.call(scope || this);
        }this]);
}

В бизнес-правиле в этом случае необходимо использовать только

"attribute": "Order.SxPaymentFormula.SxPaymentDelay"

 

Нравится

Поделиться

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