Имя: Пароль:
1C
1С v8
Ошибка в обработке загрузка выгрузка XML
0 Черника
 
23.03.22
17:36
Люди добрые помогите, кто чем может. Ошибка при загрузке из файла
Обработка выгрузки и загрузки файла XML

Сам код:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
    НачалоПериода = НачалоГода(ТекущаяДата());
    КонецПериода = КонецГода(ТекущаяДата());
КонецПроцедуры

&НаКлиенте
Процедура Выгрузить(Команда)
    АдресФайлаВоВременномХранилище = "";
    ВыгрузитьНаСервере(АдресФайлаВоВременномХранилище);
    ПолучитьФайл(АдресФайлаВоВременномХранилище, "Выгрузка.xml");
КонецПроцедуры

&НаСервере
Функция ВыгрузитьНаСервере(АдресФайлаВоВременномХранилище)
    Расширение = ".xml";
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла(Расширение);
    
        //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
    // Данный фрагмент построен конструктором.
    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
    
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    РасходныйКассовыйОрдер.Номер КАК Номер,
        |    РасходныйКассовыйОрдер.Дата КАК Дата,
        |    РасходныйКассовыйОрдер.Получатель КАК Получатель,
        |    РасходныйКассовыйОрдер.Сумма КАК Сумма
        |ИЗ
        |    Документ.РасходныйКассовыйОрдер КАК РасходныйКассовыйОрдер
        |ГДЕ
        |    РасходныйКассовыйОрдер.Дата >= &Дата1
        |    И РасходныйКассовыйОрдер.Дата <= &Дата2";
    
    
    Запрос.УстановитьПараметр("Дата1", НачалоПериода);
    Запрос.УстановитьПараметр("Дата2", КонецПериода);    
    Выборка = Запрос.Выполнить().Выгрузить();
    
    //заполняем файло    
    ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.ОткрытьФайл(ИмяВременногоФайла,"UTF-8");
    ЗаписьXML.ЗаписатьОбъявлениеXML();
    ЗаписьXML.ЗаписатьНачалоЭлемента("Выгрузка");
    Для Каждого СТР Из Выборка Цикл
        ЗаписьXML.ЗаписатьНачалоЭлемента("НовыйДокумент");
        
        ЗаписьXML.ЗаписатьНачалоЭлемента("Номер");
        ЗаписьXML.ЗаписатьТекст(XMLСтрока(СТР.Номер));
        ЗаписьXML.ЗаписатьКонецЭлемента();
        
        ЗаписьXML.ЗаписатьНачалоЭлемента("Дата");
        ЗаписьXML.ЗаписатьТекст(XMLСтрока(СТР.Дата));
        ЗаписьXML.ЗаписатьКонецЭлемента();
        
        ЗаписьXML.ЗаписатьНачалоЭлемента("Получатель");
        ЗаписьXML.ЗаписатьТекст(XMLСтрока(СТР.Получатель));
        ЗаписьXML.ЗаписатьКонецЭлемента();
        
        ЗаписьXML.ЗаписатьНачалоЭлемента("Сумма");
        ЗаписьXML.ЗаписатьТекст(XMLСтрока(СТР.Сумма));
        ЗаписьXML.ЗаписатьКонецЭлемента();
        
        //ЗаписьXML.ЗаписатьКонецЭлемента();
    КонецЦикла;
    ЗаписьXML.ЗаписатьКонецЭлемента();
    ЗаписьXML.Закрыть();
    //заполняем файло    
    
    Файл = Новый Файл(ИмяВременногоФайла);    
    Если Файл.Существует() Тогда        
        ДвоичныеДанные = Новый ДвоичныеДанные(ИмяВременногоФайла);
        АдресФайлаВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор);
        УдалитьФайлы(ИмяВременногоФайла);        
    КонецЕсли;    

КонецФункции


&НаКлиенте
Процедура Загрузить(Команда)
    ПриЗавершении = Новый ОписаниеОповещения("ПоместитьФайлКомандаЗавершение", ЭтотОбъект);
    ПередПомещением = Новый ОписаниеОповещения("ПоместитьФайлКомандаПередПомещением", ЭтотОбъект);
    ДиалогВыбораФайлов = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    ДиалогВыбораФайлов.Заголовок = "Выбор файла для помещения";
    ДиалогВыбораФайлов.МножественныйВыбор = Ложь;
    ДиалогВыбораФайлов.Фильтр = "Файлы выгрузки|*.xml";
    НачатьПомещениеФайла(ПриЗавершении, , ДиалогВыбораФайлов, Истина, , ПередПомещением);
КонецПроцедуры

