Вопрос

Где посмотреть реализацию сообщений между деталями через песочницу (sandbox)?

Ответ

Примеры реализации обмена сообщениями между деталями через sandbox:

1) AccountBillingInfoDetailV2:

define("AccountBillingInfoDetailV2", [], function() {
	return {
		entitySchemaName: "AccountBillingInfo",
		details: /**SCHEMA_DETAILS*/{
		}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[
			{
				"operation": "merge",
				"name": "DataGrid",
				"values": {
					"selectRow": {
						"bindTo": "rowSelected"
					}
				}
			}
		]/**SCHEMA_DIFF*/,
		methods: {
			rowSelected: function() {
				this.sandbox.publish("RowSelectedInFirstDetail", { test: "param anything" }, [this.sandbox.id]);
				console.log("rowSelected in first detail...");
			}
		},
		messages: {
			"RowSelectedInFirstDetail": {
				mode: Terrasoft.MessageMode.PTP,
				direction: Terrasoft.MessageDirectionType.PUBLISH
			}
		}
	};
});

2) AccountAddressDetailV2:

define("AccountAddressDetailV2", [], function() {
	return {
		entitySchemaName: "AccountAddress",
		details: /**SCHEMA_DETAILS*/{
		}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,
		methods: {
			init: function() {
				this.sandbox.subscribe("RowSelectedInFirstDetail", function(arg) {
					console.log("test " + arg.test);
				}, this, [this.getSenderSandboxId()]);
			},
			getSenderSandboxId: function() {
				return this.sandbox.id.replace("_AccountAddress", "_AccountBillingInfo");
			}
		},
		messages: {
			"RowSelectedInFirstDetail": {
				mode: Terrasoft.MessageMode.PTP,
				direction: Terrasoft.MessageDirectionType.SUBSCRIBE
			}
		}
	};
});

 

Нравится

Поделиться

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

Вопрос

Обязательность поля "Организация" проставлена на объекте контакта "На уровне приложения".

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

- Создаем новый контакт

- Заполняем поле "Организация" (Созданную раннее в веб-версии)

- Сохраняем

- Выполняем синхронизацию

- Выпадает ошибка 



Call Stack:

Contact(9d6652ba-5062-45d2-a7f2-1fb6c3ba1978) at Wed May 16 2018 11:13:07 GMT+0300 (MSK). Error text: Type: Terrasoft.ODataRequiredColumnsEmptyValuesException

Message: Поле Организация является обязательным для заполнения

AdditionalInfo: {"position":0,"error":{"code":"3","message":{"value":"Поле Организация является обязательным для заполнения"},"innererror":{"message":"Поле Организация является обязательным для заполнения","type":"Terrasoft.Core.Entities.RequiredColumnsEmptyValuesException","stacktrace":"  в Terrasoft.Core.Entities.Entity.ValidateRequiredColumns()\r\n  в Terrasoft.Core.Entities.Entity.InternalSave(Boolean validateRequired, Boolean setColumnDefValue)\r\n  в Terrasoft.Core.Entities.Entity.Save(Boolean validateRequired, Boolean setColumnDefValue)\r\n  в Terrasoft.Core.Entities.Services.EntityLazyProxy.SaveChanges()\r\n  в Terrasoft.Core.Entities.Services.ServiceContext.SaveChanges()","internalexception":null}}}



Если убрать обязательность  - все работает корректно.

Ответ

Обяснение на примере.

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

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

Пример. Создаете:

Terrasoft.sdk.Model.addBusinessRule('Contact', {
    ruleType: Terrasoft.RuleTypes.Requirement,
    triggeredByColumns: ['Name']
});

Затем добавить в манифест необходимого модуля в секцию ModelExtensions.

Пример реализации можете посмотреть в схеме "MobileActivityModelConfig".

Нравится

Поделиться

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

Симптомы:

Ошибка: Элемент c идентификатором "Caption" уже существует

Причина:

Дубликаты ресурсов (одинаковые значения пакет+культура+ключ+значение), При этом один из дублей указывает на базовую схему, второй - на замещенную (чего теоретически быть не должно)

Решение:

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

delete
from SysLocalizableValue
where exists (
    select 1
    from SysSchema s
    where s.Id = SysLocalizableValue.SysSchemaId
        and s.ExtendParent = 1
)

 

Нравится

Поделиться

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

Вопрос

На боковой панели в srm есть знак "+", по которому можно добавить новый заказ, обращение, звонок и т.д. Но при выборе добавления, например, обращения программа подвисает и никакое окно для создания нового обращения не открывается. (то же самое по заказу и задача/звонок).

Ответ

Cодержимое «+» быстрого добавления, редактируется в справочнике «Настройка меню быстрого добавления», как «Пункт меню быстрого добавления». Одна из его колонок - «Страница добавления» - является типом «Карточка редактирования раздела», которая ссылается не на таблицу, а на представление «VwSysModuleSchemaEdit» базы данных.

А в коде этого представления, идет привязка к имени рабочего пространства «Default», которое в вашем решении переименовано на «DefaultFlat». Следовательно, ни одна из страниц редактирования Вам не была видна. Так же как и не могла быть вызвана в качестве пункта меню быстрого добавления.

Для решения проблемы необходимо старую VwSysModuleSchemaEdit в БД, переименовать, к примеру, в «VwSysModuleSchemaEdit_Old» и выполнить скрипт по добавлению нового представления:

CREATE VIEW [dbo].[VwSysModuleSchemaEdit]
AS
SELECT
       se.Id as 'Id',
       se.CreatedOn as 'CreatedOn',
       se.CreatedById as 'CreatedById',
       se.ModifiedOn as 'ModifiedOn',
       se.ModifiedById as 'ModifiedById',
       se.ProcessListeners as 'ProcessListeners',
       se.PageCaption as 'PageCaption',
       se.TypeColumnValue as 'TypeColumnValue',
       se.SysModuleEntityId as 'SysModuleEntityId',
       ss.Caption as 'EditPageCaption',
       ss.Name as 'EditPageName'
FROM SysModuleEdit se
inner join VwSysSchemaInWorkspace ss ON ss.UId = se.CardSchemaUId
       and ss.SysWorkspaceId = (SELECT Id FROM SysWorkspace WHERE Name = 'DefaultFlat')
WHERE
       exists(SELECT null FROM SysModule sm WHERE sm.SysModuleEntityId = se.SysModuleEntityId)
       and exists(SELECT vss.Caption FROM VwSysSchemaInWorkspace vss WHERE vss.UId = se.CardSchemaUId)
GO

Для вступления изменений почистите кеш браузера, и перезайдите на сайт.

Нравится

Поделиться

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

Вопрос

Как зарегистрировать раздел на уровне БД если в интерфейсе он не отображается? Используется русская локализация

Ответ

Если в таблицах SysModuleEntity, SysModuleEdit и SysModule отсутствует информация об новом разделе, то поступаем в следующем порядке:

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

  • I Этап. Создать запись в таблице SysModuleEntity (таблица, где хранится информация объектах разделов):

     

SysModuleEntity

insert into SysModuleEntity (SysEntitySchemaUId) values ('AF6DD4AD-1398-4FCE-8837-78DC65AE0F9E')

где  [SysEntitySchemaUId] - колонка Uid объекта раздела (например, "UsrRK") в таблице SysSchema;

  • II Этап. Создать запись в таблице SysModuleEdit (страница редактирования "Page"):

     

SysModuleEdit

insert into SysModuleEdit (SysModuleEntityId
,UseModuleDetails
,CardSchemaUId
,ActionKindCaption
,ActionKindName
,PageCaption)
values ('8ED522AF-00E1-4595-AC13-643944B005B7'
,1
,'8B22D9BE-4BBC-4B50-80EA-AB6FBB604B7E'
,'Добавить'
,'UsrRK1Page'
,'Card schema: "RK"')

где  [SysModuleEntityId] - колонка Id записи таблицы SysModuleEntity из первого этапа (проверка Select Id from SysModuleEntity Where SysEntitySchemaUId='AF6DD4AD-1398-4FCE-8837-78DC65AE0F9E')

[CardSchemaUId]  - колонка Uid страницы редактирования объекта (например, "UsrRK1Page") в таблице SysSchema (проверка Select Uid,Name from SysSchema where name like '%UsrRK%'). Нам необходима схема, которая называется "Название объекта + 1Page"

[ActionKindCaption] - Название кнопки в реестре раздела;

[ActionKindName] - Название схемы страницы редактирования;

[PageCaption] - Заголовок схемы страницы редактирования в таблице SysSchema (проверка Select Uid,Name,Caption from SysSchema where name like '%UsrRK1Page%')

  • III Этап. Создать запись в таблице SysModule (страница раздела "Section"):

     

SysModule

insert into SysModule (Caption
,SysModuleEntityId
,FolderModeId
,GlobalSearchAvailable
,Code
,SectionModuleSchemaUId
,SectionSchemaUId
,CardModuleUid
,Image32Id) values (N'RK'
,'8ED522AF-00E1-4595-AC13-643944B005B7'
,'B659D704-3955-E011-981F-00155D043204'
,1
,'UsrRK'
,'DF58589E-26A6-44D1-B8D4-EDF1734D02B4'
,'B3D153C0-92EF-4A53-B868-9395C3E43516'
,'4E1670DC-10DB-4217-929A-669F906E5D75'
,'026742D9-390C-4778-BC46-9FA85C42677A')

где  [Caption] - Название раздела (можно брать caption объекта раздела) - 

[SysModuleEntityId]  - колонка Id записи таблицы SysModuleEntity из первого этапа (проверка Select Id from SysModuleEntity Where SysEntitySchemaUId='AF6DD4AD-1398-4FCE-8837-78DC65AE0F9E')

[Code] - Название объекта раздела (на английском языке);

[SectionModuleSchemaUId] - UId модуля SectionModuleV2 с помощью которой открывается схему раздела (Id для всех разделов одинаковый);

