Рассмотрим исходную функцию, с которой возник вопрос:
Функция Сериализовать(ОбъектСериализации)
ДеревоВОбъектеXDTO = СериализаторXDTO.ЗаписатьXDTO(ОбъектСериализации);
МойXML = Новый ЗаписьXML;
МойXML.УстановитьСтроку();
ФабрикаXDTO.ЗаписатьXML(МойXML, ДеревоВОбъектеXDTO);
Возврат МойXML.Закрыть();
КонецФункции
Разберем, для чего предназначен данный код. Главная цель функции — преобразовать прикладной объект 1С (например, ТаблицаЗначений или ДеревоЗначений) в текстовую строку формата XML. Это необходимо для сохранения структуры данных в файл, передачи информации через REST/SOAP-сервисы или обмена между различными системами.
Возникает логичный вопрос: почему нельзя использовать стандартную процедуру ЗаписатьXML()? Дело в том, что глобальный метод платформы ЗаписатьXML() рассчитан на сериализацию только простых типов данных (числа, строки, даты, ссылки). Сложные коллекции, такие как ТаблицаЗначений или ДеревоЗначений, не могут быть записаны напрямую этим методом. Однако платформенные коллекции поддерживают механизмы XDTO-сериализации и соответствуют типам ValueTable и ValueTree в пространстве имен http://v8.1c.ru/8.1/data/core. Именно поэтому для перевода таких объектов в XML применяется объект СериализаторXDTO.
Проанализируем приведенную функцию с точки зрения чистоты и эффективности кода. В исходной реализации присутствует лишнее промежуточное действие: объект сначала явно преобразуется в объект XDTO через СериализаторXDTO.ЗаписатьXDTO(), и только затем записывается с помощью ФабрикаXDTO.ЗаписатьXML().
Платформа 1С позволяет упростить эту операцию и записать объект напрямую в один шаг. Для этого у объекта СериализаторXDTO есть встроенный метод ЗаписатьXML(). Переписанный и более лаконичный вариант функции выглядит следующим образом:
Функция Сериализовать(ОбъектСериализации)
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ОбъектСериализации);
Возврат ЗаписьXML.Закрыть();
КонецФункции
В этом случае исключается промежуточный вызов объекта ФабрикаXDTO, код становится понятнее и работает быстрее.
При использовании XDTO-сериализации сложных объектов важно учитывать следующие технические особенности и ограничения платформы:
COMОбъект, клиентская форма, результат запроса или менеджер объекта), вызов сериализатора завершится ошибкой. Все данные внутри объекта должны поддерживать XDTO-сериализацию.ТаблицаЗначений недоступен в контексте тонкого или веб-клиента. Вызов такой функции на клиенте с объектом типа ТаблицаЗначений приведет к ошибке выполнения.В зависимости от поставленной задачи, сериализация в XML не всегда является оптимальным выбором. Рассмотрим более современные и эффективные альтернативы:
СериализаторXDTO.ЗаписатьJSON(). Формат JSON существенно компактнее, быстрее формируется и проще парсится на стороне сторонних приложений.ПоместитьВоВременноеХранилище() на сервере и передать клиенту строковый адрес.ЗначениеВДанныеФормы() и ДанныеФормыВЗначение() для объекта ДанныеФормыКоллекция.ХранилищеЗначения.