Десериализация объектов в конфигурации-приемнике с отличиями в реквизитах от конфигурации-источника с использованием XDTO.
Изменение от 29.01.2024 – В справочниках и планах видов характеристик реквизиты могут относиться к элементу, группе или группе и элементу. Поэтому при десериализации объекта с отличиями в принадлежности реквизитов к элементам и группам в конфигурации приемнике возникала ошибка. В новой версии данная проблема решена (как мне кажется).
Одним из определений сериализации является: Сериализация представляет собой процесс преобразования состояния объекта в форму, пригодную для сохранения или передачи. Дополнением к сериализации служит десериализация, при которой осуществляется преобразование потока в объект.
<Сериализация> применительно к 1С - это преобразование объектов и значений 1С в строку данных в формате XML или JSON. Соответственно <Десериализация> - обратный процесс получения объектов или значений 1С из строки данных в формате XML или JSON.
В прилагаемой к данной статье конфигурации предлагается метод десериализации объектов в конфигурации-приемнике с отличиями в реквизитах от конфигурации-источника с использованием XDTO.
Механизм сериализации, заложенный в платформу 1С хорош, но вот при попытке десериалировать объект, который отличается от исходного объекта наличием или отсутствием каких-либо реквизитов не получится, для десериализации нужно совпадение структуры объектов.
В прилагаемой конфигурации в общем модуле «СериализацияЗначений» реализованы функции для выполнения сериализации в формат XML или JSON, а также десериализации из форматов XML или JSON, в том числе и объектов, отличающихся по структуре от источника. Основными в общем модуле «СериализацияЗначений» являются четыре функции: «ПолучитьМодельТекущейКонфигурацииКакСтроку», «ЗначениеВСтроку», «ПолучитьФабрикуXDTOИзСтроки», «ЗначениеИзСтроки».
Две функции для сериализации:
И две функции для десериализации:
Изменение от 20.07.2023 – в функцию <ЗначениеИзСтроки> добавлена возможность произвести замену свойств объекта XDTO. Т.е. загрузить значение одного реквизита объекта из другого реквизита. Пример в конце статьи.
Алгоритм десериализации в предлагаемом функционале:
-
Из модели данных источника в формате XML или JSON в базе приемнике создается фабрика XDTO (фабрикаXDTO-источник);
-
С помощью фабрики XDTO (фабрикаXDTO-источник), созданной на предыдущем этапе, из данных в формате XML или JSON создается объект XDTO (ОбъектXDTO-источник);
-
На основании объекта XDTO (ОбъектXDTO-источник), созданного на предыдущем этапе, создается объект XDTO приемник (объектXDTO-приемник) с помощью фабрики конфигурации приемника. Производится заполнение свойств XDTO приемника (объектXDTO-приемник) из свойств XDTO источника (ОбъектXDTO-источник). Заполнение производится рекурсивно с созданием новых объектов или значений XDTO в фабрике XDTO конфигурации-приемнике;
-
Создается сериализатор на основании фабрики конфигурации-приемника. С помощью этого созданного сериализатора производится десериализация созданной копии объекта XDTO в значения и объекты конфигурации-приемника.
Саму реализацию можно посмотреть полностью в прилагаемой конфигурации в общем модуле «СериализацияЗначений». Основной сложностью при реализации механизма для меня стало создать <ЗначениеXDTO> только на основании <ТипЗначенияXDTO> .
До конца не уверен, что это все будет работать при любых типах данных. Тестирование проводилось на версии платформы <8.3.22.1923>.
И конечно, хотелось бы увидеть от коллег возможно более простое решение. Я, к сожалению, не нашел готового похожего функционала (может плохо искал ).
Для тестирования функционала из прилагаемого файла «1Cv8_Десериализация_XDTO.dt» создаем две базы. Одну назовем «SerializationSource» («Источник»), а вторую «SerializationTarget» («Приемник»).
В конфигураторе изменим название конфигурации, в базе - источнике название конфигурации изменим на «ИсследуемСериализациюИсточник».
В базе - приемнике название конфигурации изменим на «ИсследуемСериализациюПриемник».
-
Конфигурации и данные источника и приемника полностью идентичны.
В базе источнике открываем обработку «Значения в/из строки». Заполняем закладку «Значение» как на рисунке ниже. И нажимаем кнопку «В строку». На закладках «Модель как строка» и «Значение как строка» получаем модель текущей конфигурации и значение как строки в формате XML.
Переходим в базу приемник. Открываем обработку «Значения в/из строки». Копируем в нее в закладки «Модуль как строка» и «Значение как строка», полученные данные в базе источнике. Нажимаем кнопку «Из строки». По этой кнопке производится десериализация данных стандартным способом предоставляемым платформой 1С. На закладке «Значение» мы увидим восстановленные данные. Данные аналогичны тем, что мы занесли в источнике. Можно удалить эти данные и воспользоваться кнопкой «Из строки (расширенный)» для десериализации данных немного не типовым способом (общий модуль «СериализацияЗначений»). Результат в таком варианте будет аналогичный кнопке «Из строки».
-
Конфигурации источника и приемника отличаются.
В справочник «Сотрудники» конфигурации источника добавим дополнительные реквизиты «ДатаРождения», «МестоРождения». Элементы справочник есть в обеих информационных базах.
В конфигурации источнике добавляем новые реквизиты.
Открываем информационную базу и вносим данные для сотрудников.
Запускаем обработку «Значения в/из строки» в базе источник. Заносим на закладке «Значение» такие же данные, как и в предыдущем варианте. И жмем кнопку «В строку». На закладках «Модель как строка» и «Значение как строка» получаем модель текущей конфигурации и значение как строки в формате XML.
Переходим в базу приемник. Открываем обработку «Значения в/из строки». Копируем в нее в закладки «Модуль как строка» и «Значение как строка», полученные данные в базе источнике. Нажимаем кнопку «Из строки». Десериализация не выполняется по ошибке «Ошибка преобразования данных XDTO». Это происходит по причине того, что теперь справочник «Сотрудники» конфигурации приемник имеет структуру метаданных отличную от конфигурации источник.
Воспользуемся кнопкой «Из строки (расширенный)». Десериализация выполняется. Реализация такой десериализации находится в общем модуле «СериализацияЗначений».
-
Добавим такие же реквизиты в справочник «Сотрудники» в конфигурации приемнике. И повторим предыдущий пункт. В этом случае платформенная десериализация по кнопке «Из строки» производится, т.к. конфигурации источника и приемника стали одинаковыми.
-
В конфигурации приемнике изменим тип реквизита «МестоРождения» (см. рис. ниже). И повторим десериализацию в базе приемнике. В этом случае платформенная десериализация по кнопке «Из строки» производится. Т.е. отличие в длине поля не повлияло на поведение механизма десериализации.
-
Добавим в конфигурации приемнике в справочник «Сотрудники» реквизит «Оклад». И повторим платформенную десериализацию по кнопке «Из строки». Десериализация не выполняется по ошибке «Ошибка преобразования данных XDTO».
Воспользуемся кнопкой «Из строки (расширенный)». Десериализация выполняется. Реализация такой десериализации находится в общем модуле «СериализацияЗначений».
-
Внесем в базе источнике нового сотрудника. Выберем данного сотрудника для сериализации в базе источнике.
Переходим в базу приемник. Открываем обработку «Значения в/из строки». Копируем в нее в закладки «Модуль как строка» и «Значение как строка» полученные данные в базе источнике. Воспользоваться платформенной десериализацией «Из строки» не получится по причине того, что структура справочника «Сотрудники» в источнике и приемнике различаются. Воспользуемся кнопкой «Из строки (расширенный)». Десериализация выполняется. Как и предполагалось, в базе приемнике ссылка отображается как <Объект не найден>. Результат получения объекта лучше посмотреть в отладчике.
-
Добавим в конфигурации источнике новый справочник «Заказчики».
Занесем несколько элементов в данный справочник.
В базе источнике открываем обработку «Значения в/из строки». Заполняем закладку «Значение» как на рисунке ниже. И нажимаем кнопку «В строку». На закладках «Модель как строка» и «Значение как строка» получаем модель текущей конфигурации и значение как строки в формате XML.
Переходим в базу приемник. Открываем обработку «Значения в/из строки». Копируем в нее в закладки «Модуль как строка» и «Значение как строка», полученные данные в базе источнике. Воспользуемся кнопкой «Из строки (расширенный)». Десериализация выполняется. Т.к. в конфигурации приемнике нет справочника «Заказчики», то значения, связанные с заказчиками десериализуются в значение «Неопределено».
-
Изменения от 20.07.2023 - возможность произвести замену свойств объекта.
В конфигурации приемнике добавим в справочник «Сотрудники» реквизит «Должность2».
В базе источнике открываем обработку «Значения в/из строки». Заполняем закладку «Значение» как на рисунке ниже. И нажимаем кнопку «В строку». На закладках «Модель как строка» и «Значение как строка» получаем модель текущей конфигурации и значение как строки в формате XML.
Переходим в базу приемник. Открываем обработку «Значения в/из строки».
Заполним закладку «Замена свойств (при десериализации)» как на рисунке ниже.
Копируем в закладки «Модуль как строка» и «Значение как строка», полученные данные в базе источнике. Нажимаем кнопку «Из строки (расширенный). Десериализация выполняется. Результат получения объекта лучше посмотреть в отладчике.
В отладчике видно, что в справочнике объекте «Сотрудники» реквизит «Должность2» заполнен значением из реквизита «Должность».
КОНЕЦ