Bpm'online mobile bug report: Невозможно получить значение колонки Data, так как она не была загружена
Симптомы
В мобильном приложении добавляется файл/фото на деталь "файлы и ссылки" в одном из разделов.
После запуска синхронизации возникает ошибка:
Bpm'online mobile bug report
Type: Terrasoft.ODataException
Message: An error occurred while processing this request.
Сообщение содержит: Невозможно получить значение колонки Data, так как она не была загружена
Причина
В процессе схемы File в скрипте ScriptFileSaving есть код:
var data = Entity.GetColumnValue("Data") as byte[];
И если обновлять данные в этой схеме (через OData) и не указывать колонку Data, то появляется сообщение, что она не загружена.
Такая ситуация может происходить если в таблице файлов (ActivityFile, OpportunityFile и т.п.) есть циклическая связь.
Например в таблице ActivityFile есть колонка Activity, которая ссылается на таблицу Activity, в которой, в свою очередь, есть справочная колонка UsrActivityFile, которая ссылается на таблицу ActivityFile.
Мобильное приложение это отслеживает и разбивает один запрос
INSERT INTO ActivityFile (Id, Name, Data, Activity) VALUES (1, 2, 3, 4)
На два запроса:
INSERT INTO ActivityFile (Id, Name, Data) VALUES (1, 2, 3) UPDATE ActivityFile SET Activity = 4 WHERE Id = 1
Вот этот второй запрос и не срабатывает.
Решение
Есть обходное решение. Для требуемой таблицы в манифесте установить признак IgnoreSplitLogActions
{ "SyncOptions": { "ModelDataExportConfig": [ { "Name": "ActivityFile", "IgnoreSplitLogActions": true } ],
Тогда вставка файла не будет разбиваться на два запроса.
Необходимые условия и возможные ограничения
Для UIV1 необходимо дополнительно "заоверрайдить" схему:
if (!Terrasoft.SysSettingsValue.getBooleanValue("UseMobileUIV2")) { /* * Moved from UIV2 */ Ext.define("Terrasoft.Sync.LogManager.override", { override: "Terrasoft.Sync.LogManager", /** * @private */ ignoreSplitLogActions: function(logAction) { var modelName = logAction.get("ModelName"); var manifest = Terrasoft.ApplicationConfig.manifest; var ignore = false; if (manifest.SyncOptions) { var modelDataExportConfig = manifest.SyncOptions.ModelDataExportConfig || []; for (var i = 0, ln = modelDataExportConfig.length; i < ln; i++) { var modelConfig = modelDataExportConfig[i]; if (Ext.isObject(modelConfig) && modelConfig.Name === modelName) { ignore = modelConfig.IgnoreSplitLogActions; break; } } } return ignore === true; }, /** * @private */ splitLogActions: function() { var firstTierActions = this.firstTierActions = []; var secondTierActions = this.secondTierActions = []; for (var i = 0, ln = this.mergedLogActions.length; i < ln; i++) { var logAction = this.mergedLogActions[i]; if (this.isCreateAction(logAction) && !this.ignoreSplitLogActions(logAction)) { firstTierActions.push(logAction); this.splitLogActionWithLoopColumns(logAction); this.splitLogActionWithBinaryColumns(logAction); } else { secondTierActions.push(logAction); if (this.isUpdateAction(logAction)) { this.splitLogActionWithBinaryColumns(logAction); } } } } }); }