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

1. user5300 913 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 64 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 64 19.08.19 11:44 Сейчас в теме
(3) Потому, что стандартная выборка содержит ВСЕ реквизиты объекта базы-источника, часть из которых просто отсутствует в базе-приемнике.
Эта проблема решается написанием запроса с выборкой только НУЖНЫХ реквизитов.
6. user5300 913 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 64 19.08.19 12:09 Сейчас в теме
Вместо

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

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

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

Тестировщик 1С
Москва
зарплата от 125 000 руб.
Полный день

Программист 1С
Санкт-Петербург
зарплата от 90 000 руб.
Полный день

Программист/тестировщик
Москва
зарплата от 130 000 руб. до 150 000 руб.
Полный день

Ведущий разработчик 1С / Team lead отдела разработки 1С
Москва
зарплата от 300 000 руб. до 300 000 руб.
Полный день