Отсутствует обязательное свойство xdto 1c

Обновлено: 30.06.2024

Цель блога описать интересные и полезные примеры программирования в системе 1С:Предприятие 8.

понедельник, 12 ноября 2012 г.

1С:Предприятие 8. Веб-сервисы. XDTO

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

  1. Результат - число - результат выполнения сложения. 0 если есть ошибка;
  2. Ошибка - строка - "Ok" или "Передано отрицательное значение".

Для этого нам надо:

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

XDTO

Откроется окно свойств, назовем этот пакет "ТипыВебСервиса". В свойство "URI пространства имен" укажем "http://codenotes-1c.blogspot.com". Как я уже писал в статье 1С:Предприятие 8. Веб-сервисы. Реализация собственного веб-сервиса нет особого значения что вы укажете в этом поле и даже не особо важно (для 1С) что эта строка будет ссылкой URI. После этого пакет можно открыть, щелкнув в дереве метаданных по пакету "ТипыВебСервиса" и в новом окне добавим "Тип объекта".

ОбъектXDTO

Дадим ему имя "РезультатОперации", остальные свойства можно не менять.

ОбъектXDTO

У объекта создадим свойство. Для этого нажмем на него правой кнопкой и выберем "Добавить - Свойство".

Свойства ОбъектXDTO

Реквизиты ОбъектXDTO

И создадим второе свойство "Ошибка" как на картинке ниже.

Реквизиты Объект XDTO

На этом завершено создание пакета XDTO. Теперь можно приступить к написанию кода обработки ошибки и возврата результата веб-операции.

У нашего веб-сервиса WebService в свойство "Пакет XDTO" укажем только что созданный пакет. Иначе не сможем указать у веб-операции Plus2 тип "РезультатОперации".

Веб сервис ПакетXDTO

Откроем свойства веб-операции Plus2 в поле "Тип возвращаемого значения" выберем тип "РезультатОперации" из пакета с пространства имен "http://codenotes-1c.blogspot.com" как на рисунке.

ОбъектXDTO

Теперь функция Plus2 будет возвращать не число, а структуру с двумя полями "Результат" и "Ошибка". Давайте откроем модуль веб-сервиса. Так как созданная нами структура не является стандартным типом то необходимо создать переменную типа "РезультатОперации", конечно на самом деле это будет ОбъектXDTO. ТипXDTOРезультатОперации = ФабрикаXDTO.Тип("http://codenotes-1c.blogspot.com", "РезультатОперации");

Этой строкой мы с помощью Фабрики XDTO в конфигурации создали ТипОбъектаXDTO, указав пространство имен пакета и имя типа.

Эта строка создает уже сам ОбъектXDTO, с которым можно уже будет работать привычным способом (обращение к реквизитам через точку). Далее мы перепишем код, добавив проверку на отрицательные значения, и код веб-операции будет выглядеть так:


Функция Plus2(Параметр)
ТипXDTOРезультатОперации = ФабрикаXDTO.Тип("http://codenotes-1c.blogspot.com", "РезультатОперации");
РезультатОперации = ФабрикаXDTO.Создать(ТипXDTOРезультатОперации);
Если Параметр < 0 Тогда
РезультатОперации.Результат = 0;
РезультатОперации.Ошибка = "Передано отрицательное значение";
Иначе
РезультатОперации.Результат = Параметр+2;
РезультатОперации.Ошибка = "Ok";
КонецЕсли;
Возврат РезультатОперации;
КонецФункции

Если вызвать эту операцию с отрицательным значением то получим следующий результат: <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"> <m:return xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <Результат xmlns="http://codenotes-1c.blogspot.com">0</Результат> <Ошибка xmlns="http://codenotes-1c.blogspot.com">Передано отрицательное значение</Ошибка>

О том как вызвать операцию веб-сервиса и просмотреть результат вы можете прочитать в статье 1С:Предприятие 8. Веб-сервисы. Публикация и тестирование

ЗначениеXDTO

то этот тип можно использовать как тип входного параметра:

Свойства параметра веб-операции


<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
<soap:Header/>
<soap:Body>
<soap:Fault>
<soap:Code>
<soap:Value>soap:Sender</soap:Value>
</soap:Code>
<soap:Reason>
<soap:Text xml:lang="ru_RU">Неизвестная ошибка. Ошибка проверки данных XDTO:
Значение: '-2' не соответствует простому типу: ПоложительноеЧисло
Несоответствие фасету MinInclusive = '0'
по причине:
Ошибка проверки данных XDTO:
Значение: '-2' не соответствует простому типу: ПоложительноеЧисло
Несоответствие фасету MinInclusive = '0'</soap:Text>
</soap:Reason>
</soap:Fault>
</soap:Body>
</soap:Envelope>

