XML запись и чтение

1. user5300 1036 19.08.19 10:59 Сейчас в теме
Добрый день, друзья! Нуждаюсь в совете )

Разделили базу на 2 части, одна типовая, вторя немного измененная.
В измененной добавлено пару реквизитов в справочнике и из-за этого не получается произвести выгрузку и загрузку XML...

Пытаюсь выгрузить основные реквизиты, а самописные обойти, пока не получается) может кто подскажет ?)
вот код:

 Запись = Новый ЗаписьXML;
    Запись.УстановитьСтроку();
    Запись.ЗаписатьОбъявлениеXML();
    Запись.ЗаписатьНачалоЭлемента("Данные");
    Запись.ЗаписатьСоответствиеПространстваИмен("", "http://v8.1c.ru/8.1/data/enterprise/current-config");
    Запись.ЗаписатьСоответствиеПространстваИмен("xsd", "http://www.w3.org/2001/XMLSchema");
    Запись.ЗаписатьСоответствиеПространстваИмен("xsi", "http://www.w3.org/2001/XMLSchema-instance");
    Выборка = Справочники.ФизическиеЛица.Выбрать();
    Пока Выборка.Следующий() Цикл
        СериализаторXDTO.ЗаписатьXML(Запись, Выборка.ПолучитьОбъект()); ////Вот здесь при записи можно ли как то обойти обход при записи этих не типовых реквизитов ?
    КонецЦикла;
    Запись.ЗаписатьКонецЭлемента();
    Текст = Запись.Закрыть();
    
    Чтение = Новый ЧтениеXML;
    Чтение.УстановитьСтроку(Текст);
    Чтение.ПерейтиКСодержимому();
    Чтение.Прочитать();
    Пока Чтение.ТипУзла<>ТипУзлаXML.КонецЭлемента Цикл
        Объект = СериализаторXDTO.ПрочитатьXML(Чтение);        
        //покажем что прочитали, осталось только записать объект
        Сообщить(""+ТипЗнч(Объект)+" - "+Объект);
    КонецЦикла;
    Чтение.Закрыть();
Показать
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. user623969_dusa 19.08.19 11:33 Сейчас в теме
(1) подсказали в 3. разовый обмен в ручную выгружаете каждый реквизит и загружаете через сериализатор или выгружаетет через суриализотор а загружаете построчным чтением (можно все выгружать и загружать пореквизитно)
если это будет постоянно то лучше написать правила и выгружать через сериализатор не опускаясь до структуры
2. nomad_irk 76 19.08.19 11:05 Сейчас в теме
нельзя. запросом получайте нужные данные, формируйте выборку и обменивайтесь.
3. ice-net 19 19.08.19 11:23 Сейчас в теме
(2) Почему же нельзя,
если это
 СериализаторXDTO.ЗаписатьXML(Запись, Выборка.ПолучитьОбъект()); ////Вот здесь при записи можно ли как то обойти обход при записи этих не типовых реквизитов ?

заменить на запись каждого реквизита вручную в xml с той же структурой, что и в типовой базе, то думаю можно будет.
Что-то типа..
ЗаписьXML.ЗаписатьНачалоЭлемента(XMLТипЗнч(Объект).ИмяТипа);
ЗаписьXML.ЗаписатьНачалоЭлемента(ИмяРеквизита);
	ЗаписатьТекстXML(ЗаписьXML, ЗначениеРеквизита);
	ЗаписьXML.ЗаписатьКонецЭлемента();
...........
ЗаписьXML.ЗаписатьНачалоЭлемента(ИмяРеквизита999);
	ЗаписатьТекстXML(ЗаписьXML, ИмяРеквизита999);
	ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.ЗаписатьКонецЭлемента();

Показать


Хотя проще и быстрее, на мой взгляд, написать правила обмена через КД и грузить через универсальный обмен xml.
user623969_dusa; +1 Ответить
5. nomad_irk 76 19.08.19 11:44 Сейчас в теме
(3) Потому, что стандартная выборка содержит ВСЕ реквизиты объекта базы-источника, часть из которых просто отсутствует в базе-приемнике.
Эта проблема решается написанием запроса с выборкой только НУЖНЫХ реквизитов.
6. user5300 1036 19.08.19 11:53 Сейчас в теме
(3)
(4)
Вот на данный момент у меня так, через выборку и запись каждого элемента и реквизита, но хотелось бы как то оптимизировать это всё. Так как выгружаются физические лица, там и связь с регистром (Документы) и справочником (Сотрудники) и тд. Писать КД и через универсальный обмен не желательно )) У меня всё "Одной" кнопкой делается : Подключение -запись в xml - чтение - Запись в базу
А просто скопировать объект и убрать лишние реквизиты не получится ? или наоборот добавить при записи ?)
7. ice-net 19 19.08.19 11:59 Сейчас в теме
(6)

Еще вариант, взять результаты
 СериализаторXDTO.ЗаписатьXML(Запись, Выборка.ПолучитьОбъект());

из двух баз, найти отличия м/у ними и, удалять эти строки после выгрузки..
Можно попробовать что-то вроде:
ЗаписьXML = Новый ЗаписьXML;
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Выборка.ПолучитьОбъект());
СтрXML = ЗаписьXML.Закрыть();
УдалитьЛишнееИзСтроки(СтрXML); //Тут удаляете информацию о лишних реквизитах и приводите структуру к приемнику.
Запись.ЗаписатьТекст(СтрXML);

user5300; +1 Ответить
8. nomad_irk 76 19.08.19 12:09 Сейчас в теме
Вместо

Выборка = Справочники.ФизическиеЛица.Выбрать();

Сделать запрос с нужными полями - это конечно же сложнее, чем придумывать разные костыли по выгрузке каждого реквизита стандартной выборки :)

Чудаки, балин.....
9. user5300 1036 13.07.20 14:47 Сейчас в теме
ЗаписьXML = Новый ЗаписьXML;
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Выборка.ПолучитьОбъект());
СтрXML = ЗаписьXML.Закрыть();
УдалитьЛишнееИзСтроки(СтрXML); //Тут удаляете информацию о лишних реквизитах и приводите структуру к приемнику.
Запись.ЗаписатьТекст(СтрXML);
Оставьте свое сообщение

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