&НаКлиенте
Процедура ПоместитьФайлКомандаЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
    Если Результат Тогда
        ОбработатьНаСервере(Адрес);
        ОповеститьОбИзменении(Тип("ДокументСсылка.РасходныйКассовыйОрдер"));
        Сообщить("Загрузка завершена");
    Иначе
        Сообщить("Всетаки нужно было что-то выбрать");
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПоместитьФайлКомандаПередПомещением(ПомещаемыйФайл, ОтказОтПомещенияФайла, ДополнительныеПараметры) Экспорт
    Если ПомещаемыйФайл.Размер() > 4*1024*1024 Тогда
        ПоказатьПредупреждение(, "Превышен максимальный размер файла");
        ОтказОтПомещенияФайла = Истина;
    КонецЕсли;
    Файл = ПомещаемыйФайл.Файл.ПолноеИмя;
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ОбработатьНаСервере(Адрес)
    Данные = ПолучитьИзВременногоХранилища(Адрес);
    Парсер = Новый ЧтениеXML;
    Парсер.УстановитьСтроку(ПолучитьСтрокуИзДвоичныхДанных(Данные,КодировкаТекста.UTF8));
    Пока Парсер.Прочитать() Цикл
        
        Если (Парсер.Имя = "НовыйДокумент") И (Парсер.ТипУзла = ТипУзлаXML.НачалоЭлемента) Тогда
            НовыйДокумент = Документы.РасходныйКассовыйОрдер.СоздатьДокумент();
        КонецЕсли;
        
        Если (Парсер.Имя = "НовыйДокумент") И (Парсер.ТипУзла = ТипУзлаXML.КонецЭлемента) Тогда
            Попытка
                НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
            Исключение
            КонецПопытки;
        КонецЕсли;
        
        Если (Парсер.Имя = "Номер") И (Парсер.ТипУзла = ТипУзлаXML.НачалоЭлемента) Тогда
            Если Парсер.Прочитать() Тогда
                НовыйДокумент.Номер = Парсер.Значение;
            КонецЕсли;
        КонецЕсли;
        
        Если (Парсер.Имя = "Дата") И (Парсер.ТипУзла = ТипУзлаXML.НачалоЭлемента) Тогда
            Если Парсер.Прочитать() Тогда
                НовыйДокумент.Дата = XmlЗначение(Тип("Дата"), Парсер.Значение);
            КонецЕсли;
        КонецЕсли;
        
        Если (Парсер.Имя = "Получатель") И (Парсер.ТипУзла = ТипУзлаXML.НачалоЭлемента) Тогда
            Если Парсер.Прочитать() Тогда
                НовыйДокумент.Получатель = Парсер.Значение;
            КонецЕсли;
        КонецЕсли;
        
        Если (Парсер.Имя = "Сумма") И (Парсер.ТипУзла = ТипУзлаXML.НачалоЭлемента) Тогда
            НовыйДокумент.Получатель = Парсер.Значение;
        КонецЕсли;
        
                
    КонецЦикла;
    Парсер.Закрыть();
    
КонецПроцедуры

Ошибка:
Ошибка при вызове метода контекста (Прочитать)
{Обработка.ВыгрузкаИЗагрузка.Форма.Форма.Форма(117)}:    Пока Парсер.Прочитать() Цикл
{Обработка.ВыгрузкаИЗагрузка.Форма.Форма.Форма(95)}:        ОбработатьНаСервере(Адрес);
по причине:
Ошибка разбора XML:  - [23,34]
Фатальная ошибка:
Extra content at the end of the document


по причине:
Ошибка разбора XML:  - [23,34]
Фатальная ошибка:
Extra content at the end of the document
1 Fragster
 
гуру
23.03.22
17:45
а чо просто сериализатором ТЗ в xml напрямую не фигануть?
2 acht
 
23.03.22
17:48
(0) А узел НовыйДокумент закрывать кто будет?
Файло оно заполняет...
3 Kassern
 
23.03.22
17:49
(2) закоменчено)
4 Kassern
 
23.03.22
17:51
(0) Есть такой замечательный метод, называется ЗаписатьXML() Очень вам поможет сократить код и сделать его более читаемым. Например вот такой кусок:
        ЗаписьXML.ЗаписатьНачалоЭлемента("Номер");
        ЗаписьXML.ЗаписатьТекст(XMLСтрока(СТР.Номер));
        ЗаписьXML.ЗаписатьКонецЭлемента();

Можно просто заменить на: ЗаписатьXML(ЗаписьXML,"Номер",СТР.Номер)
5 Черника
 
23.03.22
18:05
Спасибо всем за комментарии, но не подскажите как исправить данную ошибку по подробнее
6 Черника
 
23.03.22
18:12
Спасибо сериализатор решил проблему, спасибо
7 Fragster
 
гуру
23.03.22
18:13
на вход в СериализаторXDTO.ЗаписатьXML() таблицу значений (результатзапроса.Выгрузить) и на выходе из СериализаторXDTO.ПрочитатьXML() будет таблица значений.