Записать оба учебных объекта в XML и проверить независимые копии

Учебные задачи

Список товаров и смешанное пояснение проходят запись/чтение по собственной фабрике. Проверяются значения и порядок, не случайный XML-префикс.

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

Полный серверный общий модуль собственной учебной конфигурации.

Подготовка

  1. В собственной отдельной конфигурации УчебнаяКонфигурацияСинтаксиса создайте серверный общий модуль УчебныеКоллекцииXDTO с флагом Сервер. Вставьте полный код выбранного урока.

  2. Из серверной команды собственной учебной обработки вызовите УчебныеКоллекцииXDTO.ВыполнитьПример(). Метаданные справочников и документы не нужны.

  3. В код встроена маленькая собственная XSD: Order содержит повторяющиеся строки item, Note — смешанный текст с числовыми элементами amount. Не подменяйте схему или XML данными неизвестного сервиса.

  4. URI urn:guide:collections — идентификатор пространства имён, не адрес сервера. Схема не содержит import/include, DTD или внешних ссылок.

  5. Все объекты и XML создаются в памяти. Нет файлов, сети, выполнения внешнего кода, записи базы или изменений пакетов XDTO конфигурации.

Процедура ВыполнитьПример() Экспорт
    XSD = "<xs:schema xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:g=""urn:guide:collections"" targetNamespace=""urn:guide:collections"" elementFormDefault=""qualified"">
    |<xs:complexType name=""Order""><xs:sequence><xs:element name=""item"" type=""xs:string"" minOccurs=""0"" maxOccurs=""unbounded""/></xs:sequence></xs:complexType>
    |<xs:complexType name=""Note"" mixed=""true""><xs:sequence><xs:element name=""amount"" type=""xs:decimal"" minOccurs=""0"" maxOccurs=""unbounded""/></xs:sequence></xs:complexType>
    |<xs:element name=""order"" type=""g:Order""/><xs:element name=""note"" type=""g:Note""/>
    |</xs:schema>";
    ЧтениеСхемы = Новый ЧтениеXML;
    ЧтениеСхемы.УстановитьСтроку(XSD);
    Попытка
        Дерево = Новый ПостроительDOM;
        ДокументСхемы = Дерево.Прочитать(ЧтениеСхемы);
    Исключение
        ОшибкаСхемы = ОписаниеОшибки();
        Попытка
            ЧтениеСхемы.Закрыть();
        Исключение
            ВызватьИсключение ОшибкаСхемы + Символы.ПС + "Закрытие: " + ОписаниеОшибки();
        КонецПопытки;
        ВызватьИсключение ОшибкаСхемы;
    КонецПопытки;
    ЧтениеСхемы.Закрыть();
    ПостроительСхем = Новый ПостроительСхемXML;
    Схема = ПостроительСхем.СоздатьСхемуXML(ДокументСхемы.ЭлементДокумента);
    Если Схема = Неопределено Тогда
        ВызватьИсключение "Не построена собственная схема коллекций";
    КонецЕсли;
    НаборСхем = Новый НаборСхемXML;
    НаборСхем.Добавить(Схема);
    Если НЕ НаборСхем.Проверить() Тогда
        ВызватьИсключение "Собственная схема не прошла проверку";
    КонецЕсли;
    Фабрика = Новый ФабрикаXDTO(НаборСхем);
    ТипЗаказа = Фабрика.Тип("urn:guide:collections", "Order");
    Если ТипЗаказа = Неопределено Тогда
        ВызватьИсключение "В собственной фабрике не найден Order";
    КонецЕсли;
    Заказ = Фабрика.Создать(ТипЗаказа);
    СвойствоТоваров = Заказ.Свойства().Получить("item");
    Если СвойствоТоваров = Неопределено Тогда
        ВызватьИсключение "Не найдено собственное повторяющееся свойство item";
    КонецЕсли;
    Товары = Заказ.ПолучитьСписок(СвойствоТоваров);
    Если Товары = Неопределено Тогда
        ВызватьИсключение "Не получен список собственного заказа";
    КонецЕсли;
    Товары.Добавить(Фабрика.Создать(СвойствоТоваров.Тип, "Книга"));
    Товары.Добавить(Фабрика.Создать(СвойствоТоваров.Тип, "Ручка"));
    Заказ.Проверить();
    ТипПояснения = Фабрика.Тип("urn:guide:collections", "Note");
    Если ТипПояснения = Неопределено Тогда
        ВызватьИсключение "В собственной фабрике не найден Note";
    КонецЕсли;
    Пояснение = Фабрика.Создать(ТипПояснения);
    СвойствоСуммы = Пояснение.Свойства().Получить("amount");
    Если СвойствоСуммы = Неопределено Тогда
        ВызватьИсключение "Не найдено собственное числовое свойство amount";
    КонецЕсли;
    Порядок = Пояснение.Последовательность();
    Порядок.Добавить("Книга: ");
    Порядок.Добавить(СвойствоСуммы, Фабрика.Создать(СвойствоСуммы.Тип, "750"));
    Порядок.Добавить(" условных единиц.");
    Пояснение.Проверить();
    КопияЗаказа = СоздатьСвоюXMLКопию(Фабрика, Заказ, "order", ТипЗаказа);
    КопияПояснения = СоздатьСвоюXMLКопию(Фабрика, Пояснение, "note", ТипПояснения);
    КопияТоваров = КопияЗаказа.ПолучитьСписок("item");
    КопияПорядка = КопияПояснения.Последовательность();
    Сообщить(КопияТоваров.Количество() = 2);
    Сообщить(КопияТоваров.Получить(0) = "Книга");
    Сообщить(КопияТоваров.Получить(1) = "Ручка");
    Сообщить(КопияПорядка.Количество() = 3);
    Сообщить(КопияПорядка.ПолучитьТекст(0) = "Книга: ");
    Сообщить(КопияПорядка.ПолучитьЗначениеXDTO(1).Значение = 750);
    Сообщить(КопияПорядка.ПолучитьТекст(2) = " условных единиц.");
    Товары.Очистить();
    Сообщить(КопияТоваров.Количество() = 2);
    Порядок.Очистить();
    Сообщить(КопияПорядка.Количество() = 3);
