A
Allexei
Здравствуйте! Прошу помочь знатоков с XDTO. Вопрос номер один- как выгрузить в XML и загрузить из него несколько документов. Код по выгрузке и загрузке ниже:
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"Код выгрузки"</div></div><div class="sp-body"><div class="sp-content">Функция ВыгрузитьДокумент()
Если ПустаяСтрока(ИмяФайлаXML) ИЛИ ПустаяСтрока(ИмяФайлаXSD) Тогда Сообщить("Не заполнены пути файлов!"); Возврат 0; КонецЕсли;
Если пвВыборТипаВыгрузки= "ВыгрузитьОдинДокумент" И ПоступлениеТоваров.Пустая() Тогда Сообщить("Не выбран документ для выгрузки"); Возврат 0; КонецЕсли;
//1. Для формирования данных выгрузки нам необходима схема конфигурации-приемника.
// Выгрузим ее в файл: в конфигурации-примнике в дереве конфигурации правой кнопочкой по узлу
// "Пакеты XDTO"/Экспорт XML-схемы данных конфигурации. Сохраним схему как ИмяФайлаXSD
//2. Для формирования данных выгрузки создаем фабрику на основе схемы (ИмяФайлаXSD), указав путь
// к файлу схемы конфигурации-приемника:
ЗаписьXML= Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ИмяФайлаXML);
Пути= Новый Массив;
Пути.Добавить(ИмяФайлаXSD);
Фабрика= СоздатьФабрикуXDTO(Пути);
//3. Создадим тип ТипОбъектаXDTO для помещения в него данных из конфигурации-источника
// А именно тип для документа Приходная накладная и ее табличной части
ТипПриходнаяНакладная= Фабрика.Тип("http://v8.1c.ru/8.1/data/enterprise/current-config", "DocumentObject.ПриходнаяНакладная");
ТипСтокаПриходнойНакл= Фабрика.Тип("http://v8.1c.ru/8.1/data/enterprise/current-config", "DocumentTabularSectionRow.ПриходнаяНакладная.Товары");
//4. Создадим ОбъектXDTO по типу, и объект 1С конфигурации-источника:
ОбъектПриходнаяНакладная= Фабрика.Создать(ТипПриходнаяНакладная);
ОбъектНоваяСтрокаПН = Фабрика.Создать(ТипСтокаПриходнойНакл);
ПосуплениеТовараОбъект = ПоступлениеТоваров.ПолучитьОбъект();
//5. Заполним ОбъектXDTO выполнив необходимые преобразования данных
//5.1 Заполним реквизиты объекта
ОбъектПриходнаяНакладная.Ref = ПосуплениеТовараОбъект.Ссылка.УникальныйИдентификатор();
ОбъектПриходнаяНакладная.DeletionMark = ПосуплениеТовараОбъект.ПометкаУдаления;
ОбъектПриходнаяНакладная.Date = ПосуплениеТовараОбъект.Дата;
ОбъектПриходнаяНакладная.Number = ПосуплениеТовараОбъект.Номер;
ОбъектПриходнаяНакладная.Posted = ПосуплениеТовараОбъект.Проведен;
ОбъектПриходнаяНакладная.Коментарий = ПосуплениеТовараОбъект.Коментарий;
ОбъектПриходнаяНакладная.Ответственный = ПосуплениеТовараОбъект.Ответственный.УникальныйИдентификатор();
//5.2 Заполним табличную часть
Для Каждого ТекСтрока ИЗ ПоступлениеТоваров.Товары Цикл
ОбъектНоваяСтрокаПН.Номенклатура= ТекСтрока.Номенклатура.УникальныйИдентификатор();
ОбъектНоваяСтрокаПН.Количество = ТекСтрока.Количество;
ОбъектНоваяСтрокаПН.Стоимость = ТекСтрока.Стоимость;
ОбъектНоваяСтрокаПН.Сумма = ТекСтрока.Сумма;
ОбъектПриходнаяНакладная.Товары.Добавить(ОбъектНоваяСтрокаПН);
КонецЦикла;
Фабрика.ЗаписатьXML(ЗаписьXML, ОбъектПриходнаяНакладная);
ЗаписьXML.Закрыть();
КонецФункции
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"Код загрузки"</div></div><div class="sp-body"><div class="sp-content">Функция ЗагрузитьДокумент()
//Если объект 1С с таким идентификатором будет существовать в базе к моменту прочтения его из файла,
//то возвращаемый методом ПрочитатьXML объект будет не новым (ЭтоНовый()=Ложь), но будет содержать данные полученные из файла;
//если объекта с таким идентификатором нет, то объект будет новым (ЭтоНовый()=Истина), он будет содержать данные из файла и ему
//будет уже назначена ссылка нового.
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ИмяФайлаXML);
ПриходнаяНакладнаяОбъект = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
ПриходнаяНакладнаяОбъект.ОбменДанными.Загрузка = Истина;
ПриходнаяНакладнаяОбъект.Записать(РежимЗаписиДокумента.Запись);
ЧтениеXML.Закрыть();
КонецФункции
И вопрос номер два. В приведенном выше коде номенклатура в базу приемник попадает по иникальному идентификаторы, а как быть если в базе приемнике не совпадают ИУД-ы, но совпадает наименование и код?
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"Код выгрузки"</div></div><div class="sp-body"><div class="sp-content">Функция ВыгрузитьДокумент()
Если ПустаяСтрока(ИмяФайлаXML) ИЛИ ПустаяСтрока(ИмяФайлаXSD) Тогда Сообщить("Не заполнены пути файлов!"); Возврат 0; КонецЕсли;
Если пвВыборТипаВыгрузки= "ВыгрузитьОдинДокумент" И ПоступлениеТоваров.Пустая() Тогда Сообщить("Не выбран документ для выгрузки"); Возврат 0; КонецЕсли;
//1. Для формирования данных выгрузки нам необходима схема конфигурации-приемника.
// Выгрузим ее в файл: в конфигурации-примнике в дереве конфигурации правой кнопочкой по узлу
// "Пакеты XDTO"/Экспорт XML-схемы данных конфигурации. Сохраним схему как ИмяФайлаXSD
//2. Для формирования данных выгрузки создаем фабрику на основе схемы (ИмяФайлаXSD), указав путь
// к файлу схемы конфигурации-приемника:
ЗаписьXML= Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ИмяФайлаXML);
Пути= Новый Массив;
Пути.Добавить(ИмяФайлаXSD);
Фабрика= СоздатьФабрикуXDTO(Пути);
//3. Создадим тип ТипОбъектаXDTO для помещения в него данных из конфигурации-источника
// А именно тип для документа Приходная накладная и ее табличной части
ТипПриходнаяНакладная= Фабрика.Тип("http://v8.1c.ru/8.1/data/enterprise/current-config", "DocumentObject.ПриходнаяНакладная");
ТипСтокаПриходнойНакл= Фабрика.Тип("http://v8.1c.ru/8.1/data/enterprise/current-config", "DocumentTabularSectionRow.ПриходнаяНакладная.Товары");
//4. Создадим ОбъектXDTO по типу, и объект 1С конфигурации-источника:
ОбъектПриходнаяНакладная= Фабрика.Создать(ТипПриходнаяНакладная);
ОбъектНоваяСтрокаПН = Фабрика.Создать(ТипСтокаПриходнойНакл);
ПосуплениеТовараОбъект = ПоступлениеТоваров.ПолучитьОбъект();
//5. Заполним ОбъектXDTO выполнив необходимые преобразования данных
//5.1 Заполним реквизиты объекта
ОбъектПриходнаяНакладная.Ref = ПосуплениеТовараОбъект.Ссылка.УникальныйИдентификатор();
ОбъектПриходнаяНакладная.DeletionMark = ПосуплениеТовараОбъект.ПометкаУдаления;
ОбъектПриходнаяНакладная.Date = ПосуплениеТовараОбъект.Дата;
ОбъектПриходнаяНакладная.Number = ПосуплениеТовараОбъект.Номер;
ОбъектПриходнаяНакладная.Posted = ПосуплениеТовараОбъект.Проведен;
ОбъектПриходнаяНакладная.Коментарий = ПосуплениеТовараОбъект.Коментарий;
ОбъектПриходнаяНакладная.Ответственный = ПосуплениеТовараОбъект.Ответственный.УникальныйИдентификатор();
//5.2 Заполним табличную часть
Для Каждого ТекСтрока ИЗ ПоступлениеТоваров.Товары Цикл
ОбъектНоваяСтрокаПН.Номенклатура= ТекСтрока.Номенклатура.УникальныйИдентификатор();
ОбъектНоваяСтрокаПН.Количество = ТекСтрока.Количество;
ОбъектНоваяСтрокаПН.Стоимость = ТекСтрока.Стоимость;
ОбъектНоваяСтрокаПН.Сумма = ТекСтрока.Сумма;
ОбъектПриходнаяНакладная.Товары.Добавить(ОбъектНоваяСтрокаПН);
КонецЦикла;
Фабрика.ЗаписатьXML(ЗаписьXML, ОбъектПриходнаяНакладная);
ЗаписьXML.Закрыть();
КонецФункции
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"Код загрузки"</div></div><div class="sp-body"><div class="sp-content">Функция ЗагрузитьДокумент()
//Если объект 1С с таким идентификатором будет существовать в базе к моменту прочтения его из файла,
//то возвращаемый методом ПрочитатьXML объект будет не новым (ЭтоНовый()=Ложь), но будет содержать данные полученные из файла;
//если объекта с таким идентификатором нет, то объект будет новым (ЭтоНовый()=Истина), он будет содержать данные из файла и ему
//будет уже назначена ссылка нового.
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ИмяФайлаXML);
ПриходнаяНакладнаяОбъект = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
ПриходнаяНакладнаяОбъект.ОбменДанными.Загрузка = Истина;
ПриходнаяНакладнаяОбъект.Записать(РежимЗаписиДокумента.Запись);
ЧтениеXML.Закрыть();
КонецФункции
И вопрос номер два. В приведенном выше коде номенклатура в базу приемник попадает по иникальному идентификаторы, а как быть если в базе приемнике не совпадают ИУД-ы, но совпадает наименование и код?