В данной статье я хочу рассказать о сериализации данных в 1С.

А сейчас немного о самом определении: Сериализация (в программировании) — процесс перевода какой-либо структуры данных в последовательность битов. Обратной к операции сериализации является операция десериализации (структуризации) — восстановление начального состояния структуры данных из битовой последовательности.

Когда нам нужно сохранить значения, для дальнейшего его хранения или передачи, в этом случае нам без нее не обойтись, но стоит учитывать, что сериализация данных применима для тех объектов 1С, в описании которых есть пометка “Сериализуется”.

Уточним, что серилиазация может применятся не только в рамках одной информационной базы, но и о XML – сериализация. Последняя является отдельной возможностью, и применяется между различными информационными базами данных.

Для начала, рассмотрим сериализацию в рамках одной информационной базы.
Для сохранения значений во время сеанса работы в ИБ используются методы  ЗначениеВФайл() и ЗначениеИзФайла().

Пример кода

ЗначениеВФайл()
Путь = "D:\1с\ТестФайл.txt";
Попытка
    Если ЗначениеВФайл(Путь, ТаблицаЗначений) Тогда
        Предупреждение("Выгрузка успешно завершена!");
    Иначе
         Предупреждение("Возникли проблемы при выгрузке!");
КонецЕсли;
Исключение                                                          
    Предупреждение("Возникли проблемы при выгрузке! "+ОписаниеОшибки());
КонецПопытки;
Пример кода

ЗначениеИзФайла ()
ИмяФайла = Новый Файл(ВыбранныйФайл);
Если ИмяФайла.Существует() Тогда
ТаблицаЗначений = ЗначениеИЗФайла(ВыбранныйФайл);
КонецЕсли;

Если же нам требуется сохранить данные между сеансами, что удобно для пользователя, чтобы не вводить данные каждый раз на форме, то мы будем использовать методы СохранитьЗначение() и ВосстановитьЗначение(), но стоит обратить внимание что данные методы работают только при корректном завершении работы в программе,  если вдруг пк будет обесточен, то значения не сохранятся. Также не стоит забывать о сохранении значений в объекте типа ХранилищеЗначений. Подобный тип используется для картинок, образов файлов, так как для них в конфигурации нет соответствующих типов полей.

Пример кода

СохранитьЗначение()
                //Сохранение поля типа дата
СохранитьЗначение("НачалоПериода",  НачалоПериода);     
                //Сохранение ссылочного поля
СохранитьЗначение("Контрагент",  Контрагент);   
                //Сохранение табличной части
СохранитьЗначение("ТабличнаяЧасть", ТабличнаяЧасть.Выгрузить());
Пример кода

ВосстановитьЗначение()
                //Получаем значения сохраненных параметров
ЗначениеНачалоПериода = ВосстановитьЗначение("НачалоПериода");
ЗначениеКонтрагент = ВосстановитьЗначение("Контрагент");
ЗначениеТабличнаяЧасть = ВосстановитьЗначение("ТабличнаяЧасть");
                //Восстанавливаем значения через вспомогательную процедуру с проверкой типа
                //и возвращаемого значения
УстановитьЗначение(ЗначениеНачалоПериода, НачалоПериода);
УстановитьЗначение(ЗначениеКонтрагент, Контрагент);
УстановитьЗначение(ЗначениеТабличнаяЧасть, ТабличнаяЧасть);
КонецПроцедуры


Процедура УстановитьЗначение(СохраненноеЗначение, Значение)
    Если СохраненноеЗначение<>Неопределено Тогда
        Если Типзнч(СохраненноеЗначение) = Тип("ТаблицаЗначений") Тогда
Значение.Загрузить(СохраненноеЗначение);
        Иначе   
            Значение = СохраненноеЗначение;
КонецЕсли;   
КонецЕсли;
КонецПроцедуры

Если необходимо сохранить значения в строку и восстановить значения из строки, то для этого используются методы ЗначениеВСтрокуВнутр() и ЗначениеИзСтрокиВнутр(). Эти методы реализованы в основном для сохранения функциональной совместимости с 1С:Предприятием 7.7. Использовать их в большинстве случаев не рекомендуется. Для сохранения значений в базу данных рекомендуется использовать, описанный выше, объект типа ХранилищеЗначения, а для получения некоторого строкового идентификатора ссылочного значения можно использовать возможность получения уникального идентификатора ссылки (метод УникальныйИдентификатор()) и соответственно преобразование его к строке.

Пример кода 

ЗначениеВСтрокуВнутр()
СсылкаВВидеСтроки = ЗначениеВСтрокуВнутр(СсылкаНаОрганизацию);
СтруктураВВидеСтроки = ЗначениеВСтрокуВнутр(Новый Структура("ОрганизацияСсылка,КодОрганизации", СсылкаНаОрганизацию,СсылкаНаОрганизацию.Код))
Пример кода 

ЗначениеИзСтрокиВнутр ()
СсылкаНаОрганизацию= ЗначениеИзСтрокиВнутр(СсылкаВВидеСтроки);
СтруктураИзСтроки = ЗначениеИзСтрокиВнутр(СтруктураВВидеСтроки);
Если Типзнч(СтруктураИзСтроки) = Тип("Структура") Тогда
                СсылкаНаОрганизацию = СтруктураИзСтроки.ОрганизацияСсылка;
                КодОрганизации = СтруктураИзСтроки.КодОрганизации;
КонецЕсли;

А теперь немного о XML–сериализации.

Рассмотрим сериализацию на примере объектов xml, потому что они используются чаще всего.

Есть глобальный метод ЗаписатьXML() предназначенный для этого.

Стоит отметить, что значения не всех типов могут быть записаны в формате XML данным методом.Доступные для записи типы данных делятся на на два типа: простые и сложные.

К простым типам данных относятся типы, значения которых представляются подсистемой XML-сериализации в виде элементов XML только с текстовым содержимым:

К первому относятся:

  • Число;
  • Строка;
  • Дата;
  • Булево;
  • ДвоичныеДанные;
  • Null;
  • УникальныйИдентификатор;
  • ХранилищеЗначения;
  • все ссылки на объекты базы данных;
  • ссылки на перечисления, определяемые в метаданных.

Значения сложных типов представляются в виде элементов XML, содержащих вложенные элементы:

  • Тип;
  • ОписаниеТипов;
  • КонстантаМенеджерЗначения.<имя константы>;
  • все объекты базы данных;
  • наборы записей регистров, последовательностей, перерасчетов;
  • УдалениеОбъекта;
Пример кода

Функция ПолучитьПримерXML(Значение)
ЗаписьПримерXML = Новый ЗаписьXML;
ЗаписьПримерXML.УстановитьСтроку();
ЗаписатьXML(ЗаписьПримерXML, Значение);
Возврат ЗаписьПримерXML.Закрыть();
КонецФункции

Для всех остальных типов, для которых невозможно использовать метод ЗаписатьXML() – будем преобразовывать сначала значения в XDTO, а затем уже используем выше описанный метод.

Рассмотрим на примере подробнее:

У нас есть таблица значений, которую мы хотим записать в XML.

Пример кода

Функция ПолучитьПримерXML(Значение)
ОбъектXDTO = СериализаторXDTO.ЗаписатьXDTO(Значение);
ЗаписьПримерXML = Новый ЗаписьXML;
ЗаписьПримерXML.УстановитьСтроку();
ФабрикаXDTO.ЗаписатьXML(ЗаписьПримерXML, ОбъектXDTO);
Возврат ЗаписьПримерXML.Закрыть();
КонецФункции

Надеюсь, статья была полезна. Спасибо, что прочли.