Хранилище значения из 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 час.

image_pdfimage_print

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Вам может также понравиться...

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *