Добрый день, уважаемые коллеги!

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

Нравится

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

Здравствуйте, Юрий!

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

Спасибо, Павел!

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

Здравствуйте.
Права доступа вы настраиваете в десктоп-приложении (не мобильном). В зависимости от этих настроек пользователю будет доступен тот или иной набор данных в результате синхронизации. Что касается "бизнес-правил" фильтрации, то настройки такого плана выполняются на уровне конфигурации и уже исходя из специфики поставленной задачи, это может быть применено для определённого рабочего места или пользователя, в частности. С настройкой прав доступа вы можете ознакомиться на ресурсе https://academy.terrasoft.ru, выбрав раздел документация и соответствующий продукт. С вопросами конфигурирования - https://academy.terrasoft.ru/documents/technic-sdk/7-8/dokumentaciya-po…

Добрый день!

В релизе 7.11 реализована функциональность быстрой фильтрации в разделах и деталях мобильного приложения. Для поиска нужных записей в разделе (или на детали) можно настроить "быстрый" фильтр по колонкам объекта. 

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

Подскажите, как сделать сортировку по умолчанию в мобильном приложении к примеру:
в Продажах по полю "Дата создания" DESC. Т.е. вверху самые новые Продажи.

Нравится

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

Коллеги, у кого есть опыт внедрения Field Sales - полевые продажи.
Кто может проконсультировать: as is :))))
Вопросы:
1)насколько стабильно работает версия?
2)Действительно ли можно определить местоположение менеджера, у которого на телефоне стоит мобильная версия?
3)Можно ли отслеживать маршрут машины с менеджерами в реальном времени? Т.е. у меня 20 менеджеров уехали. хочу посмотреть всех 20 - где они сейчас?
все вопросы касаются коробки. Спасибо.

Нравится

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

"Милова Марина Федоровна" написал:1)насколько стабильно работает версия?

Острая тема для открытого раздела :)

"Милова Марина Федоровна" написал:2)Действительно ли можно определить местоположение менеджера, у которого на телефоне стоит мобильная версия?
3)Можно ли отслеживать маршрут машины с менеджерами в реальном времени? Т.е. у меня 20 менеджеров уехали. хочу посмотреть всех 20 - где они сейчас?

И такое там заявлено? Я как бы для саморазвития интересуюсь, ну и тему поднять заодно вверх...
Думал, там только при использовании мобильного приложения можно сделать чекин/чекаут с передачей координат в систему, а вот чтобы у девайсов централизованно с сервера запросить данные об их положении?

Саш, по стабильности может в личку кто ответит :)))

Добрый день, Марина!

Функционал полевых продаж стабилен в использовании, в чем, собственно, Вы можете убедится, заказав себе на месяц бесплатную триальную версию продукта Sales Enterprise на нашем сайте terrasoft.ru
Что касается второго и третьего вопроса, то, как и сказал ранее Александр, данный функционал в системе не заявлен. По координатам Вы можете отслеживать где находился менеджер в момент чек-ина (действительно ли он был на точке), а маршрут строится сразу при планировании этих визитов.
Подробная информация по работе данного функционала описана в руководстве пользователя в соответствующем разделе: https://academy.terrasoft.ru/documents/sales-enterprise/7-8-0/funkciona…

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

Планируете телефонию добавить в мобильное приложение(типа вайбера, zoiper). Ну чтобі полноценно звонил с офисного и принимал звонок, как на вайбере?

Нравится

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

А чем плох функционал обычного звонка через карточку контакта?!

bpm это все CRM-ка, а не месседжер/соцсеть.

Реализовали в качестве фичи для домашней системы в мобайле. Добавили вторую кнопочку для звонков через Zoiper . Очень удобно. Если будут вопросы, пишите.

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

Добрый день!

Есть ли примеры добавления вкладки (возможно через Terrasoft.sdk.RecordPage.addColumnSet ) в мобильном приложении 7.X и настройки правил видимости, к примеру: если тек.дата больше даты начала Активности и пользователь есть в участниках Активности...

Нравится

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

Добрый вечер, Алекс.

Мобильное приложение не поддерживает несколько вкладок на странице просмотра/редактирования.
Если вам необходимо делать видимой группу колонок в зависимости от значений полей записи,
то можно добавить в пользовательскую схему примерно такой код:

