8.х XML сериализация

Тема в разделе "Общие вопросы "1С:Предприятие 8"", создана пользователем Salmishskay2516, 6 ноя 2012.

  1. TopicStarter Overlay
    Salmishskay2516
    Offline

    Salmishskay2516 Опытный в 1С

    Регистрация:
    1 ноя 2012
    Сообщения:
    143
    Симпатии:
    0
    Баллы:
    26
    Здравствуйте. Не совсем понятно как преобразовать данные 1с в XML вид и обратно. Допустим у меня есть справочник номенклатура. Как мне преобразовать данные этого справочник в xml вид? Знаю метод записатьXML().
  2. n.s.gnedash
    Offline

    n.s.gnedash Опытный в 1С Команда форума

    Регистрация:
    15 авг 2010
    Сообщения:
    1.358
    Симпатии:
    5
    Баллы:
    29
    ЗаписьXML смотри в СП
  3. TopicStarter Overlay
    Salmishskay2516
    Offline

    Salmishskay2516 Опытный в 1С

    Регистрация:
    1 ноя 2012
    Сообщения:
    143
    Симпатии:
    0
    Баллы:
    26
    Ошибся ЗаписьXML.

    Примерно так


    &НаКлиенте
    Процедура Команда1(Команда)


    ЗаписьXML = новый ЗаписьXML;
    ЗаписьXML.ОткрытьФайл("C:\Документ.xml");

    Выборка = Справочники.Номенклатура.Выбрать();

    Пока Выборка.Следующий() Цикл




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

    Что в нутри писать не понятно?
  4. Yuriy_Alexandrovich
    Offline

    Yuriy_Alexandrovich Профессионал в 1С Команда форума

    Регистрация:
    15 сен 2011
    Сообщения:
    1.275
    Симпатии:
    76
    Баллы:
    54
    пример (для разбора и поиска идей)
    Код:
    МойXML  = Новый ЗаписьXML;
    
    ДополнениеКИмениФайла = Формат(ДеньГода(ТекущаяДата()),"ЧВН; ЧРГ=""""") + Формат(Час(ТекущаяДата()),"ЧВН; ЧРГ=""""") + Формат(Минута(ТекущаяДата()),"ЧВН; ЧРГ=""""");
    
    ИмяФайлаXML = "D:\Temp\" + ДополнениеКИмениФайла + "_Exchange.xml";
    
    ПараметрыЗаписиXML = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Ложь);
    
    МойXML.ОткрытьФайл(ИмяФайлаXML, ПараметрыЗаписиXML);
    МойXML.ЗаписатьОбъявлениеXML();
    
    Объект = СериализаторXDTO.ЗаписатьXDTO(ОбъектДанных);
    
    ФабрикаXDTO.ЗаписатьXML(МойXML, Объект);
    
    МойXML.Закрыть();
    
  5. TopicStarter Overlay
    Salmishskay2516
    Offline

    Salmishskay2516 Опытный в 1С

    Регистрация:
    1 ноя 2012
    Сообщения:
    143
    Симпатии:
    0
    Баллы:
    26
    Не понятны вот эти строки

    Объект = СериализаторXDTO.ЗаписатьXDTO(ОбъектДанных);

    ФабрикаXDTO.ЗаписатьXML(МойXML, Объект);
  6. Yuriy_Alexandrovich
    Offline

    Yuriy_Alexandrovich Профессионал в 1С Команда форума

    Регистрация:
    15 сен 2011
    Сообщения:
    1.275
    Симпатии:
    76
    Баллы:
    54
    смотри в синтаксис помощнике, там есть описание, в этом коде "ОбъектДанных" - ссылка на элемент в базе, который можно "сериализовать", список значений, таблица значений, элемент справочника и т.п.
  7. TopicStarter Overlay
    Salmishskay2516
    Offline

    Salmishskay2516 Опытный в 1С

    Регистрация:
    1 ноя 2012
    Сообщения:
    143
    Симпатии:
    0
    Баллы:
    26
    Не понятно что ты записал в этот файл? Какие данные?
  8. Yuriy_Alexandrovich
    Offline

    Yuriy_Alexandrovich Профессионал в 1С Команда форума

    Регистрация:
    15 сен 2011
    Сообщения:
    1.275
    Симпатии:
    76
    Баллы:
    54
    Сериализатор нам дает "XML Data Transfer Objects" из переданного объекта, а далее с помощью фабрики этот объект записываем как XML
  9. TopicStarter Overlay
    Salmishskay2516
    Offline

    Salmishskay2516 Опытный в 1С

    Регистрация:
    1 ноя 2012
    Сообщения:
    143
    Симпатии:
    0
    Баллы:
    26
    Не понятно я новичок.
  10. Yuriy_Alexandrovich
    Offline

    Yuriy_Alexandrovich Профессионал в 1С Команда форума

    Регистрация:
    15 сен 2011
    Сообщения:
    1.275
    Симпатии:
    76
    Баллы:
    54
    "F1" переключаешь на закладку "Индекс", вбиваешь "СериализаторXDTO.ЗаписатьXDTO" и внимательно читаем, что там написано, желательно еще и по ссылкам пройти. Иначе никак
  11. TopicStarter Overlay
    Salmishskay2516
    Offline

    Salmishskay2516 Опытный в 1С

    Регистрация:
    1 ноя 2012
    Сообщения:
    143
    Симпатии:
    0
    Баллы:
    26
    СериализаторXDTO.ЗаписатьXDTO(Значение)

    Передаётся значение произвольного типа в этот метод так?

    Возвращается ОбъектXDTO так?
  12. TopicStarter Overlay
    Salmishskay2516
    Offline

    Salmishskay2516 Опытный в 1С

    Регистрация:
    1 ноя 2012
    Сообщения:
    143
    Симпатии:
    0
    Баллы:
    26
    Что записался в этот файл?
  13. Yuriy_Alexandrovich
    Offline

    Yuriy_Alexandrovich Профессионал в 1С Команда форума

    Регистрация:
    15 сен 2011
    Сообщения:
    1.275
    Симпатии:
    76
    Баллы:
    54
    А далее ФабрикаXDTO записывает объект типа XDTO (и именно объект или элемент xdto) в XML

    ну думаю xml вы видели как устроен

    тут вся фишка в том, что перед формированием xml - ки, объект нужно сериализовать (преобразовать к некоторому виду XDTO) для чего и нужен сериализатор, а далее сериализованный объект уже преобразовывается в xml с помощью "фабрики".
    Но конечно можно и свой механизм написать :))))
  14. TopicStarter Overlay
    Salmishskay2516
    Offline

    Salmishskay2516 Опытный в 1С

    Регистрация:
    1 ноя 2012
    Сообщения:
    143
    Симпатии:
    0
    Баллы:
    26
    Можете ли вы привести пример записи какого ли бо справочника или документа. МойXML = Новый ЗаписьXML;

    ДополнениеКИмениФайла = Формат(ДеньГода(ТекущаяДата()),"ЧВН; ЧРГ=""""") + Формат(Час(ТекущаяДата()),"ЧВН; ЧРГ=""""") + Формат(Минута(ТекущаяДата()),"ЧВН; ЧРГ=""""");

    ИмяФайлаXML = "D:\Temp\" + ДополнениеКИмениФайла + "_Exchange.xml";

    ПараметрыЗаписиXML = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Ложь);

    МойXML.ОткрытьФайл(ИмяФайлаXML, ПараметрыЗаписиXML);
    МойXML.ЗаписатьОбъявлениеXML();

    Объект = СериализаторXDTO.ЗаписатьXDTO(ОбъектДанных);

    ФабрикаXDTO.ЗаписатьXML(МойXML, Объект);

    МойXML.Закрыть();
  15. n.s.gnedash
    Offline

    n.s.gnedash Опытный в 1С Команда форума

    Регистрация:
    15 авг 2010
    Сообщения:
    1.358
    Симпатии:
    5
    Баллы:
    29
    так я выгружаю и бух 2.0 документы реализации
    Код:
    ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.ОткрытьФайл(ПутьКФайлу,"windows-1251");
    ЗаписьXML.ЗаписатьОбъявлениеXML();
    ЗаписьXML.ЗаписатьНачалоЭлемента("Данные");
    
    Для каждого СтрТаб Из Таб1 Цикл
    Состояние("Записывается документ № "+ СокрЛП(Строка(СтрТаб.Документ.Номер))+ " от " + СокрЛП(Строка(Формат(СтрТаб.Документ.Дата,"ДФ=dd.MM.yy"))));
    ЗаписьXML.ЗаписатьНачалоЭлемента("Документ");
    ЗаписьXML.ЗаписатьАтрибут("Номер",СокрЛП(Строка(СтрТаб.Документ.Номер)));
    ЗаписьXML.ЗаписатьАтрибут("Дата",СокрЛП(Строка(Формат(СтрТаб.Документ.Дата,"ДФ=dd.MM.yy"))));
    ЗаписьXML.ЗаписатьАтрибут("Курс",СокрЛП(Строка(СтрТаб.Документ.КурсВзаиморасчетов)));
    ЗаписьXML.ЗаписатьАтрибут("ПокупательНаименование",СокрЛП(Строка(СтрТаб.Документ.Контрагент.Наименование)));
    ЗаписьXML.ЗаписатьАтрибут("ПокупательИНН",СокрЛП(Строка(СтрТаб.Документ.Контрагент.ИНН)));
    Для Каждого Товар из СтрТаб.Документ.Товары Цикл  
    ВсегоСНДС = 0;
    ЗаписьXML.ЗаписатьНачалоЭлемента("Товар");
    ЗаписьXML.ЗаписатьАтрибут("Наименование",СокрЛП(Строка(Товар.Номенклатура)));
    ЗаписьXML.ЗаписатьАтрибут("НомНомер",СокрЛП(Строка(Товар.Номенклатура.Код)));
    Если Товар.Номенклатура.НомерГТД.Пустая() Тогда
    Сообщить("У Товара "+СокрЛП(Строка(Товар.Номенклатура))+ " не заполнен номер ГТД!");
    КонецЕсли;
    ЗаписьXML.ЗаписатьАтрибут("НомерГТД",СокрЛП(Строка(Товар.Номенклатура.НомерГТД)));
    Колич =  СокрЛП(СтрЗаменить(Строка(Товар.Количество),",","."));
    ЗаписьXML.ЗаписатьАтрибут("Количество",Колич);
    ЗаписьXML.ЗаписатьАтрибут("ЕдИзм",СокрЛП(Строка(Товар.Номенклатура.БазоваяЕдиницаИзмерения)));
    ЦенаБезНДС1 = СтрЗаменить(Строка(Товар.Цена),",",".");
    ЦенаБезНДС = СтрЗаменить(ЦенаБезНДС1,Символы.НПП,"");
    ЗаписьXML.ЗаписатьАтрибут("ЦенаБезНДС",СокрЛП(ЦенаБезНДС));
    СуммаБезНДС1 = СтрЗаменить(Строка(Товар.Сумма),",",".");
    СуммаБезНДС = СтрЗаменить(СуммаБезНДС1,Символы.НПП,"");
    ЗаписьXML.ЗаписатьАтрибут("СуммаБезНДС",СокрЛП(СуммаБезНДС));
    ЗаписьXML.ЗаписатьАтрибут("СтНдс",СокрЛП(Строка(Товар.СтавкаНДС)));
    СуммаНдс1 = СтрЗаменить(Строка(Товар.СуммаНДС),",",".");
    СуммаНдс = СтрЗаменить(СуммаНдс1,Символы.НПП,"");
    ЗаписьXML.ЗаписатьАтрибут("СуммаНдс",СокрЛП(Строка(СуммаНдс)));
    ВсегоСНДС = Товар.Сумма+ Товар.СуммаНДС;
    ВсегоСНДС1 = СтрЗаменить(Строка(ВсегоСНДС),",",".");
    ВсегоСНДС = СтрЗаменить(ВсегоСНДС1,Символы.НПП,"");
    ЗаписьXML.ЗаписатьАтрибут("ВсегоСНДС",СокрЛП(Строка(ВсегоСНДС)));
    ЗаписьXML.ЗаписатьАтрибут("КодОкеи",СокрЛП(Строка(Товар.Номенклатура.БазоваяЕдиницаИзмерения.Код)));
    Страна = Товар.Номенклатура.СтранаПроисхождения;
    Если Товар.Номенклатура.СтранаПроисхождения.Пустая() Тогда
    Страна = Справочники.КлассификаторСтранМира.Россия;
    ЗаписьXML.ЗаписатьАтрибут("Страна",СокрЛП(Строка(Страна)));
    ЗаписьXML.ЗаписатьАтрибут("КодОксм",СокрЛП(Строка(Страна.Код)));
    Иначе
    ЗаписьXML.ЗаписатьАтрибут("Страна",СокрЛП(Строка(Страна)));
    ЗаписьXML.ЗаписатьАтрибут("КодОксм",СокрЛП(Строка(Страна.Код)));
    КонецЕсли;
    ЗаписьXML.ЗаписатьКонецЭлемента();
    КонецЦикла;
    
    ЗаписьXML.ЗаписатьКонецЭлемента(); 
    КонецЦикла;
    
    ЗаписьXML.ЗаписатьКонецЭлемента(); 
    ЗаписьXML.Закрыть();
  16. TopicStarter Overlay
    Salmishskay2516
    Offline

    Salmishskay2516 Опытный в 1С

    Регистрация:
    1 ноя 2012
    Сообщения:
    143
    Симпатии:
    0
    Баллы:
    26
    Что значит ЗаписьXML.ЗаписатьНачалоЭлемента("Данные"); ???
  17. n.s.gnedash
    Offline

    n.s.gnedash Опытный в 1С Команда форума

    Регистрация:
    15 авг 2010
    Сообщения:
    1.358
    Симпатии:
    5
    Баллы:
    29
    В итоге получаем такой файл - там 1 документ, в таб части 2 товара...

    Код:
    <?xml version="1.0" encoding="windows-1251"?>
    <Данные>
    <Документ Номер="00000000383" Дата="01.08.12" Курс="1" ПокупательНаименование="СЕК, СтройЕвроКомплект ООО" ПокупательИНН="">
    <Товар Наименование="бензин 92" НомНомер="000000835" НомерГТД="" Количество="124" ЕдИзм="Л" ЦенаБезНДС="30" СуммаБезНДС="3720" СтНдс="Без НДС" СуммаНдс="0" ВсегоСНДС="3720" КодОкеи="112" Страна="РОССИЯ" КодОксм="643"/>
    <Товар Наименование="бензин 95" НомНомер="000000814" НомерГТД="" Количество="124" ЕдИзм="Л" ЦенаБезНДС="35" СуммаБезНДС="4340" СтНдс="Без НДС" СуммаНдс="0" ВсегоСНДС="4340" КодОкеи="112" Страна="РОССИЯ" КодОксм="643"/>
    </Документ>
    </Данные>
    
  18. TopicStarter Overlay
    Salmishskay2516
    Offline

    Salmishskay2516 Опытный в 1С

    Регистрация:
    1 ноя 2012
    Сообщения:
    143
    Симпатии:
    0
    Баллы:
    26
    ЗаписьXML.ЗаписатьНачалоЭлемента("Данные") это вот это <Данные> </Данные> Понятно.

    А начало где?

    Вот эта часть не понятна?


    Для каждого СтрТаб Из Таб1 Цикл
  19. n.s.gnedash
    Offline

    n.s.gnedash Опытный в 1С Команда форума

    Регистрация:
    15 авг 2010
    Сообщения:
    1.358
    Симпатии:
    5
    Баллы:
    29
    какое начало? это я уже отправил то, что получилось в итоге... там и Начало (ДАННЫЕ) и Конец (/Данные)
    там уже хранится ( в этих данных) другие теги, в моем случае это Документ
    т.е. Данные 1 раз на весь XML

    <Данные>

    <Документ>
    Тут описываешь поля документа 1
    </Документ>

    <Документ>
    Тут описываешь поля документа 2
    </Документ>


    <Документ>
    Тут описываешь поля документа 3
    </Документ>

    <Документ>
    Тут описываешь поля документа N
    </Документ>

    </Данные>

    Для каждого СтрТаб.... на это пока не обращай внимание, я просто скопировал из своей рабочей обработки...
    на форме есть таблица(Таб1), в ней список документов. я перебираю каждый документ по очереди и записываю его
  20. TopicStarter Overlay
    Salmishskay2516
    Offline

    Salmishskay2516 Опытный в 1С

    Регистрация:
    1 ноя 2012
    Сообщения:
    143
    Симпатии:
    0
    Баллы:
    26
    Покажи код или картинку.
Похожие темы
  1. vika
    Ответов:
    1
    Просмотров:
    1.250
  2. MAGMA177
    Ответов:
    1
    Просмотров:
    686
Загрузка...

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