1С 8.3 БСП ЗначениеВСтрокуXML - Программист 1С Минск. Автоматизация бизнеса.

Популярные страницы:
Перейти к контенту

1С 8.3 БСП ЗначениеВСтрокуXML

Данные > Примеры кода 1С > 1С 8.3 БСП > Серилизация XML
Перейти в раздел примеры кода 1С 8.3:
1С 8.3 БСП ЗначениеВСтрокуXML. Преобразует (сериализует) любое значение в XML-строку. Преобразованы в могут быть только те объекты, для которых в синтаксис-помощнике указано, что они сериализуются.
Примера кода от rayastar
// тест
Результат = ОбщегоНазначения.ЗначениеВСтрокуXML("тест")


// //    xmlns="http://v8.1c.ru/8.1/data/enterprise/current-config"
//    xmlns:xs="http://www.w3.org/2001/XMLSchema"
//    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
//    xsi:type="CatalogRef.Номенклатура">
//    f93e113e-c83a-11e2-8026-0015e9b8c48d
//
Результат = ОбщегоНазначения.ЗначениеВСтрокуXML(Номенклатура)


// Метод в основном используется для сохранения/загрузки настроек
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

   СтрокаXML = ПолучитьИзВременногоХранилища(Параметры.АдресВоВременномХранилище);
   Ведомость = ОбщегоНазначения.ЗначениеИзСтрокиXML(СтрокаXML);  // ТЗ из XML строки

   Обработка = РеквизитФормыВЗначение("Объект");
   Обработка.Зарплата.Загрузить(Ведомость.Зарплата.Выгрузить());

КонецПроцедуры

&НаСервере
Процедура ЗаписатьНаСервере()

   СтрокаXML = ПолучитьИзВременногоХранилища(АдресВоВременномХранилище);
   Ведомость = ОбщегоНазначения.ЗначениеИзСтрокиXML(СтрокаXML); // ТЗ из XML строки

   Обработка = РеквизитФормыВЗначение("Объект");
   Ведомость.Зарплата.Загрузить(Обработка.Зарплата.Выгрузить());

   СтрокаXML = ОбщегоНазначения.ЗначениеВСтрокуXML(Ведомость); // ТЗ в XML строку
   ПоместитьВоВременноеХранилище(СтрокаXML, АдресВоВременномХранилище);

КонецПроцедуры
// Автор библиотеки: ООО "1С-Софт". Все права защищены © 2021
// Типовая конфигурация Библиотека стандартных подсистем (далее - БСП)
// Код БСП распространяется по лицензии Attribution 4.0 International (CC BY 4.0):
// ссылка на лицензию: https://creativecommons.org/licenses/by/4.0/legalcode
Дополнение:
Если по ходу отладочной сессии возникает необходимость вытащить из программного кода не просто текст запроса, а экземпляр – то есть запрос с уже установленными параметрами, готовый к выполнению в консоли – это можно сделать при помощи БСП. Нам потребуется конструкция:  

ОбщегоНазначения.ЗапросВСтрокуXML(Запрос)

Если остановить выполнение процедурного кода на соответствующей строке, поместить указанную конструкцию в табло, на выходе мы получим XML-дамп нашего объекта Запрос.

Да, конечно, потребуется вручную скопировать этот дамп в буфер, переключиться на дополнительный клиентский сеанс, открыть там консоль запросов (поставляется в комплекте БСП) и выполнить загрузку запроса из XML-дампа. Но это сложно только в описании, а в реальности выполняется на раз-два и даже с завязанными глазами.

Единственное, на что стоит обратить внимание – если копировать XML-дамп прямо из табло (фокус на ячейке, ctrl+c), к искомой строке платформа может добавить непрошенный спецсимвол перевода строки, поэтому лучше сперва открыть значение в отдельном окне (фокус на ячейке, F2), а уже потом копировать.

