Симптомы:

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

Причина:

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

Решение:

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

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

 

Нравится

Поделиться

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

Симптомы

Во время синхронизации происходит ошибка:

Элемент с идентификатором "90a3e9f6-........................-7c4aadb41f28" не найден

Причина

Таблица SysLookup не используется в десктопных версиях 7.5 и 7.6, но используется в мобильном приложении ниже версии 7.7.1

В таблице SysLookup есть записи которые ссылаются на несуществующие схемы, например такие UID'ы:

90A3E9F6-12D4-45B5-9122-7C4AADB41F28

A85932A3-30A5-49D7-9627-7F749A055AB7

CCF7D813-FC83-47AD-BE61-8F3B3B98A54F

E0AA5FA2-0910-478D-943B-E9C2579AD7B4

Решение

Выполнить скрипт

UPDATE [SysLookup]
SET IsSimple = 0
WHERE IsSimple = 1
AND NOT EXISTS (select 1 from SysSchema ss WHERE ss.[UId] = SysEntitySchemaUId)

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

Некоторые версия BPMonline 7.6

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

Нравится

Поделиться

0 комментариев
Показать все комментарии
IF NOT EXISTS (
 
    SELECT 1 FROM sys.columns
 
    WHERE [Name] = N'TIME_ZONE_ID'
 
    AND [Object_ID] =
Object_ID(N'[dbo].[QRTZ_SIMPROP_TRIGGERS]')
 
)
 
BEGIN
 
    ALTER TABLE [dbo].[QRTZ_SIMPROP_TRIGGERS] ADD [TIME_ZONE_ID]
[NVARCHAR] (80);
 
END;  

 

Нравится

Поделиться

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

Симптомы

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

Причина

На странице настройки присутствует невидимая правая панель, которую скрыли ещё в 7.2.0, в результате чего на ширину дерева групп выделено всего 40%. Кроме того, к странице применяются стили из PageDesignerUtilities, которые отображают всю область настройки на половину страницы.

Решение

В версии 7.7.0 данный функционал полностью изменён, в результате чего проблемы в этой версии не будет. Для версий 7.6.0 и ниже необходимо заместить модуль MailboxFolderSyncSettingsModule с полным копированием кода, удалить стили для класса left-container, добавить новый стиль

#mainContainerEx {
 
     width:  100%;
 
     padding-top:  7px;
 
     margin-right:  40px;
 
}

и заменить в исходном коде id и селектор mainContainer на mainContainerEx.

Нравится

Поделиться

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 комментариев
Показать все комментарии

Вопрос

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

Ответ

Для этой цели Вы можете использовать свойство 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 комментариев
Показать все комментарии

Симптомы

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

Причина

Некорректное формирование гиперссылки по данным поля.

Решение

Проблема исправлена в последних версиях 7.6.0 и начиная с 7.7.0. Часто бывает так, что клиент по различным причинам не может обновиться до данных версий. В этом случае есть обходное решение: необходимо создать замещающий клиентский модуль для схемы BasePageV2 и вставить в него код:

define("BasePageV2", ["terrasoft"], function(Terrasoft) {
	return {
		methods: {
			/**
			 * @inheritdoc Terrasoft.BasePageV2#getEntitySchemaQuery
			 * @overridden
			*/
			getEntitySchemaQuery: function() {
				var esq = this.callParent(arguments);
				this.Terrasoft.each(this.columns, function(column) {
					if ((column.type === Terrasoft.ViewModelColumnType.ENTITY_COLUMN) && column.referenceSchemaName) {
						var referenceSchema = Terrasoft.configuration.EntityStructure[column.referenceSchemaName];
						var attributeValue = referenceSchema && referenceSchema.attribute;
						var columnPath = attributeValue && (column.name + "." + attributeValue);
						if (columnPath && !esq.columns.contains(columnPath)) {
							esq.addColumn(columnPath);
						}
					}
				}, this);
				return esq;
			},
 
			/**
			 * @inheritdoc Terrasoft.BasePageV2#setColumnValues
			 * @overridden
			*/
			setColumnValues: function(entity) {
				this.Terrasoft.each(this.columns, function(column) {
					if ((column.type === Terrasoft.ViewModelColumnType.ENTITY_COLUMN) && column.referenceSchemaName) {
						var columnName = column.name;
						var lookupValue = entity.get(columnName);
						if (!Ext.isEmpty(lookupValue)) {
							var referenceSchema = Terrasoft.configuration.EntityStructure[column.referenceSchemaName];
							var attributeValue = referenceSchema && referenceSchema.attribute;
							var columnPath = attributeValue && (columnName + "." + attributeValue);
							if (columnPath) {
								var entityLookupValue = entity.get(columnPath);
								lookupValue[attributeValue] = entityLookupValue;
								this.set(columnPath, entityLookupValue);
							}
						}
					}
				}, this);
				this.callParent(arguments);
			}
		},
		diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/
	};
});

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

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

Нравится

Поделиться

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 комментариев
Показать все комментарии