Примеры сериализации и десериализации xml

Примеры сериализации и десериализации xml на языке программирования 1С:Предприятие. Примеры позволяют быстро разобраться в вопросе и использовать код в своих разработках

Создание XML из структуры и соответствия

// Преобразование структуры в XML-документ
Процедура СоздатьXMLИзСтруктуры()

    // Создаем XML-документ
    XML = Новый ЗаписьXML;
    XML.УстановитьСтроку();
    XML.ЗаписатьОбъявлениеXML();
    
    // Корневой элемент
    XML.ЗаписатьНачалоЭлемента("Данные");
    
    // Записываем элементы
    XML.ЗаписатьНачалоЭлемента("Имя");
    XML.ЗаписатьТекст("Иван Петров");
    XML.ЗаписатьКонецЭлемента();
    
    XML.ЗаписатьНачалоЭлемента("Возраст");
    XML.ЗаписатьТекст("30");
    XML.ЗаписатьКонецЭлемента();
    
    XML.ЗаписатьНачалоЭлемента("Активен");
    XML.ЗаписатьТекст("Истина");
    XML.ЗаписатьКонецЭлемента();
    
    XML.ЗаписатьКонецЭлемента(); // Данные
    
    Результат = XML.Закрыть();
    Сообщить("Созданный XML:");
    Сообщить(Результат);
    
КонецПроцедуры

Сериализация структуры и массива в XML

// Сериализация сложных типов данных в XML
Процедура СериализоватьСтруктуруВXML()

    // Подготавливаем данные
    Данные = Новый Структура;
    Данные.Вставить("Товар", "Ноутбук");
    Данные.Вставить("Цена", 50000);
    Данные.Вставить("Склад", "Основной");
    
    // Сериализуем в XML
    XML = Новый ЗаписьXML;
    XML.УстановитьСтроку();
    XML.ЗаписатьОбъявлениеXML();
    
    СериализоватьСтруктуру(XML, Данные, "ТоварнаяПозиция");
    
    Результат = XML.Закрыть();
    Сообщить("Сериализованная структура:");
    Сообщить(Результат);
    
    // Сериализация массива
    Массив = Новый Массив;
    Массив.Добавить("Первый");
    Массив.Добавить("Второй");
    Массив.Добавить("Третий");
    
    XML2 = Новый ЗаписьXML;
    XML2.УстановитьСтроку();
    XML2.ЗаписатьОбъявлениеXML();
    
    СериализоватьМассив(XML2, Массив, "Список", "Элемент");
    
    Результат2 = XML2.Закрыть();
    Сообщить("Сериализованный массив:");
    Сообщить(Результат2);
    
КонецПроцедуры

Процедура СериализоватьСтруктуру(XML, Данные, ИмяКорня)
    XML.ЗаписатьНачалоЭлемента(ИмяКорня);
    Для Каждого КлючЗначение Из Данные Цикл
        XML.ЗаписатьНачалоЭлемента(КлючЗначение.Ключ);
        XML.ЗаписатьТекст(Строка(КлючЗначение.Значение));
        XML.ЗаписатьКонецЭлемента();
    КонецЦикла;
    XML.ЗаписатьКонецЭлемента();
КонецПроцедуры

Процедура СериализоватьМассив(XML, Массив, ИмяМассива, ИмяЭлемента)
    XML.ЗаписатьНачалоЭлемента(ИмяМассива);
    Для Каждого Элемент Из Массив Цикл
        XML.ЗаписатьНачалоЭлемента(ИмяЭлемента);
        XML.ЗаписатьТекст(Строка(Элемент));
        XML.ЗаписатьКонецЭлемента();
    КонецЦикла;
    XML.ЗаписатьКонецЭлемента();
КонецПроцедуры

Десериализация XML в структуру

// Чтение XML-документа и преобразование в структуру данных
Процедура ДесериализоватьXMLВСтруктуру()

    XMLСтрока = "
    |<Книга>
    |    <Название>Мастер и Маргарита</Название>
    |    <Автор>Михаил Булгаков</Автор>
    |    <Год>1966</Год>
    |    <Цена>500</Цена>
    |</Книга>";
    
    // Читаем XML
    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.УстановитьСтроку(XMLСтрока);
    
    // Парсим XML в структуру
    Данные = ПарситьXMLВСтруктуру(ЧтениеXML);
    
    Сообщить("Десериализованные данные:");
    Сообщить("Название: " + Данные.Название);
    Сообщить("Автор: " + Данные.Автор);
    Сообщить("Год: " + Данные.Год);
    Сообщить("Цена: " + Данные.Цена);
    
