Создать настоящие UTF-8 байты XML в памяти

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

ОткрытьПоток получает параметры и явный Ложь для BOM. Затем тот же собственный поток используется для обратного чтения.

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

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

Подготовка

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

  2. Все тексты и товары заданы константами: Книга, A&B, количество 3. Учётные данные, файлы организации, HTTP и внешние XML не используются.

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

  4. Для урока файла имя конфигурации должно быть УчебнаяКонфигурацияСинтаксиса. Существующий файл не перезаписывается. После проверки удалите вручную только показанный собственный временный файл.

  5. ПараметрыЗаписиXML неизменяемы после создания. Все пять параметров задаются конструктором, а не присваиванием свойств.

Процедура ВыполнитьПример() Экспорт
    Параметры = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Ложь, Ложь, "  ");
    Поток = Новый ПотокВПамяти;
    Запись = Новый ЗаписьXML;
    Попытка
        Запись.ОткрытьПоток(Поток, Параметры, Ложь);
        Запись.ЗаписатьОбъявлениеXML();
        Запись.ЗаписатьНачалоЭлемента("catalog");
        Запись.ЗаписатьНачалоЭлемента("product");
        Запись.ЗаписатьАтрибут("code", "A&B");
        Запись.ЗаписатьАтрибут("quantity", "3");
        Запись.ЗаписатьТекст("Книга <учебник> & пособие");
        Запись.ЗаписатьКонецЭлемента();
        Запись.ЗаписатьКонецЭлемента();
        Запись.Закрыть();
        Сообщить(Поток.Размер() > 0);
        Поток.Перейти(0, ПозицияВПотоке.Начало);
        Чтение = Новый ЧтениеXML;
        Попытка
            Чтение.ОткрытьПоток(Поток);
            Пока Чтение.Прочитать() Цикл
                Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента
                    И Чтение.ЛокальноеИмя = "product" Тогда
                    Сообщить(Чтение.ПолучитьАтрибут("code") = "A&B");
                    Сообщить(Чтение.ПолучитьАтрибут("quantity") = "3");
                КонецЕсли;
            КонецЦикла;
        Исключение
            Чтение.Закрыть();
            ВызватьИсключение;
        КонецПопытки;
        Чтение.Закрыть();
    Исключение
        ОшибкаОперации = ОписаниеОшибки();
        Запись.Закрыть();
        Поток.Закрыть();
        ВызватьИсключение ОшибкаОперации;
    КонецПопытки;
    Поток.Закрыть();
КонецПроцедуры

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

  1. Создать собственный поток и параметры UTF-8. Передать Ложь третьим аргументом: BOM не добавляется.

  2. Записать объявление и товар штатными методами. Закрыть писатель до перехода к чтению.

  3. Проверить ненулевой размер потока и переместить его позицию в начало.

  4. Открыть ЧтениеXML на потоке, пройти весь XML, проверить атрибуты и закрыть читатель и поток, включая ветку ошибки.

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

  1. Три проверки дают Истина.

  2. Поток содержит байты XML, но на диске ничего не создано. В отладчике проверьте начало данных без UTF-8 BOM EF BB BF.

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

Самостоятельный рецепт байтового XML для дальнейшей передачи без файловой зависимости.

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

  1. Кодировка строки и байты потока — разные вещи. В этом уроке UTF-8 применяется к реальной записи байтов.

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

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

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

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

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

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