При работе с механизмами обмена данными в 1С, особенно с использованием технологии XDTO (XML Data Transfer Objects), разработчики часто сталкиваются с неочевидными ошибками. Две из них особенно распространены: ошибка «Неизвестное свойство» при попытке добавить элемент в коллекцию и ошибка «Не установлено значение свойства» при получении данных через веб-сервис. Эти проблемы, как правило, вызваны не ошибками в коде, а некорректной настройкой самого XDTO-пакета. Давайте подробно разберем причины этих ошибок и пошагово рассмотрим их решение.
Проанализируем типичную ситуацию. У нас есть объект XDTO, например, DocumentList, который по своей логике должен содержать список документов. В XDTO-пакете для него определено свойство Document. Мы пытаемся добавить в этот список новый документ с помощью кода:
DocumentList.Добавить("Document", Document);
В ответ на это действие система выдает ошибку: «Неизвестное свойство: Свойство 'Document' не обнаружено». Ошибка выглядит парадоксальной, ведь мы уверены, что свойство Document у объекта DocumentList существует. В чем же дело?
Выясним причину. Корень проблемы кроется в том, как платформа 1С интерпретирует свойства объектов XDTO на основе их настроек в пакете. Свойство объекта XDTO будет вести себя как коллекция (СписокXDTO), к которой можно применять методы вроде Добавить(), Вставить(), Количество(), только в одном случае: если в его настройках указана возможность хранения более чем одного элемента.
Эта возможность определяется параметром «Максимальное количество» (в XML-схеме это атрибут maxOccurs).
Максимальное количество установлено в «1», платформа считает его одиночным, скалярным свойством. Его типом будет ОбъектXDTO (или примитивный тип), но не СписокXDTO. У такого объекта, естественно, нет метода Добавить(), что и приводит к ошибке.Максимальное количество должно быть больше 1. Общепринятой практикой является установка значения «-1», что означает «неограниченное количество элементов».Разберем по шагам, как это исправить:
DocumentList).Document).После выполнения этих действий свойство Document будет корректно интерпретироваться платформой как СписокXDTO, и вызов метода Добавить() будет отрабатывать без ошибок.
Итак, первую проблему мы решили. Теперь данные формируются и отправляются. Но на принимающей стороне, при чтении данных, полученных через веб-сервис (WS-ссылку), возникает новая ошибка: «Не установлено значение одного из свойств объекта». При этом проверка на стороне отправителя показывает, что все поля в передаваемом списке заполнены. Что же опять не так?
Проанализируем ситуацию. Эта ошибка связана с понятием обязательности свойств в XDTO. Когда вы создаете новое свойство в XDTO-пакете, по умолчанию оно считается обязательным. За это отвечает параметр «Минимальное количество» (в XML-схеме — minOccurs).
Минимальное количество равно «1», это означает, что приходящий XML-документ обязан содержать тег, соответствующий этому свойству.Проблема возникает, когда передающая система по какой-то причине не включает этот тег в XML. Например, если значение свойства — это пустая строка, Неопределено или NULL, и логика сериализации на стороне отправителя настроена так, чтобы не создавать пустые теги. В этом случае принимающая сторона, получив XML без обязательного тега, считает структуру нарушенной и выдает ошибку.
Посмотрим на решение:
Чтобы исправить это, нужно сделать проблемное свойство необязательным на принимающей стороне.
Это изменение говорит системе, что наличие данного тега в XML-сообщении не является обязательным. Если тег придет — система его обработает. Если не придет — это не будет считаться ошибкой, и свойство просто останется незаполненным. Это стандартная практика для полей, которые могут быть не заполнены в источнике данных.
Важное дополнение. Следует различать свойство, которое может отсутствовать, и свойство, которое может быть пустым (nil). Параметр Минимальное количество = 0 разрешает полное отсутствие тега в XML. В то же время, есть свойство Возможно пустое = Истина (nillable="true" в XSD), которое требует наличия тега, но позволяет ему иметь специальный атрибут, указывающий на значение "null", например: <МоеСвойство xsi:nil="true"/>. Для большинства сценариев обмена достаточно сделать свойство необязательным через Минимальное количество = 0.
Таким образом, внимательная настройка свойств «Минимальное количество» и «Максимальное количество» в XDTO-пакетах позволяет избежать большинства распространенных ошибок и обеспечить надежный и гибкий обмен данными между системами.