Выгрузка объекта справочника (например) в XML через метод ЗаписатьXML. Но не просто, а со значениями ссылочных реквизитов. Возможно ли? Т.е. Выгрузка данных ссылочного объекта с вложенными ссылочными объектами.

1. resonance 81 14.04.20 20:49 Сейчас в теме
Есть задача. Выгрузить данные выборочных справочников из УТ 10.3 и загрузить их в УТ 11.4 одним движением мышки.
Так как конфигурации разные, автоматически выгрузить в XDTO и потом загрузить в XDTO у меня не получилось, ни каким образом. На загрузке и создании объекта в УТ 11, всега ошибка ... "Не найдено описание типа" я так понимаю что структура справочника не совпадает, посему

реализацию этого "чуда", решил делать через XML+DOM. Выгрузка объекта через метод ЗаписатьXML работает и для каждого элемента справочника, в файле XML создается Элемент с названием <CatalogObject.ИмяСправочника> и закрывающийся </CatalogObject.ИмяСправочника> .
С загрузкой тоже нет проблем, загружаю файл в ПостроительDOM и перебираю узлы, дальше - дело техники...Но.
Как Выгрузить в XML значения ссылочных реквизитов Объекта? Выгружаются только УникальныеИднетификаторы ссылок .
Возможно ли такое? Т.е. разом, выгрузить элемент справочника и все связанные не пустые ссылки в его реквизитах.
Найденные решения
8. nomad_irk 72 14.04.20 22:51 Сейчас в теме
(7) в общих чертах:

Процедура ВыгрузитьРекурсивно(ЗаписьXML, Объект, МетаданныеОбъекта)

МассивПримитивныхТипов = Новый Массив;
МассивПримитивныхТипов.Добавить(Тип("Число"));
МассивПримитивныхТипов.Добавить(Тип("Строка"));
МассивПримитивныхТипов.Добавить(Тип("Дата"));
МассивПримитивныхТипов.Добавить(Тип("Булево"));

Если Найти(Строка(ТипЗнч(Объект)), "СправочникОбъект") > 0 Тогда
       ЗаписьXML.ЗаписатьНачалоЭлемента("CatalogObject" + МетаданныеОбъекта.Имя);
ИначеЕсли Найти(Строка(ТипЗнч(Объект)), "ДокументОбъект") > 0
       ЗаписьXML.ЗаписатьНачалоЭлемента("DocumentObject" + МетаданныеОбъекта.Имя);
ИначеЕсли...............
        ........................
КонецЕсли;

Для Каждого СтандартныйРеквизит ИЗ МетаданныеОбъекта.СтандартныеРеквизиты Цикл
       ЗаписьXML.ЗаписатьНачалоЭлемента(СтандартныйРеквизит.Имя);
       ЗаписьXML.ЗаписатьТекст(Формат(Объект[СтандартныйРеквизит.Имя], "ЧГ="));
       ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЦикла:

Для Каждого Реквизит ИЗ МетаданныеОбъекта.Реквизиты Цикл
       Если МассивПримитивныхТипов.Найти(ТипЗнч(Объект[Реквизит.Имя])) <> Неопределено Тогда
           ЗаписьXML.ЗаписатьНачалоЭлемента(Реквизит.Имя);
           ЗаписьXML.ЗаписатьТекст(Формат(Объект[Реквизит.Имя], "ЧГ="));
           ЗаписьXML.ЗаписатьКонецЭлемента();
      Иначе
           ТекОбъект = Объект[Реквизит.Имя].ПолучитьОбъект();
           ТекМетаданныеОбъекта = Объект[Реквизит.Имя].Метаданные();
           ВыгрузитьРекурсивно(ЗаписьXML, ТекОбъект, ТекМетаданныеОбъекта); 
      КонецЕсли;
КонецЦикла;

Для Каждого ТабличнаяЧасть ИЗ МетаданныеОбъекта.ТабличныеЧасти  Цикл

..........

КонецЦикла

ЗаписатьКонецЭлемента();

КонецПроцедуры
Показать
resonance; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. nomad_irk 72 14.04.20 21:29 Сейчас в теме
(1)Вполне. Определяете, какой из реквизитов имеет ссылочный тип, получаете объект по ссылке и инициируете выгрузку объекта "вручную".
Получается некая рекурсия.
3. resonance 81 14.04.20 21:31 Сейчас в теме
(2)
Определяете, какой из реквизитов имеет ссылочный тип, получаете объект по ссылке и и

