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)