Ext.define("CustomContactPreviewPage.Controller", {
    override: "ContactPreviewPage.Controller",
 
    onLoadRecord: function(record) {
        this.callParent(arguments);
        var view = this.getView();
        var panel = view.getPanel();
        var account = record.get("Account");
		var accountId = account && account.getId();
        var panelItems = panel.getItems();
        for (var i = 0, ln = panelItems.getCount(); i < ln; i++) {
            var item = panelItems.items[i];
            if (item.id === "Contact_Preview_ContactCommunicationDetailEmbeddedDetail_ColumnSet") {
                var isItemHidden = item.getHidden();
                if (accountId === "5aa4ace7-bfef-4fd0-ab0c-b7d5711d9e27") {
                    if (!isItemHidden) {
                        item.setHidden(true);
                    }
                } else if (isItemHidden) {
                    item.setHidden(false);
                }
            }
        }
    }
});

*пример для версий 7.6
либо версии 7.7 с сис.настройкой MobileApplicationMode = UIV1

"Кривонос Максим" написал:Если вам необходимо делать видимой группу колонок в зависимости от значений полей записи

Спасибо, Максим!

Именно группа колонок внутри ColumnSet. Но есть нюанс, в item.id вижу "ext-tscolumnset-38" (цифры всегда разные) и оно никак не связано с объявленным title:

