При входе в базу 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 (расширяемый язык разметки). Разработчики 1С создали специальный объект XDTO для удобства своих клиентов и простого взаимодействия с файлами XML, поэтому программисту 1С важно работать с этими объектами платформы, так как обмен данными через XML встречается постоянно.
Преимущества механизма XDTO
Этот функционал создавался как удобный инструмент обмена данными между конфигурациями и другими приложениями. Также этот механизм используют для работы с web-сервисами и для обработки произвольных данных. Большое преимущество XDTO перед другими способами – в нем есть возможность обращаться к файлу XML, как к объекту 1С. То есть все реквизиты можно будет получить, описывая структуру через точку, не задумываясь о скобках, тегах и атрибутах.
Взаимодействие с файлами XML происходит по заранее установленным правилам, описанным в объекте структуры конфигурации – XDTO – пакеты в 1С 8.3. Суть этих элементов структуры в том, что они представляют собой схемы, по которым будут распознаваться данные из XML-файлов. В типовых конфигурациях уже присутствуют подобные объекты, но при работе с конкретными файлами понадобятся другие схемы.
Существует два способа добавить XDTO-пакет в конфигурацию:
- Собственноручно создать. Этот вариант подойдет при самостоятельной работе с XML определенного формата. Зная, какие данные будут подаваться на вход для импорта с использованием XDTO, можно заранее создать в конфигурации нужный объект. Этот вариант хорош, если обмен данными налажен и никаких изменений не планируется;
Рис.1 XDTO пакеты - Импорт присланной схемы. Когда нам присылают данные, их схема может оказаться какой угодно, особенно, если раньше мы не работали с источником. Сильно упростит ситуацию, если вместе с XML нам пришлют и файл формата xsd. В нем содержится выгрузка XDTO-пакета, который может разобрать конкретные XML. Нам останется лишь импортировать его.
Чтобы загрузить данные из присланной нам схемы, необходимо в режиме конфигуратор открыть раздел «Общие» и «XDTO-пакеты». Через контекстное меню выбрать пункт «Импорт XML-схемы…», выбрать файл и подтвердить пространство имен, взятое из файла. После этого необходимо обновить конфигурацию, и предварительные настройки сделаны.
Но на самом деле в последнем случае нам необязательно создавать XDTO-пакеты в конфигурации 1С 8.3. Существует возможность только использовать XSD-схему, присланную нам из отдельного файла, не внося изменения в структуру базы 1С. Для этого нужно воспользоваться кодом, объясняющим платформе 1С, какой тип объекта с какими параметрами будет загружаться.
Это происходит следующими командами:
ФайлXSD = Новый Массив();
ФайлXSD.Добавить("D:1strust.xsd");
ФабрикаXDTOИзФайла = СоздатьФабрикуXDTO(ФайлXSD);
Номенклатура = ФабрикаXDTOИзФайла.Тип("http://www.1c.ru/products", "Номенклатура");
Экспорт и импорт файла
После того как мы разобрались с принципами использования пакетов XDTO, нужно посмотреть на механику работы с файлами XML. Лучше всего это будет видно на простом примере, чтобы понять основы. Добавим новый элемент в раздел XDTO-пакетов и настроим его следующим образом:
- Заполняем URI-пространство имен в свойствах XDTO пакета. Среди разработчиков 1С принято заполнять этот реквизит адресом страницы, заполненной описанием тех данных, с которыми происходит работа. Это помогает в работе, но не всегда возможно. В иных случаях заполняют произвольным текстом;
- Задаем тип объекта и его свойства, используя контекстное меню. Задаем имя этих параметров и для свойств определяем тип, выбирая его из предложенных платформой.
Следующим этапом будет написание процедуры для создания файла XML по описанной выше схеме. Код достаточно прост, поскольку создан XDTO-пакет, а у элемента всего 2 свойства – «Наименование» и «Артикул». Обращаться к конкретной схеме позволяет объект платформы «ФабрикаXDTO». Сама процедура состоит из:
- Определение схемы будущей XML;
ТипФабрики = ФабрикаXDTO.Тип("http://www.primerXML.ru/Nomen","Номенклатура");
- Заполнение свойств номенклатуры;
Номенклатура = ФабрикаXDTO.Создать(ТипФабрики); Номенклатура.Наименование = "Тест XML"; Номенклатура.Артикул = "2";
- Создание нового XML файла.
ИмяФайла = "D:1struct1.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:1struct1.xml";
МойXML = Новый ЧтениеXML;
МойXML.ОткрытьФайл(ИмяФайла);
номенклатура = ФабрикаXDTO.ПрочитатьXML(МойXML, ТипФабрики);
МойXML.Закрыть();
Теперь попробуем прочитать файл, схемы которого нет в нашей конфигурации. Для этого экспортируем XDTO-пакет в файл формата xsd и удалим схему из конфигурации. После этого нам придется объяснить платформе, откуда ей брать схему читаемой XML-кодом, продемонстрированным ранее. Однако в простейших случаях 1С самостоятельно может распознать все свойства.
Лучше все-таки не рассчитывать на понятливость платформы 1С, а использовать точную схему XML. Многие специалисты используют сторонний софт для их создания, но для этого необходим достаточно большой опыт и уровень подготовки. Работа с пакетами XDTO требует внимания и соблюдения точного соответствия файлов заданной схеме, чтобы минимизировать возможные ошибки.
Исправление ошибок
Одной из достаточно распространенных ошибок, связанных с работой с XDTO-пакетами, является «Ошибка преобразования данных XDTO». Ее суть заключается в том, что платформа не может разобрать данный ей XML-файл по заданной схеме. При получении подобной ошибки при импорте данных, необходимо проверить формат файлов – возможно, присутствуют незакрытые теги.
Зачастую проблема с ошибками преобразования данных возникает и по другим причинам:
- Ошибки в обновлении платформы или конфигурации;
- Обмен между базами разных версий;
- Недочеты в алгоритме приема данных;
- Проблемы с временной памятью конкретного компьютера.
Чтобы исправить эту ошибку, сначала почистите кэш или удалите, а также заново добавьте информационную базу в список баз. Затем внимательно проверьте файл XML – вдруг случайно сделали ошибку в его тексте, проверьте соответствие структуры пакету XDTO. Если ошибка появилась после обновления, сделайте тестирование и исправление ИБ, сохранив перед этим резервную копию базы. Если проблема не уйдет, вернитесь на предыдущую версию и подождите, пока разработчики 1С не разберутся с этой проблемой.
Еще одна проблема, часто мучающая программистов 1С, работающих с XDTO, – ошибка проверки данных. Если при импорте вы видите подобный текст, то с высокой долей вероятности источник проблемы в несоответствии файла нужной схеме. Но проблема может быть не на вашей стороне, а в базе, из которой выгружали XML. Чтобы исправить эту оплошность, придется внимательно изучить всю последовательность действий и найти, после чего файл перестал соответствовать ожиданиям.
Более сложная для анализа проблема, если при обмене информацией 1С выдает ошибку о несоответствии типов XDTO. В этом случае придется проверять все данные, находить ошибки и их причины. В некоторых случаях ошибки могут быть в коде, иногда – в данных информационной базы. Чтобы это понять, необходимо иметь доступ к базам причастным к обмену и четко понимать всю суть происходящего экспорта и импорта.
На первый взгляд работа с XDTO достаточно сложна, поэтому на первое время рекомендуется добавлять XDTO-пакеты в 1С для большего порядка и учета. Конечно, все нюансы изучить сразу невозможно, но в процессе работы вы будете продолжать учиться. Но с уверенной теоретической базой намного удобнее начинать разбираться в этом вопросе.
DS_SD
06.06.08 — 17:23
Подскажите, пожалуйста, что делаю не так…
При сериализации справочника возникает проблема с реквизитами, которые имеют тип перечисления и не заполнены
ОбъектXDTO.Проверка() выдает следующее:
Структура объекта не соответствует типу: {http://v8.1c.ru/8.1/data/enterprise/current-config}CatalogObject.ТипыЦенНоменклатуры
Проверка свойства ‘СпособРасчетаЦены’:
форма: Элемент
имя: {http://v8.1c.ru/8.1/data/enterprise/current-config}СпособРасчетаЦены
тип: {http://v8.1c.ru/8.1/data/enterprise/current-config}EnumRef.СпособыРасчетаЦены
Отсутствует обязательное свойство
Присваиваю значение свойству так:
ОбъектXDTO.СпособРасчетаЦены = Фабрика.Создать(ТипЗначенияXDTO, Спр.СпособРасчетаЦены);
ТипЗначенияXDTO содержит тип {http://v8.1c.ru/8.1/data/enterprise/current-config}EnumRef.СпособыРасчетаЦены
regniws
1 — 06.06.08 — 17:43
ну, видимо потому что в схеме, данные поля обязательны для заполнения.
DS_SD
2 — 06.06.08 — 17:52
Если ты о свойстве «Возможно пустое». пробовал, менял — все одно и тоже.
Кстати, функция возвращает такую ошибку:
{(1)}: Ошибка при вызове метода контекста (Создать): Ошибка проверки данных XDTO:
Значение: » не соответствует простому типу: {http://v8.1c.ru/8.1/data/enterprise/current-config}EnumRef.СпособыРасчетаЦены
Значение не соответствует значениям фасета перечисления
regniws
3 — 06.06.08 — 17:55
выгрузи пакет xdto в xsd схему и посмотри на нее глазками в разделе, где проверяются твои перечисления. Может на что тебя натолкнет.
Может глукануло и просто список доступных значений полей не соответствует тому, что есть в базе.
DS_SD
4 — 06.06.08 — 18:07
Вот так объявляется перечисление:
<xsd:simpleType name=»EnumRef.СпособыРасчетаЦены»>
<xsd:restriction base=»xsd:string»>
<xsd:enumeration value=»ПоПроцентнойНаценкеНаБазовыйТип»/>
<xsd:enumeration value=»ПоВхождениюБазовойЦеныВДиапазон»/>
</xsd:restriction>
</xsd:simpleType>
Вот так справочник:
<xsd:complexType name=»CatalogObject.ТипыЦенНоменклатуры»>
<xsd:sequence>
…
…
…
<xsd:element name=»СпособРасчетаЦены» type=»tns:EnumRef.СпособыРасчетаЦены»/>
</xsd:sequence>
</xsd:complexType>
мысли уже кончились…
regniws
5 — 06.06.08 — 18:11
хм.. ну, думаю, что ты у себя проверил, что всего два значения у тебя перечисления в конфигураторе!?
Кстати, в xsd твоем не сказано. что name=»СпособРасчетаЦены» необязательно для заполнения.
DS_SD
6 — 06.06.08 — 18:20
1) да, эта часть конфы идентична.
2) просто, поскольку это роли не сыграло, вернул взад… еще раз проверил, появилась строка :
<xsd:element name=»СпособРасчетаЦены» nillable=»true» type=»tns:EnumRef.СпособыРасчетаЦены»/>
толку от нее не увидел
regniws
7 — 06.06.08 — 18:23
хм.. а я знаю..
короче, нужно посмотреть, как сериализуется пустое значение перечисления.
nilable = true, говорит, что его вообще можно не заполнять, но
пустое значение и отсутствие значения — это разные вещи :)))
например, если сериализуется в «», то это не nilable = true, и к тому же по рестрикшенам xsd
<xsd:simpleType name=»EnumRef.СпособыРасчетаЦены»>
<xsd:restriction base=»xsd:string»>
<xsd:enumeration value=»ПоПроцентнойНаценкеНаБазовыйТип»/>
<xsd:enumeration value=»ПоВхождениюБазовойЦеныВДиапазон»/>
</xsd:restriction>
</xsd:simpleType>
это тоже не допустимо
попробуй в xsd Руками поправить
<xsd:simpleType name=»EnumRef.СпособыРасчетаЦены»>
<xsd:restriction base=»xsd:string»>
<xsd:enumeration value=»»/>
<xsd:enumeration value=»ПоПроцентнойНаценкеНаБазовыйТип»/>
<xsd:enumeration value=»ПоВхождениюБазовойЦеныВДиапазон»/>
</xsd:restriction>
</xsd:simpleType>
или во что оно там сериализуется.
regniws
8 — 06.06.08 — 18:23
а, ну и потом xsd загрузить обратно
DS_SD
9 — 06.06.08 — 18:30
))) Кошмар!!! Получилось! Спасибо тебе большое!
А если не ручками, а в конфигураторе, мышкой, такое получится?
regniws
10 — 06.06.08 — 18:31
не знаю :)) никогда не работал с xdto :))))
regniws
11 — 06.06.08 — 18:32
да, и хотелось бы, так сказать, мужской комплемент
зачетный вопрос, инетерсно было разобраться :)))
DS_SD
12 — 06.06.08 — 18:37
Похоже нет. Ничего подобного там не нашел… Ну 1С… :)) Ну такое то надо предусмотреть (при экспорте XML-схемы).
Ладно, теперь буду по аналогии мучать составные типы! Спасибо!
regniws
13 — 06.06.08 — 18:39
DS_SD
14 — 06.06.08 — 18:41
11 Спасибо ) надеюсь, ветка кому-н. еще пригодиться
10.04.17 — 11:29
Проблема следующая, в хмл файле который получен с вебсервиса есть пары элементов с одинаковым именем. Сооветсвено при попытке загрузить сжему пакета получаем следующие:
Ошибка проверки модели XDTO: xdto-objectType-3.1.2 тип: Transaction пакет: http://www.sample-package.org
Дублирование имени свойства ‘APMReferenceID’
Подскажите есть способ обойти эти грабли?
Схема такая:
<xs:schema xmlns:tns=»http://www.sample-package.org»; xmlns:xs=»http://www.w3.org/2001/XMLSchema»; targetNamespace=»http://www.sample-package.org»; attributeFormDefault=»unqualified» elementFormDefault=»qualified»>
<xs:complexType name=»Response»>
<xs:sequence>
<xs:element name=»RequestID» type=»xs:ID»/>
<xs:element name=»FromDate» type=»xs:dateTime»/>
<xs:element name=»ToDate» type=»xs:dateTime»/>
<xs:element name=»PageTransactionsCount» type=»xs:byte»/>
<xs:element name=»Transaction» type=»tns:Transaction» minOccurs=»0″ maxOccurs=»unbounded»/>
</xs:sequence>
<xs:attribute name=»Type» type=»xs:string»/>
<xs:attribute name=»Version» type=»xs:string»/>
</xs:complexType>
<xs:complexType name=»Transaction»>
<xs:sequence>
<xs:element name=»TransactionID» type=»xs:int»/>
<xs:element name=»ClientName» type=»xs:string»/>
<xs:element name=»RelatedTransactionID» type=»xs:int»/>
<xs:element name=»ClientUniqueID» type=»xs:string»/>
<xs:element name=»Result» type=»xs:string»/>
<xs:element name=»Reason» type=»xs:string»/>
<xs:element name=»AuthCode» type=»xs:string»/>
<xs:element name=»Amount» type=»xs:float»/>
<xs:element name=»Currency» type=»xs:string»/>
<xs:element name=»UserID» type=»xs:string»/>
<xs:element name=»TransactionDate» type=»xs:dateTime»/>
<xs:element name=»TransactionType» type=»xs:string»/>
<xs:element name=»IsRebill» type=»xs:boolean»/>
<xs:element name=»MembershipID» type=»xs:string»/>
<xs:element name=»Bank» type=»xs:string»/>
<xs:element name=»CardCompany» type=»xs:string»/>
<xs:element name=»Last4Digits» type=»xs:short»/>
<xs:element name=»Email» type=»xs:string»/>
<xs:element name=»FirstName» type=»xs:string»/>
<xs:element name=»LastName» type=»xs:string»/>
<xs:element name=»WebSite» type=»xs:string»/>
<xs:element name=»ShopID» type=»xs:byte»/>
<xs:element name=»CreditTypeId» type=»xs:byte»/>
<xs:element name=»APMTransactionID» type=»xs:string»/>
<xs:element name=»APMReferenceID» type=»xs:string»/>
<xs:element name=»Bin» type=»xs:int»/>
<xs:element name=»ExpDate» type=»xs:short»/>
<xs:element name=»Address» type=»xs:string»/>
<xs:element name=»City» type=»xs:string»/>
<xs:element name=»State» type=»xs:string»/>
<xs:element name=»ZipCode» type=»xs:string»/>
<xs:element name=»Country» type=»xs:string»/>
<xs:element name=»IPAddress» type=»xs:string»/>
<xs:element name=»Phone» type=»xs:string»/>
<xs:element name=»ReferenceID» type=»xs:string»/>
<xs:element name=»IsVoiceAuth» type=»xs:boolean»/>
<xs:element name=»RequestID» type=»xs:string»/>
<xs:element name=»UniqueCC» type=»xs:string»/>
<xs:element name=»ECI» type=»xs:byte»/>
<xs:element name=»ExternalAccountID» type=»xs:string»/>
<xs:element name=»APMReferenceID» type=»xs:string»/>
<xs:element name=»ProductID» type=»xs:string»/>
</xs:sequence>
<xs:attribute name=»TransactionID» type=»xs:int»/>
</xs:complexType>
</xs:schema>
Фрагмент файла XML:
<?xml version=»1.0″ encoding=»UTF-8″?>
<Response xmlns=»http://www.sample-package.org»; Type=»Transactions» Version=»1.1.6″>
<RequestID>3528276d-3df0-4c90-a56f-987f7c7bddcd</RequestID>
<FromDate>2017-03-17 00:00:00</FromDate>
<ToDate>2017-03-17 23:59:59</ToDate>
<PageTransactionsCount>89</PageTransactionsCount>
<Transaction TransactionID=»482390311″>
<TransactionID>482390311</TransactionID>
<ClientName>Awadticket Ltd 3D</ClientName>
<RelatedTransactionID>0</RelatedTransactionID>
<ClientUniqueID>a32a7453-30f2-4e5b-9d6b-7be5fef140db</ClientUniqueID>
<Result>Approved</Result>
<Reason />
<AuthCode />
<Amount>5.59</Amount>
<Currency>EUR</Currency>
<UserID />
<TransactionDate>2017-03-17 10:52:54</TransactionDate>
<TransactionType>Auth3D</TransactionType>
<IsRebill>false</IsRebill>
<MembershipID />
<Bank>Safecharge Acquirer — MasterCard</Bank>
<CardCompany>MasterCard</CardCompany>
<Last4Digits>1013</Last4Digits>
<Email />
<FirstName />
<LastName />
<WebSite />
<ShopID>0</ShopID>
<CreditTypeId>0</CreditTypeId>
<APMTransactionID />
<APMReferenceID />
<Bin>548673</Bin>
<ExpDate>1117</ExpDate>
<Address />
<City />
<State />
<ZipCode />
<Country>RU</Country>
<IPAddress />
<Phone />
<ReferenceID />
<IsVoiceAuth>false</IsVoiceAuth>
<RequestID />
<UniqueCC>Qdu4lEUWJTtBz37oeBS9SGcNcrY=</UniqueCC>
<ECI>7</ECI>
<ExternalAccountID />
<APMReferenceID />
<ProductID />
</Transaction>
<Transaction TransactionID=»482390373″>
<TransactionID>482390373</TransactionID>
<ClientName>Awadticket Ltd 3D</ClientName>
<RelatedTransactionID>0</RelatedTransactionID>
<ClientUniqueID>a32a7453-30f2-4e5b-9d6b-7be5fef140db</ClientUniqueID>
<Result>Approved</Result>
<Reason />
<AuthCode />
<Amount>15.5895</Amount>
<Currency>EUR</Currency>
<UserID />
<TransactionDate>2017-03-17 10:52:59</TransactionDate>
<TransactionType>Auth3D</TransactionType>
<IsRebill>false</IsRebill>
<MembershipID />
<Bank>Safecharge Acquirer — MasterCard</Bank>
<CardCompany>MasterCard</CardCompany>
<Last4Digits>1013</Last4Digits>
<Email />
<FirstName />
<LastName />
<WebSite />
<ShopID>0</ShopID>
<CreditTypeId>0</CreditTypeId>
<APMTransactionID />
<APMReferenceID />
<Bin>548673</Bin>
<ExpDate>1117</ExpDate>
<Address />
<City />
<State />
<ZipCode />
<Country>RU</Country>
<IPAddress />
<Phone />
<ReferenceID />
<IsVoiceAuth>false</IsVoiceAuth>
<RequestID />
<UniqueCC>Qdu4lEUWJTtBz37oeBS9SGcNcrY=</UniqueCC>
<ECI>7</ECI>
<ExternalAccountID />
<APMReferenceID />
<ProductID />
</Transaction>
</Response>
1 — 10.04.17 — 13:36
ап
2 — 10.04.17 — 13:39
убрать один из них, что тут думать
3 — 10.04.17 — 13:39
Или дать другое имя
4 — 10.04.17 — 13:46
я не могу убрать, не я генерю файл
5 — 10.04.17 — 13:47
я лишь схему сделал
6 — 10.04.17 — 13:48
Мне нужно так составить схему чтоб игнорировать этот повтор или совсем не читать эти колонки. Если это возможно конечно..
7 — 10.04.17 — 13:51
у Transaction последовательный = истина
а у APMReferenceID минимальное количество = 0, максимальное -1
ну и гемор с заполнением — добавлять в нужные места этот APMReferenceID уже не помню как, но не через обычный список.
Тот, кто формат сочинял — походу с головой не дружит. Ну, или мазохист.
8 — 10.04.17 — 13:52
еще можно _попробовать_ обозвать второй свойство APMReferenceID2 и указать у него локальное имя
9 — 10.04.17 — 13:53
но хз, будет ли работать
10 — 10.04.17 — 13:55
(8) не взлетело, пробовал
(7) сейчас проверю
11 — 10.04.17 — 13:57
если только читать такие файлы, то попроще
12 — 10.04.17 — 13:58
ну и можно минимальное = 2 максимальное = 2 поставить, если их действительно два
13 — 10.04.17 — 14:24
Ребята заработало, фрагстеру особое спасибо. Окончательный варинат схемы такой:
<xs:schema xmlns:tns=»http://www.sample-package.org»; xmlns:xs=»http://www.w3.org/2001/XMLSchema»; targetNamespace=»http://www.sample-package.org»; attributeFormDefault=»unqualified» elementFormDefault=»qualified»>
<xs:complexType name=»Response»>
<xs:sequence>
<xs:element name=»RequestID» type=»xs:ID»/>
<xs:element name=»FromDate» type=»xs:dateTime»/>
<xs:element name=»ToDate» type=»xs:dateTime»/>
<xs:element name=»PageTransactionsCount» type=»xs:byte»/>
<xs:element name=»Transaction» type=»tns:Transaction» minOccurs=»0″ maxOccurs=»unbounded»/>
</xs:sequence>
<xs:attribute name=»Type» type=»xs:string»/>
<xs:attribute name=»Version» type=»xs:string»/>
</xs:complexType>
<xs:complexType name=»Transaction»>
<xs:choice>
<xs:element name=»TransactionID» type=»xs:int»/>
<xs:element name=»ClientName» type=»xs:string»/>
<xs:element name=»RelatedTransactionID» type=»xs:int»/>
<xs:element name=»ClientUniqueID» type=»xs:string»/>
<xs:element name=»Result» type=»xs:string»/>
<xs:element name=»Reason» type=»xs:string»/>
<xs:element name=»AuthCode» type=»xs:string»/>
<xs:element name=»Amount» type=»xs:decimal»/>
<xs:element name=»Currency» type=»xs:string»/>
<xs:element name=»UserID» type=»xs:string»/>
<xs:element name=»TransactionDate» type=»xs:dateTime»/>
<xs:element name=»TransactionType» type=»xs:string»/>
<xs:element name=»IsRebill» type=»xs:boolean»/>
<xs:element name=»MembershipID» type=»xs:string»/>
<xs:element name=»Bank» type=»xs:string»/>
<xs:element name=»CardCompany» type=»xs:string»/>
<xs:element name=»Last4Digits» type=»xs:short»/>
<xs:element name=»Email» type=»xs:string»/>
<xs:element name=»FirstName» type=»xs:string»/>
<xs:element name=»LastName» type=»xs:string»/>
<xs:element name=»WebSite» type=»xs:string»/>
<xs:element name=»ShopID» type=»xs:byte»/>
<xs:element name=»CreditTypeId» type=»xs:byte»/>
<xs:element name=»APMTransactionID» type=»xs:string»/>
<xs:element name=»APMReferenceID» type=»xs:string» maxOccurs=»2″/>
<xs:element name=»Bin» type=»xs:int»/>
<xs:element name=»ExpDate» type=»xs:short»/>
<xs:element name=»Address» type=»xs:string»/>
<xs:element name=»City» type=»xs:string»/>
<xs:element name=»State» type=»xs:string»/>
<xs:element name=»ZipCode» type=»xs:string»/>
<xs:element name=»Country» type=»xs:string»/>
<xs:element name=»IPAddress» type=»xs:string»/>
<xs:element name=»Phone» type=»xs:string»/>
<xs:element name=»ReferenceID» type=»xs:string»/>
<xs:element name=»IsVoiceAuth» type=»xs:boolean»/>
<xs:element name=»RequestID» type=»xs:string»/>
<xs:element name=»UniqueCC» type=»xs:string»/>
<xs:element name=»ECI» type=»xs:byte»/>
<xs:element name=»ExternalAccountID» type=»xs:string»/>
<xs:element name=»ProductID» type=»xs:string»/>
</xs:choice>
<xs:attribute name=»TransactionID» type=»xs:int»/>
</xs:complexType>
</xs:schema>
14 — 10.04.17 — 14:33
а ещё вопрос, у исходного ответа сервера отсутствует атрибут xmlns=»http://www.sample-package.org»;; и я добавляю его через СтрЗаменить(ТекстОтвета,»<Response «,»<Response xmlns=»»http://www.sample-package.org»»;; «);)
может есть какое либо другое, более красивое решение этой задачи?
15 — 10.04.17 — 14:43
(14) ну, можно через документDOM добавлять… но надо ли?
16 — 10.04.17 — 14:44
в смысле — работает, не чини
17 — 10.04.17 — 15:05
(14) Есть — писать вручную корневой тэг ответа (ЗаписатьНачалоЭлемента), затем УстановитьСоответствиеПространстваИмен, затем пишешь через фабрику ХМЛ-содержимое, затем ЗаписатьКонецЭлемента
18 — 10.04.17 — 15:06
я же не пишу, я только читаю ответ вебсервиса
19 — 10.04.17 — 15:08
или имеется ввиду получение этого ответа и запись его у себя локально но уже с xmlns? а потом уже парсить по схеме?
20 — 10.04.17 — 15:09
А, тогда пофиг как
21 — 10.04.17 — 15:13
что-то типа того (работоспособность не проверял):
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(СтрокаXML);
Чтение.ПерейтиКСодержимому();
Построитель = Новый ПостроительDOM;
Документ = Построитель.Прочитать(Чтение);
Документ.ЭлементДокумента.УстановитьСоответствиеПространстваИмен(«», ПространствоИмен, Ложь);
Чтение = Новый ЧтениеУзловDOM;
Чтение.Открыть(Документ);
Чтение.ПерейтиКСодержимому();
ОбъектРезультат = ФабрикаXDTO.ПрочитатьXML(Чтение, ТипXDTO);
tan76
22 — 10.04.17 — 15:50
как то не заработал этот вариант, видимо СтрЗаменить наше всё, буду пока его использовать.
Одним из самых популярных форматов данных, используемых практически в любой компании, является XML (расширяемый язык разметки). Разработчики 1С создали специальный объект XDTO для удобства своих клиентов и простого взаимодействия с файлами XML, поэтому программисту 1С важно работать с этими объектами платформы, так как обмен данными через XML встречается постоянно.
Преимущества механизма XDTO
Этот функционал создавался как удобный инструмент обмена данными между конфигурациями и другими приложениями. Также этот механизм используют для работы с web-сервисами и для обработки произвольных данных. Большое преимущество XDTO перед другими способами – в нем есть возможность обращаться к файлу XML, как к объекту 1С. То есть все реквизиты можно будет получить, описывая структуру через точку, не задумываясь о скобках, тегах и атрибутах.
Взаимодействие с файлами XML происходит по заранее установленным правилам, описанным в объекте структуры конфигурации – XDTO – пакеты в 1С 8.3. Суть этих элементов структуры в том, что они представляют собой схемы, по которым будут распознаваться данные из XML-файлов. В типовых конфигурациях уже присутствуют подобные объекты, но при работе с конкретными файлами понадобятся другие схемы.
Существует два способа добавить XDTO-пакет в конфигурацию:
- Собственноручно создать. Этот вариант подойдет при самостоятельной работе с XML определенного формата. Зная, какие данные будут подаваться на вход для импорта с использованием XDTO, можно заранее создать в конфигурации нужный объект. Этот вариант хорош, если обмен данными налажен и никаких изменений не планируется;
Рис.1 XDTO пакеты - Импорт присланной схемы. Когда нам присылают данные, их схема может оказаться какой угодно, особенно, если раньше мы не работали с источником. Сильно упростит ситуацию, если вместе с XML нам пришлют и файл формата xsd. В нем содержится выгрузка XDTO-пакета, который может разобрать конкретные XML. Нам останется лишь импортировать его.
Чтобы загрузить данные из присланной нам схемы, необходимо в режиме конфигуратор открыть раздел «Общие» и «XDTO-пакеты». Через контекстное меню выбрать пункт «Импорт XML-схемы…», выбрать файл и подтвердить пространство имен, взятое из файла. После этого необходимо обновить конфигурацию, и предварительные настройки сделаны.
Но на самом деле в последнем случае нам необязательно создавать XDTO-пакеты в конфигурации 1С 8.3. Существует возможность только использовать XSD-схему, присланную нам из отдельного файла, не внося изменения в структуру базы 1С. Для этого нужно воспользоваться кодом, объясняющим платформе 1С, какой тип объекта с какими параметрами будет загружаться.
Это происходит следующими командами:
ФайлXSD = Новый Массив();
ФайлXSD.Добавить("D:1strust.xsd");
ФабрикаXDTOИзФайла = СоздатьФабрикуXDTO(ФайлXSD);
Номенклатура = ФабрикаXDTOИзФайла.Тип("http://www.1c.ru/products", "Номенклатура");
Экспорт и импорт файла
После того как мы разобрались с принципами использования пакетов XDTO, нужно посмотреть на механику работы с файлами XML. Лучше всего это будет видно на простом примере, чтобы понять основы. Добавим новый элемент в раздел XDTO-пакетов и настроим его следующим образом:
- Заполняем URI-пространство имен в свойствах XDTO пакета. Среди разработчиков 1С принято заполнять этот реквизит адресом страницы, заполненной описанием тех данных, с которыми происходит работа. Это помогает в работе, но не всегда возможно. В иных случаях заполняют произвольным текстом;
- Задаем тип объекта и его свойства, используя контекстное меню. Задаем имя этих параметров и для свойств определяем тип, выбирая его из предложенных платформой.
Следующим этапом будет написание процедуры для создания файла XML по описанной выше схеме. Код достаточно прост, поскольку создан XDTO-пакет, а у элемента всего 2 свойства – «Наименование» и «Артикул». Обращаться к конкретной схеме позволяет объект платформы «ФабрикаXDTO». Сама процедура состоит из:
- Определение схемы будущей XML;
ТипФабрики = ФабрикаXDTO.Тип("http://www.primerXML.ru/Nomen","Номенклатура");
- Заполнение свойств номенклатуры;
Номенклатура = ФабрикаXDTO.Создать(ТипФабрики); Номенклатура.Наименование = "Тест XML"; Номенклатура.Артикул = "2";
- Создание нового XML файла.
ИмяФайла = "D:1struct1.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:1struct1.xml";
МойXML = Новый ЧтениеXML;
МойXML.ОткрытьФайл(ИмяФайла);
номенклатура = ФабрикаXDTO.ПрочитатьXML(МойXML, ТипФабрики);
МойXML.Закрыть();
Теперь попробуем прочитать файл, схемы которого нет в нашей конфигурации. Для этого экспортируем XDTO-пакет в файл формата xsd и удалим схему из конфигурации. После этого нам придется объяснить платформе, откуда ей брать схему читаемой XML-кодом, продемонстрированным ранее. Однако в простейших случаях 1С самостоятельно может распознать все свойства.
Лучше все-таки не рассчитывать на понятливость платформы 1С, а использовать точную схему XML. Многие специалисты используют сторонний софт для их создания, но для этого необходим достаточно большой опыт и уровень подготовки. Работа с пакетами XDTO требует внимания и соблюдения точного соответствия файлов заданной схеме, чтобы минимизировать возможные ошибки.
Исправление ошибок
Одной из достаточно распространенных ошибок, связанных с работой с XDTO-пакетами, является «Ошибка преобразования данных XDTO». Ее суть заключается в том, что платформа не может разобрать данный ей XML-файл по заданной схеме. При получении подобной ошибки при импорте данных, необходимо проверить формат файлов – возможно, присутствуют незакрытые теги.
Зачастую проблема с ошибками преобразования данных возникает и по другим причинам:
- Ошибки в обновлении платформы или конфигурации;
- Обмен между базами разных версий;
- Недочеты в алгоритме приема данных;
- Проблемы с временной памятью конкретного компьютера.
Чтобы исправить эту ошибку, сначала почистите кэш или удалите, а также заново добавьте информационную базу в список баз. Затем внимательно проверьте файл XML – вдруг случайно сделали ошибку в его тексте, проверьте соответствие структуры пакету XDTO. Если ошибка появилась после обновления, сделайте тестирование и исправление ИБ, сохранив перед этим резервную копию базы. Если проблема не уйдет, вернитесь на предыдущую версию и подождите, пока разработчики 1С не разберутся с этой проблемой.
Еще одна проблема, часто мучающая программистов 1С, работающих с XDTO, – ошибка проверки данных. Если при импорте вы видите подобный текст, то с высокой долей вероятности источник проблемы в несоответствии файла нужной схеме. Но проблема может быть не на вашей стороне, а в базе, из которой выгружали XML. Чтобы исправить эту оплошность, придется внимательно изучить всю последовательность действий и найти, после чего файл перестал соответствовать ожиданиям.
Более сложная для анализа проблема, если при обмене информацией 1С выдает ошибку о несоответствии типов XDTO. В этом случае придется проверять все данные, находить ошибки и их причины. В некоторых случаях ошибки могут быть в коде, иногда – в данных информационной базы. Чтобы это понять, необходимо иметь доступ к базам причастным к обмену и четко понимать всю суть происходящего экспорта и импорта.
На первый взгляд работа с XDTO достаточно сложна, поэтому на первое время рекомендуется добавлять XDTO-пакеты в 1С для большего порядка и учета. Конечно, все нюансы изучить сразу невозможно, но в процессе работы вы будете продолжать учиться. Но с уверенной теоретической базой намного удобнее начинать разбираться в этом вопросе.