КонецПроцедуры

Функция ПарситьXMLВСтруктуру(ЧтениеXML)
    Результат = Новый Структура;
    
    // Читаем корневой элемент
    ЧтениеXML.Прочитать();
    
    // Читаем все дочерние элементы
    Пока ЧтениеXML.Прочитать() Цикл
        Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
            ИмяЭлемента = ЧтениеXML.Имя;
            ЧтениеXML.Прочитать();
            Значение = ЧтениеXML.Значение;
            Результат.Вставить(ИмяЭлемента, Значение);
            ЧтениеXML.Прочитать(); // Пропускаем конец элемента
        КонецЕсли;
    КонецЦикла;
    
    Возврат Результат;
КонецФункции

Работа с атрибутами XML

// Чтение и запись XML с атрибутами
Процедура РаботаСАтрибутамиXML()

    // Создаем XML с атрибутами
    ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.УстановитьСтроку();
    ЗаписьXML.ЗаписатьОбъявлениеXML();
    
    ЗаписьXML.ЗаписатьНачалоЭлемента("Сотрудники");
    
    ЗаписьXML.ЗаписатьНачалоЭлемента("Сотрудник");
    ЗаписьXML.ЗаписатьАтрибут("Ид", "1");
    ЗаписьXML.ЗаписатьАтрибут("Отдел", "ИТ");
    ЗаписьXML.ЗаписатьТекст("Иванов Иван");
    ЗаписьXML.ЗаписатьКонецЭлемента();
    
    ЗаписьXML.ЗаписатьНачалоЭлемента("Сотрудник");
    ЗаписьXML.ЗаписатьАтрибут("Ид", "2");
    ЗаписьXML.ЗаписатьАтрибут("Отдел", "Бухгалтерия");
    ЗаписьXML.ЗаписатьТекст("Петрова Мария");
    ЗаписьXML.ЗаписатьКонецЭлемента();
    
    ЗаписьXML.ЗаписатьКонецЭлемента(); // Сотрудники
    
    XMLСтрока = ЗаписьXML.Закрыть();
    Сообщить("XML с атрибутами:");
    Сообщить(XMLСтрока);
    
    // Читаем XML с атрибутами
    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.УстановитьСтроку(XMLСтрока);
    
    Сообщить("Прочитанные данные:");
    Пока ЧтениеXML.Прочитать() Цикл
        Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "Сотрудник" Тогда
            Ид = ЧтениеXML.ПолучитьАтрибут("Ид");
            Отдел = ЧтениеXML.ПолучитьАтрибут("Отдел");
            ЧтениеXML.Прочитать();
            Имя = ЧтениеXML.Значение;
            Сообщить("Сотрудник: " + Имя + " | Ид: " + Ид + " | Отдел: " + Отдел);
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры

Сохранение и загрузка XML в файл

// Запись XML в файл и чтение XML из файла
Процедура СохранитьИЗагрузитьXMLФайл()

    ИмяФайла = "C:\Temp\data.xml";
    
    // Подготавливаем данные
    Данные = Новый Структура;
    Данные.Вставить("Организация", "ООО Ромашка");
    Данные.Вставить("ИНН", "7700000001");
    Данные.Вставить("ЮрАдрес", "г. Москва, ул. Тверская, д. 10");
    
    // Запись в файл
    ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.УстановитьСтроку();
    ЗаписьXML.ЗаписатьОбъявлениеXML();
    
    ЗаписьXML.ЗаписатьНачалоЭлемента("Организация");
    Для Каждого КлючЗначение Из Данные Цикл
        ЗаписьXML.ЗаписатьНачалоЭлемента(КлючЗначение.Ключ);
        ЗаписьXML.ЗаписатьТекст(Строка(КлючЗначение.Значение));
        ЗаписьXML.ЗаписатьКонецЭлемента();
    КонецЦикла;
    ЗаписьXML.ЗаписатьКонецЭлемента();
    
    XMLСтрока = ЗаписьXML.Закрыть();
    
    Запись = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8);
    Запись.Записать(XMLСтрока);
    Запись.Закрыть();
    
    Сообщить("XML сохранен в файл: " + ИмяФайла);
    
    // Чтение из файла
    Чтение = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8);
    ПрочитаннаяСтрока = Чтение.Прочитать();
    Чтение.Закрыть();
    
    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.УстановитьСтроку(ПрочитаннаяСтрока);
    ВосстановленныеДанные = ПарситьXMLВСтруктуру(ЧтениеXML);
    ЧтениеXML.Закрыть();
    
    Сообщить("Прочитано из файла:");
    Для Каждого КлючЗначение Из ВосстановленныеДанные Цикл
        Сообщить(КлючЗначение.Ключ + ": " + КлючЗначение.Значение);
    КонецЦикла;
    
    // Удаляем файл
    УдалитьФайлы(ИмяФайла);
    
