Объект схемы XML.
Полное описание, параметры и ограничения
СхемаXML (XMLSchema)
СхемаXML (XMLSchema)
Доступен, начиная с версии 8.1.
Свойства:
Аннотация (Annotation)
Компоненты (Components)
Контейнер (Container)
КорневойКонтейнер (RootContainer)
Схема (Schema)
ТипКомпоненты (ComponentType)
ЭлементDOM (DOMElement)
URIПространстваИменСхемыДляСхемыXML (SchemaForSchemaNamespaceURI)
Аннотации (Annotations)
БлокировкаПоУмолчанию (BlockDefault)
Версия (Version)
Директивы (Directives)
ДокументDOM (DOMDocument)
ЗавершенностьПоУмолчанию (FinalDefault)
ОбъявленияАтрибутов (AttributeDeclarations)
ОбъявленияНотаций (NotationDeclarations)
ОбъявленияЭлементов (ElementDeclarations)
ОпределенияГруппАтрибутов (AttributeGroupDefinitions)
ОпределенияГруппМоделей (ModelGroupDefinitions)
ОпределенияОграниченийИдентичности (IdentityConstraintDefinitions)
ОпределенияТипов (TypeDefinitions)
ПрефиксСхемыДляСхемыXML (SchemaForSchemaPrefix)
ПространствоИмен (TargetNamespace)
РасположениеСхемы (SchemaLocation)
Содержимое (Content)
СхемаДляСхемыXML (SchemaForSchema)
ФормаАтрибутовПоУмолчанию (AttributeFormDefault)
ФормаЭлементовПоУмолчанию (ElementFormDefault)
Язык (Lang)
Методы:
КлонироватьКомпоненту (CloneComponent)
ОбновитьЭлементDOM (UpdateDOMElement)
Содержит (Contains)
РазрешитьОбъявлениеАтрибута (ResolveAttributeDeclaration)
РазрешитьОбъявлениеЭлемента (ResolveElementDeclaration)
РазрешитьОпределениеГруппыАтрибутов (ResolveAttributeGroupDefinition)
РазрешитьОпределениеГруппыМоделей (ResolveModelGroupDefinition)
РазрешитьОпределениеТипа (ResolveTypeDefinition)
Конструкторы:
По умолчанию
Описание:
Объект схемы XML.
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.
См. также:
АннотацияXS, свойство Схема
СхемаXML, свойство Схема
ИнформацияДляПриложенияXS, свойство Схема
ДокументацияXS, свойство Схема
ФасетМинимальногоИсключающегоЗначенияXS, свойство Схема
ФасетМинимальногоВключающегоЗначенияXS, свойство Схема
ФасетМаксимальногоИсключающегоЗначенияXS, свойство Схема
ФасетМаксимальногоВключающегоЗначенияXS, свойство Схема
ФасетДлиныXS, свойство Схема
ФасетМинимальнойДлиныXS, свойство Схема
ФасетМаксимальнойДлиныXS, свойство Схема
ФасетОбщегоКоличестваРазрядовXS, свойство Схема
ФасетКоличестваРазрядовДробнойЧастиXS, свойство Схема
ФасетПеречисленияXS, свойство Схема
ФасетОбразцаXS, свойство Схема
ФасетПробельныхСимволовXS, свойство Схема
ОпределениеПростогоТипаXS, свойство Схема
ОпределениеСоставногоТипаXS, свойство Схема
ОпределениеГруппыАтрибутовXS, свойство Схема
ОпределениеГруппыМоделиXS, свойство Схема
ОбъявлениеАтрибутаXS, свойство Схема
ОбъявлениеЭлементаXS, свойство Схема
ОпределениеОграниченияИдентичностиXS, свойство Схема
ОпределенияXPathXS, свойство Схема
ОбъявлениеНотацииXS, свойство Схема
МаскаXS, свойство Схема
ИмпортXS, свойство Схема
ВключениеXS, свойство Схема
ПереопределениеXS, свойство Схема
ИспользованиеАтрибутаXS, свойство Схема
ГруппаМоделиXS, свойство Схема
ФрагментXS, свойство Схема
ИмпортXS, свойство РазрешеннаяСхема
ВключениеXS, свойство РазрешеннаяСхема
ПереопределениеXS, свойство РазрешеннаяСхема
СхемаXML, свойство СхемаДляСхемыXML
НаборСхемXML, метод Получить
НаборСхемXML, метод Добавить
Использование в версии:
Доступен, начиная с версии 8.1.
Методическая информация
Практические примеры
Создать ограничения собственного контракта: скидка, описание и статус
Из шести видов новых фасетов строим восемь действующих ограничений для трёх собственных типов XML Schema. Проверяем не только созданные объекты, но и 13 допустимых и недопустимых входных значений через собственную фабрику XDTO.
Где и как запускать
Полный серверный общий модуль УчебныеОграничения своей новой пустой конфигурации УчебныеФасеты85 и полный отдельный модуль формы. В1С не запускался.
Подготовка
НОВАЯ пустая отдельная учебная база точно 8.5.1.1343. Имя конфигурации УчебныеФасеты85, совместимость Не использовать. Нет бизнес-объектов, расширений, подписок и фоновых заданий; чужие базы и XML не используются.
Создайте общий модуль УчебныеОграничения: Сервер=Да, Вызов сервера=Да, Клиент=Нет, Глобальный=Нет, Привилегированный=Нет. Вставьте полный основной модуль. Создайте свою внешнюю обработку УчебныеФасеты85 с управляемой формой и командой/кнопкой Выполнить, действие Выполнить; отдельный полный модуль формы приведён ниже.
Будущая ручная подготовка: сохранить конфигурацию, Конфигурация → Обновить конфигурацию базы данных (F7), открыть новый собственный клиент и свою обработку. Здесь F7, форма, BSL и XDTO не запускались.
Исходная XML-строка содержит три собственных simpleType без фасетов, только xs:string и xs:decimal. Пространство имён urn:guide:owned-facets — идентификатор, не сетевой адрес. Нет import/include, чтения файлов, настоящей интеграции или изменения метаданных базы.
Процедура ВыполнитьПример() Экспорт
ПроверитьСвойПустойСтенд();
Схема = ПостроитьСвоюИсходнуюСхему();
Скидка = ПолучитьСвоеОпределение(Схема, "Discount");
Описание = ПолучитьСвоеОпределение(Схема, "Description");
Статус = ПолучитьСвоеОпределение(Схема, "Status");
МинимальнаяСкидка = Новый ФасетМинимальногоИсключающегоЗначенияXS;
ПрисоединитьСвойФасет(Скидка, МинимальнаяСкидка, "ФасетМинимальногоИсключающегоЗначенияXS", 0, "0");
МаксимальнаяСкидка = Новый ФасетМаксимальногоИсключающегоЗначенияXS;
ПрисоединитьСвойФасет(Скидка, МаксимальнаяСкидка, "ФасетМаксимальногоИсключающегоЗначенияXS", 1, "1");
МинимальнаяДлина = Новый ФасетМинимальнойДлиныXS;
ПрисоединитьСвойФасет(Описание, МинимальнаяДлина, "ФасетМинимальнойДлиныXS", 3, "3");
МаксимальнаяДлина = Новый ФасетМаксимальнойДлиныXS;
ПрисоединитьСвойФасет(Описание, МаксимальнаяДлина, "ФасетМаксимальнойДлиныXS", 20, "20");
Пробелы = Новый ФасетПробельныхСимволовXS;
ПрисоединитьСвойФасет(Статус, Пробелы, "ФасетПробельныхСимволовXS", ОбработкаПробельныхСимволовXS.Сворачивать, "collapse");
Для Каждого ИмяСтатуса Из СтрРазделить("draft,published,closed", ",") Цикл
ДопустимыйСтатус = Новый ФасетПеречисленияXS;
ПрисоединитьСвойФасет(Статус, ДопустимыйСтатус, "ФасетПеречисленияXS", ИмяСтатуса, ИмяСтатуса);
КонецЦикла;
Если Скидка.Фасеты.Количество() <> 2 Или Описание.Фасеты.Количество() <> 2 Или Статус.Фасеты.Количество() <> 4 Тогда
ВызватьИсключение "Не совпало распределение восьми собственных фасетов";
КонецЕсли;
Скидка.ОбновитьЭлементDOM();
Описание.ОбновитьЭлементDOM();
Статус.ОбновитьЭлементDOM();
Схема.ОбновитьЭлементDOM();
Набор = Новый НаборСхемXML;
Набор.Добавить(Схема);
Если Не Набор.Проверить() Тогда
ВызватьИсключение "Собственная схема должна быть корректна до проверки отдельных значений";
КонецЕсли;
Фабрика = Новый ФабрикаXDTO(Набор);
Случаи = Новый Массив;
Случаи.Добавить(Новый Структура("Имя,Вход,Допустимо,Выход", "Discount", "0", Ложь, Неопределено));
Случаи.Добавить(Новый Структура("Имя,Вход,Допустимо,Выход", "Discount", "0.25", Истина, 0.25));
Случаи.Добавить(Новый Структура("Имя,Вход,Допустимо,Выход", "Discount", "1", Ложь, Неопределено));
Случаи.Добавить(Новый Структура("Имя,Вход,Допустимо,Выход", "Discount", "-0.1", Ложь, Неопределено));
Случаи.Добавить(Новый Структура("Имя,Вход,Допустимо,Выход", "Description", "Аб", Ложь, Неопределено));
Случаи.Добавить(Новый Структура("Имя,Вход,Допустимо,Выход", "Description", "ABC", Истина, "ABC"));
Случаи.Добавить(Новый Структура("Имя,Вход,Допустимо,Выход", "Description", "12345678901234567890", Истина, "12345678901234567890"));
Случаи.Добавить(Новый Структура("Имя,Вход,Допустимо,Выход", "Description", "123456789012345678901", Ложь, Неопределено));
Случаи.Добавить(Новый Структура("Имя,Вход,Допустимо,Выход", "Status", "draft", Истина, "draft"));
Случаи.Добавить(Новый Структура("Имя,Вход,Допустимо,Выход", "Status", " published ", Истина, "published"));
Случаи.Добавить(Новый Структура("Имя,Вход,Допустимо,Выход", "Status", "closed", Истина, "closed"));
Случаи.Добавить(Новый Структура("Имя,Вход,Допустимо,Выход", "Status", "deleted", Ложь, Неопределено));
Случаи.Добавить(Новый Структура("Имя,Вход,Допустимо,Выход", "Status", "PUBLISHED", Ложь, Неопределено));
ПроверитьСвоиСлучаи(Фабрика, Случаи);
КонецПроцедуры
Процедура ПроверитьСвойПустойСтенд()
Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
КонецЕсли;
Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
КонецЕсли;
Источники = Новый Массив;
Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
Для Каждого Источник Из Источники Цикл
Расширения = РасширенияКонфигурации.Получить(, Источник);
Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
ВызватьИсключение "Native список расширений должен иметь тип Массив";
КонецЕсли;
Если Расширения.Количество() <> 0 Тогда
ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
КонецЕсли;
КонецПроцедуры
Функция ПостроитьСвоюИсходнуюСхему()
XSD = "<xs:schema xmlns:xs=""http://www.w3.org/2001/XMLSchema"" targetNamespace=""urn:guide:owned-facets"">
|<xs:simpleType name=""Discount""><xs:restriction base=""xs:decimal""/></xs:simpleType>
|<xs:simpleType name=""Description""><xs:restriction base=""xs:string""/></xs:simpleType>
|<xs:simpleType name=""Status""><xs:restriction base=""xs:string""/></xs:simpleType>
|</xs:schema>";
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(XSD);
Попытка
Построитель = Новый ПостроительDOM;
DOM = Построитель.Прочитать(Чтение);
Исключение
Чтение.Закрыть();
ВызватьИсключение;
КонецПопытки;
Чтение.Закрыть();
ПостроительСхемы = Новый ПостроительСхемXML;
Схема = ПостроительСхемы.СоздатьСхемуXML(DOM.ЭлементДокумента);
Если ТипЗнч(Схема) <> Тип("СхемаXML") Или Схема.ПространствоИмен <> "urn:guide:owned-facets" Тогда
ВызватьИсключение "Не построена своя исходная XML-схема";
КонецЕсли;
Возврат Схема;
КонецФункции
Функция ПолучитьСвоеОпределение(Схема, Имя)
Определение = Схема.ОпределенияТипов.Получить(Имя, "urn:guide:owned-facets");
Если ТипЗнч(Определение) <> Тип("ОпределениеПростогоТипаXS") Или Определение.Имя <> Имя Тогда
ВызватьИсключение "Не найден свой исходный простой тип " + Имя;
КонецЕсли;
Если Определение.Фасеты.Количество() <> 0 Тогда
ВызватьИсключение "В исходном собственном типе не должно быть уже заданных фасетов";
КонецЕсли;
Возврат Определение;
КонецФункции
Процедура ПрисоединитьСвойФасет(Определение, Фасет, ОжидаемыйТип, Значение, Лексическое)
Если ТипЗнч(Фасет) <> Тип(ОжидаемыйТип) Тогда
ВызватьИсключение "Не совпал конкретный тип нового собственного фасета";
КонецЕсли;
Определение.Фасеты.Добавить(Фасет);
Фасет.Значение = Значение;
Фасет.ЛексическоеЗначение = Лексическое;
Если ТипЗнч(Фасет.Значение) <> ТипЗнч(Значение) Или Фасет.Значение <> Значение
Или Фасет.ЛексическоеЗначение <> Лексическое Тогда
ВызватьИсключение "Не совпали типизированное и лексическое значения своего фасета";
КонецЕсли;
Если Фасет.ОпределениеПростогоТипа.Имя <> Определение.Имя
Или Фасет.Схема.ПространствоИмен <> "urn:guide:owned-facets" Тогда
ВызватьИсключение "Фасет должен принадлежать только своему определению и своей схеме";
КонецЕсли;
Фасет.ОбновитьЭлементDOM();
КонецПроцедуры
Процедура ПроверитьСвоиСлучаи(Фабрика, Случаи)
Если Случаи.Количество() <> 13 Тогда
ВызватьИсключение "Ожидалось ровно 13 собственных граничных случаев";
КонецЕсли;
Для Каждого Случай Из Случаи Цикл
ТипМодели = Фабрика.Тип("urn:guide:owned-facets", Случай.Имя);
Если ТипЗнч(ТипМодели) <> Тип("ТипЗначенияXDTO") Тогда
ВызватьИсключение "Не получен свой тип значения XDTO " + Случай.Имя;
КонецЕсли;
Допустимо = Ложь;
ЗначениеМодели = Неопределено;
Попытка
ЗначениеМодели = Фабрика.Создать(ТипМодели, Случай.Вход);
Допустимо = Истина;
Исключение
Сообщить(СтрШаблон("Отклонён собственный пример %1: %2", Случай.Имя, Случай.Вход));
КонецПопытки;
Если Допустимо <> Случай.Допустимо Тогда
ВызватьИсключение СтрШаблон("Не совпало ограничение %1 для [%2]", Случай.Имя, Случай.Вход);
КонецЕсли;
Если Допустимо Тогда
Если ТипЗнч(ЗначениеМодели) <> Тип("ЗначениеXDTO")
Или ТипЗнч(ЗначениеМодели.Значение) <> ТипЗнч(Случай.Выход)
Или ЗначениеМодели.Значение <> Случай.Выход Тогда
ВызватьИсключение "Не совпало полное собственное нормализованное значение";
КонецЕсли;
КонецЕсли;
Сообщить(СтрШаблон("%1 [%2]: допустимо=%3", Случай.Имя, Случай.Вход, Допустимо));
КонецЦикла;
КонецПроцедурыУчебныеФасеты85.Форма
Своя внешняя обработка УчебныеФасеты85 → управляемая Форма → Модуль
Полный отдельный модуль своей формы; не выполнялся.
&НаКлиенте
Процедура Выполнить(Команда)
ВыполнитьНаСервере();
Сообщить("Собственная схема и все 13 граничных случаев проверены");
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ВыполнитьНаСервере()
УчебныеОграничения.ВыполнитьПример();
КонецПроцедурыРазбор по шагам
Прочитать собственную строку как DOM и построить СхемаXML. Сразу проверить тип схемы и её пространство имён; получить Discount, Description, Status по имени и тому же URI. У каждого исходного типа должен быть пустой список явных фасетов.
Конструктор создаёт отдельный компонент, но сам по себе не ограничивает данные. ПрисоединитьСвойФасет добавляет его в список именно подготовленного типа, задаёт типизированное и лексическое значения, сверяет их и проверяет владельца. Readonly-свойства Фасеты, Схема и ОпределениеПростогоТипа не присваиваются.
Для Discount создаём два исключающих ограничения 0 и 1. Условие 0 < скидка < 1 относится к доле: 0.25 означает 25 процентов, а не число25. Обе границы недопустимы.
Для Description два компонента задают длины 3 и 20 включительно. Используем короткие простые строки без эмодзи и составных Unicode-символов, чтобы задача не подменялась подсчётом байтов или визуальных знаков.
Для Status фасет пробелов получает настоящее значение enum ОбработкаПробельныхСимволовXS.Сворачивать, лексически collapse. Три отдельных новых ФасетПеречисленияXS задают draft, published, closed. Это перечисление XML-схемы, не менеджер Перечисления конфигурации.
Проверяем распределение восьми фасетов: 2/2/4. Синхронизируем DOM каждого нового компонента, определений и схемы; проверяем набор схем ДО создания фабрики. Фабрика создаётся после добавления ограничений, а не до них.
Только создание значения находится внутри Попытка. Тип модели проверен заранее, а сравнение факта с эталоном — после обработки ошибки. Поэтому исключение собственных проверок не превращается в якобы ожидаемое отклонение входа.
Для всех принятых входов проверяются полный нормализованный результат и его точный тип. Строка с крайними пробелами восстанавливается как published, а скидка0.25 — как число. Все 13 случаев должны совпасть с независимыми эталонами.
Как проверить результат
Будущий результат: 6 входов приняты и 7 отклонены, без исключения о несовпадении. Discount: 0.25 принят; 0, 1, -0.1 отклонены. Description: длины3 и20 приняты, 2 и21 отклонены.
Status: draft, closed и строка с крайними пробелами published приняты; deleted и PUBLISHED отклонены. Нормализованный результат published не содержит крайних пробелов.
Будущий отрицательный контроль: только в вызове для МаксимальнаяДлина замените оба значения 20/"20" на19/"19", не меняя эталон случая с20 символами. Корректная схема будет построена, но положительный случай должен вызвать несовпадение. После опыта восстановите полный исходный модуль.
runtimeVerifiedScenarios=0. Сигнатуры конструкторов, свойства и доступность проверены по установленной справке. Результаты XDTO приведены как ожидаемые: в1С не получены, обратные ссылки владельцев и синхронизация DOM не выполнялись. Пример не отправляет скидки, статусы или описания во внешние системы.
Ожидаемый результат
Шесть разных конструкторов участвуют в одном действующем учебном контракте, проверяемом на всех 13 граничных случаях, а не только в чтении свойств новых пустых объектов.
На что обратить внимание
Новый фасет вне определения типа — ещё не правило проверки. Не пропускайте добавление в Фасеты и не присваивайте readonly-обратные ссылки вручную.
Значение и ЛексическоеЗначение имеют разные типы. У фасета пробелов значение — enum платформы, не строка collapse; у числовых границ в нашей xs:decimal-модели — число, а лексическая запись использует точку.
Свернуть крайние и повторяющиеся XML-пробелы не означает изменить регистр: PUBLISHED не входит в перечисление. Для Description xs:string пробелы этим контрактом не удаляются.
Любая ошибка создания значения будет зафиксирована как отказ, но прежде схема и конкретный тип обязаны пройти подготовительные проверки. Для реального внешнего ввода нужны отдельные диагностика ошибок, ограничения размера и защита XML-парсера; данный урок работает только с собственными постоянными строками.
Схему после построения фабрики не меняем: не рассчитывайте на автоматическое обновление уже построенной модели XDTO. Для другой версии контракта нужен новый проверенный набор и новая фабрика.
Это собственный учебный контракт, не схема Avito и не правила скидок выбранной конфигурации. Нет подтверждения запуска, прав доступа или поведения рабочей базы.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Записать учебный товар в XML и проверить восстановленные поля
После проверки модели используем фабрику именно нашей схемы. Явно задаём корневой элемент product и URI, а при чтении — ожидаемый Product.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Не заменяйте учебный XML ответом реального сервиса: его схема может быть другой.
Фабрика создана в памяти из одного собственного набора; экспортируется только URI urn:guide:product.
XSD = "<xs:schema xmlns:xs=""http://www.w3.org/2001/XMLSchema""
| xmlns:g=""urn:guide:product"" targetNamespace=""urn:guide:product""
| elementFormDefault=""qualified"" version=""1.0"" xml:lang=""ru"">
| <xs:annotation><xs:documentation>Учебный товар, не контракт внешнего API</xs:documentation></xs:annotation>
| <xs:simpleType name=""Sku""><xs:restriction base=""xs:string"">
| <xs:length value=""4""/><xs:pattern value=""[A-Z][0-9]{3}""/>
| </xs:restriction></xs:simpleType>
| <xs:complexType name=""Product""><xs:sequence>
| <xs:element name=""name"" type=""xs:string""/>
| <xs:element name=""quantity"" type=""xs:nonNegativeInteger""/>
| <xs:element name=""note"" type=""xs:string"" minOccurs=""0""/>
| </xs:sequence><xs:attribute name=""code"" type=""g:Sku"" use=""required""/>
| </xs:complexType>
| <xs:element name=""product"" type=""g:Product""/>
|</xs:schema>";
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(XSD);
Попытка
ЧтениеДерева = Новый ПостроительDOM;
ДокументСхемы = ЧтениеДерева.Прочитать(Чтение);
Чтение.Закрыть();
Исключение
Чтение.Закрыть();
ВызватьИсключение;
КонецПопытки;
Построитель = Новый ПостроительСхемXML;
Схема = Построитель.СоздатьСхемуXML(ДокументСхемы.ЭлементДокумента);
Если Схема = Неопределено Тогда
ВызватьИсключение "Не удалось построить учебную схему";
КонецЕсли;
Набор = Новый НаборСхемXML;
Набор.Добавить(Схема);
Если Не Набор.Проверить() Тогда
ВызватьИсключение "Учебная XSD не прошла проверку";
КонецЕсли;
Фабрика = Новый ФабрикаXDTO(Набор);
ТипТовара = Фабрика.Тип("urn:guide:product", "Product");
Если ТипТовара = Неопределено Тогда
ВызватьИсключение "В фабрике не найден тип Product";
КонецЕсли;
Товар = Фабрика.Создать(ТипТовара);
Свойства = Товар.Свойства();
Код = Свойства.Получить("code");
Название = Свойства.Получить("name");
Количество = Свойства.Получить("quantity");
Примечание = Свойства.Получить("note");
Если Код = Неопределено Или Название = Неопределено
Или Количество = Неопределено Или Примечание = Неопределено Тогда
ВызватьИсключение "Не найдены четыре свойства учебной модели";
КонецЕсли;
Товар.Установить(Код, Фабрика.Создать(Код.Тип, "A001"));
Товар.Установить(Название, Фабрика.Создать(Название.Тип, "Книга"));
Товар.Установить(Количество, Фабрика.Создать(Количество.Тип, "3"));
Товар.Проверить();
Запись = Новый ЗаписьXML;
Запись.УстановитьСтроку();
Попытка
Фабрика.ЗаписатьXML(Запись, Товар, "product", "urn:guide:product");
XML = Запись.Закрыть();
Исключение
Запись.Закрыть();
ВызватьИсключение;
КонецПопытки;
Сообщить(XML);
ЧтениеТовара = Новый ЧтениеXML;
ЧтениеТовара.УстановитьСтроку(XML);
Попытка
Копия = Фабрика.ПрочитатьXML(ЧтениеТовара, ТипТовара);
ЧтениеТовара.Закрыть();
Исключение
ЧтениеТовара.Закрыть();
ВызватьИсключение;
КонецПопытки;
Копия.Проверить();
КопияКода = Копия.ПолучитьXDTO("code");
КопияНазвания = Копия.ПолучитьXDTO("name");
КопияКоличества = Копия.ПолучитьXDTO("quantity");
Сообщить(КопияКода.Значение = "A001");
Сообщить(КопияНазвания.Значение = "Книга");
Сообщить(КопияКоличества.Значение = 3);
Сообщить(Не Копия.Установлено(Примечание));
ЭкспортированныйНабор = Фабрика.ЭкспортСхемыXML("urn:guide:product");
Сообщить(ЭкспортированныйНабор.Получить("urn:guide:product").ПространствоИмен = "urn:guide:product");Разбор по шагам
Фабрика.ЗаписатьXML записывает данные модели, а не платформенный объект справочника.
Корневой элемент и URI задаём явно. Префикс при сериализации может отличаться, поэтому сравниваем значения после чтения, а не текст XML целиком.
Чтение использует ТипТовара из той же фабрики. Копия.Проверить проверяет восстановленный объект.
ПолучитьXDTO по именам читает три поля, отсутствующее note проверяем через описатель Примечание.
ЭкспортСхемыXML возвращает набор схем в памяти для конкретного пакета, не записывает файлы автоматически.
Как проверить результат
После XML-цикла код A001, название Книга, количество 3; note всё ещё отсутствует.
В XML code — атрибут, а название и количество — элементы.
Экспортированный набор содержит схему пространства urn:guide:product. Нет файлов или сетевых запросов.
Ожидаемый результат
Учебный объект прошёл полный цикл собственная XSD → XDTO → XML → XDTO с проверкой значений и необязательного поля.
На что обратить внимание
Одинаковый локальный тег product с другим URI — другой контракт.
Внешние XML проверяйте по согласованной схеме и ограничениям размера; этот урок читает только собственную короткую строку.
Наличие свойства товара в XDTO не создаёт товар в 1С: нет записи в справочник или документ.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.