Имя: Пароль:
1C
 
Интересный кейс сериализации Хранилища значений.
0 Гений 1С
 
гуру
11.11.25
21:28
Вот тестовый код, можно погонять в консоли кода, запускать надо на сервере (на клиенте нет таблицы значений):


ТЗ = Новый ТаблицаЗначений();

ДанныеТЗ = Новый ХранилищеЗначения(ТЗ);
Строка = XMLСтрока(ДанныеТЗ);

Сообщить(Строка);

ДД = ПолучитьДвоичныеДанныеИзBase64Строки(Строка);
СтрокаХЗ = ПолучитьСтрокуИзДвоичныхДанных(ДД,"utf-8");
//Сообщить(СтрокаХЗ);
Поз = Найти(СтрокаХЗ, "{");
Если Поз <> 0 тогда
    Сообщить("Позиция фигурной скобки: " + Поз);
    СтрокаХЗ = Сред(СтрокаХЗ, Поз);
КонецЕсли;

РезТЗ = ЗначениеИзСтрокиВнутр(СтрокаХЗ);
Сообщить(ТипЗнч(РезТЗ));


Есть какой-то иной способ десериализации такого хранилища значений?

СтрокаХЗ там занятная получается (на картинке).
1 Garykom
 
гуру
11.11.25
21:30
Геня, научись уже пользоваться поиском в инете
На ИСе несколько статей есть, даже как читать данные ХЗ напрямую из СУБД
2 Гений 1С
 
гуру
11.11.25
21:51
(1) ответ из "позы гуру" и "посылом в поиск" мне не интересен.
3 PR
 
11.11.25
23:48
(1) Ему не нужен ответ, ему нужно внимание
В бложек никто не ходит, а внимания хочется
4 AlexKimp
 
12.11.25
07:42
Эммм... Как вы лодку назовете...
Назвал СтрокаХЗ - получил строку ХЗ )))
5 Мультук
 
гуру
12.11.25
08:31
(0)

1) Либо автор не предусматривал десериализацию.
Например была поставлена задача сериализовать данные
и она успешно решена. Задачи десериализовать не было.

2) Либо у автора сериализации на этапе создания кода был "лаксианский ключ", который впоследствии был утерян.
Это всё объясняет.
6 RomanYS
 
12.11.25
09:50
(0) зачем такая мутная сериализация, если ожидается, что она даст результат эквивалентный ЗначениеВСтрокуВнутр(ТЗ)?
7 p-soft
 
12.11.25
10:04
(6) затем что помещение в хранилище одновременно жмет данные алгоритмом deflate.
в инете все есть
8 p-soft
 
12.11.25
10:04
(7) это альтернатива zip, но еще и работа с потоками в памяти
9 Гений 1С
 
гуру
12.11.25
11:08
В общем один читатель написал решение. Странно, но работает:


ТЗ = Новый ТаблицаЗначений;

Строка = XMLСтрока(Новый ХранилищеЗначения(ТЗ));

Сообщить(Строка);
    
Зн = XMLЗначение(Тип("ХранилищеЗначения"), Строка);    
ТЗ = Зн.Получить();

Сообщить(ТипЗнч(ТЗ));
10 Гений 1С
 
гуру
12.11.25
11:11
(6) не знаю, Разработчики Data Mobile использовали такую, а потом пытались прочитать через ЗначениеИзФайла и получали кукиш.
11 Ненавижу 1С
 
гуру
12.11.25
11:30
(9) геня такой "гений". Ну прочитал бы документацию:

Выполняет действие обратное действию метода XMLСтрока.
12 Гений 1С
 
гуру
12.11.25
11:34
(11) логично ссылку на XMLЗначение добавлять в описание XMLСтрока, а не включать "стокгольмский синдром".

Но кстати, забавно, что внутри Base64 лежит ЗначениеВСтрокуВнутр, которое 1с не рекомендует использовать для обменов.
13 Ненавижу 1С
 
гуру
12.11.25
11:34
(12) а оно там и есть:

См. также:
Глобальный контекст, метод XMLЗначение

ты просто не умеешь признавать, что бываешь не прав
14 RomanYS
 
12.11.25
11:50
(9) так очевидно должно работать. Но в (0) от строки отрезали кусок...
15 Гений 1С
 
гуру
12.11.25
12:13
(14) ну так там она сериализируется через ЗначениеВСтрокуВнутр, в классическом "1с-стиле" вырезания аппендикса через гланды.

(13) Где здесь См.Также?

СериализаторXDTO (XDTOSerializer)
XMLСтрока (XMLString)
Синтаксис:
XMLСтрока(<Значение>)
Параметры:
<Значение> (обязательный)
Тип: Неопределено, Null, Булево, Число, Строка, Дата, УникальныйИдентификатор, ДвоичныеДанные, ХранилищеЗначения; значения перечислений, значения системных перечислений (ВидСчета, ВидДвиженияБухгалтерии, ВидДвиженияНакопления, ДопустимыйЗнак, ДопустимаяДлина, ЧастиДаты) или все ссылки на объекты базы данных.
Значение, для которого должно быть получено строковое представление, которое может быть использовано как текст элемента или значение атрибута XML. Как строка XML могут быть представлены значения следующих типов:
Null, Булево, Число, Строка, Дата, УникальныйИдентификатор, ДвоичныеДанные, ХранилищеЗначения и все ссылки на объекты базы данных.
Возвращаемое значение:
Тип: Строка.
Описание:
Получает XML представление значения для помещения в текст элемента или значение атрибута XML.
XML представления различных типов платформы 1С:Предприятие 8:
"Строка" - как есть;
"Булево": "Истина" - "true", "Ложь" -"false";
"Дата" - XML представление соответствует представлению типа dateTime схемы XML (см. http://www.w3.org/TR/xmlschema-2/#dateTime);
"Число" - XML представление соответствует представлению типа decimal схемы XML (см. http://www.w3.org/TR/xmlschema-2/#decimal);
Значение системного перечисления (для перечислений, поддерживающих XML сериализацию) - имя значения перечисления;
"УникальныйИдентификатор" - строковое представление уникального идентификатора;
"Ссылки" - XML представление уникального идентификатора ссылки;
"ХранилиищеЗначений" и "ДвоичныеДанные" - строка в формате base64.
Доступность:
Тонкий клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
Использование в версии:
Доступен, начиная с версии 8.1.
     Методическая информация
16 Fragster
 
гуру
12.11.25
12:24
(0) погугли что такое BOM
17 Гений 1С
 
гуру
12.11.25
12:35
(16) с BOM я сталкивался. Тема уже исчерпана, но забавно что 1с хранит Хранилище значений в формате ЗначениеВСтрокуВнутр. Кому-то было лень писать сериализатор на Селезневке и он схалявил.
18 Маленький Вопросик
 
12.11.25
12:44
А причем здесь методы хранения и тип данных хранения при передаче с сервера на клиент в бсп прописана функция работы с массивами

Нельзя ли отказаться от сериализации уже?
19 Гений 1С
 
гуру
12.11.25
12:55
(18) там сохраняли в файл разработчики Data Mobile, накосячили, я за ними подправлял.
20 Fragster
 
гуру
12.11.25
12:59
(17) ну вот на картинке в (0) у тебя оно. и из-за этого напрямую не десериализцется
21 Ненавижу 1С
 
гуру
12.11.25
13:00
(15) а зачем ты полез смотреть не тот метод? в примере метод глобального контекста
22 Гений 1С
 
гуру
12.11.25
13:03
(21) да, отсылка есть, ок.
23 Гений 1С
 
гуру
12.11.25
13:04
(20) ну это уже внутрянка сериализации, 1с использует ЗначениеВСтрокуВнутр и добавляет BOM или еще что то в двоичные данные.
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.