🔥 Горящие вакансии
Все статьи

Сериализация данных в 1С

Эту и другие технические статьи написали наши программисты 1С и получили за них премии. Если вы тоже работаете с 1С и любите делиться опытом, приходите разработчиком в Neti

В данной статье я хочу рассказать о сериализации данных в 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.Закрыть();
КонецФункции

Оставить коментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Раз в квартал — дайджест достойный внимания

Вести с полей 1С, кейсы работы с заказчиками и вакансии на удалёнке

Image

Отправить резюме

    Я согласен на обработку персональных данных в соответствии
    со ст. 9 ФЗ № 152-ФЗ «О персональных данных»

    Отправить резюме

      Я согласен на обработку персональных данных в соответствии
      со ст. 9 ФЗ № 152-ФЗ «О персональных данных»

      Pекомендовать друга

        Отправьте контактные данные вашего друга и предупредите его, что мы с ним свяжемся. Когда друг успешно отработает 3 месяца, вы получите 20 000 ₽.


        Выбрать вакансию
        • Ведущий аналитик 1С
        • Программист 1С
        • Консультант-аналитик 1С
        • Проекты для команды специалистов 1С
        • Проекты для специалистов 1С
        • Стажёр-программист 1С
        • Bitrix-разработчик
        Я согласен на обработку персональных данных в соответствии
        со ст. 9 ФЗ № 152-ФЗ «О персональных данных»

        Pекомендовать друга

          Отправьте контактные данные вашего друга и предупредите его, что мы с ним свяжемся. Когда друг успешно отработает 3 месяца, вы получите 20 000 ₽.


          Выбрать вакансию
          • Ведущий аналитик 1С
          • Программист 1С
          • Консультант-аналитик 1С
          • Проекты для команды специалистов 1С
          • Проекты для специалистов 1С
          • Стажёр-программист 1С
          • Bitrix-разработчик
          Я согласен на обработку персональных данных в соответствии
          со ст. 9 ФЗ № 152-ФЗ «О персональных данных»

          Спасибо!

          Мы получили ваше резюме. Менеджер свяжется с вами в течение трех дней

          Горящие вакансии