Хранилище значения из XML строки
На одном из проектов столкнулся с обработкой от Data Mobile под Альфа-Авто 5.5 для обмена с ТСД, где была допущена небрежность в работе с форматом данных.
Данные в файл настроек выгружались одним методом (с последующей записью XML-строки в текстовый файл):
ДанныеТЗ = Новый ХранилищеЗначения(ШаблоныДокументов.Выгрузить()); Возврат XMLСтрока(ДанныеТЗ);
А загружались уже другим, при этом разбор просто выдавал ошибку без детализации:
ИмяФайла = лКаталогНастроек+"v83_templates.tab"; ТаблицаШаблона=ЗначениеИзФайла(ИмяФайла)
Файл в блокноте выглядел так:

Сразу я и не понял, как можно разобрать такой файл, в платформе методов по получению хранилища значения из XML строки не нашел.
Но файл напоминал двоичные данные, проверил свое предположение в онлайн-декодере:

Но в файле перед самой кодировкой таблицы значений во внутреннее значение, начинающейся с символа фигурной скобки, присутствуют служебные байты:

Поэтому я их вырезаю и начинаю разбор с фигурной скобки, получается вот такой код:
Т = Новый ТекстовыйДокумент(); Т.Прочитать(ИмяФайла); Строка = Т.ПолучитьТекст(); ДД = ПолучитьДвоичныеДанныеИзBase64Строки(Строка); СтрокаХЗ = ПолучитьСтрокуИзДвоичныхДанных(ДД,"utf-8"); Поз = Найти(СтрокаХЗ, "{"); Если Поз <> 0 тогда СтрокаХЗ = Сред(СтрокаХЗ, Поз); КонецЕсли; ТаблицаШаблона = ЗначениеИзСтрокиВнутр(СтрокаХЗ);
Не претендую на универсальность — если в служебных байтах будет фигурная скобка, может не сработать, но думаю, вероятность такого мала. Если у вас есть другой вариант разбора хранилища значения, помещенного в файл методом XMLСтрока, сообщите мне.
UPD 1: Желающие поэкспериментировать могут погонять такой вот тестовый код в консоли кода, запускать надо на сервере (на клиенте нет таблицы значений):
ТЗ = Новый ТаблицаЗначений(); ДанныеТЗ = Новый ХранилищеЗначения(ТЗ); Строка = XMLСтрока(ДанныеТЗ); Сообщить(Строка); ДД = ПолучитьДвоичныеДанныеИзBase64Строки(Строка); СтрокаХЗ = ПолучитьСтрокуИзДвоичныхДанных(ДД,"utf-8"); //Сообщить(СтрокаХЗ); Поз = Найти(СтрокаХЗ, "{"); Если Поз <> 0 тогда Сообщить("Позиция фигурной скобки: " + Поз); СтрокаХЗ = Сред(СтрокаХЗ, Поз); КонецЕсли; РезТЗ = ЗначениеИзСтрокиВнутр(СтрокаХЗ); Сообщить(ТипЗнч(РезТЗ));
Вывод кода:
Позиция фигурной скобки: 12
Таблица значений
AQFbAAAAAAAAAO+7v3siIyIsYWNmNjE5MmUtODFjYS00NmVmLTkzYTYtNWE2OTY4
Yjc4NjYzLA0KezksDQp7MH0sDQp7MiwwLA0KezEsMH0sLTEsLTF9LA0KezAsMH0N
Cn0NCn0=
Если убрать комментарий с вывода строки, при попытке ее вывода будет выдана ошибка:

То есть хранилище значений сериализируется через XMLСтрока в некий странный формат.
UPD 2: Один из читателей прислал решение — значение из XMLСтрока десериализируется через XMLЗначение:
ТЗ = Новый ТаблицаЗначений; Строка = XMLСтрока(Новый ХранилищеЗначения(ТЗ)); Сообщить(Строка); Зн = XMLЗначение(Тип("ХранилищеЗначения"), Строка); ТЗ = Зн.Получить(); Сообщить(ТипЗнч(ТЗ));
Среда: Альфа-Авто: Автосалон+Автосервис+Автозапчасти ПРОФ, редакция 5.1 (5.1.10.09)/ Обработка DataMobile: выгрузка и загрузка данных (08.04.2025) v.3
Объем: 1 час.




Свежие комментарии