[SectionSchemaUId] - колонка Uid страницы раздела объекта (например, "UsrRK1Section") в таблице SysSchema (проверка Select Uid,Name,Caption from SysSchema where name like '%UsrRK%'). Нам необходима схема, которая называется "Название объекта + 1Section"

Нравится

Поделиться

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

Вопрос:

В ходе бизнес процесса мне необходимо создать несколько конфигурационных единиц в обращении, из КЕ которые соответствуют определенному условию.

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

Ввиду этого возник вопрос: как мне прочитать не первую, а вторую третью и т.д. записи соответствующие условию?

Возможны другие варианты решения задачи?

Ответ:

Для реализации с помощью цикла необходимо добавить в объекте дополнительное логическое поле (условно, Для цикла), и использовать его в рамках цикла (для уже добавленных данных проставлять значение = 1; а читать первый результат выборки, где Для цикла = 0).

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

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

Нравится

Поделиться

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

Вопрос

Как изменить вкладку по умолчанию?

Ответ

Для этой цели Вы можете использовать свойство DefaultTabName, задав в нем необходимую вкладку, либо переопределить метод initTabs(), в котором при помощи this.setActiveTab("Имя вкладки"); задать вкладку, которая будет устанавливаться активной.

Нравится

Поделиться

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

Симптомы

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

Тип: Terrasoft.SourceCodeException

Сообщение: TypeError: undefined is not an object (evaluating 'Terrasoft.sdk.RecordPage.getColumns(model, columnSetName).

get(columnName).columnOriginalConfig')

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

Script: file:///private/var/mobile/Containers/Bundle/Application/4C00C070-499C-4318-9653-8938B2A3B608/bpm'online.app/www/Common/Terrasoft.Mobile.Combined.js%0D%0A%09Line: 7698"

Причина

Пользователь удалил базовую колонку через дизайнер

Решение

1) В конфигурации создаем новый "модуль" с именем UsrMobileOverrideUtilities

добавляем в него такой текст: 

Ext.define("Terrasoft.sdk.RecordPage.Override", {
    override: "Terrasoft.sdk.RecordPage",
    configureColumn: function(model, columnSetName, columnName, columnConfig) {
        if (!Terrasoft.sdk.RecordPage.getColumns(model, columnSetName).get(columnName)) {
            return;
        }
        this.callParent(arguments);
    }
});

2) Меняем пользовательский манифест обычно он называется UsrMobileApplicationManifestCustom

добавляем в него такой блок:

"CustomSchemas": [
    "UsrMobileOverrideUtilities"
],

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

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

Нравится

Поделиться

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

Вопрос

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

1. Можно ли использовать для детали filterMethod, как в основной версии, или каким-либо образом использовать произвольный фильтр, а не только по колонке родительской страницы?

2. Как отключить возможность добавлять, удалять и редактировать записи детали, в зависимости от значений на родительской странице?

Ответ

1. Для деталей можно указывать фильтры, используя метод configure() соотв. sdk-класса:

Terrasoft.sdk.Details.configure("Contact", "ActivityDetailV2StandartDetail", {
   filters: Ext.create("Terrasoft.Filter", {
      type: Terrasoft.FilterTypes.Group,
      subfilters: [
         Ext.create("Terrasoft.Filter", {
            compareType: Terrasoft.ComparisonTypes.NotEqual,
            property: "Type",
            value: Terrasoft.GUID.ActivityTypeEmail
         })
      ]
   })
});

2. В целом, изменение режима работы детали делается так:

Terrasoft.sdk.Details.setChangeModes("Contact", "ActivityDetailV2StandartDetail", [Terrasoft.ChangeModes.Read]);

Но если нужно менять режим работы от условия, то для этого в контроллерах страниц есть метод getChangeModes(). Т.е. в контроллерах соотв. страниц (грида, просмотра, редактирования) нужно расширить этот метод:

getChangeModeOperations: function() {
   var detailConfig = this.getDetailConfig();
   if (detailConfig) {
      var parentRecord = detailConfig.parentRecord;
      if (parentRecord.get("IsNonActualEmail") === false) {
         return {
            canCreate: false,
            canUpdate: false,
            canDelete: false
         };
      }
   }
   return this.callParent(arguments);
}

 

Нравится

Поделиться

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

Вопрос

День добрый.

Версия 7.7

Мы вносим какие то изменения на страницу, к примеру Контрагента, вносим свои колонки, удаляем стандартные.

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

В данной версии, этого не достаточно, страница как была отредактирована, так она и осталась.

Как выйти из положения?

Ответ

Данное поведение связано с тем что начиная с версии 7.7 в BPM'Online используются бандлы, в которых содержатся все схемы страниц и разделов. Простое удаление замещающей схемы страницы раздела не изменяет бандл. Для возврата к исходной странице, Вам нужно создать пустой замещающий клиентский модуль для нужной Вам страницы. К примеру для страницы раздела "Лиды" он будет выглядеть так:

define("LeadPageV2", ["BusinessRuleModule", "ConfigurationConstants"],
    function(BusinessRuleModule, ConfigurationConstants) {
        return {};
});

Затем нужно сохранить созданный модуль и очистить кэш браузера.

Нравится

Поделиться

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