Излишне упоминать, что указанный метод БСП можно использовать не только для ручной отладки, но и, например, для автоматической записи «телеметрии», то есть некоего прикладного аналога ТЖ. Так что упоминать об этом мы и не станем. ;-)
Дополнение от usеr126119:
Передать через функции взятые из БСП серьезные объекты (в моем случае это был тип данных РезультатЗапроса) без выгрузки или других танцев с бубном в рамках портирования консоли на мобильные платформы оказалось абсолютно невозможным, так как данные типы тип не сериализуются XDTO.  Однако для этого можно применить следующее правило, которое может работать в пределах одной базы:
  • Если тип сериализуется - ничего не делаем. Сразу преобразуем.
  • Если нельзя сериализовать- упаковываем в хранилище значений. Следует отметить, что хранилище значений упаковывается также, чтобы с ним не было проблем.
Итоговые правки в код дают следующие функции:
Примера кода от usеr126119:
// Преобразованы в могут быть любые объекты (дополнено через ХранилищеЗначения.
// См. также ЗначениеИзСтрокиXML.
//
// Параметры:
//  Значение - Произвольный - значение, которое необходимо сериализовать в XML-строку.
//
// Возвращаемое значение:
//  Строка - XML-строка.
//
Функция ЗначениеВСтрокуXML(Значение) Экспорт

   ЗаписьXML = Новый ЗаписьXML;
   ЗаписьXML.УстановитьСтроку();
   Если Значение=Тип("ХранилищеЗначения") Тогда
     //Сохраняем жизнь исходному типу - через оборачивание.
       ХранилищеЗначения=новый ХранилищеЗначения(Значение);
       СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ХранилищеЗначения);
   Иначе
      //Выполняем Сериализацию:
      Попытка
         СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Значение);
      Исключение
        ХранилищеЗначения=новый ХранилищеЗначения(Значение);
        СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ХранилищеЗначения);
      КонецПопытки;
   КонецЕсли;
   Возврат ЗаписьXML.Закрыть();
КонецФункции

// Выполняет преобразование (десериализацию) XML-строки в значение.
// См. также ЗначениеВСтрокуXML.
//
// Параметры:
//  СтрокаXML - Строка - XML-строка, с сериализованным объектом..
//
// Возвращаемое значение:
//  Произвольный - значение, полученное из переданной XML-строки.
//
Функция ЗначениеИзСтрокиXML(СтрокаXML) Экспорт

   ЧтениеXML = Новый ЧтениеXML;
   ЧтениеXML.УстановитьСтроку(СтрокаXML);
   ХранилищеЗначение=СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
   //Восстанавливаем значение из Хранилища:
   Если ХранилищеЗначение=Тип("ХранилищеЗначения") Тогда
       Возврат ХранилищеЗначение.Получить();
   Иначе
       Возврат ХранилищеЗначение;
   КонецЕсли;

КонецФункции
Если есть необходимость ввести универсальную функцию, которая совместима на компьютерных платформах со старым внутренним форматом 1С (мне понадобилось для работы с Консолью Запросов на Windows), тогда полученные универсальные функции:
Примера кода от usеr126119:
Функция УниверсальнаяЗначениеВСтрокуВнутр(Значение)

   Попытка
       Возврат Вычислить("ЗначениеВСтрокуВнутр(Значение)");
   Исключение
       //Для мобильных приложений выполняем по правилам XMl-Функций, которые были переделаны:
       Возврат ЗначениеВСтрокуXML(Значение);
   КонецПопытки;

КонецФункции


Функция УниверсальнаяЗначениеИзСтрокиВнутр(Значение)

   Попытка
       Возврат Вычислить("ЗначениеИзСтрокиВнутр(Значение)");
   Исключение
       //Для мобильных приложений выполняем по правилам XMl-Функций, которые были переделаны:
       Возврат ЗначениеИзСтрокиXML(Значение);
   КонецПопытки;

КонецФункции
Приведенными функциями в пределах одной базы можно пользоваться на следующих платформах:
  • Компьютерные: 1С 8.2 и 1С 8.3 - Тонкий, Толстый, ВебКлиент.
  • На мобильных платформах 8.3 можно использовать универсальные переделанные функции БСП для аналога внутренних значений.
Поиск кода
0
Комментарии
____________________
Copyright©, «Программист 1С в г.Минске», 22.06.2021
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник
Назад к содержимому