Terrasoft.sdk.RecordPage.addColumnSet("VisitActions", {
    name: "MerchandisingStandardsColumnset",
    position: 2,
    title: "VisitActionsDetailConfig_MerchandisingStandardsColumnset_title"
},
[

Попробуйте использовать это свойство

item.config && item.config.name

"Кривонос Максим" написал:Попробуйте использовать это свойство

Максим, огромное спасибо!

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

В описании (которого почему-то не нашел в оглавлении) http://academy.terrasoft.ru/documents/docs/technic/SDK/7.6.0/MobileAppli...
для секции ModelDataImportConfig есть пример с макросом. А возможно ли сделать зависимость от какого-то поля контакта пользователя?

Например у Активности есть поле Участок (справочник) и у Контакта есть такое поле Участок. Нужно чтобы Активность загружалась если её участок совпадает с участком указанным в Активности

Нравится

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

Здравствуйте.
Вы пишите "Нужно чтобы Активность загружалась если её участок совпадает с участком указанным в Активности" - это как понимать?
Опишите пожалуйста детальней - что ожидается увидеть на выходе. какой бизнес-кейс решается?

Есть Пользователь П1 (торговый представитель), с ним связан Контакт К1, у которого есть кастомное поле Участок (типа справочник) со значением У1. Есть задачки (простите Активности!) З1, З2, ...., З99999, у которых кроме всего прочего так же есть кастомное поле Участок из того же справочника. Так вот если нет надобности грузить 99999 задачек, а только те у которых поля Участок совпадают с одноименным полем Контакта, то как построить данный фильтр типа Пользователь.Контакт.Участок = Задачка.Участок.

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

В етом случае Вас тоит вносить код в секцию ModelDataImportConfig Манифеста мобильного приложения.

Пример фильтрации данных для загрузки описан в документе, приведенном Вами выше:
Активность. Загружаются все колонки. Выполняется фильтрация модели - загружаются только те активности, у которых участником является текущий пользователь.

ModelDataImportConfig: [
// Конфигурирование модели Activity.
{
Name: 'Activity',
SyncFilter: {
type: 'Terrasoft.FilterTypes.Group',
logicalOperation: 'Terrasoft.FilterLogicalOperations.Or',
subfilters: [
{
property: 'Participant',
modelName: 'ActivityParticipant',
assocProperty: 'Activity',
operation: 'Terrasoft.FilterOperations.Any',
valueIsMacros: true,
value: 'Terrasoft.ValueMacros.CurrentUserContact'
}
]
},
SyncColumns: ['Title', 'StartDate', 'DueDate', 'Status', 'Result', 'DetailedResult', 'ActivityCategory', 'Priority', 'Owner', 'Account', 'Contact',
'Lead', 'Opportunity', 'ShowInScheduler', 'Author', 'Type'
]
},

"Клименко Николай" написал:загружаются только те активности, у которых участником является текущий пользователь.

так ведь нет участников :smile: есть УЧАСТОК

Предоставленый код является примером реализации.
По аналогии, Вы можете настроить свою фильтрацию.

"Клименко Николай" написал:

Предоставленый код является примером реализации.

По аналогии, Вы можете настроить свою фильтрацию.


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

Нужно понимание как сделать фильтры по полям и в левой и в правой части выражения сравнения, что-то типа (ActivityAccount - деталь Контрагенты в Активностях):

ModelDataImportConfig: [
        // Конфигурирование модели Activity.
        {
            Name: 'ActivityAccount',
            SyncFilter: {
                type: 'Terrasoft.FilterTypes.Group',
                logicalOperation: 'Terrasoft.FilterLogicalOperations.Or',
                subfilters: [
                    {
                        property: 'PartOf',
                        valueIsMacros: true,
                        value: 'Terrasoft.ValueMacros.CurrentUserContact.PartOf'
                    }
                ]
            },    

В Вашем случае необходимо применить вариант решения с использоваием view

1. Создать View (например VwActivityAreaByContactArea) с колонками Активности и Контакта

2. Добавить в конфигурацию скрипт (Подразумевается колонка Участок = Area) и установить
------------------------------------------------------------------------
IF EXISTS (SELECT 1 FROM sys.views WHERE name = 'VwActivityAreaByContactArea')
DROP VIEW dbo.VwActivityAreaByContactArea
go
------------------------------------------------------------------------
CREATE VIEW dbo.VwActivityAreaByContactArea AS
SELECT
a.Id,
a.CreatedOn,
a.CreatedById,
a.ModifiedOn,
a.ModifiedById,
a.ProcessListeners,
a.Id as ActivityId,
c.Id as ContactId
FROM Activity a
JOIN Contact c ON c.Area = a.Area
Where c.Area <> ''

3. В манифесте добавить фильтрацию
"ModelDataImportConfig": [
{
"Name": "Activity",
"SyncFilter": {
"type": 'Terrasoft.FilterTypes.Group',
"logicalOperation": 'Terrasoft.FilterLogicalOperations.And',
"subfilters": [
{
"property": 'Participant',
"modelName": 'ActivityParticipant',
"assocProperty": 'Activity',
"operation": 'Terrasoft.FilterOperations.Any',
"valueIsMacros": true,
"value": 'Terrasoft.ValueMacros.CurrentUserContact'
},
{
"property": "Contact",
"modelName": "VwActivityAreaByContactArea",
"assocProperty": "Activity",
"operation": 'Terrasoft.FilterOperations.Any',
"valueIsMacros": true,
"value": "Terrasoft.ValueMacros.CurrentUserContact"
}
]
}
},
{
"Name": "VwActivityAreaByContactArea",
"SyncFilter": {
"property": "Contact",
"valueIsMacros": true,
"value": "Terrasoft.ValueMacros.CurrentUserContact"
}
}
]
И указать модель View

"Models": {
"Activity": {
"Grid": "MobileActivityGridPage",
"Preview": "MobileActivityPreviewPage",
"Edit": "MobileActivityEditPage",
"RequireLookupColumnsModels": true,
"RequiredModels": [

"VwActivityAreaByContactArea"
]
}

"Клименко Николай" написал:В Вашем случае необходимо применить вариант решения с использоваием view

Николай, спасибо большое! Всё гениальное... не так то и просто :sad:

Извините за некропостинг, но может найдется кто, чтобы немного мне объяснить.
Мне надо отфильтровать Обращения, по состоянию, которые НЕ закрыты. Или хотя бы для примера SolutionOverdue, который означает "закрытие".
Добавляю в манифест фильтр:

"SyncFilter": {
					"property": "Status",
// Название модели, для которой выполняется фильтрация.
					//"modelName": "Case",
// Колонка связанной модели, по которой осуществляется связь с основной моделью.
					//"assocProperty": "Id",
					//"operation": "Terrasoft.FilterOperations.Any",
					"compareType": "Terrasoft.ComparisonType.NotEqual",
					//"value": {
						//"value": "3e7f420c-f46b-1410-fc9a-0050ba5d6c38",
						//"displayValue": "Закрыт"}
                                        "value": "3e7f420c-f46b-1410-fc9a-0050ba5d6c38"
				},

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

"SyncFilter": {
					"type:" "Terrasoft.FilterTypes.Simple",
					"property": "SolutionOverdue",
					"compareType": "Terrasoft.ComparisonType.Equal",
					"value": true
				},

В данном случае ошибок при синхронизации не выдает, но и он тупо не работает.

Подскажите что не так делаю, и вообще объясните моменты с modelName и assocProperty - для чего эти значения. Коммент в примере совсем не понятно что имеется ввиду.

"Михайловский Илья Викторович" написал:

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

Мне надо отфильтровать Обращения, по состоянию, которые НЕ закрыты. Или хотя бы для примера SolutionOverdue, который означает "закрытие".

Добавляю в манифест фильтр:

"SyncFilter": {

                                        "property": "Status",

// Название модели, для которой выполняется фильтрация.

                                        //"modelName": "Case",

// Колонка связанной модели, по которой осуществляется связь с основной моделью.

                                        //"assocProperty": "Id",

                                        //"operation": "Terrasoft.FilterOperations.Any",

                                        "compareType": "Terrasoft.ComparisonType.NotEqual",

                                        //"value": {

                                                //"value": "3e7f420c-f46b-1410-fc9a-0050ba5d6c38",

                                                //"displayValue": "Закрыт"}

                                        "value": "3e7f420c-f46b-1410-fc9a-0050ba5d6c38"

                                },

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

Пробовал еще такой фильтр:

"SyncFilter": {

                                        "type:" "Terrasoft.FilterTypes.Simple",

                                        "property": "SolutionOverdue",

                                        "compareType": "Terrasoft.ComparisonType.Equal",

                                        "value": true

                                },

В данном случае ошибок при синхронизации не выдает, но и он тупо не работает.

Подскажите что не так делаю, и вообще объясните моменты с modelName и assocProperty - для чего эти значения. Коммент в примере совсем не понятно что имеется ввиду.

Добрый день, Илья!
Примеры описаны для версии 7.6.
Уточните, пожалуйста, версию системы и мобильного приложения.

"Вильшанский Дмитрий" написал:
Михайловский Илья Викторович пишет:

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

Мне надо отфильтровать Обращения, по состоянию, которые НЕ закрыты. Или хотя бы для примера SolutionOverdue, который означает "закрытие".

Добавляю в манифест фильтр:

"SyncFilter": {

                                        "property": "Status",

// Название модели, для которой выполняется фильтрация.

                                        //"modelName": "Case",

// Колонка связанной модели, по которой осуществляется связь с основной моделью.

                                        //"assocProperty": "Id",

                                        //"operation": "Terrasoft.FilterOperations.Any",

                                        "compareType": "Terrasoft.ComparisonType.NotEqual",

                                        //"value": {

                                                //"value": "3e7f420c-f46b-1410-fc9a-0050ba5d6c38",

                                                //"displayValue": "Закрыт"}

                                        "value": "3e7f420c-f46b-1410-fc9a-0050ba5d6c38"

                                },

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

Пробовал еще такой фильтр:

"SyncFilter": {

                                        "type:" "Terrasoft.FilterTypes.Simple",

                                        "property": "SolutionOverdue",

                                        "compareType": "Terrasoft.ComparisonType.Equal",

                                        "value": true

                                },

В данном случае ошибок при синхронизации не выдает, но и он тупо не работает.

Подскажите что не так делаю, и вообще объясните моменты с modelName и assocProperty - для чего эти значения. Коммент в примере совсем не понятно что имеется ввиду.

Добрый день, Илья!

Примеры описаны для версии 7.6.

Уточните, пожалуйста, версию системы и мобильного приложения.

7.8
Я уже сделал, но через модуль, создал с именем UsrMobileCaseModelConfig со след кодом:

Terrasoft.sdk.Module.addFilter("Case", Ext.create("Terrasoft.Filter", {
	name: "CaseCustomFilter",
	type: "Terrasoft.FilterTypes.Group",
	subfilters: [
//Не закрытый статус
		Ext.create("Terrasoft.Filter", {
			name: "CaseStatusFilterValue",
			property: "Status",
			compareType: Terrasoft.ComparisonTypes.NotEqual,
			value: "3e7f420c-f46b-1410-fc9a-0050ba5d6c38"
		}),
//Ответственный - текущий пользователь
		Ext.create("Terrasoft.Filter", {
			name: "CaseOwnerFilterValue",
			property: "Status",
			compareType: Terrasoft.ComparisonTypes.Equal,
			valueIsMacros: true,
			value: "Terrasoft.ValueMacros.CurrentUserContact"
		}),
//Не отменен статус
		Ext.create("Terrasoft.Filter", {
			name: "CaseStatusFilterValue",
			property: "Status",
			compareType: Terrasoft.ComparisonTypes.NotEqual,
			value: "6e5f4218-f46b-1410-fe9a-0050ba5d6c38"
		})
	]
}));

И затем в манифесте в PageExists подключил этот модуль, и все заработало.

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

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

BPMonline 7.7.0.2326

Возможно ли в мобильном приложении настроить автоматическую синхронизацию?
И как это реализовать?

Нравится

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

Виктория здравсвуйте.
Что значит "автоматическую синхронизацию"?
Опишите пожалуйста функционал который Вы бы хотели видеть и чем не подходят текущие настройки.

Здравствуйте!
Руководитель компании хочет, чтобы после входа в приложение каждые 5 минут происходила синхронизация без нажатия на кнопку, сама по себе.
Возможно ли такое?
И в каком модуле нужно прописывать код?

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

Все-таки Online синхронизация не подходит, потому что без доступа к интернету не будет возможности создавать и просматривать записи. А нам этот вариант не подходит.

Все-таки возможно ли реализовать автоматическую синхронизацию?
И в какой схеме нужно прописать код?

Пример рассмотрен здесь:
http://www.community.terrasoft.ru/forum/topic/15331

А правильно ли я понимаю, что для реализации автоматической синхронизации, мне необходимо использовать setInterval и clearInterval?
При чем при загрузке приложения стартовая страница это раздел Лиды.
То есть можно при инициализации страницы реестра вызвать setInterval?
А нужно ли вызывать clearInterval или после выхода из системы он сам автоматически завершится?
И получается мне нужно переопределить страницу грида?
Или автоматическую синхронизацию можно реализовать по-другому?

1. Да, для того, чтобы синхронизация запускалась через какой-то период, можно использовать setInterval().
2. Да, можно сделать этот запуск на инициализации страницы реестра Лида, если у Вас гарантированно эта страница открывается при старте.
3. clearInterval() вызывать не обязательно.
4. Да, как вариант, можно реализовать подобное на инициализации реестра Лида. Контроллер будет выглядеть примерно так:

Ext.define('LeadGridPage.Controller', {
	extend: 'Terrasoft.controller.BaseGridPage',
	statics: {
		Model: Lead
	},
	config: {
		refs: {
			view: '#LeadGridPage'
		}
	},
 
	initializeView: function(view) {
		this.callParent(arguments);
		Terrasoft.MobileSettingsPageControllerSyncManager.synchronize({
			exportOnly: false,
			checkForPredefinedDatabase: false,
			redirect: function(){
				Terrasoft.core.redirectToMainPage();
			},
		});
	}
});

Но нужно понимать следующее:
- Поскольку Javascript - однопоточный, то и синхронизация будет выполняться в основном потоке приложения. Это может привести к тому, что в случае обращения к одному и тому же объекту приложение будет "тупить". Т.е. если пользователь пытается найти Контакта и в этот же момент синхронизация тоже будет обращаться к Контактам (например, будет добавлять новые записи в этот объект), то UI приложения будет тормозить\зависать, пока сохранение не завершится.

- В приведенном выше коде после выполнения синхронизации осуществляется рестарт приложения (Terrasoft.core.redirectToMainPage();). Обычно мы это делаем для того, чтобы конфигурационные изменения, загруженные в ходе синхронизации, применились (например, Вы добавили новую колонку в карточку редактирования и хотите, чтобы у всех пользователей это изменение появилось). Но в Вашем случае, возможно, этого делать не нужно (пользователям вряд ли понравится, что приложение вдруг взяло и перегрузилось).

- Если Вам нужно просто передавать данные в bpm'online, то достаточно указать свойство exportOnly

С учетом вышеизложенного код немного поменяется:

Terrasoft.MobileSettingsPageControllerSyncManager.synchronize({
	exportOnly: true,
	checkForPredefinedDatabase: false,
	redirect: function(){
		//Terrasoft.core.redirectToMainPage();
	},
});

Попробуйте, может такой вариант Вам подойдет.

Спасибо большое!!!

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

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

BPMonline 7.7.0.2326

Возможно ли в мобильном приложении при сохранении новой записи раздела Лиды осуществлять синхронизацию? И как это реализовать?

Нравится

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

Возможно Вам будет удобней включить online-режим для мобильного приложении?
Тогда все изменения будут моментально отображаться/передаваться на сервер.
(Правда для его работы на устройсвах необходим будет постоянно интернет)

А где включается online-режим для мобильного приложения?
А если интернет пропадет и в этот момент добавят 2 записи, а после того, как интеренет появится, добавят 3-ю запись, что произойдет с первыми 2?
Или если не добавят 3-ю запись, а просто появится интернет, 2 записи будут переданы на сервер?

Включается в системной настройке "режим работы мобильного приложения"
Если нет интернета вы не сможете создать ни одной записи. впрочем как и прочитать.

Тогда нам такой режим не подходит.

А возможно ли при сохранении записи Лида сразу начинать синхронизацию?
И как это реализовать?

Примерно так

Terrasoft.MessageBox.showConfirmation({
   message: LocalizableStrings["PharmaMobileActivityPreviewPageSyncConfirm"],
   htmlEncode: false,
   yesCallback: function() {
      Terrasoft.MobileSettingsPageControllerSyncManager.synchronize({
         exportOnly: false,
         checkForPredefinedDatabase: false,
         redirect: function(){
            Terrasoft.core.redirectToMainPage();
         },
      });
   },
   noCallback: function() {},
   scope: this
});

Правильно ли я понимаю, что для того, чтобы синхронизация происходила после сохранения записи, мне нужно переопределить страницу редактирования Лида и на onSaved написать вызов синхронизации?
Или это делается по-другому?

Подобное можно реализовать как минимум двумя способами.
1. Как Вы о писали, можно переопределить страницу редактирования Лида и в контроллере на обработчике onDataSavedSuccessfully() реализовать запуск синхронизации. Этот обработчик срабатывает как-раз после того, как данные сохранены.

2. Второй способ - подписаться на события самой модели и уже там реализовать нужную Вам функциональность. Плюс этого подхода - код будет срабатывать всегда на соотв. событие, вне зависимости от того, открывали Вы вообще страницу редактирования Лида или нет. Пример подобной реализации можно подсмотреть в схеме MobileActivityModelConfig. Такая подписка будет выглядеть примерно так:

Terrasoft.Configuration.sync = function() {
      Terrasoft.MobileSettingsPageControllerSyncManager.synchronize({
         exportOnly: false,
         checkForPredefinedDatabase: false,
         redirect: function(){
            Terrasoft.core.redirectToMainPage();
         },
      });
};
 
Terrasoft.sdk.Model.setModelEventHandler("Lead", Terrasoft.ModelEvents[Terrasoft.ModelEventKinds.After].insert, Terrasoft.Configuration.sync);
Terrasoft.sdk.Model.setModelEventHandler("Lead", Terrasoft.ModelEvents[Terrasoft.ModelEventKinds.After].update, Terrasoft.Configuration.sync);

Спасибо большое! Получилось!
Второй способ работает лучше!
Спасибо!!!

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

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

BPMonline 7.7.0.2326

Скажите, как скрыть журнал синхронизации в разделе Настройки?

Нравится

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

Здравствуйте!
Рекомендую посмотреть в сторону схемы "SystemDesigner" пакета UIv2.
Так находятся элементы [Дизайнера системы]

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

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

Так захотел руководитель компании.
Хочет, чтобы в мобильном приложении в настройках остались только кнопки синхронизация и очистить кеш.
Скажите, такое возможно? И как это реализовать?

Есть такой вариант:
Создайте отдельный модуль для общих настроек UsrMobileUtilitiesCustom

Ext.define("Ext.MobileSettingsPageOverride", {
    override: "Terrasoft.controller.MobileSettingsPage",
 
    updateValues: function() {
		this.callParent(arguments);
		var syncLogPageButton = this.getSyncLogPageButton();
		syncLogPageButton.setHidden(true);
    }
 
});

подключите ее в манифесте в блоке CustomSchemas

{
	...
	"CustomSchemas": [
		"UsrMobileUtilitiesCustom"
	],
	...
}

Эттот вариант не очень хорош/надежен т.к. метод updateValues приватный

второй вариант, скрыть стилями

Terrasoft.util.writeStyles(
"#MobileSettingsPage_syncLogPageContainer {display: none}"
)

теоретически, тоже может перестать работать в будущем.

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

Спасибо большое! Получилось скрыть журнал синхронизации первым способом.

Но непонятно, по какой функции обращаться к адресу, логину, паролю, рабочему месту.
Схему MobileSettingsPage я не нашла.

Скажите, где можно посмотреть, как к ним обратиться, чтобы их скрыть?

Это ядровые компоненты мобильного приложения.
Теоретически их можно извлечь из .apk файла
(можно поискать инструкции в интеренте как это сделать)

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

список основных элементов:
view: "#MobileSettingsPage",
navigationPanel: "#MobileSettingsPage_NavigationPanel",
loginField: "#MobileSettingsPage_login",
passwordField: "#MobileSettingsPage_password",
serverField: "#MobileSettingsPage_server",
isSecureConnection: "#MobileSettingsPage_isSecureConnection",
workspaceField: "#MobileSettingsPage_workspace",
workplaceCombobox: "#MobileSettingsPage_workplaceCombobox",
backgroundSyncCombobox: "#MobileSettingsPage_backgroundSyncCombobox",
syncButton: "#MobileSettingsPage_syncButton",
clearDatabaseButton: "#MobileSettingsPage_clearSqlDatabaseButton",
versionLabel: "#MobileSettingsPage_version",
additionalColumnSet: "#MobileSettingsPage_additionalSettingsColumnSet",
demoLoginButton: "#MobileSettingsPage_demoLoginButton",
exportOnly: "#MobileSettingsPage_exportOnly",
demoPage: "#MobileDemoLoginPage",
syncLogPageButton: "#MobileSettingsPage_syncLogPageContainer",
sendUsageStatisticsButton: "#MobileSettingsPage_sendUsageStatisticsButton"

Пример обращения:
this.getLoginField()

Спасибо большое!!! Получилось!

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

BPMonline 7.7.0.2326

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

Нравится

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

Здравствуте, Виктория!

Для решения данной задачи можно использовать бизнес правило фильтрации для мобильного приложения.

Пример правила фильтрации, в котором поле "Контакт" фильтруется по колонке "Контрагент" в разделе "Счета".

Terrasoft.sdk.Model.addBusinessRule("Invoice", {
    ruleType: Terrasoft.RuleTypes.Filtration,
    events: [Terrasoft.BusinessRuleEvents.Load, Terrasoft.BusinessRuleEvents.ValueChanged],
    triggeredByColumns: ["Account"],
    filteredColumn: "Contact",
    filters: Ext.create("Terrasoft.Filter", {
        property: "Account"
    })
});

Здравствуте, Виктория!

Для решения данной задачи можно использовать бизнес правило фильтрации для мобильного приложения.

Пример правила фильтрации, в котором поле "Контакт" фильтруется по колонке "Контрагент" в разделе "Счета".

Terrasoft.sdk.Model.addBusinessRule("Invoice", {
    ruleType: Terrasoft.RuleTypes.Filtration,
    events: [Terrasoft.BusinessRuleEvents.Load, Terrasoft.BusinessRuleEvents.ValueChanged],
    triggeredByColumns: ["Account"],
    filteredColumn: "Contact",
    filters: Ext.create("Terrasoft.Filter", {
        property: "Account"
    })
});

Здравствуйте!
Не поняла, где именно это реализовывать.
Я создала через мастер мобильного приложения свое рабочее место "Агенты" и поместила туда раздел Лиды.
В Лиде есть новое поле справочник UsrAgent (выбор из контактов). Хотела бы его отфильтровать, чтобы при выборе из справочника были только контакты нашей компании с типом агент, наподобие ответственного в любых карточка BPMonline.
Но обратила внимания, что поле ответственный, например, в документе в мобильном приложении не фильтруется (хотела посмотреть пример реализации).
Скажите, возможно ли фильтровать поле в мобильном приложении?
и в какой именно схеме нужно делать изменения?

Начала разбираться в мобильном приложении, заметила, что обязательность и фильтрация полей написаны для раздела активности в MobileActivityModelConfig (я так поняла, что это модуль)

Мне нужно сделать фильтрация для полей раздела Лид. Нашла MobileLeadModelConfig (но написана она, как исходный код).

Заместить я ее не могу, так как нет в списке замещения и новую создать точно такую же не могу, потому что пользовательские схемы должны начинаться с Usr.

И как мне быть? Получается, что это ошибка системы? Как выйти из этой ситуации?

Добрый день, Виктория
Для решения Вашей задачи необходимо:

  • Желательно создать отдельную схему с типом «Модуль»
    И назвать ее так «UsrMobileLeadModelConfig» (чтоб она соответствовала базовым стилям именования файлов).
  • Внутри нее поместить такой код:
    Terrasoft.sdk.Model.addBusinessRule("Lead", {
    	name: "UsrMobileLeadUsrAgentFilter",
    	ruleType: Terrasoft.RuleTypes.Filtration,
    	events: [Terrasoft.BusinessRuleEvents.Load],
    	triggeredByColumns: ["UsrAgent"],
    	filters: Ext.create("Terrasoft.Filter", {
    		name: "filterName",
    		type: Terrasoft.FilterTypes.Group,
    		logicalOperation: Terrasoft.FilterLogicalOperations.And,
    		subfilters: [
    			{
    				property: "Account",
    				value: 'айдишникнашейкомпании'
    			},
    			{
    				property: "Type",
    				value: 'айдишниктипаконтактаагент'
    			}
    		]
    	})
    });
  • Затем эту схему необходимо подключить в манифесте:
    - Создаем/Открываем схему UsrMobileApplicationManifestDefaultWorkplace
    - Добавляем в блок Models такой код:
    "Models": {
       "Lead": {
          "PagesExtensions": ["UsrMobileLeadModelConfig"]
       }
    }
  • Сохраняем
  • Синхронизируемся на девайсе

Здравствуйте!
Весь день пробую код, который вы написали.

Заметила, что если в блоке "Models" добавить в "PageExtensions", то при синхронизации возникает ошибка, поэтому (по примеру в коде) добавила в "ModelExtensions" и проверила на обязательности этого поля, все срабатывает.
Terrasoft.sdk.Model.addBusinessRule('Lead', {
ruleType: Terrasoft.RuleTypes.Requirement,
triggeredByColumns: ['UsrAgent']
});

Но фильтрация не работает, пустой список, пробовала и просто по Account и по двум, пустой список и все.
Почему не работает фильтрация?
Почему пустой список хотя в sql с этими id есть 2 записи и в приложении на компе тоже 2 записи, а в мобильном приложении пусто?
Значение name: "filterName" должно быть любым или определенным? Или в чем-то другом причина?

Получилось настроить фильтрацию по текстовому полю:

Terrasoft.sdk.Model.addBusinessRule("Lead", {
ruleType: Terrasoft.RuleTypes.Filtration,
triggeredByColumns: ["UsrAgent"],
filters: Ext.create("Terrasoft.Filter", {
compareType: Terrasoft.ComparisonTypes.Equal,
property: "Name",
value: "Агент 1",
name: "test123"
})
});

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

1)

"Чуплыгина Виктория Викторовна" написал:"PageExtensions", то при синхронизации возникает ошибка

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

2) Проверьте, что значения Id-шников указаны в нижнем регистре

{
   property: "Account",
   value: "e308b781-3c5b-4ecb-89ef-5c1ed4da488e"
},

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

1) Если получилось настроить обязательность и фильтрацию по текстовому полю, то, мне кажется, подключила я все верно.
Квадратные скобки я поставила.

2) да, в нижнем регистре.

Может, все-таки для фильтрации по справочнику нужно указать что-то еще?
Никак не могу понять, что именно.

Terrasoft.sdk.Model.addBusinessRule("Activity", {
ruleType: Terrasoft.RuleTypes.Filtration,
events: [Terrasoft.BusinessRuleEvents.Load],
triggeredByColumns: ["Owner"],
filters: Ext.create("Terrasoft.Filter", {
property: "Active",
modelName: "SysAdminUnit",
assocProperty: "Contact",
operation: Terrasoft.FilterOperations.Any,
name: "ActivityContact_SysAdminUnit_Filtration",
value: true
})
});

Фильтрация поля ответственный в разделе активности?
что означают свойства modelName и assocProperty?
modelName, наверно, там, где искать property?

Да, это она.
modelName - имя связанной таблицы.
assocProperty - имя колонки по которой связанная таблица ссылается на фильтруемую таблицу.

Это не обычный фильтр, а фильтр по обратным связям.
Он означает следующее: Берем всех контактов для которых существует запись в таблице SysAdminUnit которая ссылается на контакта через свое поле SysAdminUnit.Contact

Значение name: "filterName" может быть любым

Указанный пример должен работать.
Попробуйте еще такой пример:

Сначала с NotEqual

Terrasoft.sdk.Model.addBusinessRule("Lead", {
	ruleType: Terrasoft.RuleTypes.Filtration,
	triggeredByColumns: ["UsrAgent"],
	filters: Ext.create("Terrasoft.Filter", {
		compareType: Terrasoft.ComparisonTypes.NotEqual,
		property: "Id",
		value: "81d05412-d90c-440a-831a-03fc52489fa5",
		name: "name1"
	})
});

а затем с Equal

Похоже что данные по колонке Тип не забираются для таблицы "Контакт"
Добавьте в манифест колонку тип, примерно так:

"ModelDataImportConfig": [
{
	"Name": "Contact",
	"SyncColumns": [
		"Name",
		"Account",
		"Department",
		"JobTitle",
		"Photo",
		"Type"
	]
}
]

После чего лучше очистить кеш и пересинхронизироваться

Спасибо Вам большое!!!!!

Действительно данные по колонкам не забирались для таблицы контакт!

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