Сохранить порядок текста и числовой суммы в смешанном XML

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

mixed=true позволяет чередовать текст с элементами amount. Последовательность — не список только чисел и не обычная ТаблицаЗначений.

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

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

Подготовка

  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", "Note");
    Если ТипПояснения = Неопределено Тогда
        ВызватьИсключение "В собственной фабрике не найден Note";
    КонецЕсли;
    Пояснение = Фабрика.Создать(ТипПояснения);
    СвойствоСуммы = Пояснение.Свойства().Получить("amount");
    Если СвойствоСуммы = Неопределено Тогда
        ВызватьИсключение "Не найдено собственное числовое свойство amount";
    КонецЕсли;
    Порядок = Пояснение.Последовательность();
    Порядок.Добавить("Книга: ");
    Порядок.Добавить(СвойствоСуммы, Фабрика.Создать(СвойствоСуммы.Тип, "750"));
    Порядок.Добавить(" условных единиц.");
    Пояснение.Проверить();
    Сообщить(Порядок.Владелец = Пояснение);
    Сообщить(Порядок.Количество() = 3);
    Сообщить(Порядок.ПолучитьТекст(0) = "Книга: ");
    Сообщить(Порядок.ПолучитьСвойство(0) = Неопределено);
    Сообщить(Порядок.ПолучитьСвойство(1) = СвойствоСуммы);
    Сообщить(Порядок.ПолучитьЗначениеXDTO(1).Значение = 750);
    Полученное = Порядок.ПолучитьЗначение(1);
    Сообщить("Тип ПолучитьЗначение: " + Строка(ТипЗнч(Полученное)));
    Сообщить(УчебноеПростоеЗначение(Полученное) = 750);
    Сообщить(Порядок.ПолучитьТекст(2) = " условных единиц.");
КонецПроцедуры

Функция УчебноеПростоеЗначение(Элемент)
    Если ТипЗнч(Элемент) = Тип("ЗначениеXDTO") Тогда
        Возврат Элемент.Значение;
    КонецЕсли;
    Возврат Элемент;
КонецФункции

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

  1. Построить Note со смешанным содержимым. Получить его собственную Последовательность без конструктора.

  2. Добавить текст Книга:, типизированный decimal 750 с описателем amount, затем конечный текст.

  3. Текстовая позиция не связана со свойством amount; получить её текст и проверить отсутствие описателя.

  4. Для числовой позиции прочитать свойство, XDTO-значение и его простое Значение. Дополнительно вывести фактический тип результата ПолучитьЗначение.

  5. Учебная функция извлекает простое значение из обёртки, если оно пришло как ЗначениеXDTO. Она не преобразует произвольный внешний XML.

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

  1. Восемь булевых проверок Истина. Последовательность: текст, число 750, текст.

  2. Владельцем является своё Пояснение. Число не превращается в бизнес-ссылку или запись базы.

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

Показано происхождение и содержимое настоящей смешанной последовательности.

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

  1. Без mixed=true произвольные текстовые части не соответствуют этой модели.

  2. Количество последовательности считает текстовые и элементные части, не товары и не сумму.

  3. Индекс 1 относится к текущему порядку частей. После вставки используйте пересчитанные позиции.

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

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

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

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

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