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

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

  1. Allexei

    Allexei Well-Known Member

    Регистрация:
    2 май 2008
    Сообщения:
    322
    Симпатии:
    0
    Здравствуйте! Прошу помочь знатоков с 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

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

    Gluk8888 Гость

  4. Allexei

    Allexei Well-Known Member

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

    Gluk8888 Гость

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

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