HelpF.pro

Как организовать обмен данными между произвольными конфигурациями?

Код 1C v 8.х
 Процедура Выгрузка(Элемент) 

Путь = "c:\"; //реальный путь к каталогу, в котором создаются файлы

ЗаписьXML = Новый ЗаписьXML();
ЗаписьXML.ОткрытьФайл(Путь + "выгрузка.xml");
Узел = ПланыОбмена.Поставка.НайтиПоКоду("Маг1");

ЗапСообщения = ПланыОбмена.СоздатьЗаписьСообщения();
ЗапСообщения.НачатьЗапись(ЗаписьXML, Узел);

Выборка = ПланыОбмена.ВыбратьИзменения(Узел, ЗапСообщения.НомерСообщения);

Пока Выборка.Следующий() Цикл
Данные = Выборка.Получить();

Если ТипЗнч(Данные) = Тип("ДокументОбъект.РеализацияТоваров") Тогда
ВыгрузкаРеализации(ЗаписьXML, Данные);

Иначе // все остальные объекты
ЗаписатьXML(ЗаписьXML, Данные);
КонецЕсли;
КонецЦикла;

ЗапСообщения.ЗакончитьЗапись();
ЗаписьXML.Закрыть();

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


Процедура ВыгрузкаРеализации(ЗаписьXML, Документ)

ЗаписьXML.ЗаписатьНачалоЭлемента("DocumentObject.ПередачаТовара");

ЗаписатьXML(ЗаписьXML, Документ.Ссылка.УникальныйИдентификатор(), "Ref", НазначениеТипаXML.Явное);
ЗаписатьXML(ЗаписьXML, Документ.ПометкаУдаления, "DeletionMark", НазначениеТипаXML.Явное);
ЗаписатьXML(ЗаписьXML, Документ.ВалютаДокумента, "ВалютаДокумента", НазначениеТипаXML.Явное);

// Остальные свойства документа.

// Табличная часть.
ЗаписьXML.ЗаписатьНачалоЭлемента("Товары");

Для Каждого ТекСтрока Из Документ.Товары Цикл
ЗаписьXML.ЗаписатьНачалоЭлемента("Row");

ЗаписатьXML(ЗаписьXML, ТекСтрока.Номенклатура, "Номенклатура", НазначениеТипаXML.Явное);
ЗаписатьXML(ЗаписьXML, ТекСтрока.Количество, "Количество", НазначениеТипаXML.Явное);

// Остальные реквизиты табличной части.

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

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

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


Процедура Загрузка(Элемент)

Путь = "c:\"; //реальный путь к каталогу, в котором создаются файлы

ЧтениеXML = Новый ЧтениеXML();
ЧтениеXML.ОткрытьФайл(Путь + "выгрузка.xml");

ЧтСообщения = ПланыОбмена.СоздатьЧтениеСообщения();
ЧтСообщения.НачатьЧтение(ЧтениеXML);

ПланыОбмена.УдалитьРегистрациюИзменений(ЧтСообщения.Отправитель, ЧтСообщения.НомерСообщения);

Пока ВозможностьЧтенияДанных(ЧтениеXML) Цикл
Данные = ПрочитатьДанные(ЧтениеXML);

Если РазрешениеКоллизий(Данные) Тогда
Данные.ОбменДанными.Отправитель = ЧтСообщения.Отправитель;
Данные.ОбменДанными.Загрузка = Истина;
Данные.Записать();
КонецЕсли;
КонецЦикла;

ЧтСообщения.ЗакончитьЧтение();
ЧтениеXML.Закрыть();

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


Функция ВозможностьЧтенияДанных(ЧтениеXML)

ТипXML = ПолучитьXMLТип(ЧтениеXML);

Если ТипXML = Неопределено Тогда
Возврат Ложь;
КонецЕсли;

Если ТипXML.ИмяТипа = "DocumentObject.ПередачаТовара" И ТипXML.URIПространстваИмен = "" Тогда
Возврат Истина;
КонецЕсли;

Возврат ВозможностьЧтенияXML(ЧтениеXML);

КонецФункции


Функция ПрочитатьДанные(ЧтениеXML)

ТипXML = ПолучитьXMLТип(ЧтениеXML);

Если ТипXML.ИмяТипа = "DocumentObject.ПередачаТовара" И ТипXML.URIПространстваИмен = "" Тогда
Возврат ЧтениеРеализации(ЧтениеXML);
КонецЕсли;

Возврат ПрочитатьXML(ЧтениеXML);

КонецФункции


Функция ЧтениеРеализации(ЧтениеXML)

ЧтениеXML.Прочитать();

// Работа со ссылкой документа.
ПолученнаяСсылка = ПрочитатьXML(ЧтениеXML);
Док = Документы.ПоступлениеТоваров.ПолучитьСсылку(Новый УникальныйИдентификатор(ПолученнаяСсылка));

Документ = Док.ПолучитьОбъект();

Если Документ = Неопределено Тогда
Документ = Документы.ПоступлениеТоваров.СоздатьДокумент();
Документ.УстановитьСсылкуНового(Док);
Документ.Дата = ТекущаяДата;
Документ.УстановитьНовыйНомер();
КонецЕсли;

Документ.ПометкаУдаления = ПрочитатьXML(ЧтениеXML);
Документ.ВалютаДокумента = ПрочитатьXML(ЧтениеXML);

// Табличная часть "Товары.
// Построчное чтение.
ЧтениеXML.Прочитать();
Документ.Товары.Очистить();

Пока ЧтениеXML.Имя = "Row" Цикл

// Позиционируемся на узле с номенклатурой.
ЧтениеXML.Прочитать();
НоваяСтрока = Документ.Товары.Добавить();
НоваяСтрока.Номенклатура = ПрочитатьXML(ЧтениеXML);
НоваяСтрока.Количество = ПрочитатьXML(ЧтениеXML);

// Читаем конец узла Row.
ЧтениеXML.Прочитать();
КонецЦикла;

// Читаем конец табличной части.
ЧтениеXML.Прочитать();

// Читаем конец документа.
ЧтениеXML.Прочитать();

Возврат(Документ);

КонецФункции


Функция РазрешениеКоллизий(Данные)

Если ТипЗнч(Данные) = Тип("ДокументОбъект.ПоступлениеТоваров") Тогда

Если Не Данные.ЭтоНовый() Тогда
СсылкаНаУзел = ПланыОбмена.Поставка.НайтиПоКоду("Опт");

Если ПланыОбмена.ИзменениеЗарегистрировано(СсылкаНаУзел, Данные) Тогда
Возврат(Ложь);
КонецЕсли;
КонецЕсли;
КонецЕсли;

Возврат(Истина);

КонецФункции

Опубликовано на сайте: https://HelpF.pro
Прямая ссылка: https://HelpF.pro/faq/view/788.html