|
Ошибка в обработке загрузка выгрузка 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() будет таблица значений.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |