Как исправить ошибки XDTO: 'Неизвестное свойство' при добавлении в список и 'Не установлено значение' при обмене данными?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе с механизмами обмена данными в 1С, особенно с использованием технологии XDTO (XML Data Transfer Objects), разработчики часто сталкиваются с неочевидными ошибками. Две из них особенно распространены: ошибка «Неизвестное свойство» при попытке добавить элемент в коллекцию и ошибка «Не установлено значение свойства» при получении данных через веб-сервис. Эти проблемы, как правило, вызваны не ошибками в коде, а некорректной настройкой самого XDTO-пакета. Давайте подробно разберем причины этих ошибок и пошагово рассмотрим их решение.

Проблема №1: Ошибка «Неизвестное свойство» при использовании метода Добавить()

Проанализируем типичную ситуацию. У нас есть объект XDTO, например, DocumentList, который по своей логике должен содержать список документов. В XDTO-пакете для него определено свойство Document. Мы пытаемся добавить в этот список новый документ с помощью кода:

DocumentList.Добавить("Document", Document);

В ответ на это действие система выдает ошибку: «Неизвестное свойство: Свойство 'Document' не обнаружено». Ошибка выглядит парадоксальной, ведь мы уверены, что свойство Document у объекта DocumentList существует. В чем же дело?

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

Эта возможность определяется параметром «Максимальное количество» (в XML-схеме это атрибут maxOccurs).

Разберем по шагам, как это исправить:

  1. Откройте конфигуратор и найдите ваш XDTO-пакет, в котором описана структура данных.
  2. В дереве пакета найдите тип объекта, с которым возникает проблема (в нашем примере это DocumentList).
  3. Раскройте его свойства и выделите то, которое должно быть списком (в нашем примере — Document).
  4. В палитре свойств для этого элемента найдите параметр «Максимальное количество» и измените его значение с «1» на «-1».
  5. Также рекомендуется проверить параметр «Минимальное количество». Если список может быть пустым, установите для него значение «0». Это хорошая практика, которая предотвратит другие возможные ошибки.
  6. Сохраните изменения в XDTO-пакете и обновите конфигурацию базы данных.

После выполнения этих действий свойство Document будет корректно интерпретироваться платформой как СписокXDTO, и вызов метода Добавить() будет отрабатывать без ошибок.

Проблема №2: Ошибка «Не установлено значение свойства» при получении данных по WS-ссылке

Итак, первую проблему мы решили. Теперь данные формируются и отправляются. Но на принимающей стороне, при чтении данных, полученных через веб-сервис (WS-ссылку), возникает новая ошибка: «Не установлено значение одного из свойств объекта». При этом проверка на стороне отправителя показывает, что все поля в передаваемом списке заполнены. Что же опять не так?

Проанализируем ситуацию. Эта ошибка связана с понятием обязательности свойств в XDTO. Когда вы создаете новое свойство в XDTO-пакете, по умолчанию оно считается обязательным. За это отвечает параметр «Минимальное количество» (в XML-схеме — minOccurs).

Проблема возникает, когда передающая система по какой-то причине не включает этот тег в XML. Например, если значение свойства — это пустая строка, Неопределено или NULL, и логика сериализации на стороне отправителя настроена так, чтобы не создавать пустые теги. В этом случае принимающая сторона, получив XML без обязательного тега, считает структуру нарушенной и выдает ошибку.

Посмотрим на решение:

Чтобы исправить это, нужно сделать проблемное свойство необязательным на принимающей стороне.

  1. Откройте конфигуратор на принимающей стороне и найдите соответствующий XDTO-пакет.
  2. Найдите тип объекта и свойство, на которое указывает текст ошибки.
  3. В палитре свойств для этого элемента измените параметр «Минимальное количество» с «1» на «0».
  4. Сохраните изменения и обновите конфигурацию.

Это изменение говорит системе, что наличие данного тега в XML-сообщении не является обязательным. Если тег придет — система его обработает. Если не придет — это не будет считаться ошибкой, и свойство просто останется незаполненным. Это стандартная практика для полей, которые могут быть не заполнены в источнике данных.

Важное дополнение. Следует различать свойство, которое может отсутствовать, и свойство, которое может быть пустым (nil). Параметр Минимальное количество = 0 разрешает полное отсутствие тега в XML. В то же время, есть свойство Возможно пустое = Истина (nillable="true" в XSD), которое требует наличия тега, но позволяет ему иметь специальный атрибут, указывающий на значение "null", например: <МоеСвойство xsi:nil="true"/>. Для большинства сценариев обмена достаточно сделать свойство необязательным через Минимальное количество = 0.

Таким образом, внимательная настройка свойств «Минимальное количество» и «Максимальное количество» в XDTO-пакетах позволяет избежать большинства распространенных ошибок и обеспечить надежный и гибкий обмен данными между системами.

← На главную