Обмен данными XDTO (пример)
Теги: XDTO,1С

Обмен данными XDTO (пример)

# Код реализации

```1c
&НаКлиенте
Процедура Выгрузить(Команда)

	Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
	Диалог.Заголовок = "Выберите файл для выгрузки";
	Диалог.Фильтр = "xml |*.xml|";
	Если Диалог.Выбрать() Тогда
		Сообщить(Диалог.ПолноеИмяФайла);
	Иначе
		Возврат;
	КонецЕсли;

	ВыгрузкаXML=ПолучитьXMLФайл(ЭтаФорма.УникальныйИдентификатор);

	Описание=Новый ОписаниеПередаваемогоФайла(Диалог.ПолноеИмяФайла,ВыгрузкаXML);
	МассивОписаний=Новый Массив;
	МассивОписаний.Добавить(Описание);
	ПолучитьФайлы(МассивОписаний,,,Ложь);
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьXMLФайл(ГУИДФормы)

	ИмяТемпФайла = ПолучитьИмяВременногоФайла("xml");
	Данные = Новый ЗаписьXML;
	Данные.ОткрытьФайл(ИмяТемпФайла);
	Данные.ЗаписатьОбъявлениеXML();
	Данные.ЗаписатьНачалоЭлемента("Данные");

	Фабрика = СоздатьФабрикуXDTO("D:\Приемник.xsd");

	РаботникиОбъектТип= Фабрика.Тип("http://v8.1c.ru/8.1/data/enterprise/current-config","CatalogObject.Работники");

	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	Сотрудники.Ссылка РаботникСсылка,
	|	Сотрудники.ПометкаУдаления DeletionMark,
	|	Сотрудники.Родитель РодительСсылка,
	|	Сотрудники.ЭтоГруппа IsFolder,
	|	Сотрудники.Код Code,
	|	Сотрудники.Наименование Description,
	|	Сотрудники.ДатаРождения ДеньРождения,
	|	Сотрудники.ПричинаУвольнения ПричинаУвольнения
	|ИЗ
	|	Справочник.Сотрудники КАК Сотрудники";

	Результат = Запрос.Выполнить();

	ВыборкаДетальныеЗаписи = Результат.Выбрать();

	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		РаботникиОбъект = Фабрика.Создать(РаботникиОбъектТип);
		РаботникиОбъект.Ref = ВыборкаДетальныеЗаписи.РаботникСсылка.УникальныйИдентификатор();
		РаботникиОбъект.Parent = ВыборкаДетальныеЗаписи.РодительСсылка.УникальныйИдентификатор();

		Если ВыборкаДетальныеЗаписи.IsFolder Тогда
			ЗаполнитьЗначенияСвойств(РаботникиОбъект,ВыборкаДетальныеЗаписи,,"ДеньРождения,ПричинаУвольнения");
		Иначе
			ЗаполнитьЗначенияСвойств(РаботникиОбъект,ВыборкаДетальныеЗаписи);
			РаботникиОбъект.Автомобиль = Неопределено;
			РаботникиОбъект.Должность = новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000");
            РаботникиОбъект.Комментарий = "Импорт из исходной базы";
			РаботникиОбъект.Организация = новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000");
		КонецЕсли;

		Фабрика.ЗаписатьXML(Данные,РаботникиОбъект);
	КонецЦикла;

	Данные.ЗаписатьКонецЭлемента();
	Данные.Закрыть();

	Двоичное=Новый ДвоичныеДанные(ИмяТемпФайла);
	Адрес=ПоместитьВоВременноеХранилище(Двоичное,ГУИДФормы);
	Возврат Адрес;
КонецФункции

&НаКлиенте
Процедура Загрузить(Команда)

	Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	Диалог.Заголовок = "Выберите файл для загрузки";
	Диалог.Фильтр = "xml |*.xml|"; // картинки

	Если Диалог.Выбрать() Тогда
		Сообщить(Диалог.ПолноеИмяФайла);
	Иначе
		Возврат;
	КонецЕсли;

	ДвоичныеДанные = Новый ДвоичныеДанные(Диалог.ПолноеИмяФайла);
	ГуидФормы = Этаформа.УникальныйИдентификатор;
	Адрес = ПоместитьВоВременноеХранилище(ДвоичныеДанные,ГуидФормы);

	ЗагрузитьНаСервере(Адрес);

КонецПроцедуры

&НаСервереБезКонтекста
Процедура ЗагрузитьНаСервере(Адрес)

	ТемпФайл = ПолучитьИмяВременногоФайла("xml");
	ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);
	ДвоичныеДанные.Записать(ТемпФайл);
	Данные = Новый ЧтениеXML;
	Данные.ОткрытьФайл(ТемпФайл);
	Данные.Прочитать();
	Данные.Прочитать();

	Пока СериализаторXDTO.ВозможностьЧтенияXML(Данные) Цикл
		РаботникОбъект = СериализаторXDTO.ПрочитатьXML(Данные);
		РаботникОбъект.ОбменДанными.Загрузка=Истина;
		РаботникОбъект.Записать();
	КонецЦикла;

	Данные.Закрыть();

КонецПроцедуры
```