Симптомы

Есть сущность, в ней несколько табов (e.g. Tab1 и Tab2), в табах field groups. Tab1 - первый слева направо, т.е. открыт по умолчанию, и видны поля. Нужно добавить поле в Tab2, закрытый / неактивный по умолчанию. Но не просто добавить, и менять скрывать / снова показывать по условию. Я это делаю путём биндинга функции на свойство "visible" в размете. Еслие поле на карточке (не в табе) или в первом (открытом) то всё работает. Если же поле находится в Tab2, то при открытии сущности бросается исключение.

В неактивном табе расположен GRID_LAYOUT на котором расположено поле с байндингом свойства "visible" на свойство/метод модели. Необходимым условием есть расположение поле в GRID_LAYOUT и наличие у поля байндинга со свойством "visible".

Решение

Обходные решения: 

1) Использовать свойство элемента "enabled" вместо "visible", то есть, вместо того что бы скрывать поле, делать поле не редактируемым.

Недостаток: поле остаётся видимым.

Достоинство: решение совместимо с мастерами.

2) Вместо контейнера GRID_LAYOUT для скрываемого элемента в качестве контейнера использовать: CONTAINER, CONTROL_GROUP или ContainerList .

Недостаток: решение не совместимо с мастером и скорей всего потребует вмешательства разработчика. Достоинство: поле будет скрыто."

Нравится

Поделиться

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

Вопрос

Высоту поля "Решение" можно изменить?

Ответ

Для решения данного вопроса необходимо изменять базовую логику приложения с помощью кода в схеме KnowledgeBasePageV2. 

Алгоритм:

1. Заместить данный модуль.

2. Для колонки «Notes» (diff) добавить в секцию «values» или «controlConfig» свойство «"height": "размер в пикселях"»).

Пример кода:

{
    "operation": "merge",
    "name": "Notes",
    "values": {
        "height": "500px"  
    }
},

 

Нравится

Поделиться

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

Симптомы

При синхронизации/входе в раздел мобильного приложения у клиента возникает ошибка вида:

Тип: Terrasoft.SourceCodeException 

Сообщение: Uncaught TypeError: Cannot read property 'ColumnConfigs' of null 

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

        Script: file:///android_asset/www/Common/Terrasoft.Mobile.Combined.js%0D%0A%09Line: 19048 

Calls sequence: 

    at Ext.define.showException (file:///android_asset/www/Common/Terrasoft.Mobile.Combined.js:33105:41

    at Ext.define.showUncaughtException (file:///android_asset/www/Common/Terrasoft.Mobile.Combined.js:1965:25

    at window.onerror (file:///android_asset/www/Common/Terrasoft.Mobile.Combined.js:1666:20)

Причина

Дублирование схем в манифесте

Решение

Вариант 1

Нужно в базовой схеме MobileApplicationManifest пакета Mobile изменить строчку

…
Models: {
    …
    Activity: {
        …
        RequiredModels: [
            'Contact''ActivityType''ActivityStatus',
            'ActivityResult''ActivityCategory''ActivityPriority', 'Contact', 
            'Account''Opportunity''Lead''ActivityParticipantRole',
            'ActivityParticipant''ActivityCategoryResultEntry''ActivityCorrespondence''Activity'

Убрать дублирующееся значение «Contact»

Вариант 2

Обновить мобильное приложение на более свежую версию

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

Версия BPMonline 7.1.0 - 7.5.0

Версия мобильного приложения:

   Android 7.6.2. - 7.6.3.

   iOS 7.6.2

Нравится

Поделиться

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

Вопрос

Возможно ли одному контакту привязать две учетные записи в SysAdminUnit?

Ответ

Реализовать данный кейс не представляется возможным, для системы крайне важным является условие 1 контакт=1 запись в SysAdminUnit.

Нравится

Поделиться

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

Вопрос

На детали Email отображаются записи других типов активностей.

Ответ

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

define("EmailDetailV2", ["terrasoft", "ProcessModuleUtilities", "ConfigurationConstants"],
    function(Terrasoft, ProcessModuleUtilities, ConfigurationConstants) {
        return {
            /**
            * Имя схемы объекта
            * @type {String}
            */
            entitySchemaName: "Activity",
            messages: {},
            attributes: {},
            methods: {
                getFilters: function() {
                    var parentfilters = this.callParent(arguments);
                    parentfilters.add(
                        "EmailFilter",
                        this.Terrasoft.createColumnFilterWithParameter(
                            this.Terrasoft.ComparisonType.EQUAL,
                            "Type",
                            ConfigurationConstants.Activity.Type.Email
                        )
                    );
                    return parentfilters;
                }
            },
            diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/
        };
});

 

Нравится

Поделиться

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

Вопрос

Как скрыть поле с детали "Средства связи"

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

Ответ

Данный вопрос необходимо решать на уровне конфигурации.

Рассмотрим реализацию на примере.

Кейс:

необходимо скрыть поле «E-mail» из секции «Запрет на использование» в разделе «Контакты».

Решение:

  1. Необходимо заместить схему (Управление конфигурацией – Конфигурация – кнопка «Добавить» - пункт «Замещающий клиентский модуль»).
  2. В открывшимся окне в поле «Родительский объект» указать «Средства связи контакта (устаревшая версия)» (Рис. 1).

ВАЖНО. Необходимо использовать устаревшую версию схемы «Средства связи».

    3. В замещающую схему вставить следующий код:

define("ContactCommunicationDetail", ["ContactCommunicationDetailResources", "terrasoft"],
    function(resources, Terrasoft) {
        return {
            entitySchemaName: "ContactCommunication",
            methods: {
                /**
                * Возвращает запреты на использование.
                * @protected
                * @return {Object} Объект, который содержит свойства запретов на использование.
                */
                getRestrictions: function() {
                    return {
                        "DoNotUseEmail": { /*Не использовать E-mail*/
                            "RestrictCaption": this.get("Resources.Strings.DoNotUseEmail"),
                            "Caption": this.get("Resources.Strings.DoNotUseEmailCaption")
                        },
                        "DoNotUseCall": { /*Не использовать телефон*/
                            "RestrictCaption": this.get("Resources.Strings.DoNotUseCall"),
                            "Caption": this.get("Resources.Strings.DoNotUseCallCaption")
                        },
                        "DoNotUseSms": { /*Не использовать SMS*/
                            "RestrictCaption": this.get("Resources.Strings.DoNotUseSms"),
                            "Caption": this.get("Resources.Strings.DoNotUseSmsCaption")
                        },
                        "DoNotUseFax": { /*Не использовать факс*/
                            "RestrictCaption": this.get("Resources.Strings.DoNotUseFax"),
                            "Caption": this.get("Resources.Strings.DoNotUseFaxCaption")
                        },
                        "DoNotUseMail": { /*Не использовать почту*/
                            "RestrictCaption": this.get("Resources.Strings.DoNotUseMail"),
                            "Caption": this.get("Resources.Strings.DoNotUseMailCaption")
                        }
                    };
                }
            },
            diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/
        };
    });

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

Рис. 1

4. Затем выделяем с помощью компьютерной мышки часть кода, которая изображен на рисунке 2 (начиная от названия "DoNotUseEmail" и заканчивая }, ).

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

Рис. 2

5. В итоге должно выглядеть как рисунке 3. Затем мы сохраняем схему.

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

Рис. 3

6. Затем очищаем кэш браузера и проверяем результат.

 7. В результате поле "E-mail" не отобразиться (Рис. 4).

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

Рис. 4

Примечание. Скрытие других полей или реализация в разделе «Контрагенты» происходит аналогичным путем. 

Нравится

Поделиться

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

Вопрос

Каким образом можно хранить URL (в каком поле) и как возможно (если это возможно в принципе) сделать так, чтобы на форме это поле стало "кликабельным"?

Ответ

URL можно хранить в текстовом поле.

Основные нюансы реализации описаны в ответе на комьюнити: http://www.community.terrasoft.ru/forum/topic/9686#comment-54881

Для поля необходимо добавить следующие свойства в свойство values элемента массива diff:

"showValueAsLink": true,
"href": {
        "bindTo": "UsrFieldName",
        "bindConfig": {"converter": "getUsrFieldNameLink"}
},
"controlConfig": {
        "className": "Terrasoft.TextEdit",
        "linkclick": { bindTo: "onUsrFieldNameLinkClick"}
}

Где UsrFieldName - название поля, которое мы хотим отображать как гиперссылку.

Также необходимо реализовать два метода, с которыми мы связали наше поле:

getUsrFieldNameLink: function(value) {
    return {
        "url": value,
        "caption": value
    };
},
onUsrFieldNameLinkClick: function(url) {
    if (url != null) {
        window.open(url, "_blank""height=" + this.get("WindowHeight") + ",width=" + this.get("WindowWidth"));
        return false;
    }
}

Необходимо также следить за тем, чтобы значение данного поля начиналось с http или https, иначе система будет добавлять к содержимому путь к приложению. Можно также анализировать значение входящего параметра value в первом методе и в случае необходимости добавлять эту приставку.

Полный пример элемента diff:

{
    "operation": "insert",
    "name": "UsrURLpage22872546-f334-4b46-a445-112b532455c4",
    "values": {
        "layout": {
            "colSpan": 12,
            "rowSpan": 1,
            "column": 0,
            "row": 3,
            "layoutName": "Header"
        },
        "labelConfig": {},
        "enabled": true,
        "bindTo": "UsrURLpage",
        "showValueAsLink": true,
        "href": {
            "bindTo": "UsrURLpage",
            "bindConfig": {"converter": "getUsrURLpageLink"}
        },
        "controlConfig": {
            "className": "Terrasoft.TextEdit",
            "linkclick": { bindTo: "onUsrURLpageLinkClick"}
        }
    },
    "parentName": "Header",
    "propertyName": "items",
    "index": 6
}

 

Нравится

Поделиться

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

Вопрос

Мобильное приложение.

Интересует вопрос по настройке порядка отображения заказов в мобильном приложении.

Список заказов не отображается в нужной последовательности. Как следует настроить приложение, чтобы шла последовательность по дате регистрации? И вначале (сверху) показывался последний заказ?

 В чём была причина хаотичного расположения заказов?

Ответ

Для сортировки по определенной колонке необходимо в манифеесте прописать дополнительно логику.

Пример:

Terrasoft.sdk.GridPage.setOrderByColumns("Order", {
    column: "CreatedOn",
    orderType: Terrasoft.OrderTypes.DESC
});

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

Ниже пример:

 

- добавляет объект «UsrTestOrderMobile» с нужными колонками 

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

- регистрируем деталь в мастере деталей;

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

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

- далее нам необходимо настроить сортировку. Создаем новую клиентскую схему, например, «UsrMobileUsrTestOrderMobileModuleConfig» с необходимым кодом:

 

Terrasoft.sdk.GridPage.setOrderByColumns("UsrTestOrderMobile", {
    column: "UsrName",
    orderType: Terrasoft.OrderTypes.DESC
});

- сохраняем изменения;

- подключаем в манифест в секции «Models» нужного объекта детали в «PagesExtensions»

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

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

 

Важные моменты:

- убедиться, что в настройках импорта (ModelDataImportConfig) синхронизируете все необходимые колонки

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

- была первичная колонка (которая используется в сортировке) для отображения в объекте либо на уровне кода (ниже пример):

 

Terrasoft.sdk.GridPage.setPrimaryColumn("UsrTestOrderMobile", "UsrName");

Terrasoft.sdk.RecordPage.addColumn("UsrTestOrderMobile", {

        name: "UsrName",

        position: 1

    }, "primaryColumnSet");

 

Проверили на последней сборке 7.11.3 и все работает корректно.



Также используйте следующую документацию:

https://academy.terrasoft.ru/documents/technic-sdk/7-11/manifest-mobilnogo-prilozheniya;

https://academy.terrasoft.ru/documents/technic-sdk/7-11/kak-dobavit-polzovatelskiy-razdel-v-mobilnoe-prilozhenie;

https://academy.terrasoft.ru/documents/technic-sdk/7-11/sdk-reestra.

Нравится

Поделиться

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

Вопрос

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

Ошибка при компиляции Элемент Системная настройка с кодом "CodeCompilerWarningLevel" не найдена не найден.

Ответ

Все дело в том что пользователь удалил пользователя Supervisor.

Решение, восстановить супервизора:

------
INSERT INTO Contact (Id, Name, AccountId, OwnerId, GenderId, TypeId) VALUES ('410006E1-CA4E-4502-A9EC-E54D922D2C00',
'Supervisor', 'E308B781-3C5B-4ECB-89EF-5C1ED4DA488E', '410006E1-CA4E-4502-A9EC-E54D922D2C00',
'EEAC42EE-65B6-DF11-831A-001D60E938C6', '60733EFC-F36B-1410-A883-16D83CAB0980')
------
 
INSERT INTO [dbo].[SysAdminUnit]
  ([Id]
  ,[CreatedOn]
  ,[CreatedById]
  ,[ModifiedOn]
  ,[ModifiedById]
  ,[Name]
  ,[Description]
  ,[ParentRoleId]
  ,[ContactId]
  ,[TimeZoneId]
  ,[UserPassword]
  ,[SysAdminUnitTypeValue]
  ,[AccountId]
  ,[Active]
  ,[LoggedIn]
  ,[SynchronizeWithLDAP]
  ,[LDAPEntry]
  ,[LDAPEntryId]
  ,[LDAPEntryDN]
  ,[IsDirectoryEntry]
  ,[ProcessListeners]
  ,[SysCultureId]
  ,[LoginAttemptCount])
VALUES
  ('7F3B869F-34F3-4F20-AB4D-7480A5FDF647'
  ,'2008-12-25 10:30:00.0000000'
  ,'22C5540C-D9B1-49EF-8EB7-72419B78E57C'
  ,'2012-09-11 04:52:13.3962744'
  ,'410006E1-CA4E-4502-A9EC-E54D922D2C00'
  ,'Supervisor'
  ,''
  ,NULL
  ,'410006E1-CA4E-4502-A9EC-E54D922D2C00'
  ,''
  ,'eF4f7sfUgBuNFei7bk+3djw/zXkaB1ODf3huR0RJDD4='
  ,4
  ,NULL
  ,1
  ,0
  ,0
  ,''
  ,''
  ,''
  ,0
  ,0
  ,'1A778E3F-0A8E-E111-84A3-00155D054C03'
  ,0)
GO
 
------

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

Нравится

Поделиться

0 комментариев
Показать все комментарии
Публикация

Вопрос

Суть ошибки: не компилируется один из Package (пакет оракла, а не нашего приложения) с ошибкой, содержащей текст:

ORA-00932: inconsistent datatypes

или

После входа ошибка Authorization Failed

Ответ

Cсылка на багу оракла и патч, который нужно скачать и установить на сервер при возникновении ошибки. Воспроизводится точно на версии 11.2.0.4 (и, судя по описанию патча, еще и 11.2.0.3).

https://support.oracle.com/knowledge/Oracle%20Database%20Products/2003626_1.html

Дополнительно:

There's a known bug related to this see - MOS note 2003626.1. 

It's fixed in patch 18139621. 

https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:9519164900346280654

https://stackoverflow.com/questions/43589677/ora-00932-expected-number-got/43591908

Нравится

Поделиться

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