Симптомы:

localhost redirected you too many times. 

Версия приложения 7.12.0. SE_M_CC

Причина:

Неактуальная версия Redis или .NET Framework

Решение:

Установить Redis версии 3.2.

Установить .NET Framework више 4.6.

Нравится

Поделиться

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

Вопрос

В разделе Активности видны только те записи, на которые у пользователя есть права и где он является ответственным. Как отключить фильтрацию по ответственному ? И где она “живёт”?

Записи другого ответственного можно было посмотреть, нажав кнопку. Заметили, что она активна только при Online режиме работы приложения. Как сделать так, что бы она стала активной и в Offline?

Ответ

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

Важно: Мы не рекомендуем отключать фильтрацию по ответственному для offline-режима. 

 

Для настройки/удаления фильтров используется схема манифеста. Статья о настройке фильтров в манифесте https://academy.terrasoft.ru/documents/technic-sdkmob/7-12/manifest-svoystva-sinhronizacii-prilozheniy

 

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

 "Remove": {
        "SyncOptions": {
            "ModelDataImportConfig": [
                {
                    "Name": "Activity",
                    "QueryFilter": null
                },
                {
                    "Name": "ActivityParticipant",
                    "QueryFilter": null
                }
            ]
        }
    }

 

Для того, что бы кнопка выбора ответственного стала активной, необходимо расширить класс Terrasoft.configuration.controller.ActivityGridPage, а именно метод initializeOwnerButton. Пример:

initializeOwnerButton: function() {
   this.callParent(arguments);
   if (!Terrasoft.ApplicationUtils.isOnlineMode()) {
      var view = this.getView();
      var ownerButton = view.getOwnerButton();
      ownerButton.on("tap", this.onOwnerButtonTap, this);
   }
}

 

Нравится

Поделиться

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

1. Сначала создаем параметр в который будем записывать строку: ProcessSchemaParameter1

2. Создаем параметр в который будем записывать конечную строку (можно записывать в тот же параметр)

3. Выбираем в БП элемент "задание-сценарий". Копируем туда код.

String value = Get<string>("ProcessSchemaParameter1");// читаем параметр и записываем его значение в "value"
int startIndex = 2; //с какого символа по порядку начинать "вытягивать" 0 - с самого начала строки, то есть первый символ, 1 - 2й символ и тд.
      int length = 3;// к-во символов которое нам необходимо вытянуть. ПРИМЕР: слово "Синхрофазатрон". Если использовать этот код без изменений, то на выходе получим "нхр"(н-3я буква, от нее еще 3 символа)
      String substring = value.Substring(startIndex, length);
      Set("ProcessSchemaParameter1", substring);// в какой параметр записываем конечную строку
return true;

 

Нравится

Поделиться

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

Симптомы

В коммуникационной панели не отображается блок с почтой. В консоли появляется сообщение следующего характера: Uncaught Terrasoft.ItemNotFoundException: Column with the '4684d4ba-4b6b-4d1a-93fb-70ec2afed57f' Id not found in the 'Activity' object

Причина

Проблема заключается в том, что в таблицу EntityConnection добавлена связь активности с несуществующим или устаревшим объектом.

Решение

Выполнить в конфигурации или СУБД скрипт, который удаляет ссылку на несуществующую колонку:

DELETE FROM [dbo].[EntityConnection]

WHERE [ColumnUId] = '4684d4ba-4b6b-4d1a-93fb-70ec2afed57f'

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

Перед выполнением убедиться, что колонки с таким UId действительно нет в объекте Activity. Возможно, в одном из пакетов она есть, но из-за некорректной зависимости пакетов она недоступна для системы.

Нравится

Поделиться

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

Вопрос

Не работает поле с изображением для детали, по инструкции http://academy.terrasoft.ru/documents/docs/technic/SDK/7.6.0/AddPictureField.html

Ответ

Данная инструкция релевантна для схемы страницы, для детали необходимо добавить метод:

