Сериал типа мистер ошибка

При входе в базу 1с вы можете увидеть “Ошибка преобразования данных XDTO:

Начало Свойства: errorProcessingSettings

Форма: Элемент

Тип: {http://v8.1c.ru/8.2/managed-application/core}ErrorProcessingSettings по причине

Чаще всего ошибка возникает при определенном типе запуска: это либо через тонкий клиент, либо через линк42, случаи бывают разные. Через браузер такие базы запускаются без ошибок.

Есть простое решение данной проблемы.

Достаточно запустить базу доступным нам способом (где нет ошибки) включить Функции тех. специалиста (Меню — Настройки — Параметры — Режим технического специалиста)

В Функциях для технического специалиста ищем Управление настройками обработки ошибок (Стандартные)

Запускаем

Готово!

Уже более 10 000 компаний работают
в облачной 1С от 42Clouds

— Консультация по 1С Бесплатно!

— Поддержка 24/7 по техническим вопросам: в чате, по телефону, по почте

— Все типовые конфигурации онлайн, доступ через RDP, Remote App, Web

Преобразование XML в таблицу значений ☑ 0

DanJer74

17.03.16

08:56

Приветствую! Можно ли как-то сделать следующее: загрузить xml через фабрику xdto в таблицу значений без построчного перебора. Суть в том, что при чтении очень большое количество записей (более 200000). Хотелось бы закинуть одним махом.

1

cw014

17.03.16

09:01

Делаешь таблицу «ЗначениеВСтрокуВнутр». Изучаешь получившееся. Берешь свой XML в качестве строки и меняешь его под структуру «ЗначениеВСтрокуВнутр». Делаешь «ЗначениеИзСтрокиВнутр»

2

LordCMEPTb

17.03.16

09:13

Можно попробовать: http://its.1c.ru/db/v836doc/bookmark/dev/TI000000763

Но при чтении xml могут быть «забавные» ошибки, на которые ответа можно не найти: Ошибка с XDTO ..1998/namespace}space

3

Живой Ископаемый

17.03.16

10:13

ТЗ тоже сериализуется. Посмотреть формат ХМЛ который получается при ее сериализации, дополнить тот хмл, который нужно загрузить таким образом, чтобы он по сути предстяавлял собой сериализацию ТЗ(это делать на уровне текста). прочитатьОбъектХДТО из полученного хмл в ТЗ одним оператором.

4

DanJer74

17.03.16

11:59

(3) Как посмотреть формат?

5

DanJer74

17.03.16

12:00

6

DanJer74

17.03.16

12:00

Я вот это вот нарыл, а что дальше делать — не понятно

7

Serginio1

17.03.16

12:07

СериализаторXDTO

8

Serginio1

17.03.16

12:10

Список1=Новый СписокЗначений;

Список2=Новый СписокЗначений;

    
Список1.Добавить(Список2);

Список2.Добавить(1);

Список2.Добавить(«1»);

Список2.Добавить(Список1);

//стр=XMLСтрока(Список1);

ЗаписатьXML=Новый ЗаписьXML;

ЗаписатьXML.УстановитьСтроку();

СериализаторXDTO.ЗаписатьXML(ЗаписатьXML,список1);

стр=ЗаписатьXML.Закрыть();

Сообщить(стр);

ЧтениеXML=новый ЧтениеXML;

ЧтениеXML.УстановитьСтроку(стр);

список=СериализаторXDTO.прочитатьXML(ЧтениеXML,ФабрикаXDTO.Тип(ЧтениеXML.URIПространстваИмен,ЧтениеXML.Имя));

сообщить(список);

9

Serginio1

17.03.16

12:12

Навсякий случай ЧтениеXML.ПерейтиКСодержимому()

10

mistеr

17.03.16

12:12

(8) Почему не на .NET?!! :)

11

DanJer74

17.03.16

12:22

СериализаторXDTO.ЗаписатьXML(ЗаписатьXML,список1); платформа падает

12

Живой Ископаемый

17.03.16

12:38

13

mehfk

17.03.16

12:39

(10) Тоже удивлен :)

14

Живой Ископаемый

17.03.16

12:40

15

DanJer74

17.03.16

12:57

Мне нужно СписокXDTO загнать в таблицу

16

Живой Ископаемый

17.03.16

13:00

сделай так, чтобы это был не список xdto а строки таблицы значения. на уровне текстового содержимого хмл-файла

17

DanJer74

17.03.16

13:02

Каким образом?

18

DanJer74

17.03.16

13:04

Вообще было бы удобней все это в регистр сведений загонять

19

Serginio1

17.03.16

13:06

(10) Мечтательно Вот Когда 1С будет на .Net

20

mehfk

17.03.16

13:07

(18) Ну тогда XML должен представлять из себя сериализованный набор записей. Если это не так (а это не так), то пиши парсер. Соответствующие средства в языке 1с есть.

21

Живой Ископаемый

17.03.16

13:09

2(17) Ты смотришь на тот ХМЛ который у тебя есть, и ты смотришь на хмл полученный в 12, и думаешь что тебе нужно сделать, чтобы получить из первого второй, делаешь это, и потом читаешь как в 14.

ПРОФИТ

22

Tateossian

17.03.16

13:12

(19) Низачто. Убунта будет в пролете.

23

Serginio1

17.03.16

14:29

(22) .Net Core работает и на Убунте

24

DanJer74

17.03.16

14:46

В общем я вот до этого дошел:

НоваяСтр = ТЗ.Добавить();

    НоваяСтр.Артикул = «123»;

    НоваяСтр.Производитель = «1123»;

    НоваяСтр.ПолноеНаименование = «Наимен1123»;

    НоваяСтр.Цена = «1123.2»;

    
    НоваяСтр = ТЗ.Добавить();

    НоваяСтр.Артикул = «456»;

    НоваяСтр.Производитель = «1456»;

    НоваяСтр.ПолноеНаименование = «Наимен456»;

    НоваяСтр.Цена = «1123.1»;

    
    П = ВернутьТЗ();

    
    НовыйОбъект = СериализаторXDTO.ЗаписатьXDTO(П);

    
    ЗаписьXML = Новый ЗаписьXML;

    ЗаписьXML.ОткрытьФайл(«S:\new.xml»);

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

    ЗаписьXML.Закрыть();

    
    
    ЧтениеXML = Новый ЧтениеXML;

    ТипОбъектаXDTO=ФабрикаXDTO.Тип(«http://v8.1c.ru/8.1/data/core»,»ValueTable»;);

    ЧтениеXML.ОткрытьФайл(«S:\new.xml»);

    ОбъектXDTO=ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);

    ОбъектXDTO.Проверить();

    Сериализатор=Новый СериализаторXDTO(ФабрикаXDTO);

    МояТаблица=Сериализатор.ПрочитатьXDTO(ОбъектXDTO);

        

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

&НаСервере

Функция ВернутьТЗ()

    Возврат ДанныеФормыВЗначение(ТЗ,Тип(«ТаблицаЗначений»));

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

Но на     МояТаблица=Сериализатор.ПрочитатьXDTO(ОбъектXDTO);

валится с ошибкой

{Форма.Форма.Форма(145)}: Ошибка при вызове метода контекста (ПрочитатьXDTO)

    МойСписокЗначений2=Сериализатор.ПрочитатьXDTO(ОбъектXDTO);

по причине:

Ошибка преобразования данных XDTO:

НачалоСвойства: {http://www.w3.org/2001/XMLSchema}anyType    Форма: Элемент    Тип: {http://www.w3.org/2001/XMLSchema}anyType

по причине:

Ошибка преобразования данных XDTO:

НачалоСвойства: {http://v8.1c.ru/8.1/data/core}column    Форма: Элемент    Тип: {http://www.w3.org/2001/XMLSchema}anyType

А запихать мне надо файл вот с такой структурой

<?xml version=»1.0″ standalone=»yes»?>

<dataroot xmlns:od=»urn:schemas-microsoft-com:officedata»>

<Лист1><Производитель>1-56&#160;(MARUICHI)</Производитель><Артикул>3068</Артикул><Наименование>Пыльник&#160;рулевой&#160;рейки</Наименование><Цена>272</Цена><Наличие>1</Наличие></Лист1>

<Лист1><Производитель>1-56&#160;(MARUICHI)</Производитель><Артикул>68414</Артикул><Наименование>Пыльник&#160;ШРУСа</Наименование><Цена>225</Цена><Наличие>1</Наличие></Лист1>

<Лист1><Производитель>555</Производитель><Артикул>SA6171R</Артикул><Наименование>Рычаг&#160;передподвески&#160;верх&#160;прав</Наименование><Цена>1825</Цена><Наличие>2</Наличие></Лист1>

</dataroot>

25

DanJer74

17.03.16

14:47

Голова пухнет уже от всего этого

26

Serginio1

17.03.16

14:50

(24) Потому, что нужно внимательно читать (8)

ЧтениеXML=новый ЧтениеXML;

ЧтениеXML.УстановитьСтроку(стр);

ЧтениеXML.ПерейтиКСодержимому();

список=СериализаторXDTO.прочитатьXML(ЧтениеXML,ФабрикаXDTO.Тип(ЧтениеXML.URIПространстваИмен,ЧтениеXML.Имя));

27

Serginio1

17.03.16

14:53

Вопрос про XDTO. ☑ 0

ll13

22.12.09

20:03

При выгрузке в XML через XDTO, все реквизиты должны быть заполнены(либо инициализированны пустыми значениями), иначе потом невозможно буде загрузить с помощью Объект = СериализаторXDTO.ПрочитатьXML(ЧтениеXML)

Вопрос : кто нибудь пользует XDTO для обмена между разнородными конфами ? Ведь вышеуказанный факт делает бесполезным XDTO в реальных условиях, когда у документа 50 реквизитов, обязательны 5, остальные 45 нужно инициализировать пустыми значениями…(

1

Рэйв

22.12.09

20:07

(0)Пусть побьют меня камнями, но слово «XDTO» слышу первый раз….Наверное я отсталый…Поэтому предпочитаю КД 2.0

2

Живой Ископаемый

22.12.09

20:19

Не переноси остальные 45 вообще — делов-то… исключи их схемы вовсе

3

ll13

22.12.09

20:22

Исключал, не работает (
Т.е. если в неком Объекте есть реквизит Реквизит1, а в файле переноса XML его нет то Объект = СериализаторXDTO.ПрочитатьXML(ЧтениеXML) выдаст ошибку …

4

Живой Ископаемый

22.12.09

20:24

что-то ты не так  делаешь

5

ll13

22.12.09

20:28

Скиньте пример если есть.

6

Живой Ископаемый

22.12.09

20:31

есть книжка в сети.. переход от в80 к в81… ссылку конечно не дам.. там целая глава про хдто

7

ll13

22.12.09

20:38

У меня есть эта книга, там есть «игрушечный» пример, который разумеется отлично работает, перенести документ с 3-мя реквизитами проблемы не составляет.
Проблема — когда в документе есть к примеру 100 реквизитов, а обязательных для заполнения не больше 10-ти, в таком случае все остальные реквизиты необходимо, при выгрузке инициализировать пустыми значениями, т.е. ВСЕ реквизиты должны существовать в сериализованном виде.

8

acsent

22.12.09

20:42

покажи код

9

Claudio

22.12.09

20:51

(0) Вообще-то XDTO предполагался скорее для обмена между 1С и другими программами, а не между 2-мя базами. Зачем так изголяться, когда есть Конвертация данных?

10

Claudio

22.12.09

20:52

(1) Да, слегка отстал, XDTO появилось на 8.1

11

acsent

22.12.09

21:11

XDTO позволяет одним движение превратить XML в объект (не обязательно объект бд)

12

acsent

22.12.09

21:12

(11) Удобно для хранения настроек

13

Kasper076

22.12.09

21:43

(11) Абсолютно прав. Но и (0) тоже прав. Разбирался в свое время с этой темой. Все реквизиты объекта должны быть заполнены иначе, при загрузке, 1С не модет создать объект из его XML-представления. Вот полезная ссылка http://itland.ru/forum//index.php?showtopic=21932&pid=107069&st=0&#entry107069

14

ll13

23.12.09

10:34

(11) Превратить то превратишь, но только при условии что XML содержит ВСЕ реквизиты объекта(в том числе незаполненные). Эта особенность делает XDTO бесполезным при обмене данными между разнородными конфами. Кроме того крайне не надёжным, пример : Настроена перенос документа Д1 из базы Б1 в документ Д2 из базы Б2. Состав реквизитов документа не идентичен. Все работает отлично. Далее в базе Б2 у документа Д2 добавляем реквизит НеобязательныйНикомуНеНужныйРеквизит. И… все перенос больше не работает, его надо переписывать и дописывать сериализацию реквизита НеобязательныйНикомуНеНужныйРеквизит…
(13) Ссылку читал там игрушечный пример который работает замечательно, но где в реальность Вы видели документ с 3-ме реквизитами ?! )

15

ll13

25.12.09

14:12

Подниму ветку, проблема преобразования из XML -> Объект 1С, при отсутствии нескольких реквизитов в XML осталась не решена , можь кто решил эту задачу ?

16

Oftan_Idy

25.12.09

14:20

Да, с чего вы взяли что должны быть все реквизиты в пакете XDTO?

Все зависит от того как описана модель (xsd).

Для типа объета укажите фасет «Минимальное количество» = 0, и элемент можно вообще не включать в пакет.

17

Kasper076

25.12.09

14:41

(16) У типа объекта я не нашел фассета «Минимальное количество». Только у свойств оно есть.

18

Oftan_Idy

25.12.09

15:12

(17) Да, сори у свойства

19

ll13

25.12.09

15:42

А может у кого есть реально работающий пример обмена данными между конфами различной структуры, построенный на XDTO ?

20

Kasper076

25.12.09

15:56

(18) Т.е. те свойства у которых фасет МинимальноеКоличесто = 0 могут быть незаполненными? И вытекает ли отсюда, что те свойства у которых фасет МаксимальноКоличество = 0 могут быть в объекте источнике, но отсутствовать в объекте приемнике?

21

quest

25.12.09

15:58

странно, реквизти может быть не обязательным. Либо тип открытым.

22

Kasper076

25.12.09

16:02

(21) Как это в XSD-схеме обозначить?

23

quest

25.12.09

16:08

<xsd:complexType mixed=»true» name=»Документ»>
       <xsd:all>
           <xsd:element name=»Контрагент» nillable=»true» type=»tns:Контрагент»/>

24

quest

25.12.09

16:09

<xsd:anyAttribute namespace=»##any» processContents=»lax»/>
   </xsd:complexType>

рука дренулась. Сори

25

ll13

25.12.09

16:37

В таком случае что я делаю неправильно ?

1). Создал в конфигурации Документ1, с единственным реквизитом Реквизит1.
2). Экспортировал XML-схему конфы в файл shema.xsd
3). Выгрузил Документ1 при помощи кода:
Пути = Новый Массив();
Пути.Добавить(«D:\shema.xsd»);
МояФабрика = СоздатьФабрикуXDTO(Пути);    
ТипXDTO = МояФабрика.Тип(«http://v8.1c.ru/8.1/data/enterprise/current-config», «DocumentObject.Документ1»);
ОбъектXDTO = МояФабрика.Создать(ТипXDTO);
ОбъектXDTO.Ref = Документ1.Ссылка;
ОбъектXDTO.DeletionMark = Документ1.ПометкаУдаления;
ОбъектXDTO.Date   = Документ1.Дата;
ОбъектXDTO.Number = Документ1.Номер;
ОбъектXDTO.Posted = Документ1.Проведен;

// Реквизит1 намеренно не заполняю !!!

ИмяФайла = «D:\perenos.xml»;
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ИмяФайла);
МояФабрика.ЗаписатьXML(ЗаписьXML,ОбъектXDTO);
ЗаписьXML.Закрыть();

