Имя: Пароль:
1C
1С v8
Чтение файла 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) супер!