В данной статье я хочу рассказать о сериализации данных в 1С.
Немного о самом определении: Сериализация (в программировании) — процесс перевода какой-либо структуры данных в последовательность битов. Обратной к операции сериализации является операция десериализации (структуризации) — восстановление начального состояния структуры данных из битовой последовательности.
Когда нам нужно сохранить значения, для дальнейшего его хранения или передачи, в этом случае нам без нее не обойтись, но стоит учитывать, что сериализация данных применима для тех объектов 1С, в описании которых есть пометка «Сериализуется».
Уточним, что серилиазация может применятся не только в рамках одной информационной базы, но и о XML – сериализация. Последняя является отдельной возможностью, и применяется между различными информационными базами данных.
Для начала, рассмотрим сериализацию в рамках одной информационной базы.
Для сохранения значений во время сеанса работы в ИБ используются методы ЗначениеВФайл() и ЗначениеИзФайла().
Пример кода
ЗначениеВФайл() Путь = "D:1сТестФайл.txt"; Попытка Если ЗначениеВФайл(Путь, ТаблицаЗначений) Тогда Предупреждение("Выгрузка успешно завершена!"); Иначе Предупреждение("Возникли проблемы при выгрузке!"); КонецЕсли; Исключение Предупреждение("Возникли проблемы при выгрузке! "+ОписаниеОшибки()); КонецПопытки;
Пример кода
ЗначениеИзФайла () ИмяФайла = Новый Файл(ВыбранныйФайл); Если ИмяФайла.Существует() Тогда ТаблицаЗначений = ЗначениеИЗФайла(ВыбранныйФайл); КонецЕсли;
Если же нам требуется сохранить данные между сеансами, что удобно для пользователя, чтобы не вводить данные каждый раз на форме, то мы будем использовать методы СохранитьЗначение() и ВосстановитьЗначение(), но стоит обратить внимание что данные методы работают только при корректном завершении работы в программе, если вдруг пк будет обесточен, то значения не сохранятся. Также не стоит забывать о сохранении значений в объекте типа ХранилищеЗначений. Подобный тип используется для картинок, образов файлов, так как для них в конфигурации нет соответствующих типов полей.
Пример кода
СохранитьЗначение() //Сохранение поля типа дата СохранитьЗначение("НачалоПериода", НачалоПериода); //Сохранение ссылочного поля СохранитьЗначение("Контрагент", Контрагент); //Сохранение табличной части СохранитьЗначение("ТабличнаяЧасть", ТабличнаяЧасть.Выгрузить());
Пример кода
ВосстановитьЗначение() //Получаем значения сохраненных параметров ЗначениеНачалоПериода = ВосстановитьЗначение("НачалоПериода"); ЗначениеКонтрагент = ВосстановитьЗначение("Контрагент"); ЗначениеТабличнаяЧасть = ВосстановитьЗначение("ТабличнаяЧасть"); //Восстанавливаем значения через вспомогательную процедуру с проверкой типа //и возвращаемого значения УстановитьЗначение(ЗначениеНачалоПериода, НачалоПериода); УстановитьЗначение(ЗначениеКонтрагент, Контрагент); УстановитьЗначение(ЗначениеТабличнаяЧасть, ТабличнаяЧасть); КонецПроцедуры Процедура УстановитьЗначение(СохраненноеЗначение, Значение) Если СохраненноеЗначение<>Неопределено Тогда Если Типзнч(СохраненноеЗначение) = Тип("ТаблицаЗначений") Тогда Значение.Загрузить(СохраненноеЗначение); Иначе Значение = СохраненноеЗначение; КонецЕсли; КонецЕсли; КонецПроцедуры
Если необходимо сохранить значения в строку и восстановить значения из строки, то для этого используются методы ЗначениеВСтрокуВнутр() и ЗначениеИзСтрокиВнутр(). Эти методы реализованы в основном для сохранения функциональной совместимости с 1С:Предприятием 7.7. Использовать их в большинстве случаев не рекомендуется. Для сохранения значений в базу данных рекомендуется использовать, описанный выше, объект типа ХранилищеЗначения, а для получения некоторого строкового идентификатора ссылочного значения можно использовать возможность получения уникального идентификатора ссылки (метод УникальныйИдентификатор()) и соответственно преобразование его к строке.
Пример кода
ЗначениеВСтрокуВнутр() СсылкаВВидеСтроки = ЗначениеВСтрокуВнутр(СсылкаНаОрганизацию); СтруктураВВидеСтроки = ЗначениеВСтрокуВнутр(Новый Структура("ОрганизацияСсылка,КодОрганизации", СсылкаНаОрганизацию,СсылкаНаОрганизацию.Код))</pre>
Пример кода
ЗначениеИзСтрокиВнутр () СсылкаНаОрганизацию= ЗначениеИзСтрокиВнутр(СсылкаВВидеСтроки); СтруктураИзСтроки = ЗначениеИзСтрокиВнутр(СтруктураВВидеСтроки); Если Типзнч(СтруктураИзСтроки) = Тип("Структура") Тогда СсылкаНаОрганизацию = СтруктураИзСтроки.ОрганизацияСсылка; КодОрганизации = СтруктураИзСтроки.КодОрганизации; КонецЕсли;
А теперь немного о 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.Закрыть(); КонецФункции