Подскажите с Xdto

Тема в разделе "1C и всё что с ней связано", создана пользователем Allexei, 22 дек 2010.

  1. Allexei

    Allexei Well-Known Member
    1C Team

    Репутация:
    0
    Регистрация:
    2 май 2008
    Сообщения:
    324
    Симпатии:
    1
    Здравствуйте! Прошу помочь знатоков с 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.Закрыть();
    КонецФункции
    И вопрос номер два. В приведенном выше коде номенклатура в базу приемник попадает по иникальному идентификаторы, а как быть если в базе приемнике не совпадают ИУД-ы, но совпадает наименование и код?
     
  2. Allexei

    Allexei Well-Known Member
    1C Team

    Репутация:
    0
    Регистрация:
    2 май 2008
    Сообщения:
    324
    Симпатии:
    1
    С несколькими документами разобрался, может есть кто подскажет как перегрузить номенклатуру по коду?
     
  3. Gluk8888

    Gluk8888 Гость

    Репутация:
    0
  4. Allexei

    Allexei Well-Known Member
    1C Team

    Репутация:
    0
    Регистрация:
    2 май 2008
    Сообщения:
    324
    Симпатии:
    1
    Делаю для себя. Через конвертацию не хочу. Хочется именно через XDTO.Пока остановился только на том что загрузка будет как для простого XML...
     
  5. Gluk8888

    Gluk8888 Гость

    Репутация:
    0
    Вам говорят где посмотреть можно реализацию механизмов загрузки/выгрузки в том числе и через xml. Хочется свой велосипед? удачи :)
     
Загрузка...

Поделиться этой страницей