• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы Allexei
  • Дата начала
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.Закрыть();
КонецФункции
И вопрос номер два. В приведенном выше коде номенклатура в базу приемник попадает по иникальному идентификаторы, а как быть если в базе приемнике не совпадают ИУД-ы, но совпадает наименование и код?
 
A

Allexei

С несколькими документами разобрался, может есть кто подскажет как перегрузить номенклатуру по коду?
 
G

Gluk8888

посмотри Конвретацию данных, там уже все придумано. (скачать можно сдесь:
 
A

Allexei

Делаю для себя. Через конвертацию не хочу. Хочется именно через XDTO.Пока остановился только на том что загрузка будет как для простого XML...
 
G

Gluk8888

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!