Таким образом используя описание ЗначенияXDTO мы можем указать ограничения к типам и не задумываться о программной обработке значений. Вы можете использовать ЗначениеXDTO в полях ОбъектаXDTO, тем самым можете создавать очень сложные структуры типов данных.

Если ты о свойстве "Возможно пустое". пробовал, менял - все одно и тоже.

Кстати, функция возвращает такую ошибку:

: Ошибка при вызове метода контекста (Создать): Ошибка проверки данных XDTO:
Значение: '' не соответствует простому типу: EnumRef.СпособыРасчетаЦены
Значение не соответствует значениям фасета перечисления

выгрузи пакет xdto в xsd схему и посмотри на нее глазками в разделе, где проверяются твои перечисления. Может на что тебя натолкнет.

Может глукануло и просто список доступных значений полей не соответствует тому, что есть в базе.

Вот так объявляется перечисление:
<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>

мысли уже кончились.

хм.. ну, думаю, что ты у себя проверил, что всего два значения у тебя перечисления в конфигураторе!?

Кстати, в xsd твоем не сказано. что name="СпособРасчетаЦены" необязательно для заполнения.

1) да, эта часть конфы идентична.
2) просто, поскольку это роли не сыграло, вернул взад. еще раз проверил, появилась строка :
<xsd:element name="СпособРасчетаЦены" nillable="true" type="tns:EnumRef.СпособыРасчетаЦены"/>

толку от нее не увидел

хм.. а я знаю..
короче, нужно посмотреть, как сериализуется пустое значение перечисления.

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:simpleType name="EnumRef.СпособыРасчетаЦены">
<xsd:restriction base="xsd:string">
<xsd:enumeration value=""/>
<xsd:enumeration value="ПоПроцентнойНаценкеНаБазовыйТип"/>
<xsd:enumeration value="ПоВхождениюБазовойЦеныВДиапазон"/>
</xsd:restriction>
</xsd:simpleType>

Анна Викулина

Гарантируем стабильный обмен без ошибок между программами 1С. Гарантии фиксируем в договоре.

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

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

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

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

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

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

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

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

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

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

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

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

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

  1. Определение схемы будущей XML;
  2. Заполнение свойств номенклатуры;
  3. Создание нового XML файла.

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

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

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

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

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

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

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

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

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

Использование объектов XDTO в web-сервисах

Механизм XDTO представляет собой гибкое средство моделирования данных, которое широко используется в технологии web-сервисов 1С:Предприятия. В этой статье мы рассмотрим, как с использованием XDTO можно задавать различные типы данных и как их применять в web-сервисах.

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

Способность сериализоваться/десериализоваться в формат переноса данных позволяет объекту переноса данных мигрировать с одного компьютера на другой. Между разными компьютерами и даже разными процессами одного компьютера нет единого адресного пространства и нет возможности передавать объект по ссылке. Поэтому сериализация является единственным способом взаимодействия между этими процессами. Сериализация позволяет представить объект в некоторой промежуточной форме, например в виде xml, передать эту промежуточную форму заданному процессу заданного компьютера и обратно десериализовать объект в вид, пригодный для программного использования.

Свойство замкнутости позволяет объекту переноса данных обеспечить необходимый уровень целостности, т.к. если бы какая-либо его часть ссылалась на другие объекты, то после переноса и десериализации эта ссылка стала бы недействительной, из чего следовало бы, что и сам объект переноса данных был бы непригоден для дальнейшего использования. Свойство замкнутости не запрещает иметь ссылки внутри объекта переноса данных, т.к. объект сериализуется/десериализуется как единой целое и механизм сериализации обеспечивает правильное преобразование ссылок внутри объекта переноса данных.

Механизм XDTO позволяет определять объекты переноса данных, которые могут образовывать строгую иерархию и могут сериализоваться в XML. Эти свойства позволили использовать объекты XDTO в качестве параметров и возвращаемых значений операций web-сервисов.

Все типы данных XDTO подразделяются на типы-значения и типы-объекты. Типы-значения позволяют определять простые типы, например, строки, числа, даты, булевы значения и т.д. Типы-объекты позволяют определять сложные типы, такие как структуры и массивы. Рассмотрим более подробно, как задавать с помощью XDTO некоторые характерные типы.

Строки

Строки моделируются типами-значениями. Строковый тип имеет имя: string . В фигурных скобках здесь задается пространство имен типа. В XDTO как и в XML схеме, на которой он основан, все типы имеют пространство имен и локальное имя.

Для создания строкового значения нужно:

Строка при передаче представляется в виде текста xml тега:

Следует учесть, что строки конвертируются в UTF-8 при сериализации.

Целые числа

Целые числа моделируются типами-значениями. Целочисленный тип имеет имя: int .

Для создания целочисленного значения нужно:

Число при передаче представляется в виде текста xml тега:

Дробные числа

