|
Чтение файла xdto | ☑ | ||
---|---|---|---|---|
0
Franchiser
гуру
22.11.19
✎
19:38
|
Есть обработка которая считывает данные из файла xml с использование xsd через фабрику xdto в пустой конфигурации с режимом совместимости 8.2.16.
Если поменять режим на 8.3.12 то вылетает ошибка на этапе чтение файла, с чем может быть связана ошибка? |
|||
1
runoff_runoff
22.11.19
✎
20:00
|
озвучить ошибку - почти половина решения вопроса
|
|||
2
Franchiser
гуру
22.11.19
✎
20:34
|
ВсеДанные = Сериализатор.Фабрика.ПрочитатьXML(ЧтениеХМЛ, Сериализатор.Фабрика.Тип("http://www.mycompany.com","Данные"));
по причине: Ошибка преобразования данных XDTO: Чтение объекта типа: {http://www.mycompany.com}Данные - [1,402] Проверка дополнительного свойства: форма: Элемент имя: {http://www.mycompany.com}ДатаВыгрузки по причине: Ошибка проверки данных XDTO: Структура объекта не соответствует типу: {http://www.mycompany.com}Данные |
|||
3
Franchiser
гуру
22.11.19
✎
22:21
|
Проверил: перестает работать начиная с режима совместимости 8.3.8
|
|||
4
Сияющий в темноте
22.11.19
✎
23:08
|
проверяй кодировку
у меня на 8.3.14 ЧтениеXML просто не стало читать файл с русскими буквами в кодировке utf8,он в них там какую то лабуду вставляет местами. |
|||
5
Franchiser
гуру
23.11.19
✎
02:36
|
если читать так:
ВсеДанные = Сериализатор.Фабрика.ПрочитатьXML(ЧтениеХМЛ) то работает с 8.3.8. Но все элементы типа dateTime пространства http://www.w3.org/2001/XMLSchema отображаются как строки, а не Дата. |
|||
6
runoff_runoff
23.11.19
✎
03:59
|
а если попробовать вот так (без Сериализатор)
ФабрикаXDTO.ПрочитатьXML(ЧтениеXML) |
|||
7
dmpl
23.11.19
✎
08:27
|
(2) namespace у фабрики правильный?
|
|||
8
Franchiser
гуру
23.11.19
✎
10:42
|
(7) не знаю, как проверить
|
|||
9
novichok79
23.11.19
✎
10:46
|
в заголовке схемы есть атрибут targetNamespace, он всегда должен быть указан, иначе 1С не читает это дело. хотя, если работало до 8.3.8, то дело не в нем.
|
|||
10
Franchiser
гуру
23.11.19
✎
10:48
|
(9) да, указано
|
|||
11
Franchiser
гуру
23.11.19
✎
10:55
|
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://www.mycompany.com" xmlns:ns1="http://v8.1c.ru/8.1/data/core" targetNamespace="http://www.mycompany.com" elementFormDefault="unqualified" attributeFormDefault="unqualified"> <xs:import namespace="http://v8.1c.ru/8.1/data/core" schemaLocation="file:///C:/Work/XSD81/core.xsd"/> <xs:complexType name="Данные"> <xs:sequence> <xs:element name="ДатаВыгрузки" type="xs:dateTime" nillable="true" minOccurs="0"/> <xs:element name="ПериодВыгрузки" type="tns:ПериодВыгрузки" nillable="true" minOccurs="0"/> <xs:element name="ГруппыАртикулов" type="tns:ГруппаАртикулов" minOccurs="0" maxOccurs="unbounded"/> <xs:element name="СоставГруппАртикулов" type="tns:Таблица" minOccurs="0"/> <xs:element name="ПараметрыСпецификаций" type="tns:ПараметрСпецификации" minOccurs="0" maxOccurs="unbounded"/> <xs:element name="Спецификации" type="tns:Спецификация" minOccurs="0" maxOccurs="unbounded"/> <xs:element name="Документы" type="tns:Документ" minOccurs="0" maxOccurs="unbounded"/> <xs:element name="Аналоги" type="tns:Таблица" minOccurs="0"/> <xs:element name="ВыпускПродукции" type="tns:Таблица" nillable="true" minOccurs="0"/> <xs:element name="Затраты" type="tns:Таблица" nillable="true" minOccurs="0"/> <xs:element name="РаспределениеЗатратНаПродукцию" type="tns:Таблица" nillable="true" minOccurs="0"/> </xs:sequence> </xs:complexType> |
|||
12
Franchiser
гуру
23.11.19
✎
10:55
|
Спотыкается на элементе ДатаВыгрузки
|
|||
13
Franchiser
гуру
23.11.19
✎
11:03
|
Почему он не соответствует типу "Данные"?
|
|||
14
dmpl
23.11.19
✎
11:06
|
(9) В 8.2 namespace можно было указать программно, в свежих 8.3 оно берется из файла, игнорируя то, что указано программно.
|
|||
15
dmpl
23.11.19
✎
11:08
|
(13) А как выглядит эта дата? Может сам формат строки теперь не соответствует этому типу?
|
|||
16
Franchiser
гуру
23.11.19
✎
11:09
|
В типе Данные можно указывать типы из пространства xs, а не tns?
|
|||
17
Franchiser
гуру
23.11.19
✎
11:11
|
(15) дата в формате xml
2001-10-26T21:32:52 |
|||
18
dmpl
23.11.19
✎
11:12
|
(16) Можно попробовать импортировать схему в XDTO-пакет и потом экспортировать обратно. 1С, НЯП, имеет особенности при работе со схемами, а импорт-экспорт приводит схему к тому виду, который 1С должна понимать.
|
|||
19
Franchiser
гуру
23.11.19
✎
11:14
|
(18) схема передают из другой системы вместе с файлом, не хотелось бы ничего менять. Потом, я уже так делал: добавлял в конфу пакет и выгружал.
|
|||
20
dmpl
23.11.19
✎
11:14
|
Еще можно попробовать сделать обратное преобразование - не чтение по этой схеме, а запись - тогда, возможно, по различию в файлах станет понятнее, что не нравится 1С.
|
|||
21
dmpl
23.11.19
✎
11:15
|
+(20) Ну и записанное должно прочитаться, иначе это уже какая-то бага 1С, если она не может прочитать то, что сама записала.
|
|||
22
Franchiser
гуру
23.11.19
✎
11:15
|
Дата должна преобразовываться xdto автоматически?
|
|||
23
acht
23.11.19
✎
11:19
|
(19) > схема передают из другой системы вместе с файлом,
Тогда для чтения надо использовать не глобальную ФабрикуXDTO (она весьма неявно завязана на текущую конфигурацию и ее пакеты), а создавать по схемам свой объект типа ФабрикаXDTO и читать им. |
|||
24
Franchiser
гуру
23.11.19
✎
11:20
|
Я до конца не понимаю для чего нужен второй параметр в методе фабрики ПрочитатьXML().
|
|||
25
dmpl
23.11.19
✎
11:20
|
(22) ПрочитатьXML(), НЯП, не генерит типы 1С, они появляются только при чтении XDTO.
|
|||
26
Franchiser
гуру
23.11.19
✎
11:21
|
(23) так и делается: создаётся набор схем
|
|||
27
acht
23.11.19
✎
11:22
|
А хотя у тебя похоже так и есть - Сериализатор.Фабрика откуд берется?
|
|||
28
acht
23.11.19
✎
11:23
|
(24) Для подсказки как интерпретировать объект, если не удалось определить текущий тип по состоянию чтения XML
|
|||
29
Franchiser
гуру
23.11.19
✎
11:23
|
АрхивДанных = Новый Файл(ПолучитьИмяВременногоФайла());
ПолучитьИзВременногоХранилища(Данные[0].Хранение).Записать(АрхивДанных.ПолноеИмя); КаталогИзвлечения = РаспаковатьДанные(АрхивДанных); ФайлыДанных = НайтиФайлы(КаталогИзвлечения.ПолноеИмя,"*.xml")[0]; ФайлСхемы = НайтиФайлы(КаталогИзвлечения.ПолноеИмя,"*.xsd")[0]; Сериализатор = Новый СериализаторXDTO(ИнициализироватьСхему(ФайлСхемы)); ЧтениеХМЛ.ОткрытьФайл(ФайлыДанных.ПолноеИмя) |
|||
30
dmpl
23.11.19
✎
11:25
|
(24) Можно явно указать тип значения (на случай если из файла невозможно определить тип однозначно).
|
|||
31
dmpl
23.11.19
✎
11:27
|
(29) ЧтениеХМЛ - стоит проверить namespaceURI у этого объекта, чтобы убедиться, что 1С правильно поняла его.
|
|||
32
Franchiser
гуру
23.11.19
✎
11:28
|
(30) так там разные типы из пространства tns и xs. О каком типе речь?
|
|||
33
Franchiser
гуру
23.11.19
✎
11:29
|
(31) смотрел, часть в uri было квадратиками, но так было и до 8.3.8. что раньше uri не проверялся?
|
|||
34
dmpl
23.11.19
✎
11:32
|
(33) Раньше программные действия позволяли переопределить его своим. А в 8.3 (возможно как раз с версии 8.3.9) это уже не работает. Я бы копал в эту сторону - для начала поправил бы исходный файл так, чтобы квадратиков не было.
|
|||
35
Franchiser
гуру
23.11.19
✎
11:34
|
Начиная с 8.3.8
|
|||
36
Franchiser
гуру
23.11.19
✎
11:36
|
(34) откуда Uri берется?
|
|||
37
Franchiser
гуру
23.11.19
✎
11:39
|
Файл xml читается с тэга <Данные>
|
|||
38
Franchiser
гуру
23.11.19
✎
11:39
|
Начинается...
|
|||
39
dmpl
23.11.19
✎
11:42
|
(36) Из самого файла. Именно для этого надо сделать обратное преобразование, чтобы увидеть, какую структуру ожидает 1С.
(37) Проблема, скорее всего, в этом. Надо добавить атрибут с указанием namespace, записать XML и заново его начать читать. |
|||
40
Franchiser
гуру
23.11.19
✎
12:02
|
(39) да есть mamespace в xml
|
|||
41
runoff_runoff
23.11.19
✎
22:14
|
дайте файлик загрузить
прогоню его через загрузку ГТД в отладчике |
|||
42
Franchiser
гуру
23.11.19
✎
22:17
|
(41) скинь почту, что за загрузка ГТД?
|
|||
43
runoff_runoff
23.11.19
✎
22:46
|
(42) хочу проверить (6), т.е. прочитать его чисто как xml
[email protected] |
|||
44
Сияющий в темноте
24.11.19
✎
00:06
|
вообще,на русских именах полей в кодировке utf8 ЧтениеXML валится в произвольном месте,точнее,где двухбайтовый символ на границу буфера попадает-и это баг 1с,так как она же этот файл записывает.
И чего делать-не понятно,читатель от Mictosoft хавает такие файлы на ура. |
|||
45
Franchiser
гуру
24.11.19
✎
10:07
|
(42) как в (6) чисто читает без 2го параметра, но тогда дата получается как текст
|
|||
46
Franchiser
гуру
24.11.19
✎
14:05
|
Добавил схему в пакет конфигурации, записал данные, потом считал. Все нормально читает если внести изменения в тэги xml файла:
<Данные xmlns="http://www.mycompany.com" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <ДатаВыгрузки xmlns="">2019-11-24T13:47:34</ДатаВыгрузки> <ГруппыАртикулов xmlns="" xmlns:d2p1="http://www.mycompany.com"> <УникальныйИдентификатор>c3b227ee-046b-490b-83a0-4b97a9d5b2a8</УникальныйИдентификатор> <Код>123</Код> <Наименование>тест</Наименование> </ГруппыАртикулов> </Данные> Т.е. в ДатаВыгрузки добавилось xmlns="". В ГруппыАртикулов добавилось xmlns="" xmlns:d2p1="http://www.mycompany.com". Можно ли обойтись без этих приписок? |
|||
47
Franchiser
гуру
24.11.19
✎
14:21
|
Так еще работает:
<Данные xmlns="http://www.myacompany.com" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="http://www.myacompany.com"> <ДатаВыгрузки xmlns="">2019-11-24T13:47:34</ДатаВыгрузки> <ГруппыАртикулов xmlns=""> <УникальныйИдентификатор>c3b227ee-046b-490b-83a0-4b97a9d5b2a8</УникальныйИдентификатор> <Код>123</Код> <Наименование>тест</Наименование> </ГруппыАртикулов> </Данные> |
|||
48
Franchiser
гуру
24.11.19
✎
14:30
|
Вообщем пришел к выводы, что проблему можно решить путем замены в первой строке:
<Данные xmlns="http://www.mycompany.com" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> На: <Данные xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="http://www.mycompany.com"> |
|||
49
Franchiser
гуру
24.11.19
✎
23:06
|
Нашел еще вариант решения с избавлением от xmlns="".
Проставить в схеме "Квалифицированная форма элемента" = Истина. |
|||
50
rozer76
25.11.19
✎
08:59
|
(49) супер!
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |