Работа с XDTO-пакетами в 1С часто вызывает вопросы у разработчиков, особенно когда дело доходит до типизации простых полей, определенных через xs:enumeration. Давайте разберем, как правильно инициализировать и присваивать значения свойствам типа documentStatus, чтобы избежать распространенных ошибок валидации и несоответствия типов.
Когда вы импортируете XSD-схему в 1С, перечисления (simpleType с ограничением enumeration) превращаются в типы значений XDTO. Основная сложность заключается в том, что фабрика ФабрикаXDTO требует строгого указания пространства имен (URI), которое было определено в оригинальной XML-схеме. Ошибки типа «Несоответствие типов» чаще всего возникают из-за попытки указать системное пространство имен http://www.w3.org/2001/XMLSchema вместо URI конкретного пакета, к которому относится ваш тип.
Поскольку базовым типом для большинства таких перечислений является xs:string, платформа 1С достаточно интеллектуальна, чтобы принять обычную строку. Если значение входит в список разрешенных, вы можете присвоить его напрямую.
Это самый простой и лаконичный метод:
// Предположим, что СтруктураНакладной.СтатусНакладной содержит "NEW"
НакладнаяXDTO.status = "NEW";
Платформа автоматически проверит, соответствует ли переданная строка одному из значений enumeration, заданных в описании типа XDTO. Если вы попытаетесь записать недопустимое значение, система сообщит об ошибке при сериализации объекта.
В тех случаях, когда требуется строгая типизация или вы хотите убедиться, что значение создается «по правилам» пакета, используйте метод Создать() объекта ФабрикаXDTO. Рассмотрим по шагам, как это реализовать правильно:
ФабрикаXDTO.Тип(URI, ИмяТипа). Здесь критически важно указать правильный URI вашего пакета.ФабрикаXDTO.Создать(Тип, Значение) для формирования экземпляра.Пример корректного кода:
// Укажите URI, соответствующий вашему пакету XDTO
URI = "http://iiko.ru/xml/iiko_outgoinginvoice";
ТипСтатуса = ФабрикаXDTO.Тип(URI, "documentStatus");
// Создаем значение статуса
ЗначениеСтатуса = ФабрикаXDTO.Создать(ТипСтатуса, "PROCESSED");
// Присваиваем свойству объекта
НакладнаяXDTO.status = ЗначениеСтатуса;
Рассмотрим ситуацию, с которой сталкиваются новички. При попытке инициализации часто указывают http://www.w3.org/2001/XMLSchema. Это пространство имен зарезервировано для стандартных типов XML (string, int, date). Однако ваш тип documentStatus является пользовательским и существует только внутри вашего XDTO-пакета. Следовательно, ФабрикаXDTO «не видит» ваш тип в стандартных пространствах имен W3C.
Важно: Всегда проверяйте свойства XDTO-пакета в конфигураторе. В поле «URI пространства имен» указано значение, которое необходимо использовать в методе ФабрикаXDTO.Тип().
При работе с XML через XDTO всегда следуйте этим правилам:
ФабрикаXDTO.Создать(ТипОбъекта)) — для иерархических структур.XMLСтрока().Разбор этой ситуации показывает, что работа с XDTO становится гораздо понятнее, как только вы начинаете рассматривать фабрику как строгий реестр всех типов, зарегистрированных в текущей сессии конфигурации 1С.