Я собственно сейчас так и делаю. Но, необходимо (лично мое мнение), что бы выгрузка вложенного ссылочного реквизита происходила внтури тэга XML основного объекта. Иначе у меня возникают трудности в загрузке, нужно будет определять какая из ссылок принадлежит какому элементу (реквизиту) справочника, конечно можно использовать в имени элемента xml имя в виде.. GUID = я все это знаю, но хотелось чего то более локаничного)
4. nomad_irk 72 14.04.20 21:36 Сейчас в теме
(3) В таком случае, вам необходимо формировать XML что называется вручную, по каждому реквизиту шапки/ТЧ объекта.
Автоматом - только так как оно работает, т.е. ссылочные реквизиты выгружаются в виде значения ссылки(GUID-а).
5. resonance 81 14.04.20 21:38 Сейчас в теме
(4)
. ссылочные реквизиты выгружаются в виде значения ссылки(GUIID-а).

Я находил в одной из веток форума, ответ одного из пользователей, о том, что он "разобрался" в вопросе, но решения он не представил... а ветку я потерял(. От сюда - эта моя ветка с вопросом) надежда так сказать последняя
6. nomad_irk 72 14.04.20 21:40 Сейчас в теме
(5)Я подозреваю, что его метод именно рекурсивная выгрузка объектов по ссылкам, т.к. я далек от мысли, что тот кто придумал КД2/3 - не знали как это реализовать и стали выдумывать вот это все.
Формат выгружаемого XML по-умолчанию достаточно тривиален, повторить его вручную не составит особого труда.
7. resonance 81 14.04.20 22:10 Сейчас в теме
(6)
ат выгружаемого XML по-умолчанию достаточно тривиален, повторить его вручную не составит особого труда.

Приведу пример.
Элемент справочника номенклатура, содержит реквизит ссылочного типа, "ОсновнойПоставщик", тип Справочник контаргенты.
Элемент справочника Контрагенты Содержи реквизит "Договор", тип Справочник Договоры контрагентов.
Элемент Справочника Договоры контрагентов содержит реквизит (тут уже фантазирую, пример все таки) "УсловияВыполнения", тип Справочник Условия выполнения договоров контрагентов... и сколько этих "вложенностей" будет я не знаю... собственно в этом и сложность, я не могу придумать ручную рекурсию... вернее пока не придумал. Вот и решил спросить у знающих людей...
(6)
8. nomad_irk 72 14.04.20 22:51 Сейчас в теме
(7) в общих чертах:

Процедура ВыгрузитьРекурсивно(ЗаписьXML, Объект, МетаданныеОбъекта)

МассивПримитивныхТипов = Новый Массив;
МассивПримитивныхТипов.Добавить(Тип("Число"));
МассивПримитивныхТипов.Добавить(Тип("Строка"));
МассивПримитивныхТипов.Добавить(Тип("Дата"));
МассивПримитивныхТипов.Добавить(Тип("Булево"));

Если Найти(Строка(ТипЗнч(Объект)), "СправочникОбъект") > 0 Тогда
       ЗаписьXML.ЗаписатьНачалоЭлемента("CatalogObject" + МетаданныеОбъекта.Имя);
ИначеЕсли Найти(Строка(ТипЗнч(Объект)), "ДокументОбъект") > 0
       ЗаписьXML.ЗаписатьНачалоЭлемента("DocumentObject" + МетаданныеОбъекта.Имя);
ИначеЕсли...............
        ........................
КонецЕсли;

Для Каждого СтандартныйРеквизит ИЗ МетаданныеОбъекта.СтандартныеРеквизиты Цикл
       ЗаписьXML.ЗаписатьНачалоЭлемента(СтандартныйРеквизит.Имя);
       ЗаписьXML.ЗаписатьТекст(Формат(Объект[СтандартныйРеквизит.Имя], "ЧГ="));
       ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЦикла:

Для Каждого Реквизит ИЗ МетаданныеОбъекта.Реквизиты Цикл
       Если МассивПримитивныхТипов.Найти(ТипЗнч(Объект[Реквизит.Имя])) <> Неопределено Тогда
           ЗаписьXML.ЗаписатьНачалоЭлемента(Реквизит.Имя);
           ЗаписьXML.ЗаписатьТекст(Формат(Объект[Реквизит.Имя], "ЧГ="));
           ЗаписьXML.ЗаписатьКонецЭлемента();
      Иначе
           ТекОбъект = Объект[Реквизит.Имя].ПолучитьОбъект();
           ТекМетаданныеОбъекта = Объект[Реквизит.Имя].Метаданные();
           ВыгрузитьРекурсивно(ЗаписьXML, ТекОбъект, ТекМетаданныеОбъекта); 
      КонецЕсли;
КонецЦикла;

Для Каждого ТабличнаяЧасть ИЗ МетаданныеОбъекта.ТабличныеЧасти  Цикл

..........

КонецЦикла

ЗаписатьКонецЭлемента();

КонецПроцедуры
Показать
resonance; +1 Ответить
9. resonance 81 15.04.20 16:48 Сейчас в теме
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот