Десериализация объектов в конфигурации-приемнике с отличиями в реквизитах от конфигурации-источника

30.01.24

Интеграция - Обмен между базами 1C

В прилагаемой к данной статье конфигурации предлагается метод десериализации объектов в конфигурации-приемнике с отличиями в реквизитах от конфигурации-источника с использованием XDTO.

Скачать исходный код

Наименование Файл Версия Размер
1Cv8_Десериализация_XDTO
.rar 2,45Mb
3
.rar 2,45Mb 3 Скачать
1Cv8_Десериализация_сЗаменойСвойств_XDTO (20240129)
.rar 2,99Mb
3
.rar 2,99Mb 3 Скачать
1Cv8_Десериализация_сЗаменойСвойств_XDTO
.rar 2,98Mb
3
.rar 2,98Mb 3 Скачать

Десериализация объектов в конфигурации-приемнике с отличиями в реквизитах от конфигурации-источника с использованием 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» («Приемник»).

В конфигураторе изменим название конфигурации, в базе - источнике название конфигурации изменим на «ИсследуемСериализациюИсточник».

В базе - приемнике название конфигурации изменим на «ИсследуемСериализациюПриемник».

  1. Конфигурации и данные источника и приемника полностью идентичны.

В базе источнике открываем обработку «Значения в/из строки». Заполняем закладку «Значение» как на рисунке ниже. И нажимаем кнопку «В строку». На закладках «Модель как строка» и «Значение как строка» получаем модель текущей конфигурации и значение как строки в формате XML.

Переходим в базу приемник. Открываем обработку «Значения в/из строки». Копируем в нее в закладки «Модуль как строка» и «Значение как строка», полученные данные в базе источнике. Нажимаем кнопку «Из строки». По этой кнопке производится десериализация данных стандартным способом предоставляемым платформой 1С. На закладке «Значение» мы увидим восстановленные данные. Данные аналогичны тем, что мы занесли в источнике. Можно удалить эти данные и воспользоваться кнопкой «Из строки (расширенный)» для десериализации данных немного не типовым способом (общий модуль «СериализацияЗначений»). Результат в таком варианте будет аналогичный кнопке «Из строки».

  1. Конфигурации источника и приемника отличаются.

В справочник «Сотрудники» конфигурации источника добавим дополнительные реквизиты «ДатаРождения», «МестоРождения». Элементы справочник есть в обеих информационных базах.

В конфигурации источнике добавляем новые реквизиты.

Открываем информационную базу и вносим данные для сотрудников.

Запускаем обработку «Значения в/из строки» в базе источник. Заносим на закладке «Значение» такие же данные, как и в предыдущем варианте. И жмем кнопку «В строку». На закладках «Модель как строка» и «Значение как строка» получаем модель текущей конфигурации и значение как строки в формате XML.

Переходим в базу приемник. Открываем обработку «Значения в/из строки». Копируем в нее в закладки «Модуль как строка» и «Значение как строка», полученные данные в базе источнике. Нажимаем кнопку «Из строки». Десериализация не выполняется по ошибке «Ошибка преобразования данных XDTO». Это происходит по причине того, что теперь справочник «Сотрудники» конфигурации приемник имеет структуру метаданных отличную от конфигурации источник.

Воспользуемся кнопкой «Из строки (расширенный)». Десериализация выполняется. Реализация такой десериализации находится в общем модуле «СериализацияЗначений».

  1. Добавим такие же реквизиты в справочник «Сотрудники» в конфигурации приемнике. И повторим предыдущий пункт. В этом случае платформенная десериализация по кнопке «Из строки» производится, т.к. конфигурации источника и приемника стали одинаковыми.

  2. В конфигурации приемнике изменим тип реквизита «МестоРождения» (см. рис. ниже). И повторим десериализацию в базе приемнике. В этом случае платформенная десериализация по кнопке «Из строки» производится. Т.е. отличие в длине поля не повлияло на поведение механизма десериализации.

  1. Добавим в конфигурации приемнике в справочник «Сотрудники» реквизит «Оклад». И повторим платформенную десериализацию по кнопке «Из строки». Десериализация не выполняется по ошибке «Ошибка преобразования данных XDTO».

Воспользуемся кнопкой «Из строки (расширенный)». Десериализация выполняется. Реализация такой десериализации находится в общем модуле «СериализацияЗначений».

  1. Внесем в базе источнике нового сотрудника. Выберем данного сотрудника для сериализации в базе источнике.

Переходим в базу приемник. Открываем обработку «Значения в/из строки». Копируем в нее в закладки «Модуль как строка» и «Значение как строка» полученные данные в базе источнике. Воспользоваться платформенной десериализацией «Из строки» не получится по причине того, что структура справочника «Сотрудники» в источнике и приемнике различаются. Воспользуемся кнопкой «Из строки (расширенный)». Десериализация выполняется. Как и предполагалось, в базе приемнике ссылка отображается как <Объект не найден>. Результат получения объекта лучше посмотреть в отладчике.

  1. Добавим в конфигурации источнике новый справочник «Заказчики».

Занесем несколько элементов в данный справочник.

В базе источнике открываем обработку «Значения в/из строки». Заполняем закладку «Значение» как на рисунке ниже. И нажимаем кнопку «В строку». На закладках «Модель как строка» и «Значение как строка» получаем модель текущей конфигурации и значение как строки в формате XML.

Переходим в базу приемник. Открываем обработку «Значения в/из строки». Копируем в нее в закладки «Модуль как строка» и «Значение как строка», полученные данные в базе источнике. Воспользуемся кнопкой «Из строки (расширенный)». Десериализация выполняется. Т.к. в конфигурации приемнике нет справочника «Заказчики», то значения, связанные с заказчиками десериализуются в значение «Неопределено».

  1. Изменения от 20.07.2023 - возможность произвести замену свойств объекта.

В конфигурации приемнике добавим в справочник «Сотрудники» реквизит «Должность2».

В базе источнике открываем обработку «Значения в/из строки». Заполняем закладку «Значение» как на рисунке ниже. И нажимаем кнопку «В строку». На закладках «Модель как строка» и «Значение как строка» получаем модель текущей конфигурации и значение как строки в формате XML.

Переходим в базу приемник. Открываем обработку «Значения в/из строки».

Заполним закладку «Замена свойств (при десериализации)» как на рисунке ниже.

Копируем в закладки «Модуль как строка» и «Значение как строка», полученные данные в базе источнике. Нажимаем кнопку «Из строки (расширенный). Десериализация выполняется. Результат получения объекта лучше посмотреть в отладчике.

В отладчике видно, что в справочнике объекте «Сотрудники» реквизит «Должность2» заполнен значением из реквизита «Должность».

КОНЕЦ

Сериализация десериализация XDTO

См. также

SALE! 10%

Перенос данных из УПП 1.3 в ERP 2 / УТ 11 / КА 2. Переносятся документы, справочная информация и остатки

Перенос данных 1C Платформа 1С v8.3 1С:Управление производственным предприятием 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Перенос документов, начальных остатков и справочной информации из УПП 1.3 в ERP 2 | из УПП 1.3 в УТ 11 | из УПП в КА 2 | Правила конвертации (КД 2) в продаже с 2015 года, постоянно работаем над их развитием | Более 360 предприятий выполнили переход с использованием этого продукта! | Сэкономьте время - используйте готовое решение для перехода! | Позволяет перенести из УПП 1.3 в ERP / УТ 11 / КА 2 всю возможную информацию | В переносе есть фильтр по организации и множество других опциональных параметров выгрузки | Есть несколько алгоритмов выгрузки остатков на выбор

50722 45650 руб.

04.08.2015    160776    357    268    

349

[ED3] Обмен для ERP 2.5, КА 2.5, УТ 11.5 БП 3.0, Розница, УНФ и других с EnterpriseData (универсальный формат обмена), правила обмена

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

Правила в универсальном формате обмена для ERP 2.5, КА 2.5, УТ 11.5, БП 3.0, Розница, УНФ, для последних версий конфигураций. Ссылки на другие конфигурации в описании публикации. Правила совместимы со всеми другими версиями конфигураций новыми и старыми, поддерживающими обмен в формате EnterpriseData. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

25080 руб.

12.06.2017    135908    731    291    

393

SALE! 10%

Перенос данных из ERP 2 / КА 2 / УТ 11 в БП 3.0. Переносятся документы, начальные остатки и справочники

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Перенос данных из ERP в БП 3 | из КА 2 в БП 3 | из УТ 11 в БП 3 | из ЕРП в БП 3 | В продаже с 2019г. | Воспользовались более 176 предприятий! | Сэкономьте время - используйте готовое решение для перехода! | Перенос разработан в формате КД 2 (правила конвертации данных) | Переносятся все возможные виды документов, начальных остатков и нормативно-справочная информация| Можно опционально выгружать каждую пару "номенклатура+характеристика" как отдельную номенклатуру | Есть выгрузка настроек счетов учета и зарплатных данных из ERP / КА 2 | Можно проверить на вашем сервере перед покупкой, обращайтесь!

