Выгрузка объекта справочника (например) в XML через метод ЗаписатьXML. Но не просто, а со значениями ссылочных реквизитов. Возможно ли? Т.е. Выгрузка данных ссылочного объекта с вложенными ссылочными объектами.
Есть задача. Выгрузить данные выборочных справочников из УТ 10.3 и загрузить их в УТ 11.4 одним движением мышки.
Так как конфигурации разные, автоматически выгрузить в XDTO и потом загрузить в XDTO у меня не получилось, ни каким образом. На загрузке и создании объекта в УТ 11, всега ошибка ... "Не найдено описание типа" я так понимаю что структура справочника не совпадает, посему
реализацию этого "чуда", решил делать через XML+DOM. Выгрузка объекта через метод ЗаписатьXML работает и для каждого элемента справочника, в файле XML создается Элемент с названием <CatalogObject.ИмяСправочника> и закрывающийся </CatalogObject.ИмяСправочника> .
С загрузкой тоже нет проблем, загружаю файл в ПостроительDOM и перебираю узлы, дальше - дело техники...Но.
Как Выгрузить в XML значения ссылочных реквизитов Объекта? Выгружаются только УникальныеИднетификаторы ссылок .
Возможно ли такое? Т.е. разом, выгрузить элемент справочника и все связанные не пустые ссылки в его реквизитах.
Так как конфигурации разные, автоматически выгрузить в XDTO и потом загрузить в XDTO у меня не получилось, ни каким образом. На загрузке и создании объекта в УТ 11, всега ошибка ... "Не найдено описание типа" я так понимаю что структура справочника не совпадает, посему
реализацию этого "чуда", решил делать через XML+DOM. Выгрузка объекта через метод ЗаписатьXML работает и для каждого элемента справочника, в файле XML создается Элемент с названием <CatalogObject.ИмяСправочника> и закрывающийся </CatalogObject.ИмяСправочника> .
С загрузкой тоже нет проблем, загружаю файл в ПостроительDOM и перебираю узлы, дальше - дело техники...Но.
Как Выгрузить в XML значения ссылочных реквизитов Объекта? Выгружаются только УникальныеИднетификаторы ссылок .
Возможно ли такое? Т.е. разом, выгрузить элемент справочника и все связанные не пустые ссылки в его реквизитах.
Найденные решения
(7) в общих чертах:
Процедура ВыгрузитьРекурсивно(ЗаписьXML, Объект, МетаданныеОбъекта)
МассивПримитивныхТипов = Новый Массив;
МассивПримитивныхТипов.Добавить(Тип("Число"));
МассивПримитивныхТипов.Добавить(Тип("Строка"));
МассивПримитивныхТипов.Добавить(Тип("Дата"));
МассивПримитивныхТипов.Добавить(Тип("Булево"));
Если Найти(Строка(ТипЗнч(Объект)), "СправочникОбъект") > 0 Тогда
ЗаписьXML.ЗаписатьНачалоЭлемента("CatalogObject" + МетаданныеОбъекта.Имя);
ИначеЕсли Найти(Строка(ТипЗнч(Объект)), "ДокументОбъект") > 0
ЗаписьXML.ЗаписатьНачалоЭлемента("DocumentObject" + МетаданныеОбъекта.Имя);
ИначеЕсли...............
........................
КонецЕсли;
Для Каждого СтандартныйРеквизит ИЗ МетаданныеОбъекта.СтандартныеРеквизиты Цикл
ЗаписьXML.ЗаписатьНачалоЭлемента(СтандартныйРеквизит.Имя);
ЗаписьXML.ЗаписатьТекст(Формат(Объект[СтандартныйРеквизит.Имя], "ЧГ="));
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЦикла:
Для Каждого Реквизит ИЗ МетаданныеОбъекта.Реквизиты Цикл
Если МассивПримитивныхТипов.Найти(ТипЗнч(Объект[Реквизит.Имя])) <> Неопределено Тогда
ЗаписьXML.ЗаписатьНачалоЭлемента(Реквизит.Имя);
ЗаписьXML.ЗаписатьТекст(Формат(Объект[Реквизит.Имя], "ЧГ="));
ЗаписьXML.ЗаписатьКонецЭлемента();
Иначе
ТекОбъект = Объект[Реквизит.Имя].ПолучитьОбъект();
ТекМетаданныеОбъекта = Объект[Реквизит.Имя].Метаданные();
ВыгрузитьРекурсивно(ЗаписьXML, ТекОбъект, ТекМетаданныеОбъекта);
КонецЕсли;
КонецЦикла;
Для Каждого ТабличнаяЧасть ИЗ МетаданныеОбъекта.ТабличныеЧасти Цикл
..........
КонецЦикла
ЗаписатьКонецЭлемента();
КонецПроцедуры
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(2)
Я собственно сейчас так и делаю. Но, необходимо (лично мое мнение), что бы выгрузка вложенного ссылочного реквизита происходила внтури тэга XML основного объекта. Иначе у меня возникают трудности в загрузке, нужно будет определять какая из ссылок принадлежит какому элементу (реквизиту) справочника, конечно можно использовать в имени элемента xml имя в виде.. GUID = я все это знаю, но хотелось чего то более локаничного)
Определяете, какой из реквизитов имеет ссылочный тип, получаете объект по ссылке и и
Я собственно сейчас так и делаю. Но, необходимо (лично мое мнение), что бы выгрузка вложенного ссылочного реквизита происходила внтури тэга XML основного объекта. Иначе у меня возникают трудности в загрузке, нужно будет определять какая из ссылок принадлежит какому элементу (реквизиту) справочника, конечно можно использовать в имени элемента xml имя в виде.. GUID = я все это знаю, но хотелось чего то более локаничного)
(4)
Я находил в одной из веток форума, ответ одного из пользователей, о том, что он "разобрался" в вопросе, но решения он не представил... а ветку я потерял(. От сюда - эта моя ветка с вопросом) надежда так сказать последняя
. ссылочные реквизиты выгружаются в виде значения ссылки(GUIID-а).
Я находил в одной из веток форума, ответ одного из пользователей, о том, что он "разобрался" в вопросе, но решения он не представил... а ветку я потерял(. От сюда - эта моя ветка с вопросом) надежда так сказать последняя
(5)Я подозреваю, что его метод именно рекурсивная выгрузка объектов по ссылкам, т.к. я далек от мысли, что тот кто придумал КД2/3 - не знали как это реализовать и стали выдумывать вот это все.
Формат выгружаемого XML по-умолчанию достаточно тривиален, повторить его вручную не составит особого труда.
Формат выгружаемого XML по-умолчанию достаточно тривиален, повторить его вручную не составит особого труда.
(6)
Приведу пример.
Элемент справочника номенклатура, содержит реквизит ссылочного типа, "ОсновнойПоставщик", тип Справочник контаргенты.
Элемент справочника Контрагенты Содержи реквизит "Договор", тип Справочник Договоры контрагентов.
Элемент Справочника Договоры контрагентов содержит реквизит (тут уже фантазирую, пример все таки) "УсловияВыполнения", тип Справочник Условия выполнения договоров контрагентов... и сколько этих "вложенностей" будет я не знаю... собственно в этом и сложность, я не могу придумать ручную рекурсию... вернее пока не придумал. Вот и решил спросить у знающих людей...
(6)
ат выгружаемого XML по-умолчанию достаточно тривиален, повторить его вручную не составит особого труда.
Приведу пример.
Элемент справочника номенклатура, содержит реквизит ссылочного типа, "ОсновнойПоставщик", тип Справочник контаргенты.
Элемент справочника Контрагенты Содержи реквизит "Договор", тип Справочник Договоры контрагентов.
Элемент Справочника Договоры контрагентов содержит реквизит (тут уже фантазирую, пример все таки) "УсловияВыполнения", тип Справочник Условия выполнения договоров контрагентов... и сколько этих "вложенностей" будет я не знаю... собственно в этом и сложность, я не могу придумать ручную рекурсию... вернее пока не придумал. Вот и решил спросить у знающих людей...
(6)
(7) в общих чертах:
Процедура ВыгрузитьРекурсивно(ЗаписьXML, Объект, МетаданныеОбъекта)
МассивПримитивныхТипов = Новый Массив;
МассивПримитивныхТипов.Добавить(Тип("Число"));
МассивПримитивныхТипов.Добавить(Тип("Строка"));
МассивПримитивныхТипов.Добавить(Тип("Дата"));
МассивПримитивныхТипов.Добавить(Тип("Булево"));
Если Найти(Строка(ТипЗнч(Объект)), "СправочникОбъект") > 0 Тогда
ЗаписьXML.ЗаписатьНачалоЭлемента("CatalogObject" + МетаданныеОбъекта.Имя);
ИначеЕсли Найти(Строка(ТипЗнч(Объект)), "ДокументОбъект") > 0
ЗаписьXML.ЗаписатьНачалоЭлемента("DocumentObject" + МетаданныеОбъекта.Имя);
ИначеЕсли...............
........................
КонецЕсли;
Для Каждого СтандартныйРеквизит ИЗ МетаданныеОбъекта.СтандартныеРеквизиты Цикл
ЗаписьXML.ЗаписатьНачалоЭлемента(СтандартныйРеквизит.Имя);
ЗаписьXML.ЗаписатьТекст(Формат(Объект[СтандартныйРеквизит.Имя], "ЧГ="));
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЦикла:
Для Каждого Реквизит ИЗ МетаданныеОбъекта.Реквизиты Цикл
Если МассивПримитивныхТипов.Найти(ТипЗнч(Объект[Реквизит.Имя])) <> Неопределено Тогда
ЗаписьXML.ЗаписатьНачалоЭлемента(Реквизит.Имя);
ЗаписьXML.ЗаписатьТекст(Формат(Объект[Реквизит.Имя], "ЧГ="));
ЗаписьXML.ЗаписатьКонецЭлемента();
Иначе
ТекОбъект = Объект[Реквизит.Имя].ПолучитьОбъект();
ТекМетаданныеОбъекта = Объект[Реквизит.Имя].Метаданные();
ВыгрузитьРекурсивно(ЗаписьXML, ТекОбъект, ТекМетаданныеОбъекта);
КонецЕсли;
КонецЦикла;
Для Каждого ТабличнаяЧасть ИЗ МетаданныеОбъекта.ТабличныеЧасти Цикл
..........
КонецЦикла
ЗаписатьКонецЭлемента();
КонецПроцедуры
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот