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

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 всю возможную информацию | В переносе есть фильтр по организации и множество других опциональных параметров выгрузки | Есть несколько алгоритмов выгрузки остатков на выбор

50722 45650 руб.

04.08.2015    165037    383    275    

369

Перенос данных 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 руб.

12.06.2017    140089    781    295    

408

Перенос данных 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). Правила подходят для версии ПРОФ и КОРП.

28000 руб.

15.12.2021    23077    157    47    

116

Зарплата Внешние источники данных Бюджетный учет Перенос данных 1C Системный администратор Программист Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 8 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

84000 руб.

19.08.2020    24337    23    1    

25

SALE! 10%

Перенос данных 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 | Сэкономьте время - используйте готовое решение для перехода! | Перенос разработан в формате КД 2 (правила конвертации данных) | Переносятся все возможные виды документов, начальных остатков и нормативно-справочная информация| Можно опционально выгружать каждую пару "номенклатура+характеристика" как отдельную номенклатуру | Есть выгрузка настроек счетов учета и зарплатных данных из ERP / КА 2 | Можно проверить на вашем сервере перед покупкой

50722 45650 руб.

15.04.2019    71477    180    148    

120

SALE! 10%

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

Можно проверить до покупки, оставьте заявку! Воспользовались более 268 компаний! Перенос данных из УТ 10.3 в УТ 11 | из УТ 10.3 в КА 2 | из УТ 10.3 в ERP. Предлагаем качественное и проверенное временем решение для перехода с УТ 10.3. Можно перенести начальные остатки, нормативно-справочную информацию и все возможные документы. При выгрузке можно установить отбор по периоду, организациям и складам. При выходе новых релизов конфигураций 1C оперативно выпускаем обновление переноса данных.

50722 45650 руб.

24.04.2015    194115    148    242    

279

SALE! 10%

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

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

50722 45650 руб.

31.10.2014    235978    99    333    

304

SALE! 10%

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

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

48278 43450 руб.

03.12.2020    35990    90    62    

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