38500 34650 руб.

15.04.2019    69097    181    139    

111

SALE! 10%

Перенос данных из БП 3.0 в УТ 11 / КА 2 / ERP 2. Переносятся начальные остатки, документы и справочники

Перенос данных 1C Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

В продаже с 2014г. | Воспользовались более 122 предприятий! | Перенос данных из БП 3.0 в УТ 11 | из БП 3.0 в КА 2 | из БП 3.0 в ERP | Сэкономьте свое время - используйте готовое решение для перехода! | Постоянно работаем над развитием переноса данных | Обновляем на новые релизы 1С | Есть фильтр выгрузки по организациям | Переносятся начальные остатки на выбранную дату, документы за период времени и вся возможная справочная информация | Перенос сделан на технологии КД 2 (правила конвертации данных)

50722 45650 руб.

31.10.2014    232544    126    327    

298

Перенос данных из УПП 1.3 в БП 3.0. Переносятся документы (обороты за период), справочная информация и остатки

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УПП 1.3 (1.3.226.x) и БП 3.0 (3.0.151.x). Правила подходят для версии ПРОФ и КОРП.

28000 руб.

15.12.2021    20748    136    38    

95

Перенос данных из УТ 10.3 в УТ 11.5. Переносятся документы (обороты за период), справочная информация и остатки

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 Оперативный учет 1С:Управление торговлей 10 1С:Управление торговлей 11 Россия Управленческий учет Платные (руб)

Перенос данных из 1С:Управление торговлей 10.3 в 1С:Управление торговлей 11.5 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УТ 10.3 (10.3.87.x) и УТ 11.5 (11.5.16.x).

28000 руб.

23.07.2020    46991    201    64    

162

SALE! 10%

Перенос данных из ERP 2 / КА 2 в ЗУП 3. Переносятся остатки, документы и справочники

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из ERP в ЗУП 3 | из КА 2 в ЗУП | Воспользовались более 79 предприятий! | Предлагаем приобрести готовые правила конвертации данных (КД 2) для переноса остатков, документов с движениями и справочной информации 3 | В продаже с 2020г. | Оперативно обновляем правила до актуальных релизов 1С | Есть перенос начальной задолженности по зарплате и начальной штатной расстановки на выбранную дату | Обороты за прошлые годы (данные для расчета среднего) переносятся свернуто в документ "Перенос данных" | Есть фильтр по организациям | Документы за текущий период переносятся сразу с движениями, поэтому не потребуется делать перерасчеты | Перенос можно проверить перед покупкой, обращайтесь!

48278 43450 руб.

03.12.2020    34570    83    58    

81

SALE! 10%

Перенос данных из БП 3.0 в УНФ 3.0 / УНФ 1.6. Переносятся остатки, документы и справочная информация

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление нашей фирмой 3.0 Россия Платные (руб)

В продаже с 2018г. | Воспользовались более 41 предприятия! | Правила конвертации (КД 2) для переноса данных из БП 3 в УНФ | Переносятся все виды документов, начальные остатки и вся возможная справочная информация | Есть фильтр по организациям | Оперативно обновляем на новые релизы | Оказываем техподдержку | В комплект файлов входит инструкция, авторская версия обработки "Универсальный обмен...", актуальные правила переноса данных и архив старых версий переноса | Учет в БП 3 должен быть корректным, некорректные данные не переносятся | Можно бесплатно проверить на вашем сервере до покупки!

50722 руб.

10.07.2018    67982    41    123    