Пытаюсь загрузить документ:
ИмяФайла = «D:\perenos.xml»;
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ИмяФайла);
Документ1 = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
Документ1.ОбменДанными.Загрузка = Истина;
Документ1.Записать(РежимЗаписиДокумента.Запись);
ЧтениеXML.Закрыть();

Получаю :
Ошибка при вызове метода контекста (ПрочитатьXML): Ошибка преобразования данных XDTO:
НачалоСвойства: {http://v8.1c.ru/8.1/data/enterprise/current-config}DocumentObject.Документ1    Форма: Элемент    Тип: {http://v8.1c.ru/8.1/data/enterprise/current-config}DocumentObject.Документ1
   Документ1 = СериализаторXDTO.ПрочитатьXML(ЧтениеXML); …..

Если при выгрузке Реквизит1 заполнить то всё отлично работает.
Как это можно обойти ?

26

ll13

25.12.09

19:08

Подниму…

28

quest

25.12.09

23:42

выгрузи схему xsd. посмотри описание. на край — забей болт на 1С и сам опиши как тебе надо.

29

ll13

28.12.09

12:53

(28) Выгрузил, посмотрел … вопрос в том что я там должен(не должен) увидеть.
Схема как схема, урезал её оставив в ней описание только одного(выгружаемого) документа. результат тот же…(

30

Sonny

28.12.09

15:28

Тоже пытался одолеть эту ошибку. В конце концов плюнул и написал свою выгрузку/загрузку через XML без использования встроенных сериализаторов.

Подозреваю, что как ни извращайся со схемой при выгрузке, результирующий файл будет одинаковым. Во всяком случае мне не удалось добиться, чтобы информация о необязательных реквизитах попадала в файл выгрузки. Есть подозрение, что СериализаторXDTO при загрузке все же должен «знать»: какие реквизиты являются необязательными. А откуда он это узнает, если в файле об этом ни байта? Возможно успеха добиться можно, используя схему при загрузке данных.

31

ll13

28.12.09

16:48

(30) Тоже не помогает уже пробовал подсунуть схему результат тот же :(

ИмяФайла = «D:\perenos.xml»;
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ИмяФайла);
Пути = Новый Массив();
Пути.Добавить(«D:\shema.xsd»);
МояФабрика = СоздатьФабрикуXDTO(Пути);
МойСериализатор = Новый СериализаторXDTO(МояФабрика);
Документ1 = МойСериализатор.ПрочитатьXML(ЧтениеXML);
Документ1.ОбменДанными.Загрузка = Истина;
Документ1.Записать(РежимЗаписиДокумента.Запись);
ЧтениеXML.Закрыть();

32

niko8

29.12.09

11:39

Не очень вникал ч суть проблемы. Но что ознасает свойставо Возможно пустое.

XDTO использовал для работы с Web сервисом. А для выгрузки и загрузки документов в XML существует обработка на ИТС, можно поковырять ее и посмотреть как там реализованно.

33

ll13

29.12.09

18:13

(32) Ничего не означает, в теории признак того что свойство может быть пустым, на практике это ничего не меняет. Свойства «Фиксированное» и «По умолчанию» так же не влияют на формирование xml-документа…

34

Kasper076

30.12.09

13:40

Я тут вот о чем подумал. Если при загрузке через свойство глобального контекста СериализаторXDTO 1С использует XSD схему той конфы, в которую мы загружаем данные. Эту схему мы изменить ни как не можем. Следовательно при загрузке нужно использовать нашу собственную схему, которую мы использовали при выгрузке.В результате будет создан некий объект из сериализованных данных. Но он не будет являться объектом БД (т.е. справочником или документом). Но значениями свойств этого объекта можно уже будет заполнить свойства объекта БД. Что-то вроде ЗаполнитьЗначенияСвойств(ОбъкетXDTO,ОбъектБД).

35

ll13

30.12.09

15:46

(34) Вариант вполне жизнеспособный.
Ещё вариант: у необязательных реквизитов в схеме поставить на всякий случай nillable=»true», затем при выгрузке заполняем реквизиты которые нужны и вызываем процедуру
Процедура ИнициализироватьПоУмолчанию(ОбъектXDTO)
// Все реквизиты которые забиваются Неопределенно в схеме должны иметь nillable=»true»
ТипСписокXDTO = Тип(«СписокXDTO»);
Для каждого СвойствоОбъектаXDTO Из ОбъектXDTO.Свойства() Цикл
 Если НЕ ТипЗнч(ОбъектXDTO[СвойствоОбъектаXDTO.Имя]) = ТипСписокXDTO Тогда
   Если НЕ ОбъектXDTO.Установлено(СвойствоОбъектаXDTO) Тогда
     ОбъектXDTO[СвойствоОбъектаXDTO.Имя] = Неопределено;                
   КонецЕсли;
 КонецЕсли;
КонецЦикла;
КонецПроцедуры

Затем с чистой совестью пишем ОбъектXDTO в XML

Грабли метода ПрочитатьXML() объекта ФабрикаXDTO

Что таит в себе окно редактирования XDTO-пакета

Фабрика XDTO — это библиотека типов, которая описывает определенные структуры XML. В языке программирования платформы 1С имеется объект ФабрикаXDTO, который содержит все пакеты XDTO, имеющиеся в конфигурации, а также предопределенные пакеты (например, пакет типов XML схемы). У данного объекта метод ПрочитатьXML(), позволяет читать элементы данных XDTO указанного типа из объекта чтения XML:


ФайлXML = Новый ЧтениеXML;
ФайлXML.УстановитьСтроку(СтрокаXML);

Пока ФайлXML.Прочитать() Цикл

Если ФайлXML.ЛокальноеИмя = "Message" И ФайлXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(ФайлXML);
КонецЕсли;

КонецЦикла;

ФайлXML.Закрыть();

Первый параметр метода является обязательным, в который передается объект чтения XML. Второй параметр метода необязательный, в который передается тип элемента данных XDTO. Если тип не указан, то будет сделана попытка определить тип данных по текущему состоянию объекта ЧтениеXML.

Допустим, создадим тип в пакете XDTO  с пространством имен http://lk.1cps.ru, который будет описывать некую структуру XML:

1. Тип «Документы»

Кусок структуры XML:
...
<Документы>
<РасчетФБ>
<Культура>12122</Культура>
<ПосевнаяПлощадь>23</ПосевнаяПлощадь>
<СтавкаСубсидий>12</СтавкаСубсидий>
<Сумма>276</Сумма>
</РасчетФБ>
<РасчетФБ>
<Культура>232323</Культура>
<ПосевнаяПлощадь>34</ПосевнаяПлощадь>
<СтавкаСубсидий>12</СтавкаСубсидий>
<Сумма>408</Сумма>
</РасчетФБ>
</Документы>
...

Прочитаем эту структуру:

Пока ФайлXML.Прочитать() Цикл
Если ФайлXML.ЛокальноеИмя = "Документы" И ФайлXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(ФайлXML, ФабрикаXDTO.Тип("http://lk.1cps.ru", "ДокументыТип"));
Прервать;
КонецЕсли;
КонецЦикла;

Приведенный код будет завершать ошибкой чтения XML, примерно такой:

Ошибка при вызове метода контекста (ПрочитатьXML)
ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(ФайлXML, ФабрикаXDTO.Тип("http://lk.1cps.ru", "ДокументыТип"));
по причине:
Ошибка преобразования данных XDTO:
Чтение объекта типа: {http://lk.1cps.ru}ДокументыТип - [126,19]
Проверка дополнительного свойства:
форма: Элемент
имя: {http://lk.1cps.ru}Культура
по причине:
Ошибка проверки данных XDTO:
Структура объекта не соответствует типу: {http://lk.1cps.ru}ДокументыТип

ПРОШЛО 4 ЧАСА :(

Так как выше приведенный кусок структуры XML не относится к пространству имен http://lk.1cps.ru, то и метод ПрочитатьXML() выкидывал ошибку, несмотря на то, что тип правильно описывает структуру XML! Поэтому XML должен выглядеть так:
...
<Документы xmlns="http://lk.1cps.ru">
<РасчетФБ>
<Культура>12122</Культура>
<ПосевнаяПлощадь>23</ПосевнаяПлощадь>
<СтавкаСубсидий>12</СтавкаСубсидий>
<Сумма>276</Сумма>
</РасчетФБ>
<РасчетФБ>
<Культура>232323</Культура>
<ПосевнаяПлощадь>34</ПосевнаяПлощадь>
<СтавкаСубсидий>12</СтавкаСубсидий>
<Сумма>408</Сумма>
</РасчетФБ>
</Документы>
...

Вот такие пироги.

Одним из самых популярных форматов данных, используемых практически в любой компании, является XML (расширяемый язык разметки). Разработчики 1С создали специальный объект XDTO для удобства своих клиентов и простого взаимодействия с файлами XML, поэтому программисту 1С важно работать с этими объектами платформы, так как обмен данными через XML встречается постоянно.

Преимущества механизма XDTO

Этот функционал создавался как удобный инструмент обмена данными между конфигурациями и другими приложениями. Также этот механизм используют для работы с web-сервисами и для обработки произвольных данных. Большое преимущество XDTO перед другими способами – в нем есть возможность обращаться к файлу XML, как к объекту 1С. То есть все реквизиты можно будет получить, описывая структуру через точку, не задумываясь о скобках, тегах и атрибутах.

Взаимодействие с файлами XML происходит по заранее установленным правилам, описанным в объекте структуры конфигурации – XDTO – пакеты в 1С 8.3. Суть этих элементов структуры в том, что они представляют собой схемы, по которым будут распознаваться данные из XML-файлов. В типовых конфигурациях уже присутствуют подобные объекты, но при работе с конкретными файлами понадобятся другие схемы.

Существует два способа добавить XDTO-пакет в конфигурацию:

  • Собственноручно создать. Этот вариант подойдет при самостоятельной работе с XML определенного формата. Зная, какие данные будут подаваться на вход для импорта с использованием XDTO, можно заранее создать в конфигурации нужный объект. Этот вариант хорош, если обмен данными налажен и никаких изменений не планируется;
    XDTO пакеты
    XDTO пакеты
  • Импорт присланной схемы. Когда нам присылают данные, их схема может оказаться какой угодно, особенно, если раньше мы не работали с источником. Сильно упростит ситуацию, если вместе с XML нам пришлют и файл формата xsd. В нем содержится выгрузка XDTO-пакета, который может разобрать конкретные XML. Нам останется лишь импортировать его.

Чтобы загрузить данные из присланной нам схемы, необходимо в режиме конфигуратор открыть раздел «Общие» и «XDTO-пакеты». Через контекстное меню выбрать пункт «Импорт XML-схемы…», выбрать файл и подтвердить пространство имен, взятое из файла. После этого необходимо обновить конфигурацию, и предварительные настройки сделаны.

Но на самом деле в последнем случае нам необязательно создавать XDTO-пакеты в конфигурации 1С 8.3. Существует возможность только использовать XSD-схему, присланную нам из отдельного файла, не внося изменения в структуру базы 1С. Для этого нужно воспользоваться кодом, объясняющим платформе 1С, какой тип объекта с какими параметрами будет загружаться.

Это происходит следующими командами:


ФайлXSD = Новый Массив();
ФайлXSD.Добавить("D:\1\strust.xsd");
ФабрикаXDTOИзФайла = СоздатьФабрикуXDTO(ФайлXSD);
Номенклатура = ФабрикаXDTOИзФайла.Тип("http://www.1c.ru/products", "Номенклатура");

Экспорт и импорт файла

После того как мы разобрались с принципами использования пакетов XDTO, нужно посмотреть на механику работы с файлами XML. Лучше всего это будет видно на простом примере, чтобы понять основы. Добавим новый элемент в раздел XDTO-пакетов и настроим его следующим образом:

  1. Заполняем URI-пространство имен в свойствах XDTO пакета. Среди разработчиков 1С принято заполнять этот реквизит адресом страницы, заполненной описанием тех данных, с которыми происходит работа. Это помогает в работе, но не всегда возможно. В иных случаях заполняют произвольным текстом;
  2. Задаем тип объекта и его свойства, используя контекстное меню. Задаем имя этих параметров и для свойств определяем тип, выбирая его из предложенных платформой.
Параметры пакета
Параметры пакета

Следующим этапом будет написание процедуры для создания файла XML по описанной выше схеме. Код достаточно прост, поскольку создан XDTO-пакет, а у элемента всего 2 свойства – «Наименование» и «Артикул». Обращаться к конкретной схеме позволяет объект платформы «ФабрикаXDTO». Сама процедура состоит из:

  1. Определение схемы будущей XML;
    
    ТипФабрики = ФабрикаXDTO.Тип("http://www.primerXML.ru/Nomen","Номенклатура");
    

  2. Заполнение свойств номенклатуры;
    
    Номенклатура = ФабрикаXDTO.Создать(ТипФабрики);
    Номенклатура.Наименование = "Тест XML";
    Номенклатура.Артикул = "2";
    

  3. Создание нового XML файла.
    
    ИмяФайла = "D:\1\struct1.xml";
    МойXML = Новый ЗаписьXML;
    ПараметрыЗаписиXML = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Ложь);
    МойXML.ОткрытьФайл(ИмяФайла, ПараметрыЗаписиXML);
    МойXML.ЗаписатьОбъявлениеXML();
    ФабрикаXDTO.ЗаписатьXML(МойXML, номенклатура);
    МойXML.Закрыть();
    

Чтение XML-файлов с помощью конкретной фабрики XDTO по уже созданному в конфигурации пакету ничуть не сложнее. Алгоритм похож по структуре и отличается только операциями взаимодействия с XML-файлами. В данном случае нам нужно воспользоваться объектом платформы «ЧтениеXML» и прочитать содержимое в переменную. На выходе у нее будет тип «ОбъектXDTO», и вы сможете обращаться ко всем ее свойствам через точку.


ТипФабрики = ФабрикаXDTO.Тип("http://www.primerXML.ru/Nomen","Номенклатура");
 
ИмяФайла = "D:\1\struct1.xml";
МойXML = Новый ЧтениеXML;
МойXML.ОткрытьФайл(ИмяФайла);
номенклатура = ФабрикаXDTO.ПрочитатьXML(МойXML, ТипФабрики);
МойXML.Закрыть();

Теперь попробуем прочитать файл, схемы которого нет в нашей конфигурации. Для этого экспортируем XDTO-пакет в файл формата xsd и удалим схему из конфигурации. После этого нам придется объяснить платформе, откуда ей брать схему читаемой XML-кодом, продемонстрированным ранее. Однако в простейших случаях 1С самостоятельно может распознать все свойства.

Экспорт XDTO-пакета
Экспорт XDTO-пакета

Лучше все-таки не рассчитывать на понятливость платформы 1С, а использовать точную схему XML. Многие специалисты используют сторонний софт для их создания, но для этого необходим достаточно большой опыт и уровень подготовки. Работа с пакетами XDTO требует внимания и соблюдения точного соответствия файлов заданной схеме, чтобы минимизировать возможные ошибки.

Исправление ошибок

Одной из достаточно распространенных ошибок, связанных с работой с XDTO-пакетами, является «Ошибка преобразования данных XDTO». Ее суть заключается в том, что платформа не может разобрать данный ей XML-файл по заданной схеме. При получении подобной ошибки при импорте данных, необходимо проверить формат файлов – возможно, присутствуют незакрытые теги.

Зачастую проблема с ошибками преобразования данных возникает и по другим причинам:

  • Ошибки в обновлении платформы или конфигурации;
  • Обмен между базами разных версий;
  • Недочеты в алгоритме приема данных;
  • Проблемы с временной памятью конкретного компьютера.

Чтобы исправить эту ошибку, сначала почистите кэш или удалите, а также заново добавьте информационную базу в список баз. Затем внимательно проверьте файл XML – вдруг случайно сделали ошибку в его тексте, проверьте соответствие структуры пакету XDTO. Если ошибка появилась после обновления, сделайте тестирование и исправление ИБ, сохранив перед этим резервную копию базы. Если проблема не уйдет, вернитесь на предыдущую версию и подождите, пока разработчики 1С не разберутся с этой проблемой.

Ошибка преобразования данных
Ошибка преобразования данных

Еще одна проблема, часто мучающая программистов 1С, работающих с XDTO, – ошибка проверки данных. Если при импорте вы видите подобный текст, то с высокой долей вероятности источник проблемы в несоответствии файла нужной схеме. Но проблема может быть не на вашей стороне, а в базе, из которой выгружали XML. Чтобы исправить эту оплошность, придется внимательно изучить всю последовательность действий и найти, после чего файл перестал соответствовать ожиданиям.

Ошибка проверки данных
Ошибка проверки данных

Более сложная для анализа проблема, если при обмене информацией 1С выдает ошибку о несоответствии типов XDTO. В этом случае придется проверять все данные, находить ошибки и их причины. В некоторых случаях ошибки могут быть в коде, иногда – в данных информационной базы. Чтобы это понять, необходимо иметь доступ к базам причастным к обмену и четко понимать всю суть происходящего экспорта и импорта.

Несоответствие типов XDTO
Несоответствие типов XDTO

На первый взгляд работа с XDTO достаточно сложна, поэтому на первое время рекомендуется добавлять XDTO-пакеты в 1С для большего порядка и учета. Конечно, все нюансы изучить сразу невозможно, но в процессе работы вы будете продолжать учиться. Но с уверенной теоретической базой намного удобнее начинать разбираться в этом вопросе.

Понравилась статья? Поделить с друзьями:
  • Сериалы наподобие мистер ошибка
  • Сериал цена ошибки чем закончится фильм
  • Сериал след серия ошибка антоновой
  • Сериал след работа над ошибками смотреть
  • Сериал след ошибки нежного периода