getSchemaImageUrl: function(primaryImageColumnValue) {
        if (!primaryImageColumnValue) {
            return null;
        }
        var imageConfig = {
            source: Terrasoft.ImageSources.SYS_IMAGE,
            params: {
                primaryColumnValue: primaryImageColumnValue.value
            }
        };
        return Terrasoft.ImageUrlBuilder.getUrl(imageConfig);
},

 

Нравится

Поделиться

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

Симптомы

В кастомном разделе не отображается кнопка "Добавить".

Причина

Кнопка "Добавить" в разделах не отображается по причине незаполненного заголовка для страниц редактирования в таблицах регистрации SysModuleEdit и SysModuleEditLcz.

Решение

Найти схемы, в которых необходимо выполнить update, можно запросом:

select * from SysModuleEdit where SysModuleEntityId in
    (select id from SysModuleEntity where SysEntitySchemaUId in
        (select uid from sysschema where name = 'UsrCroppPlants') --название объекта раздела
    )
 
select * from SysModuleEditlcz where recordid in (
    select id from SysModuleEdit where SysModuleEntityId in
        (select id from SysModuleEntity where SysEntitySchemaUId in
            (select uid from sysschema where name = 'UsrCroppPlants') --название объекта раздела
        )
    )

Пример добавления Caption для Посевных культур:

update SysModuleEditlcz
set Value = 'Добавить'
where recordid in (
    select id from SysModuleEdit where SysModuleEntityId in
        (select id from SysModuleEntity where SysEntitySchemaUId in
            (select uid from sysschema where name = 'UsrCroppPlants') --название объекта раздела
        )
    )
 
update SysModuleEdit
set ActionKindCaption = 'Добавить'
where SysModuleEntityId in
    (select id from SysModuleEntity where SysEntitySchemaUId in
        (select uid from sysschema where name = 'UsrCroppPlants') --название объекта раздела
    )

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

После update обязательно необходимо перезайти в систему и очистить Redis.

Нравится

Поделиться

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

Вопрос

Требуется добавить на деталь "Средства связи" тип средства связи "LinkedIn". То есть добавлять не средство связи "Web" и вставлять ссылку на профиль контакта в LinkedIn, а добавлять также ссылку, но имеющую название "LInkedIn".

Ответ

1. В справочнике [Типы средств связи], добавляем новое средство, называем к примеру «LinkedIn», тип коммуникаций добавляем «Web».

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

2. На записи LinkedIn нажимаем «Изменить» и в адресе открывшегося окна ищем recordId, записываем его, он пригодится дальше.

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

3. В конфигурации заместить схему CommunicationUtils, скопировав из оригинала весь код. В зависимости так же, как и в оригинале добавить ConfigurationConstants.

4. В замещенной схеме, дорабатываем метод isWebType() блоком проверки на recordId записанный выше, и при истинности проверки, возвращаем true.

function isWebType(communicationType) {
    if (!communicationType) {
        return false;
    }
 
    if (communicationType === "5e4025d7-84cf-43ce-9a90-64a966c34853") {
        return true; /*LinkedIn*/
    }
 
    communicationType = communicationType.value || communicationType;
    return ConfigurationConstants.CommunicationTypes.Web.indexOf(communicationType) !== -1;
}

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

Нравится

Поделиться

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

Вопрос

При синхронизации из-за присутсвия спец.символов, либо из-за длинного названия файла не проходит синхронизация

Необходимо сменить название (имя) файла чтобы он отображался

Ответ

Для настройки отображения имени файла необходимо внести следующие изменения в манифесте(пример в разделе Активности на детали ActivityFile): установить флаг UseRecordIdAsFileName в true для  бинарной колонки Data. Таким образом, имена файлов будут формироваться на основании ID записи.

"SyncOptions": {
    "ModelDataImportConfig": [
        {
            "Name": "ActivityFile",
            "SyncColumns": [
                "Id",
                "Name",
                {
                    "Name": "Data",
                    "UseRecordIdAsFileName": true
                },
                "Activity",
                "Type"
            ]
        }
    ]
},

 

Нравится

Поделиться

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

Вопрос

Где посмотреть реализацию сообщений между деталями через песочницу (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 комментариев
Показать все комментарии