КонецПроцедуры

Функция ПарситьXMLВСтруктуру(ЧтениеXML)
    Результат = Новый Структура;
    ЧтениеXML.Прочитать();
    
    Пока ЧтениеXML.Прочитать() Цикл
        Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
            ИмяЭлемента = ЧтениеXML.Имя;
            ЧтениеXML.Прочитать();
            Если ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда
                Результат.Вставить(ИмяЭлемента, ЧтениеXML.Значение);
                ЧтениеXML.Прочитать();
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    
    Возврат Результат;
КонецФункции

Сериализация таблицы значений в XML

// Экспорт таблицы значений в XML-формат
Процедура ТаблицаЗначенийВXML()

    // Создаем таблицу
    Таблица = Новый ТаблицаЗначений;
    Таблица.Колонки.Добавить("Код", Новый ОписаниеТипов("Число"));
    Таблица.Колонки.Добавить("Наименование");
    Таблица.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));
    
    Таблица.Добавить().Код = 1; Таблица[0].Наименование = "Ноутбук"; Таблица[0].Цена = 50000;
    Таблица.Добавить().Код = 2; Таблица[1].Наименование = "Монитор"; Таблица[1].Цена = 15000;
    Таблица.Добавить().Код = 3; Таблица[2].Наименование = "Клавиатура"; Таблица[2].Цена = 2000;
    
    // Сериализуем таблицу в XML
    ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.УстановитьСтроку();
    ЗаписьXML.ЗаписатьОбъявлениеXML();
    
    ЗаписьXML.ЗаписатьНачалоЭлемента("Товары");
    ЗаписьXML.ЗаписатьНачалоЭлемента("Колонки");
    Для Каждого Колонка Из Таблица.Колонки Цикл
        ЗаписьXML.ЗаписатьНачалоЭлемента("Колонка");
        ЗаписьXML.ЗаписатьАтрибут("Имя", Колонка.Имя);
        ЗаписьXML.ЗаписатьАтрибут("Тип", Строка(Колонка.ТипЗначения));
        ЗаписьXML.ЗаписатьКонецЭлемента();
    КонецЦикла;
    ЗаписьXML.ЗаписатьКонецЭлемента();
    
    ЗаписьXML.ЗаписатьНачалоЭлемента("Строки");
    Для Каждого СтрокаТ Из Таблица Цикл
        ЗаписьXML.ЗаписатьНачалоЭлемента("Строка");
        ЗаписьXML.ЗаписатьАтрибут("Номер", Строка(СтрокаТ.Код));
        Для Каждого Колонка Из Таблица.Колонки Цикл
            ЗаписьXML.ЗаписатьНачалоЭлемента(Колонка.Имя);
            ЗаписьXML.ЗаписатьТекст(Строка(СтрокаТ[Колонка.Имя]));
            ЗаписьXML.ЗаписатьКонецЭлемента();
        КонецЦикла;
        ЗаписьXML.ЗаписатьКонецЭлемента();
    КонецЦикла;
    ЗаписьXML.ЗаписатьКонецЭлемента();
    
    ЗаписьXML.ЗаписатьКонецЭлемента();
    XMLСтрока = ЗаписьXML.Закрыть();
    
    Сообщить("Таблица значений в XML:");
    Сообщить(XMLСтрока);
    
    // Десериализуем обратно в таблицу
    НоваяТаблица = XMLВТаблицуЗначений(XMLСтрока);
    
    Сообщить("Восстановленная таблица:");
    Для Каждого СтрокаТ Из НоваяТаблица Цикл
        Сообщить(СтрокаТ.Код + " | " + СтрокаТ.Наименование + " | " + СтрокаТ.Цена);
    КонецЦикла;
    
КонецПроцедуры