Дробные числа моделируются типами-значениями. Дробный тип с фиксированной точкой имеет имя: decimal , дробный тип с плавающей точкой имеет имя: float , дробный тип с плавающей точкой двойной точности имеет имя: double .

Для создания дробного значения нужно:

Число при передаче представляется в виде текста xml тега:

Даты моделируются типами-значениями. Тип даты без времени имеет имя: date , тип времени без даты имеет имя: time , тип даты и времени имеет имя: dateTime .

Для создания значения даты нужно:

Число при передаче представляется в виде текста xml тега:

Лексическое представление даты задается в формате:

Временная зона может быть не указана.

Лексическое представление времени задается в формате:

Временная зона может быть не указана.

Лексическое представление даты вместе со временем задается в формате:

Дата от времени разделяется символом T . Временная зона может быть не указана.

Структуры

Структуры моделируются типами-объектами. Перед тем как использовать структуру необходимо создать пакет XDTO, описываающий тип-объект структуры (например, через редактор XDTO). Тип-объект может содержать свойства, котрые соответствуют элементам структуры. Каждое свойство характеризуется уникальным именем и типом. Тип свойства может быть как типом-значением, так и типом-объектом.

Например, для создания структуры Номенклатура из демо-конфигурации Web-Сервисы нужно:

Структура при передаче представляется в виде xml структуры:

Массивы

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

Например, для создания массива номенклатур, определенного в свойстве Элементы структуры НоменклатураГруппа из демо-конфигурации Web-Сервисы нужно:

Массив при передаче представлятся в виде xml структуры:

Рассмотрим, как создавать типы и элементы в случае клиента web-сервиса и в случае сервера web-сервиса.

Каждый клиентский прокси (клиентская часть web-сервиса - объект WSПрокси ) содержит ссылку на фабрику XDTO, которая может использоваться для создания объектов и значений XDTO для передачи в качестве параметров и возвращаемых значений операций web-сервисов. Заметим, что глобальная XDTO фабрика (получаемая через свойство глобального контекста ФабрикаXDTO) не может быть использована для создания объектов и значений для передачи через прокси, даже если она содержит типы с такой же структурой и именами. Эти типы все равно будут считаться несовместимыми с типами данных web-сервиса.

Каждая реализация веб-сервиса (серверная часть web-сервиса) может использовать глобальную XDTO фабрику (получаемую через свойство глобального контекста ФабрикаXDTO) для создания объектов и значений web-сервиса.

Есть очень много статей о том, как работать с XSL/XSD из 1С, но все они в стиле: возьмем нашу XSD схему (простую и удбоную) или наш web-сервис и смотрите, как все легко экспортировать или импортировать. А что делать, если нам дали пачку XSD-схем со сложным взаимосвязями и изменять мы них не можем, а работать и поддерживать актуальность схем надо?

Сразу скажу, вопросы шифрования/подписи по ГОСТУ при работе с ГИС ЖКХ за рамками этой статьи и на хабре уже освещались. Хотя без подписей запросы выполнить не удастся.

image


Начнем с простого — скачаем пакет форматов по интеграционному взаимодействию с ГИС ЖКХ, импортируем все xsd схемы из пакета интеграций, наведем порядок переименуем все как нам удобно. В итоге получим как показано на картинке:

Ну а теперь приступим к магии. Попробуем запросить данные из справочника организаций по ОРГН. Это подсистема organizations-registry-common метод exportOrgRegist.

В hcs-organizations-registry-common-service.wsdl указано:

Спецификация из hcs-organizations-registry-common-service.wsdl
Надо собрать SOAP пакет из заголовка ISRequestHeader, тела exportOrgRegistryRequest. Посмотрим их в xsd схемах спецификаций по интеграций.

Ну приступим, откроем нужные нам пакеты XDTO. Оказывается, нужные сущности являются не типами, а свойствами, как с этим работать в документации на XDTO в статьях, которые я находил, не описано, поэтому воспользуемся урокам магии:

Начнем с тела exportOrgRegistryRequest.


Напишем функцию для сбора XML-запроса:


В итоге получим запрос:


Ответ от серверов ГИС ЖКХ (СИТ-1):

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


В итоге работать можно с очень сложными xsd схемами через стандартные инструменты платформы. В целом 1С контролируют типизацию и заполнения, бывает чересчур излишне, особенно когда внутри свойства пакета используется базовый тип другого пакета, но в любом случае тип нужно привести к локальному из-за другого пространства URI. Удобно работать с десериализоваными данными, так как там всю работу на себя берет платформа. Но проверки происходят на этапе выполнения, а при написания кода платформа 1С не предоставляет никаких подсказок и проходится пользоваться сторонними утилитами, и даже при выполнении большая часть элементов находится в состоянии «Неопределено» и даже тип или его свойство можно увидеть только в спецификации.

Читайте также: