ПостроительСхемXML.По умолчанию

Конструкторы

Синтаксис и применение ПостроительСхемXML.По умолчанию в платформе 1С:Предприятие. Описание и примеры кода.

Синтаксис

Новый ПостроительСхемXML
Полное описание, параметры и ограничения

ПостроительСхемXML.По умолчанию

ПостроительСхемXML (XMLSchemaBuilder)

По умолчанию

Синтаксис:
Новый ПостроительСхемXML
Методическая информация

Практические примеры

Отредактировать memberTypes своей XSD, не путать QName со строкой

У настоящего union собственной схемы получим коллекцию расширенных имён, пройдём её жизненный цикл и проверим всю схему после правки.

Где и как запускать

Полный модуль управляемой формы ПультXML своего стенда; собственная XSD в памяти, без реквизитов предыдущих Пультов.

Подготовка

  1. Создайте НОВУЮ отдельную файловую базу платформы 8.5.1.1343 с конфигурацией УчебныеДанныеФорм85, совместимость НеИспользовать, управляемое приложение. Не используйте УТ, КА, УНФ, БП или рабочую базу. Здесь 1С не запускалась: runtimeVerifiedScenarios=0.

  2. Используйте свою обработку УчебныеДанные85 с новой пустой управляемой формой ПультXML без основного реквизита. Вручную добавьте только команду Выполнить и её кнопку; реквизиты и таблицы предыдущих уроков не нужны.

  3. Назначьте событие ПриСозданииНаСервере одноимённой процедуре, действию команды Выполнить — процедуру Выполнить. Вставьте полный модуль целиком, F7 и обновление только своего стенда.

  4. Полная XSD включена в модуль строкой: namespace urn:guide:product, код Sku по правилу [A-Z][0-9]{3}, union SkuOrQuantity с Sku и nonNegativeInteger. Не добавляйте DTD, include/import или адреса внешней схемы.

  5. Откройте свой ПультXML в тонком или управляемом толстом клиенте. Весь разбор/редактирование выполняется на сервере в памяти; клиент получает только итоговую строку. Файлы, HTTP, база и XDTO-объекты товара не создаются.

  6. Промежуточный пустой/экспериментальный union не проверяется и не публикуется. Набор.Проверить вызывается только для исходной полной и окончательной восстановленной схемы. Здесь 1С не запускалась.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ПроверитьСвойКонтекст();
КонецПроцедуры

&НаКлиенте
Процедура Выполнить(Команда)
    Сообщить(ВыполнитьНаСервере());
КонецПроцедуры

&НаСервере
Функция ВыполнитьНаСервере()
    ПроверитьСвойКонтекст();
    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:simpleType name=""SkuList""><xs:list itemType=""g:Sku""/></xs:simpleType>
    | <xs:simpleType name=""SkuOrQuantity""><xs:union memberTypes=""g:Sku xs:nonNegativeInteger""/></xs:simpleType>
    | <xs:complexType name=""Price""><xs:simpleContent>
    |  <xs:annotation><xs:documentation source=""urn:guide:price-content"">Цена — число с атрибутом валюты</xs:documentation></xs:annotation>
    |  <xs:extension base=""xs:decimal"">
    |   <xs:annotation><xs:documentation source=""urn:guide:price-extension"">Расширение простого decimal</xs:documentation></xs:annotation>
    |   <xs:attribute name=""currency"" type=""xs:string"" default=""RUB""/>
    |  </xs:extension>
    | </xs:simpleContent></xs:complexType>
    |</xs:schema>";
    Чтение = Новый ЧтениеXML;
    Чтение.УстановитьСтроку(XSD);
    Попытка
        ЧтениеДерева = Новый ПостроительDOM;
        ДокументСхемы = ЧтениеДерева.Прочитать(Чтение);
        Чтение.Закрыть();
    Исключение
        Чтение.Закрыть();
        ВызватьИсключение;
    КонецПопытки;
    Построитель = Новый ПостроительСхемXML;
    Схема = Построитель.СоздатьСхемуXML(ДокументСхемы.ЭлементДокумента);
    Если Схема = Неопределено Тогда
        ВызватьИсключение "Не удалось построить учебную схему";
    КонецЕсли;
    Набор = Новый НаборСхемXML;
    Набор.Добавить(Схема);
    Если Не Набор.Проверить() Тогда
        ВызватьИсключение "Учебная XSD не прошла проверку";
    КонецЕсли;
    ТипОбъединения = Схема.ОпределенияТипов.Получить("SkuOrQuantity", "urn:guide:product");
    Если ТипОбъединения = Неопределено Тогда
        ВызватьИсключение "В собственной схеме не найден тип SkuOrQuantity";
    КонецЕсли;
    Если ТипЗнч(ТипОбъединения) <> Тип("ОпределениеПростогоТипаXS") Тогда
        ВызватьИсключение "У SkuOrQuantity другой вид определения типа";
    КонецЕсли;
    Имена = ТипОбъединения.ИменаТиповОбъединения;
    Если ТипЗнч(Имена) <> Тип("СписокРасширенныхИменXML") Или ТипОбъединения.Вариант <> ВариантПростогоТипаXS.Объединение Тогда
        ВызватьИсключение "Нужен настоящий список memberTypes собственного union";
    КонецЕсли;
    Имена.Очистить();
    Если Имена.Количество() <> 0 Тогда
        ВызватьИсключение "Своя коллекция должна стать пустой";
    КонецЕсли;
    URIЯзыкаXSD = "http://www.w3.org/2001/XMLSchema";
    Имена.Добавить(Новый РасширенноеИмяXML(URIЯзыкаXSD, "string"));
    Имена.Добавить(Новый РасширенноеИмяXML(URIЯзыкаXSD, "nonNegativeInteger"));
    Имена.Вставить(1, Новый РасширенноеИмяXML(URIЯзыкаXSD, "boolean"));
    Если Имена.Количество() <> 3 Или Имена[1].ЛокальноеИмя <> "boolean" Тогда
        ВызватьИсключение "Временный boolean должен находиться между string и nonNegativeInteger";
    КонецЕсли;
    ПервоеИмя = Имена.Получить(0);
    Если ТипЗнч(ПервоеИмя) <> Тип("РасширенноеИмяXML")
        Или ПервоеИмя.URIПространстваИмен <> URIЯзыкаXSD Или ПервоеИмя.ЛокальноеИмя <> "string" Тогда
        ВызватьИсключение "Имя XML — это пара URI и локального имени, не строка с префиксом";
    КонецЕсли;
    Имена.Установить(0, Новый РасширенноеИмяXML("urn:guide:product", "Sku"));
    Если Имена.Количество() <> 3 Или Имена.Получить(0).ЛокальноеИмя <> "Sku" Тогда
        ВызватьИсключение "Установить заменяет существующий элемент, не вставляет четвёртый";
    КонецЕсли;
    Имена.Удалить(1);
    Если Имена.Количество() <> 2 Или Имена[1].ЛокальноеИмя <> "nonNegativeInteger" Тогда
        ВызватьИсключение "Удалён только временный boolean по числовому индексу";
    КонецЕсли;
    ПарыИмен = Новый Массив;
    Для Каждого ИмяТипа Из Имена Цикл
        ПарыИмен.Добавить(ИмяТипа.URIПространстваИмен + "#" + ИмяТипа.ЛокальноеИмя);
    КонецЦикла;
    Если СтрСоединить(ПарыИмен, ";") <> "urn:guide:product#Sku;http://www.w3.org/2001/XMLSchema#nonNegativeInteger" Тогда
        ВызватьИсключение "Проверяется собственный явно построенный порядок и обе части QName";
    КонецЕсли;
    Схема.ОбновитьЭлементDOM();
    Если Не Набор.Проверить() Тогда
        ВызватьИсключение "После правки собственного memberTypes весь набор схем должен остаться корректным";
    КонецЕсли;
    Возврат "Своя XSD проверена: union Sku или nonNegativeInteger. Временный boolean удалён; шесть операций коллекции выполнены только в памяти.";