Функция XMLВТаблицуЗначений(XMLСтрока)
    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.УстановитьСтроку(XMLСтрока);
    
    Таблица = Новый ТаблицаЗначений;
    ВКолонках = Ложь;
    ВСтроках = Ложь;
    
    Пока ЧтениеXML.Прочитать() Цикл
        Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
            Если ЧтениеXML.Имя = "Колонки" Тогда
                ВКолонках = Истина;
            ИначеЕсли ЧтениеXML.Имя = "Строки" Тогда
                ВСтроках = Истина;
            ИначеЕсли ВКолонках И ЧтениеXML.Имя = "Колонка" Тогда
                ИмяКолонки = ЧтениеXML.ПолучитьАтрибут("Имя");
                Таблица.Колонки.Добавить(ИмяКолонки);
            ИначеЕсли ВСтроках И ЧтениеXML.Имя = "Строка" Тогда
                НоваяСтрока = Таблица.Добавить();
            ИначеЕсли ВСтроках И Таблица.Колонки.Найти(ЧтениеXML.Имя) <> Неопределено Тогда
                НоваяСтрока = Таблица[Таблица.Количество() - 1];
                ЧтениеXML.Прочитать();
                НоваяСтрока[ЧтениеXML.Имя] = ЧтениеXML.Значение;
            КонецЕсли;
        ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
            Если ЧтениеXML.Имя = "Колонки" Тогда
                ВКолонках = Ложь;
            ИначеЕсли ЧтениеXML.Имя = "Строки" Тогда
                ВСтроках = Ложь;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    
    Возврат Таблица;
КонецФункции

Иерархический XML с вложенными элементами

// Создание и обработка вложенных XML-структур
Процедура ИерархическийXML()

    // Создаем XML с вложенными элементами
    ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.УстановитьСтроку();
    ЗаписьXML.ЗаписатьОбъявлениеXML();
    
    ЗаписьXML.ЗаписатьНачалоЭлемента("Компания");
    
    ЗаписьXML.ЗаписатьНачалоЭлемента("Реквизиты");
    ЗаписьXML.ЗаписатьНачалоЭлемента("Название");
    ЗаписьXML.ЗаписатьТекст("ООО Ромашка");
    ЗаписьXML.ЗаписатьКонецЭлемента();
    ЗаписьXML.ЗаписатьНачалоЭлемента("ИНН");
    ЗаписьXML.ЗаписатьТекст("7700000001");
    ЗаписьXML.ЗаписатьКонецЭлемента();
    ЗаписьXML.ЗаписатьКонецЭлемента();
    
    ЗаписьXML.ЗаписатьНачалоЭлемента("Отделы");
    
    ЗаписьXML.ЗаписатьНачалоЭлемента("Отдел");
    ЗаписьXML.ЗаписатьАтрибут("Название", "ИТ");
    ЗаписьXML.ЗаписатьНачалоЭлемента("Сотрудники");
    
    ЗаписьXML.ЗаписатьНачалоЭлемента("Сотрудник");
    ЗаписьXML.ЗаписатьАтрибут("Ид", "1");
    ЗаписьXML.ЗаписатьТекст("Иванов Иван");
    ЗаписьXML.ЗаписатьКонецЭлемента();
    
    ЗаписьXML.ЗаписатьНачалоЭлемента("Сотрудник");
    ЗаписьXML.ЗаписатьАтрибут("Ид", "2");
    ЗаписьXML.ЗаписатьТекст("Петров Петр");
    ЗаписьXML.ЗаписатьКонецЭлемента();
    
    ЗаписьXML.ЗаписатьКонецЭлемента(); // Сотрудники
    ЗаписьXML.ЗаписатьКонецЭлемента(); // Отдел
    
    ЗаписьXML.ЗаписатьКонецЭлемента(); // Отделы
    ЗаписьXML.ЗаписатьКонецЭлемента(); // Компания
    
    XMLСтрока = ЗаписьXML.Закрыть();
    Сообщить("Иерархический XML:");
    Сообщить(XMLСтрока);
    
    // Рекурсивный разбор иерархического XML
    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.УстановитьСтроку(XMLСтрока);
    
    Сообщить("Разбор иерархической структуры:");
    РазобратьXMLРекурсивно(ЧтениеXML, "");
    
КонецПроцедуры

Процедура РазобратьXMLРекурсивно(ЧтениеXML, Отступ)
    Пока ЧтениеXML.Прочитать() Цикл
        Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
            Сообщить(Отступ + "<" + ЧтениеXML.Имя + ">");
            
            // Выводим атрибуты
            Если ЧтениеXML.КоличествоАтрибутов() > 0 Тогда
                Для Каждого Атрибут Из ЧтениеXML.Атрибуты Цикл
                    Сообщить(Отступ + "  Атрибут: " + Атрибут.Имя + "='" + Атрибут.Значение + "'");
                КонецЦикла;
            КонецЕсли;
            
            // Рекурсивно разбираем содержимое
            РазобратьXMLРекурсивно(ЧтениеXML, Отступ + "  ");
            
        ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.Текст И Не ПустаяСтрока(ЧтениеXML.Значение) Тогда
            Сообщить(Отступ + "Значение: " + ЧтениеXML.Значение);
            
        ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
            Сообщить(Отступ + "</" + ЧтениеXML.Имя + ">");
            Возврат;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Преобразование XML в JSON и обратно

// Конвертация между XML и JSON форматами
Процедура XMLВJSON()

    // Исходный XML
    XMLСтрока = "
    |<Заказ>
    |    <Номер>З-001</Номер>
    |    <Дата>2024-01-15</Дата>
    |    <Позиции>
    |        <Позиция>
    |            <Код>1</Код>
    |            <Товар>Ноутбук</Товар>
    |            <Количество>2</Количество>
    |        </Позиция>
    |        <Позиция>
    |            <Код>2</Код>
    |            <Товар>Монитор</Товар>
    |            <Количество>1</Количество>
    |        </Позиция>
    |    </Позиции>
    |</Заказ>";
    
    // Конвертируем XML в структуру
    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.УстановитьСтроку(XMLСтрока);
    Данные = РазобратьXMLВСтруктуруПолный(ЧтениеXML);
    
    // Конвертируем структуру в JSON
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON, Данные);
    JSONСтрока = ЗаписьJSON.Закрыть();
    
    Сообщить("Конвертированный JSON:");
    Сообщить(JSONСтрока);
    
    // Конвертируем обратно JSON в XML
    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(JSONСтрока);
    ВосстановленныеДанные = ПрочитатьJSON(ЧтениеJSON);
    ЧтениеJSON.Закрыть();
    
    ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.УстановитьСтроку();
    ЗаписьXML.ЗаписатьОбъявлениеXML();
    СериализоватьСтруктуруВXML(ЗаписьXML, ВосстановленныеДанные, "Корень");
    ВосстановленныйXML = ЗаписьXML.Закрыть();
    
    Сообщить("Восстановленный XML:");
    Сообщить(ВосстановленныйXML);
    
КонецПроцедуры

Функция РазобратьXMLВСтруктуруПолный(ЧтениеXML)
    Результат = Новый Структура;
    ТекущийЭлемент = "";
    
    Пока ЧтениеXML.Прочитать() Цикл
        Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
            ТекущийЭлемент = ЧтениеXML.Имя;
            // Проверяем, может быть это массив
            Если Не Результат.Свойство(ТекущийЭлемент) Тогда
                Результат.Вставить(ТекущийЭлемент, "");
            КонецЕсли;
        ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда
            Если ТекущийЭлемент <> "" Тогда
                Результат[ТекущийЭлемент] = ЧтениеXML.Значение;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    
    Возврат Результат;
КонецФункции

Процедура СериализоватьСтруктуруВXML(ЗаписьXML, Данные, ИмяЭлемента)
    ЗаписьXML.ЗаписатьНачалоЭлемента(ИмяЭлемента);
    
    Для Каждого КлючЗначение Из Данные Цикл
        Если ТипЗнч(КлючЗначение.Значение) = Тип("Структура") Тогда
            СериализоватьСтруктуруВXML(ЗаписьXML, КлючЗначение.Значение, КлючЗначение.Ключ);
        ИначеЕсли ТипЗнч(КлючЗначение.Значение) = Тип("Массив") Тогда
            ЗаписьXML.ЗаписатьНачалоЭлемента(КлючЗначение.Ключ);
            Для Каждого ЭлементМассива Из КлючЗначение.Значение Цикл
                СериализоватьСтруктуруВXML(ЗаписьXML, ЭлементМассива, "Элемент");
            КонецЦикла;
            ЗаписьXML.ЗаписатьКонецЭлемента();
        Иначе
            ЗаписьXML.ЗаписатьНачалоЭлемента(КлючЗначение.Ключ);
            ЗаписьXML.ЗаписатьТекст(Строка(КлючЗначение.Значение));
            ЗаписьXML.ЗаписатьКонецЭлемента();
        КонецЕсли;
    КонецЦикла;
    
    ЗаписьXML.ЗаписатьКонецЭлемента();
