Прикрепила xml файл через

```1c
    ДДанные = Новый ДвоичныеДанные(ПолноеИмяФайла);
    АдресВХранилище = ПоместитьВоВременноеХранилище(ДДанные);
    ПрисоединенныйФайл = ПрисоединенныеФайлы.ДобавитьФайл(ВладелецФайлов, ИмяФайла, Файл.Расширение, , , адресВХранилище);
```

Не могу открыть. Расширение xml.
Падает при открытии или попытке сохранения в стандартной функции "ПолучитьДанныеФайла" модуля ПрисоединенныеФайлы.
Проблема в строке

```1c
    ДополнительнаяИнформация.Вставить("ОтносительныйПуть", ПолучитьИдентификаторОбъекта(ФайлОбъект.ВладелецФайла) + "\");
```

Владелец файла - стандартный элемент справочника СоглашенияСКлиентами.

ПолучитьИдентификаторОбъекта(ФайлОбъект.ВладелецФайла) возвращает строку пробелов со знаком ноты в конце.

Сам текст ошибки выглядит так
{ОбщаяФорма.ПрисоединенныеФайлы.Форма(569)}: Ошибка при вызове метода контекста (ПолучитьДанныеФайла)
 ДанныеФайла = ПрисоединенныеФайлы.ПолучитьДанныеФайла(ТекущиеДанные.Ссылка, УникальныйИдентификатор);