КонецПроцедуры

Функция СоздатьСвоюXMLКопию(Фабрика, Объект, ИмяКорня, ОжидаемыйТип)
    Запись = Новый ЗаписьXML;
    Запись.УстановитьСтроку();
    Попытка
        Фабрика.ЗаписатьXML(Запись, Объект, ИмяКорня, "urn:guide:collections");
    Исключение
        ОшибкаЗаписи = ОписаниеОшибки();
        Попытка
            Запись.Закрыть();
        Исключение
            ВызватьИсключение ОшибкаЗаписи + Символы.ПС + "Закрытие записи: " + ОписаниеОшибки();
        КонецПопытки;
        ВызватьИсключение ОшибкаЗаписи;
    КонецПопытки;
    XML = Запись.Закрыть();
    Сообщить(XML);
    Чтение = Новый ЧтениеXML;
    Чтение.УстановитьСтроку(XML);
    Попытка
        Копия = Фабрика.ПрочитатьXML(Чтение, ОжидаемыйТип);
    Исключение
        ОшибкаЧтения = ОписаниеОшибки();
        Попытка
            Чтение.Закрыть();
        Исключение
            ВызватьИсключение ОшибкаЧтения + Символы.ПС + "Закрытие чтения: " + ОписаниеОшибки();
        КонецПопытки;
        ВызватьИсключение ОшибкаЧтения;
    КонецПопытки;
    Чтение.Закрыть();
    Копия.Проверить();
    Возврат Копия;
КонецФункции

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

  1. Создать Order с двумя собственными товарами и Note с текстом и суммой 750. Проверить оба объекта до записи.

  2. Писать в строку с явными именами корней order/note и URI собственной схемы. При чтении явно задать ожидаемый тип из той же фабрики.

  3. Закрыть каждого XML-писателя и читателя и при успехе, и при ошибке. Вторичную ошибку закрытия не скрывать.

  4. Проверить список и три части восстановленной последовательности. Не сравнивать XML посимвольно: префиксы могут изменяться.

  5. Очистить исходные список и последовательность. Независимые прочитанные копии сохраняют два товара и три части.

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

  1. Девять булевых сообщений Истина. XML содержит элементы item и смешанное содержимое note с amount 750.

  2. Копии не меняются после очистки исходных объектов. Файлы и записи базы не создаются.

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

Получен полный учебный цикл XSD → XDTO → XML → XDTO для двух разных моделей содержимого.

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

  1. Одинаковый локальный тег с другим URI принадлежит другому контракту.

  2. Этот помощник читает только свою короткую сериализацию. Для внешнего XML нужны отдельные ограничения размера и проверка доверия.

  3. Успешный XML-цикл не подтверждает совместимость с AVITO, OData или иным API: здесь собственная схема.

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

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

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

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

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