КонецПроцедуры

Валидация XML с использованием XSD-схемы

// Проверка XML-документа на соответствие схеме (XSD)
Процедура ВалидацияXMLПоСхеме()

    // Пример XSD-схемы (упрощенной)
    XSDСхема = "
    |<?xml version='1.0' encoding='UTF-8'?>
    |<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'>
    |    <xs:element name='Книга'>
    |        <xs:complexType>
    |            <xs:sequence>
    |                <xs:element name='Название' type='xs:string'/>
    |                <xs:element name='Автор' type='xs:string'/>
    |                <xs:element name='Год' type='xs:integer'/>
    |                <xs:element name='Цена' type='xs:decimal'/>
    |            </xs:sequence>
    |        </xs:complexType>
    |    </xs:element>
    |</xs:schema>";
    
    // Корректный XML
    КорректныйXML = "
    |<Книга>
    |    <Название>Война и мир</Название>
    |    <Автор>Лев Толстой</Автор>
    |    <Год>1869</Год>
    |    <Цена>800</Цена>
    |</Книга>";
    
    // Некорректный XML (отсутствует обязательный элемент)
    НекорректныйXML = "
    |<Книга>
    |    <Название>Преступление и наказание</Название>
    |    <Автор>Федор Достоевский</Автор>
    |    <Год>1866</Год>
    |</Книга>";
    
    // Эмуляция валидации (встроенной поддержки XSD в 1С нет, но можно реализовать базовую проверку)
    Функция ВалидироватьXML(XMLСтрока, ОбязательныеЭлементы)
        ЧтениеXML = Новый ЧтениеXML;
        ЧтениеXML.УстановитьСтроку(XMLСтрока);
        
        НайденныеЭлементы = Новый Массив;
        ВнутриКорня = Ложь;
        
        Пока ЧтениеXML.Прочитать() Цикл
            Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
                Если ВнутриКорня Тогда
                    НайденныеЭлементы.Добавить(ЧтениеXML.Имя);
                Иначе
                    ВнутриКорня = Истина;
                КонецЕсли;
            ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента И ВнутриКорня Тогда
                Прервать;
            КонецЕсли;
        КонецЦикла;
        
        // Проверяем наличие всех обязательных элементов
        Для Каждого Элемент Из ОбязательныеЭлементы Цикл
            Если НайденныеЭлементы.Найти(Элемент) = Неопределено Тогда
                Возврат "Отсутствует обязательный элемент: " + Элемент;
            КонецЕсли;
        КонецЦикла;
        
        Возврат "OK";
    КонецФункции
    
    Обязательные = Новый Массив;
    Обязательные.Добавить("Название");
    Обязательные.Добавить("Автор");
    Обязательные.Добавить("Год");
    Обязательные.Добавить("Цена");
    
    Результат1 = ВалидироватьXML(КорректныйXML, Обязательные);
    Сообщить("Валидация корректного XML: " + Результат1);
    
    Результат2 = ВалидироватьXML(НекорректныйXML, Обязательные);
    Сообщить("Валидация некорректного XML: " + Результат2);
    
КонецПроцедуры

Примечания

// Важные особенности работы с XML в 1С:
// 1. Для записи XML используются объекты ЗаписьXML, для чтения - ЧтениеXML
// 2. Всегда начинайте с ЗаписатьОбъявлениеXML() для корректного XML-документа
// 3. Атрибуты записываются перед текстовым содержимым элемента
// 4. Типы узлов: НачалоЭлемента, КонецЭлемента, Текст, Атрибут
// 5. Для чтения атрибутов используйте метод ПолучитьАтрибут()
// 6. Вложенные элементы создают иерархическую структуру документа
// 7. При парсинге XML учитывайте возможные пространства имен
// 8. Для работы с большими XML-файлами используйте построчное чтение
// 9. Экранирование спецсимволов (<, >, & и др.) выполняется автоматически
// 10. При сериализации таблицы значений рекомендуется сохранять структуру колонок
// 11. Встроенной валидации по XSD-схемам в платформе 1С нет, реализуйте свою логику проверки
// 12. XML-документы удобно использовать для обмена данными с внешними системами

Поделиться с друзьями
Smirnov code
Добавить комментарий