Как правильно присвоить значение типа «перечисление» свойству XDTO-объекта?

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

Работа с XDTO-пакетами в 1С часто вызывает вопросы у разработчиков, особенно когда дело доходит до типизации простых полей, определенных через xs:enumeration. Давайте разберем, как правильно инициализировать и присваивать значения свойствам типа documentStatus, чтобы избежать распространенных ошибок валидации и несоответствия типов.

Понимание проблемы

Когда вы импортируете XSD-схему в 1С, перечисления (simpleType с ограничением enumeration) превращаются в типы значений XDTO. Основная сложность заключается в том, что фабрика ФабрикаXDTO требует строгого указания пространства имен (URI), которое было определено в оригинальной XML-схеме. Ошибки типа «Несоответствие типов» чаще всего возникают из-за попытки указать системное пространство имен http://www.w3.org/2001/XMLSchema вместо URI конкретного пакета, к которому относится ваш тип.

Способ 1: Прямое присвоение строкового значения

Поскольку базовым типом для большинства таких перечислений является xs:string, платформа 1С достаточно интеллектуальна, чтобы принять обычную строку. Если значение входит в список разрешенных, вы можете присвоить его напрямую.

Это самый простой и лаконичный метод:


// Предположим, что СтруктураНакладной.СтатусНакладной содержит "NEW"
НакладнаяXDTO.status = "NEW";

Платформа автоматически проверит, соответствует ли переданная строка одному из значений enumeration, заданных в описании типа XDTO. Если вы попытаетесь записать недопустимое значение, система сообщит об ошибке при сериализации объекта.

Способ 2: Явное создание через Фабрику XDTO

В тех случаях, когда требуется строгая типизация или вы хотите убедиться, что значение создается «по правилам» пакета, используйте метод Создать() объекта ФабрикаXDTO. Рассмотрим по шагам, как это реализовать правильно:

  1. Определите тип с помощью ФабрикаXDTO.Тип(URI, ИмяТипа). Здесь критически важно указать правильный URI вашего пакета.
  2. Используйте метод Фабрика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 становится гораздо понятнее, как только вы начинаете рассматривать фабрику как строгий реестр всех типов, зарегистрированных в текущей сессии конфигурации 1С.

← На главную