Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
08 окт 2024, 08:01

Чтение и запись xml в 1с

Автор Ваня, 10 сен 2018, 09:08

0 Пользователей и 1 гость просматривают эту тему.

Ваня

есть xml файлик со следующим текстом.


<RegContr>
<Contr ID="127" SNAME="Поставщик Лапши" INN="1234567890"/>
                <Contr ID="128" SNAME="Поставщик Печенек" INN="0987654321"/>
</RegContr>

<RegGood>
<Good ID_EL="5608"  NAME="Лапша" />
                <Good ID_EL="5609"  NAME="Печенье" />
</RegGood>

<Doc ID="74840" SNAME="Счет на Лапшу" ID_CONTR="127" >
<String NOM="1" ID_EL="5608" SUM="50"/>
</Doc>
<Doc ID="74841" SNAME="Счет на Печенье" ID_CONTR="128" >
<String NOM="1" ID_EL="5609" SUM="100" />
</Doc>


не получается прочитать строку DOC, получилось прочитать только в другом виде xml если разделить DOC И STRING объединив их  DOC ID.

Пример xml как получается, но так не правильно:

<RegContr>
<Contr ID="127" SNAME="Поставщик Лапши" INN="1234567890"/>
                <Contr ID="128" SNAME="Поставщик Печенек" INN="0987654321"/>
</RegContr>

<RegGood>
<Good ID_EL="5608"  NAME="Лапша" />
                <Good ID_EL="5609"  NAME="Печенье" />
</RegGood>

<RegDoc>
<Doc ID="74840" SNAME="Счет на Лапшу" ID_CONTR="127" >
<String NOM="1" ID_EL="5608" SUM="50" И Good.IS_SERVICE="0" />
</Doc>
<Doc ID="74841" SNAME="Счет на Печенье" ID_CONTR="128" >
<String NOM="1" ID_EL="5609" SUM="100" И Good.IS_SERVICE="0"  />
</Doc>
</RegDoc>

<RegString>
           <String NOM="1" Doc ID="74840" ID_EL="5608" SUM="50" И Good.IS_SERVICE="0" />
           <String NOM="1" Doc ID="74841" ID_EL="5609" SUM="100" И Good.IS_SERVICE="0" />
</RegString>


и пример скрипта под переделанный xml


Процедура ПрочитатьФС(Файлик)
   
    ПутьКФайлу = Файлик[0];
   
    //XML
   
    ЧтениеXML = Новый ЧтениеXML;

    ЧтениеXML.ОткрытьФайл(ПутьКФайлу);
Группа1 = Справочники.Контрагенты.НайтиПоНаименованию("Поставщики");



    ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);

//Контрагенты, при добавлении счета ищет в справочнике контрагента по ИНН, если такого нет, то добавляет нового.
Для каждого Contr Из ОбъектXDTO.RegContr.Contr Цикл
Поставщик = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", Contr.INN);
Для каждого Doc Из ОбъектXDTO.RegDoc.Doc Цикл
КодСч = Doc.SNAME;
НомерСЧ = Документы.СчетаПоставщикам.НайтиПоРеквизиту("КодСч", КодСч);
Если ЗначениеЗаполнено(Contr.INN)И Поставщик.Пустая()И Справочники.Номенклатура.НайтиПоНаименованию(Contr.SNAME).Пустая() Тогда
      Если Doc.INN = Contr.INN Тогда
          НовыйЭлемент = Справочники.Контрагенты.СоздатьЭлемент();
         НовыйЭлемент.Наименование = Contr.NAME;
         НовыйЭлемент.ИНН = Contr.INN;
    НовыйЭлемент.Родитель = Группа1;
    НовыйЭлемент.Записать();
        КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;

//Создание номенклатуры, такая же система как и с контрагентами
Для каждого Doc Из ОбъектXDTO.RegDoc.Doc Цикл
Для каждого Good Из ОбъектXDTO.RegGood.Good Цикл
Для каждого String Из ОбъектXDTO.RegString.String Цикл
Если Doc.ID_ORG="1183" И String.ID_DOC = DOC.ID И String.ID_EL = Good.ID_EL И Справочники.Номенклатура.НайтиПоКоду(Good.ID_EL).Пустая() Тогда
НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
НовыйЭлемент.Наименование = Good.Name;
НовыйЭлемент.Код = Good.ID_EL;
Новыйэлемент.Записать();
КонецЕсли;

КонецЦикла;
КонецЦикла;
КонецЦикла;

//Счета

Для каждого Contr Из ОбъектXDTO.RegContr.Contr Цикл
Поставщик = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", Contr.INN);
Для каждого Doc Из ОбъектXDTO.RegDoc.Doc Цикл
КодСч = Doc.SNAME;
НомерСЧ = Документы.СчетаПоставщикам.НайтиПоРеквизиту("КодСч", КодСч);
Для каждого Good Из ОбъектXDTO.RegGood.Good Цикл
Для каждого String Из ОбъектXDTO.RegString.String Цикл
Если Документы.СчетаПоставщикам.НайтиПоРеквизиту("КодСч",Doc.SNAME).Пустая() Тогда
Если Doc.INN = Contr.INN Тогда
        НовыйДокумент = Документы.СчетаПоставщикам.СоздатьДокумент();
//Табличная часть
Для каждого String Из ОбъектXDTO.RegString.String Цикл
Для каждого Good Из ОбъектXDTO.RegGood.Good Цикл
Если String.ID_DOC = DOC.ID И String.ID_EL = Good.ID_EL И Good.IS_SERVICE="0" Тогда
Таб = НовыйДокумент.Товары.Добавить();
СтрТовар1 = Справочники.Номенклатура.НайтиПоКоду(String.ID_EL);
СтрТовар2 = СтрТовар1.Ссылка;
    Таб.Номенклатура  = СтрТовар2.Ссылка ;
Таб.Сумма = String.SUM;
КонецЕсли;
Если String.ID_DOC = DOC.ID И String.ID_EL = Good.ID_EL И Good.IS_SERVICE="1" Тогда
Таб1 = НовыйДокумент.Услуги.Добавить();
СтрУслуга1 = Справочники.Номенклатура.НайтиПоКоду(String.ID_EL);
СтрУслуга2 = СтрУслуга1.Ссылка;
    Таб1.Номенклатура  = СтрУслуга2.Ссылка ;
Таб1.Сумма = String.SUM;

КонецЕсли;
КонецЦикла;   
КонецЦикла;
//Конец табличной части
НовыйДокумент.КодСч = КодСч;
НовыйДокумент.Дата= ТекущаяДата();
СтрПоставщик = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", Doc.INN);
СтрПоставщик = Поставщик.Ссылка;
    НовыйДокумент.Поставщик = стрПоставщик.Ссылка;
    Если СтрПоставщик.Пустая()Тогда
    НовыйДокумент.Удалить();
          Иначе
НовыйДокумент.Записать();
  КонецЕсли;
КонецЕсли;
КонецЕсли;

КонецЦикла;
КонецЦикла;
КонецЦикла;
КонецЦикла;

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



ПОМОГИТЕ ПОЖАЛУЙСТА ПРЕОБРАЗОВАТЬ КОД ПОД ПЕРВИЧНЫЙ КОД XML

Теги: XML запись xml 

Похожие темы (5)

Рейтинг@Mail.ru

Поиск