Имя: Пароль:
1C
1С v8
Неизвестные символы � при получении XML из двоичных данных версии объекта
0 lenkavovka
 
10.06.20
06:59
Всем привет!
Задача - получить первый номер документа из истории версий.
Из РегистрСведений.ВерсииОбъектов запросом выбираем нужную версию документа с типом ХранилищеЗначения, далее пытаемся из двоичных данных сделать XML:


        ЧтениеДанных = Новый ЧтениеДанных(Результат[0].ВерсияОбъекта.Получить().Объект);
        СтрокаXML = ЧтениеДанных.ПрочитатьСимволы(,КодировкаТекста.UTF8);

В строке куча "замещающих" символов, примерно так:

�   x�xsi(http://www.w3.org/2001/XMLSchema-instance�<&DocumentObject.ЗаказКлиента{��typeHDocumentObject

При этом кириллический текст читается, то есть кодировка вероятно всё-таки UTF-8. Другие доступные кодировки текст делают нечитаемым. Подскажите, это какая-то очевидная проблема?
1 Галахад
 
гуру
10.06.20
07:45
Насколько я помню, в версии лежат двоичные данные и сначала их нужно перобразовать.
2 lenkavovka
 
10.06.20
08:15
(1) так ведь ЧтениеДанных.ПрочитатьСимволы и преобразовывает двоичные данные. Только криво.
3 Галахад
 
гуру
10.06.20
08:31
(2) Вообще нет. Этот метод просто читает поток.
4 lenkavovka
 
10.06.20
09:12
(3) хм.

В Результат[0].ВерсияОбъекта.Получить().Объект значение выглядит как-то так: E0 00 00 01 00 78 CF 02 78 73 69 28 68 74 74 70 3A 2F 2F 77 77 77 2E...
Это ведь двоичные данные, верно?

Далее. Мы создаём новое ЧтениеДанных, куда кладём это значение, и после ЧтениеДанных.ПрочитатьСимволы он в нас выплёвывает кривой XML в виде строки:

�   x�xsi(http://www.w3.org/2001/XMLSchema-instance�<&DocumentObject.ЗаказКлиента{��typeHDocumentObject.ЗаказКлиента�<Ref�!e2dcf0bb-9033-11ea-8115-0cc47a14c1ff�<; DeletionMark�false�<Date�2020-05-07T08:50:04�<Number�
ЕЕ00-001157�<Posted��<................

Если не сложно - киньте, пожалуйста, ссылку про преобразование.
5 Галахад
 
гуру
10.06.20
09:52
ДвоичныеДанные = Результат[0].ВерсияОбъекта.Получить();

ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
ДвоичныеДанные.Записать(ИмяВременногоФайла);
6 lenkavovka
 
10.06.20
10:47
(5) в момент ДвоичныеДанные.Записать(ИмяВременногоФайла) вылазит ошибка:

Текст XML содержит недопустимый символ в позиции 21

И показывает вот этот фрагмент:

Number�
ЕЕ00-001157�<Posted��

Вероятно, проблема в самих данных. Почему-то там есть символы, которые 1С при таком чтении не понимает. Похоже, придётся лезть в механизм отображения истории версий в конфигурации, смотреть, как там получают данные.
Пока сделали костыль, поиск нужного места с помощью СтрНайти. В общем проблема решена, работает. Но, конечно, вопрос остался незакрытым.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший