В практике разработчика 1С часто возникает задача передать данные объекта (документа, справочника) во внешнюю систему или сохранить его "слепок" для последующего анализа. Простое получение ссылки здесь не поможет, так как ссылка содержит лишь уникальный идентификатор (GUID). Нам же необходимо получить полный набор данных, включая все реквизиты и табличные части. Рассмотрим подробно, как это реализовать различными способами, разберем типичные ошибки и выясним, какой метод лучше подходит для разных ситуаций.
Прежде чем приступать к коду, проанализируем критически важный нюанс, на который натолкнулись участники обсуждения. Если мы пытаемся сериализовать Ссылку (например, СправочникСсылка.Контрагенты), платформа логично полагает, что нам нужно передать только указатель на объект. В результате в текстовом представлении (XML или JSON) мы увидим только GUID.
Чтобы получить содержимое всех полей, мы должны работать именно с Объектом. Если на входе у нас есть ссылка, первым делом необходимо получить объект с помощью метода ПолучитьОбъект(). Только в этом случае механизмы сериализации "увидят" состав реквизитов и табличных частей.
Механизм XDTO (XML Data Transfer Objects) является наиболее мощным и гибким инструментом в 1С для преобразования данных в текст. Он учитывает типы данных и структуру метаданных. Рассмотрим пример кода, который преобразует объект в XML-строку:
// Предположим, у нас есть СсылкаНаОбъект
ОбъектДанных = СсылкаНаОбъект.ПолучитьОбъект();
// Используем СериализаторXDTO для создания объекта XDTO
ОбъектXDTO = СериализаторXDTO.ЗаписатьXDTO(ОбъектДанных);
// Записываем XDTO в строку XML
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ОбъектXDTO);
ТекстовоеПредставление = ЗаписьXML.Закрыть();
// Теперь в переменной ТекстовоеПредставление хранится полный XML объекта
Преимущества этого метода: он универсален, корректно обрабатывает табличные части и вложенные типы. Данные выгружаются в стандартном для 1С формате, который легко прочитать и загрузить обратно в другую информационную базу.
Если нам не нужно передавать данные во внешнюю систему, а требуется лишь быстро сохранить состояние объекта внутри экосистемы 1С (например, для логирования), проанализируем метод ЗначениеВXMLСтроку. Это "коробочная" функция, которая не требует настройки фабрик XDTO.
// Получаем объект
ОбъектДляСохранения = Ссылка.ПолучитьОбъект();
// Преобразуем в XML одним методом
ТекстОбъекта = ЗначениеВXMLСтроку(ОбъектДляСохранения);
Этот метод создает XML во внутреннем формате 1С. Важно понимать, что такой текст будет содержать специфические теги, которые могут быть неудобны для парсинга сторонними приложениями (например, на Java или Python), но он идеален для обмена между базами 1С.
В современных конфигурациях 1С (начиная с платформы 8.3.6) JSON стал стандартом де-факто для веб-обмена. Если ваша цель — передать данные в веб-сервис или мобильное приложение, рассмотрим, как сериализовать объект в JSON. Для этого также удобно использовать СериализаторXDTO, но с объектом ЗаписьJSON.
ОбъектИнфо = Ссылка.ПолучитьОбъект();
ЗаписьJSON = Новый ЗаписьJSON;
ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто);
ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписиJSON);
// Сериализуем объект через XDTO напрямую в JSON
СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, ОбъектИнфо, НазначениеТипаXML.Явное);
РезультатJSON = ЗаписьJSON.Закрыть();
Важный момент: использование JSON позволяет значительно сократить объем передаваемого текста по сравнению с XML, что критично для высоконагруженных систем.
Иногда нам не нужны все реквизиты (например, мы хотим исключить служебные поля или двоичные данные). В таком случае разберем алгоритм перебора метаданных. Мы программно создаем Структура, заполняем её значениями реквизитов и затем сериализуем саму структуру.
Функция ОбъектВСтруктуру(СтрСсылка)
Результат = Новый Структура;
ДанныеОбъекта = СтрСсылка.ПолучитьОбъект();
МетаданныеОбъекта = ДанныеОбъекта.Метаданные();
// Перебираем основные реквизиты
Для каждого Реквизит Из МетаданныеОбъекта.Реквизиты Цикл
Результат.Вставить(Реквизит.Имя, ДанныеОбъекта[Реквизит.Имя]);
КонецЦикла;
// Перебираем табличные части
Для каждого ТЧ Из МетаданныеОбъекта.ТабличныеЧасти Цикл
ТаблицаДанных = ДанныеОбъекта[ТЧ.Имя].Выгрузить();
Результат.Вставить(ТЧ.Имя, ТаблицаДанных);
КонецЦикла;
Возврат Результат;
КонецФункции
После получения такой структуры её можно легко превратить в текст через ЗаписатьJSON. Этот метод дает полный контроль над составом выгрузки.
Проанализируем несколько "подводных камней", с которыми вы можете столкнуться:
ХранилищеЗначения (картинки, файлы), при сериализации они будут сконвертированы в формат Base64. Это увеличит размер текста в среднем на 33%. Выясним заранее, нужны ли эти данные в обмене.ЗаписьXML.УстановитьСтроку() сохраняет всё содержимое в оперативной памяти. Для очень больших документов (например, загрузка чеков за месяц с тысячами строк) лучше использовать запись напрямую в файл: ЗаписьXML.ОткрытьФайл(ПутьКФайлу).Подведем итог: для большинства задач "честного" обмена данными оптимальным является Способ №1 (XDTO) с обязательным получением объекта через ПолучитьОбъект(). Это гарантирует сохранение типизации и структуры данных при минимальных усилиях со стороны программиста.