46
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. gkoles010 29 17.10.23 11:03 Сейчас в теме
Использую вашу функцию СоздатьКопиюXDTO()
Есть проблема при загрузке Группы иерархического справочника.
Пример:
Есть две конфигурации cf1 и cf2
В них есть иерархический справочник Спр1
Реквизитный состав Спр1 в cf1 и cf2 отличается
В cf1 в Спр1 нет реквизитов
В cf2 в Спр1 есть реквизит Рекв1 (строка), "Использование" = "Для элемента"
Из cf1 выгружаем Группу (не элемент)
Загружаем в cf2
При копировании ОбъектаXDTO источника в ОбъектXDTO приемника добавляется новое свойство Рекв1 с значением пустой строки.
Сериализатор приемника не может десериализовать ОбъектXDTO в объект, т.к. для групп свойство Рекв1 не должно быть заполнено.
Есть возможность проверять относится ли свойство (реквизит) к группе/элементу и нужно ли его заполнять?
2. user706545_kseg1971 131 09.11.23 10:04 Сейчас в теме
Доброго дня.
Действительно такая проблема есть.
В XDTO приемнике который создается, пока не нашел как определить относится свойство к элементу, группе или к тому и другому. Если Вы уже нашли способ это сделать - поделитесь плиз.
3. gkoles010 29 09.11.23 13:56 Сейчас в теме
(2) Я пока сделал так, но думаю есть еще что доработать
	// Проверка использования реквизита справочника в группе/элементе
	// Если реквизит не используется, то пропустить
	СвойствоЭтоГруппа = СвойстваИсточника.Получить("IsFolder");
	Если Не СвойствоЭтоГруппа = Неопределено Тогда

		ИспользованиеРеквизита1С = Неопределено;
		Тип1С = Сериализатор.ИзXMLТипа(ПараметрыТипа.Имя, ПараметрыТипа.URIПространстваИмен);
		Если Тип1С = Неопределено Тогда
			// Вызвать исключение
			Продолжить;
		Иначе
			МетаданныеОбъекта = Метаданные.НайтиПоТипу(Тип1С);
			Если Не МетаданныеОбъекта = Неопределено И Метаданные.Справочники.Содержит(МетаданныеОбъекта) Тогда
				Реквизит1С = МетаданныеОбъекта.Реквизиты.Найти(СвойствоПриемника.Имя);//Результат.PredefinedDataName
				Если Реквизит1С = Неопределено Тогда
					Продолжить;
				Иначе
					ИспользованиеРеквизита1С = Реквизит1С.Использование;
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;

		Если Не ИспользованиеРеквизита1С = Неопределено Тогда
			ЭтоГруппа = ОбъектЗначениеXDTO.Получить(СвойствоЭтоГруппа);
			Если ТипЗнч(ЭтоГруппа) = Тип("Строка") Тогда
				ЭтоГруппа = XMLЗначение(Тип("Булево"), ЭтоГруппа);
			КонецЕсли;
			Если (ЭтоГруппа = Истина
				И ИспользованиеРеквизита1С = Метаданные.СвойстваОбъектов.ИспользованиеРеквизита.ДляЭлемента)
				Или (ЭтоГруппа = Ложь
				И ИспользованиеРеквизита1С = Метаданные.СвойстваОбъектов.ИспользованиеРеквизита.ДляГруппы) Тогда
				Продолжить;
			КонецЕсли;
		КонецЕсли;

	КонецЕсли;
Показать
4. user706545_kseg1971 131 29.01.24 10:14 Сейчас в теме
(3) Доброго дня. Есть версия с решеной проблемой десериализации объекта с отличиями в принадлежности реквизитов к элементам и группам в конфигурации приемнике. Есть желание потестить ?
5. gkoles010 29 30.01.24 09:40 Сейчас в теме
(4) Добрый день! В личку написать не получается... Из вашей cf использую только пару методов, и те сильно переработаны для конкретных задач. Мне было бы интересно глянуть только способ решения проблемы, мог бы дать свои комментарии.
На текущий момент параллельно читаю два файла xml, через попытку десериализую объекты (ДокументОбъект, СправочникОбъект). Если есть исключение, то создаю новый объект XDTO и заполняю его значениями источника, проверяю принадлежность к группе/элементу. Далее десериализую его. Пока работает.
Есть еще один момент с расширениями, вдруг пригодится. В расширение был добавлен реквизит (видимо связанный с основной cf), потом его в расширении переименовали как Удалить*, и реквизит вроде как отвязали от основной конфигурации. Но при десериализации были глюки, нужно было полностью удалить реквизит из расширения. Просто если где-то на практике будет ошибка, то можно искать проблему в расширении.
6. user706545_kseg1971 131 30.01.24 10:11 Сейчас в теме
(5) Доброго дня. Идея простая - сбросить те свойства которые не должны иметь значения. Делаю это непосредственно перед десериализацией, т.к. в этот момент уже есть понимание что десериализация будет в текущую конфигурацию и есть соответственно информация о метаданных. Дополнил статью новым архивом "1Cv8_Десериализация_сЗаменойСвойств_XDTO (20240129)". Могу на почту скинуть. Напишите куда скинуть.
gkoles010; +1 Ответить
7. gkoles010 29 30.01.24 14:20 Сейчас в теме
Оставьте свое сообщение