КонецФункции

&НаСервереБезКонтекста
Процедура ПроверитьСвойКонтекст()
    Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда
        ВызватьИсключение "Нужен собственный стенд УчебныеДанныеФорм85 платформы 8.5.1.1343";
    КонецЕсли;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Учебный вывод не должен выполняться внутри чужой транзакции";
    КонецЕсли;
КонецПроцедуры

Разбор по шагам

  1. Переиспользуется полный подготовленный контракт товара. ЧтениеXML получает строку, закрывается при успехе и исключении; DOM и ПостроительСхемXML создают настоящую схему, исходный НаборСхемXML проверяется.

  2. SkuOrQuantity ищется по имени И URI. Проверяется ОпределениеПростогоТипаXS с Вариант=Объединение. ИменаТиповОбъединения — readonly-свойство, но его собственная возвращённая коллекция изменяема; выдуманного конструктора СписокРасширенныхИменXML нет.

  3. Очистить удаляет элементы своего memberTypes, а не определения Sku/Product в общей схеме. После очистки ноль; до сборки нового списка схема может быть временно некорректной, это не конечный результат.

  4. Добавить принимает готовый РасширенноеИмяXML. Порядок конструктора URI, затем локальное имя; строка xs:string не является объектом расширенного имени. HTTP-подобный URI здесь идентификатор языка, не сетевой запрос.

  5. Вставить(1, boolean) помещает временный QName между string и nonNegativeInteger. Получить(0) читает объект, [1] читает другой по индексу; перед доступом проверен размер.

  6. Установить(0, Sku) заменяет string, не добавляя элемент. Новый Sku использует urn:guide:product, а не namespace языка XSD; локального имени без URI недостаточно.

  7. Удалить(1) принимает числовой индекс и удаляет только временный boolean. Итоговый список из двух QName обходится циклом; порядок здесь известен, потому что его построили мы, а не предположили порядок исходной схемы.

  8. ОбновитьЭлементDOM синхронизирует компонентную модель и DOM. Повторный Набор.Проверить подтверждает корректность набора схем, не проверяет XML-экземпляр товара или строку кода A001.

Как проверить результат

  1. Будущий тест: F7 → ПультXML → Выполнить. Временный размер 3 после Вставить, тот же 3 после Установить, итоговый 2 после Удалить.

  2. Первый QName сначала {http://www.w3.org/2001/XMLSchema}string, после замены {urn:guide:product}Sku. Не сравнивайте только представление префикса.

  3. Итоговые пары строго Sku из urn:guide:product и nonNegativeInteger из namespace языка XSD. boolean отсутствует.

  4. Обе проверки полного набора схем должны пройти. Если повторная проверка возвращает Ложь, сообщение об успешном результате не выводится.

  5. Нажмите повторно: полная XSD строится заново, изменения прошлого набора не накапливаются. Исходные уроки и строковый контракт не изменяются.

Ожидаемый результат

Будущий результат: шесть операций настоящей коллекции QName на собственной схеме; окончательный memberTypes=Sku/nonNegativeInteger и повторная проверка схемы.

На что обратить внимание

  1. Readonly у свойства ИменаТиповОбъединения запрещает переприсваивать коллекцию, но не её документированные операции. URIПространстваИмен и ЛокальноеИмя отдельного QName тоже readonly: для замены создаётся новое имя.

  2. Union означает альтернативу типов, не два поля объекта и не список значений. Список имён компонентов не равен списку экземпляров данных.

  3. Очистить/Удалить меняют только свою схему в памяти. Нет записи XSD на диск, публикации контракта или изменения внешнего API.

  4. Проверка набора схем и статические проверки кода не доказывают испытание XML-экземпляра или запуск урока в 1С. runtimeVerifiedScenarios=0.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Создать фабрику из одного собственного временного XSD-файла

Глобальный СоздатьФабрикуXDTO принимает путь или массив путей. Записываем только собственную схему в уникальный временный файл и сравниваем оба варианта.

Где и как запускать

Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.

Подготовка

  1. Учебная база 8.5.1.1343, серверный общий модуль УчебныеЗадачи. Фрагмент без директив вставьте в тело ВыполнитьПример() Экспорт и запустите собственной учебной командой.

  2. XML в заданиях приведён полностью или создаётся из собственных чисел/строк. Не подставляйте XML из неизвестных внешних источников, объекты метаданных или реальные ссылки вместо учебных значений.

  3. Ни один фрагмент не пишет товары, документы и настройки конфигурации. Файловое упражнение отдельно предупреждает о создании только собственного временного XSD.

  4. Проверки сообщениями ожидают Истина. XML-текст и объекты можно исследовать в отладчике; это не контракт Avito, SOAP или обмен типовой конфигурации.

  5. Это единственное файловое упражнение блока: создаётся новый временный XSD на стороне сервера. Не запускайте его без разрешения на учебную временную папку; рабочие файлы не указываются.

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 не прошла проверку";
КонецЕсли;
ИмяXSD = ПолучитьИмяВременногоФайла("xsd");
ТекстСхемы = Новый ТекстовыйДокумент;
ТекстСхемы.УстановитьТекст(XSD);
ТекстСхемы.Записать(ИмяXSD, КодировкаТекста.UTF8);
ФабрикаОдногоФайла = СоздатьФабрикуXDTO(ИмяXSD);
Пути = Новый Массив;
Пути.Добавить(ИмяXSD);
ФабрикаМассива = СоздатьФабрикуXDTO(Пути);
ПервыйТип = ФабрикаОдногоФайла.Тип("urn:guide:product", "Product");
ВторойТип = ФабрикаМассива.Тип("urn:guide:product", "Product");
Сообщить(ПервыйТип <> Неопределено);
Сообщить(ВторойТип <> Неопределено);
Если ПервыйТип = Неопределено Или ВторойТип = Неопределено Тогда
    ВызватьИсключение "Не найден Product в фабриках из собственного файла";
КонецЕсли;
Сообщить(ПервыйТип.Имя = ВторойТип.Имя);
Сообщить(ПервыйТип.URIПространстваИмен = ВторойТип.URIПространстваИмен);
Сообщить("Создан только собственный временный XSD: " + ИмяXSD);

Разбор по шагам

  1. Сначала разбираем и проверяем собственную XSD из текста. Затем уникальное имя временного файла формируется платформой.

  2. ТекстовыйДокумент записывает именно эту строку XSD в UTF8. Не подставляйте имя рабочего файла: единственная запись урока — новый временный XSD.

  3. Один вызов СоздатьФабрикуXDTO получает строковый путь, второй — массив с тем же путём. Каждый создаёт свою фабрику.

  4. Сравниваем имена и URI типов, а не идентичность объектов из двух фабрик. Файл намеренно оставлен для исследования, без автоматического удаления.

Как проверить результат

  1. Четыре проверки дают Истина; последнее сообщение содержит созданный путь.

  2. Откройте только этот XSD на машине выполнения серверного кода: в нём собственная схема Product/Sku. После упражнения удалите вручную только указанный учебный файл.

Ожидаемый результат

Две фабрики из одного собственного локального файла с явной границей файловой операции.

На что обратить внимание

  1. В клиент-серверной базе временный файл создаётся на сервере, не на компьютере тонкого клиента.

  2. Права безопасного режима/сервера могут запретить запись или чтение: тогда сохраните диагностику, не отключайте защиту ради урока.

  3. Повторный запуск создаёт новый временный файл; контролируйте учебные файлы и удаляйте только точно указанные.

  4. Не используйте XSD с внешними import/include по этому образцу без отдельной проверки разрешённых источников.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.