по причине:
Ошибка при вызове серверного метода.
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'ret':
 форма: Элемент
 имя: {http://v8.1c.ru/8.2/managed-application/modules}ret
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'Value':
 форма: Элемент
 имя: {http://v8.1c.ru/8.1/data/core}Value
по причине:
Текст XML содержит недопустимый символ в позиции 0 :

Но я выячислила, что дело именно в поле Относительный путь, где сидит знак с нотой.

Помогите, пожалуйста, решить проблему
---
Там было около 10 тысяч таких записей.

Да, я уже выполнила следующий код, который мне помог. Спасибо!

```1c
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | НаличиеПрисоединенныхФайлов.ОбъектСФайлами КАК ОбъектСФайлами
    |ИЗ
    | РегистрСведений.НаличиеПрисоединенныхФайлов КАК НаличиеПрисоединенныхФайлов
    |
    |УПОРЯДОЧИТЬ ПО
    | ИдентификаторОбъекта УБЫВ";
    сч = 0;
    Результат = Запрос.Выполнить().Выбрать();
    Пока Результат.Следующий() Цикл
    НаборЗаписей = РегистрыСведений.НаличиеПрисоединенныхФайлов.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.ОбъектСФайлами.Установить(Результат.ОбъектСФайлами);
    НаборЗаписей.Прочитать();

    сч=сч+1;
    Если СтрДлина(Строка(сч)) = 1 Тогда
    Идентификатор ="000000000"+Строка(сч);
    ИначеЕсли СтрДлина(Строка(сч)) = 2 Тогда
    Идентификатор ="00000000"+Строка(сч);
    ИначеЕсли СтрДлина(Строка(сч)) = 3 Тогда
    Идентификатор ="0000000"+Строка(сч);
    ИначеЕсли СтрДлина(Строка(сч)) = 4 Тогда
    Идентификатор ="000000"+Строка(сч);
    ИначеЕсли СтрДлина(Строка(сч)) = 5 Тогда
    Идентификатор ="00000"+Строка(сч);
    ИначеЕсли СтрДлина(Строка(сч)) = 6 Тогда
    Идентификатор ="0000"+Строка(сч);
    ИначеЕсли СтрДлина(Строка(сч)) = 7 Тогда
    Идентификатор ="000"+Строка(сч);
    КонецЕсли;
    Запись = НаборЗаписей[0];
    Запись.ИдентификаторОбъекта = Идентификатор;
    НаборЗаписей.Записать();

    КонецЦикла;
```
---
ПолучитьИдентификаторОбъекта
Надо выполнить анализ, откуда функция ПолучитьИдентификаторОбъекта берет возвращаемое значение.
посмотрите отладкой
---
Мне вот стало интересно, вы видите недопустимый символ в XML , но удивляетесь , что есть ошибка ?
---
Я удивляюсь, что идентификатор объекта записан непонятным значением и не понимаю, какое отношение он имеет к телу xml.
В теле xml я уверена, я его сохраняю в том числе и локально для проверки, единственное, что могло сломать xml - конвертация в двоичные данные,п омещение в хранилище для прикрепления в приоединенные файлы.

Даже консоль запросов с выборкой ИдентификаторОбъекта дает такую ошибку.
---
Ну кто мешает посмотреть что у вас в этом регистре записано

```1c
    ТекстЗапроса =
    "ВЫБРАТЬ
    | НаличиеФайлов.ИдентификаторОбъекта
    |ИЗ
    | РегистрСведений.НаличиеФайлов КАК НаличиеФайлов
    |ГДЕ
    | НаличиеФайлов.ОбъектСФайлами = &ОбъектСФайлами";

    Запрос = Новый Запрос;
    Запрос.Текст = ТекстЗапроса;
    Запрос.УстановитьПараметр("ОбъектСФайлами", ВладелецФайлов);
    РезультатВыполнения = Запрос.Выполнить();
```

Только судя по ошибке это не из за этого ...
---
В том то и загвоздка, что даже запрос на выборку одного поля НаличиеФайлов.ИдентификаторОбъекта дает ошибку. Точно тот, который Вы написали.

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

Как вариант, создайте набор записей с этим отбором и запишите его, он должен будет удалить эту запись..
Просто програмно удалите ее...(запись)
---
Там было около 10 тысяч таких записей.

Да, я уже выполнила следующий код, который мне помог. Спасибо!

```1c
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | НаличиеПрисоединенныхФайлов.ОбъектСФайлами КАК ОбъектСФайлами
    |ИЗ
    | РегистрСведений.НаличиеПрисоединенныхФайлов КАК НаличиеПрисоединенныхФайлов
    |
    |УПОРЯДОЧИТЬ ПО
    | ИдентификаторОбъекта УБЫВ";
    сч = 0;
    Результат = Запрос.Выполнить().Выбрать();
    Пока Результат.Следующий() Цикл
    НаборЗаписей = РегистрыСведений.НаличиеПрисоединенныхФайлов.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.ОбъектСФайлами.Установить(Результат.ОбъектСФайлами);
    НаборЗаписей.Прочитать();

    сч=сч+1;
    Если СтрДлина(Строка(сч)) = 1 Тогда
    Идентификатор ="000000000"+Строка(сч);
    ИначеЕсли СтрДлина(Строка(сч)) = 2 Тогда
    Идентификатор ="00000000"+Строка(сч);
    ИначеЕсли СтрДлина(Строка(сч)) = 3 Тогда
    Идентификатор ="0000000"+Строка(сч);
    ИначеЕсли СтрДлина(Строка(сч)) = 4 Тогда
    Идентификатор ="000000"+Строка(сч);
    ИначеЕсли СтрДлина(Строка(сч)) = 5 Тогда
    Идентификатор ="00000"+Строка(сч);
    ИначеЕсли СтрДлина(Строка(сч)) = 6 Тогда
    Идентификатор ="0000"+Строка(сч);
    ИначеЕсли СтрДлина(Строка(сч)) = 7 Тогда
    Идентификатор ="000"+Строка(сч);
    КонецЕсли;
    Запись = НаборЗаписей[0];
    Запись.ИдентификаторОбъекта = Идентификатор;
    НаборЗаписей.Записать();

    КонецЦикла;
```
---
Смотрите если будет больше 3 знаков в числе, он в вашем случае пробел вставит, так как Строка(1023) = "1 023", лучше через Формат() делать перевод числа в строку..
Кстати есть стандартные функции в модуле СтроковыеФункцииКлиентСервер, если у вас конфигурация стандартная, там много полезных функции, как раз для вашего есть функция ДополнитьСтроку(...)
---
Придется копать в сторону стандартной функции ПолучитьОчереднойИдентификаторОбъекта(), которая сохраняет этот идентификатор, когда я записываю файл. Но по коду этой функции никак непонятно, откуда могла взяться нота)))
---
ВЫБРАТЬ ПЕРВЫЕ 20662
  НаличиеПрисоединенныхФайлов.ИдентификаторОбъекта КАК ИдентификаторОбъекта
ИЗ
  РегистрСведений.НаличиеПрисоединенныхФайлов КАК НаличиеПрисоединенныхФайлов

не дает ошибку

а ВЫБРАТЬ ПЕРВЫЕ 20663
  НаличиеПрисоединенныхФайлов.ИдентификаторОбъекта КАК ИдентификаторОбъекта

дает ошибку.

Всего записей в регистре больше 30000. То есть каким-то образом с записи 20663 пошли кривые идентификаторы. Это очень старая база, вероятно мигрировавшая с более ранних версий, и функционал прикрепления файлов программно здесь будет использоваться впервые.

Сама 1С присваивает эти идентификаторы по нарастающей, на основе предыдущего