Bug mobile report: В процессе записи в файл произошла ошибка (актуально для iOS) - возникает из-за спецсимволов в названии файла
Симптомы
Bug mobile report:
Type: Terrasoft.SyncException
Message: В процессе синхронизации произошла ошибка
Stack trace:
Type: Terrasoft.FileException
Message: В процессе записи в файл произошла ошибка
AdditionalInfo: Имя: BPMonline700/Downloads/6005bfc5-5ea7-42da-82e6-15f5f4c9e80a/счет на оплату #6.pdf
Type: Terrasoft.FileSystemException
Message: undefined
AdditionalInfo: Код: undefined
Data: 4
Model Name: iPhone8,2 (0x0)
Platform: iOS
Platform Version: 9.2.1
IsOnlineMode: false
UIVersion: 2
ApplicationVersion: 7.7.8
ApplicationMajorVersion: 7.7
ContactId: c41b4784-a414-438c-a846-c5bf418f0056
CultureName: ru-RU
ApplicationRevision: 0
BackgroundSyncMode: 3
WorkplaceCode: DefaultWorkplace
Причина
Данная ошибка возникает из-за того, что в приложении присутствует файл «счет на оплату #6.pdf» (деталь «Файлы и ссылки»), в котором есть спецсимвол «#». В мобильном устройстве на платформе iOS есть ограничения по использованию спецсимволов при передаче запросов/файлов.
Решение
Для исправления необходимо переименовать файл и убрать символ «#». Это можно сделать, например, следующими способами:
- найти прикрепленный файл вручную открывая каждую запись в приложении;
- по ID записи (например, «6005bfc5-5ea7-42da-82e6-15f5f4c9e80a») в БД найти родительский объект, чтобы понять в каком разделе и в какой записи находиться данный файл и также переименовать через БД или на уровне приложения. Для упрощения поиска прикрепил скрипт, который можно выполнить на уровне БД и определить в каком объекте находиться данный файл.
-- Вхідні параметри - назва та значення стовпчика: DECLARE @COLUMN_NAME NVarChar(100) = 'Id' DECLARE @COLUMN_VALUE NVarChar(100) = '6005bfc5-5ea7-42da-82e6-15f5f4c9e80a' DECLARE @tableName VARCHAR(50) DECLARE tablesCursor CURSOR LOCAL FORWARD_ONLY STATIC FOR -- Запит повертає імена таблиць в БД, у яких є стовпчик @COLUMN_VALUE: SELECT table_name = sysobjects.name FROM sysobjects JOIN syscolumns ON sysobjects.id = syscolumns.id WHERE sysobjects.xtype='U' and syscolumns.name = @COLUMN_NAME OPEN tablesCursor FETCH NEXT FROM tablesCursor INTO @tableName WHILE @@FETCH_STATUS = 0 BEGIN -- Якщо в якійсь таблиці є стопчик @COLUMN_NAME зі значенням @COLUMN_VALUE - -- вивести ім'я таблиці, запит і кількість рядків у запиті EXEC ('DECLARE @recordCount INT; DECLARE @quotesChar CHAR = char(39); DECLARE @tabChar CHAR = char(9); BEGIN TRY SET @recordCount = (SELECT COUNT(*) FROM [' + @tableName + '] where ' + @COLUMN_NAME + ' = ''' + @COLUMN_VALUE + ''') IF @recordCount > 0 BEGIN PRINT '''' PRINT ''-- ' + @tableName + ':'' PRINT '' SELECT * FROM ' + @tableName + ' WHERE ' + @COLUMN_NAME + ' = '' + @quotesChar + ''' + @COLUMN_VALUE + ''' + @quotesChar + '''' PRINT '' -- Кількість рядків у запиті: '' + CAST(@recordCount as VARCHAR(5)) END END TRY BEGIN CATCH END CATCH; '); FETCH NEXT FROM tablesCursor INTO @tableName END CLOSE tablesCursor DEALLOCATE tablesCursor
Необходимые условия и возможные ограничения
Данная ошибка актуальна для iOS (iPhone)