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

30.01.24

Интеграция - Перенос данных 1C

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
1Cv8_Десериализация_XDTO
.rar 2,45Mb
4
4 Скачать (1 SM) Купить за 1 850 руб.
1Cv8_Десериализация_сЗаменойСвойств_XDTO (20240129)
.rar 2,99Mb
4
4 Скачать (2 SM) Купить за 2 150 руб.
1Cv8_Десериализация_сЗаменойСвойств_XDTO
.rar 2,98Mb
4
4 Скачать (2 SM) Купить за 2 150 руб.

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

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

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

55778 50200 руб.

04.08.2015    166467    333    277    

373

SALE! 20%

Перенос данных 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. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

26280 22338 руб.

12.06.2017    141523    798    297    

419

SALE! 10%

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

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

35000 31500 руб.

15.12.2021    24021    169    51    

127

SALE! 10%

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

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

35000 31500 руб.

23.07.2020    51267    228    69    

185

SALE! 10%

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

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

53111 47800 руб.

03.12.2020    36591    94    66    

89

SALE! 10%

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

Правила переноса кадровых и расчетных данных и справочной информации из "1С:УПП1.3" или "1С:КА 1.1" в "1С:ЗУП 3.1 | Разработан в формате КД 2 (правила конвертации данных) | При выгрузке есть фильтр по организациям | Обновляется при выходе новых релизов 1С | Развитие алгоритмов | Расчетные документы переносятся в документ "Перенос данных" | Создаются документы "Начальная штатная расстановка" и "Начальная задолженность по зарплате", переносятся кадровые документы

55778 50200 руб.

29.10.2018    56208    59    105    

61

SALE! 10%

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

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена | Можно выполнить переход с УПП на БП 3 или запускать выгрузку данных за выбранный период времени | Переносятся документы, начальные остатки и вся справочная информация | Есть фильтр по организации и множество других параметров выгрузки | Поддерживается несколько сценариев работы: как первичный полный перенос, так и перенос только новых документов | Перенос данных возможен в "1С: Бухгалтерия 3.0" версии ПРОФ, КОРП или базовую | Переход с "1С: УПП1.3" / "1С:КА 1.1" на "1С:БП3.0" с помощью правил конвертации будет максимально комфортным! | Можно бесплатно проверить перенос на вашем сервере!

48278 43450 руб.

25.02.2015    171177    303    257    

378

SALE! 15%

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

Регулярный обмен, выгрузка, перенос из КА 1.1, УПП 1.3, УТ 10.3 для обмена с любыми конфигурациями, поддерживающими обмен в формате EnterpriseData (КД3) - БП 3.0, ERP, КА 2, УТ 11, Розница 2, УНФ 1.6 и другими. Правила для старых и доработанных конфигураций не требуют синхронного обновления и совместимы с новыми и будущими конфигурациями. Обмен по расписанию, через папку, FTP, почту.

15300 13005 руб.

18.02.2016    186881    589    509    

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