Разработка и Конфигурация · 10 мин
Как преобразовать строку в XML в 1С
Как преобразовать строку в XML в 1С: объект ЧтениеXML, сериализация XDTO, ЗначениеВСтрокуВнутр, проверка ошибок и типовые примеры кода.
Задача преобразования строки в XML в 1С возникает в двух ситуациях: когда нужно разобрать XML-строку, полученную из веб-сервиса или файла, и когда нужно наоборот — сформировать XML из данных информационной базы. В обоих случаях платформа предлагает встроенные механизмы, которые не требуют подключения внешних компонентов.
Основные инструменты — объекты ЧтениеXML и ЗаписьXML, работающие в потоковом режиме, а также фабрика XDTO для объектной сериализации. Выбор зависит от структуры данных: простая выгрузка, обмен по схеме или интеграция со сторонним сервисом.
Ниже разобраны рабочие примеры кода, условия выбора подхода, проверка результата и типичные ошибки, из-за которых разбор строки завершается исключением.
Какие способы преобразования существуют и когда их применять
Платформа 1С:Предприятие 8 предоставляет три основных механизма работы с XML-строками. Первый — потоковое чтение и запись через ЧтениеXML и ЗаписьXML. Он подходит для документов любого размера и даёт полный контроль над структурой, но требует ручного обхода узлов.
Второй механизм — сериализация через XDTO: функции СериализаторXDTO.ЗаписатьXML() и СериализаторXDTO.ПрочитатьXML(). Он автоматически преобразует ссылки, табличные части и примитивные типы, но работает только с типами, известными конфигурации.
Третий вариант — ЗначениеВСтрокуВнутр() и ЗначениеИзСтрокиВнутр(), которые возвращают внутреннее представление значения в формате, близком к XML. Этот способ предназначен для внутреннего хранения и переноса между базами 1С, а не для обмена со сторонними системами.
Сравнение вариантов
Универсальный потоковый разбор и формирование. Подходит для любых XML, включая чужие схемы. Требует ручной обработки узлов.
Автоматическая сериализация объектов конфигурации. Ограничение: работает только с типами, известными метаданным.
Быстрый перенос значений между базами 1С. Не подходит для обмена с внешними системами — формат внутренний.
Как разобрать XML-строку через ЧтениеXML
Объект ЧтениеXML создаётся конструктором, после чего в него передаётся строка методом УстановитьСтроку(). Далее документ обходится в цикле методом Прочитать(), а тип текущего узла определяется свойством ТипУзла.
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(СтрокаXML);
Пока Чтение.Прочитать() Цикл
Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
ИмяУзла = Чтение.Имя;
ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.Текст Тогда
ЗначениеУзла = Чтение.Значение;
КонецЕсли;
КонецЦикла;
Чтение.Закрыть();
Признак корректной работы — цикл завершается без исключений, а переменные содержат ожидаемые имена и значения узлов. Если строка содержит синтаксическую ошибку, метод Прочитать() вызовет исключение с указанием позиции в тексте.
Чтение атрибутов и пространств имён
Атрибуты текущего узла читаются методом ПолучитьАтрибут() по имени или через обход свойства КоличествоАтрибутов(). Если документ использует пространства имён, имя узла без префикса доступно через свойство ЛокальноеИмя, а URI — через URIПространстваИмен.
Как сформировать XML-строку через ЗаписьXML
Для формирования XML из данных базы используется объект ЗаписьXML. После вызова УстановитьСтроку() документ строится последовательными вызовами ЗаписатьНачалоЭлемента(), ЗаписатьАтрибут(), ЗаписатьТекст() и ЗаписатьКонецЭлемента().
Запись = Новый ЗаписьXML;
Запись.УстановитьСтроку("UTF-8");
Запись.ЗаписатьОбъявлениеXML();
Запись.ЗаписатьНачалоЭлемента("Товар");
Запись.ЗаписатьАтрибут("Код", СокрЛП(Товар.Код));
Запись.ЗаписатьНачалоЭлемента("Наименование");
Запись.ЗаписатьТекст(Товар.Наименование);
Запись.ЗаписатьКонецЭлемента();
Запись.ЗаписатьКонецЭлемента();
СтрокаXML = Запись.Закрыть();
Метод Закрыть() возвращает готовую строку. Важно: до вызова Закрыть() строка недоступна, а незакрытые элементы приводят к ошибке. Каждому ЗаписатьНачалоЭлемента() должен соответствовать ЗаписатьКонецЭлемента().
- 1Создайте объект ЗаписьXML и вызовите УстановитьСтроку() с нужной кодировкой
- 2Запишите объявление XML методом ЗаписатьОбъявлениеXML()
- 3Сформируйте элементы, атрибуты и текст, закрывая каждый открытый узел
- 4Вызовите Закрыть() и получите итоговую строку
- 5Проверьте результат обратным чтением через ЧтениеXML
Сериализация объектов через XDTO
Когда нужно преобразовать в XML-строку целый объект конфигурации — справочник, документ или структуру простых типов, — удобнее сериализатор XDTO. Метод СериализаторXDTO.ЗаписатьXML() принимает объект записи и значение, а ПрочитатьXML() выполняет обратное преобразование.
Запись = Новый ЗаписьXML;
Запись.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(Запись, СсылкаНаОбъект);
СтрокаXML = Запись.Закрыть();
// Обратное преобразование
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(СтрокаXML);
Объект = СериализаторXDTO.ПрочитатьXML(Чтение);
Ограничение механизма: сериализатор понимает только типы, описанные в метаданных и фабрике XDTO. Произвольную структуру внешней системы он не разберёт — для чужих схем используйте потоковое чтение или пакеты XDTO с загруженной схемой.
Преобразование через ЗначениеВСтрокуВнутр
Функции ЗначениеВСтрокуВнутр() и ЗначениеИзСтрокиВнутр() преобразуют значение во внутреннее строковое представление платформы. Формат технически близок к XML, но не предназначен для внешнего обмена: сторонняя система его не прочитает.
Типовые сценарии применения — сохранение настроек в хранилище значений, передача данных между сеансами, перенос значений между базами 1С через файлы или буфер обмена. Обратное преобразование выполняется одной строкой: ЗначениеИзСтрокиВнутр(Строка).
Учтите, что строка внутреннего формата может быть объёмной для больших объектов, а её структура зависит от версии платформы. Для долговременного хранения и интеграций предпочтительнее явный XML через ЗаписьXML или XDTO.
Проверка результата и обработка ошибок
Надёжный способ убедиться, что сформированная XML-строка корректна, — прочитать её обратно через ЧтениеXML. Если разбор проходит без исключений и узлы соответствуют ожиданиям, документ синтаксически валиден.
Разбор входящих строк всегда оборачивайте в конструкцию Попытка...Исключение...КонецПопытки и логируйте ОписаниеОшибки(). Текст исключения содержит номер строки и позицию в документе, что существенно ускоряет поиск дефекта в больших сообщениях.
Как проверить результат
ЧтениеXML обходит все узлы без исключений
Исключение с указанием позиции ошибки в тексте
Объявление XML совпадает с фактической кодировкой строки
Крякозябры или ошибка разбора на первом символе
Каждому открывающему тегу соответствует закрывающий
Метод Закрыть() вызывает ошибку о незакрытых элементах
Типичные ошибки при работе с XML-строками
Чаще всего проблемы связаны не с самими методами, а с данными. Несоответствие кодировки, спецсимволы в тексте и попытка сериализовать неподдерживаемый тип — три главных источника исключений.
Ещё одна распространённая ситуация — разбор большого XML целиком в памяти через DOM-подобные подходы. Потоковое чтение через ЧтениеXML потребляет минимум памяти и остаётся стабильным на документах любого размера.
Что важно запомнить
Для разбора XML-строки — ЧтениеXML с УстановитьСтроку(), для формирования — ЗаписьXML с обязательным Закрыть(). Объекты конфигурации сериализуйте через СериализаторXDTO, а ЗначениеВСтрокуВнутр оставьте для внутренних задач. Любой разбор внешних данных оборачивайте в Попытка...Исключение и проверяйте результат обратным чтением.
Частые вопросы
Как преобразовать XML-строку в структуру или соответствие?
Напрямую такой функции нет. Разберите строку через ЧтениеXML и в цикле заполняйте Структуру или Соответствие: имя узла — ключ, текст узла — значение. Для вложенных элементов используйте рекурсивную процедуру обхода.
Почему ЧтениеXML выдаёт ошибку на первом символе строки?
Чаще всего причина — BOM-маркер в начале строки или несовпадение кодировки в объявлении XML с фактической. Удалите BOM функцией СтрЗаменить() или сформируйте строку заново с корректной кодировкой.
Можно ли разобрать XML без знания его структуры?
Да, потоковое чтение позволяет обходить документ по типам узлов без заранее известной схемы. Для каждого узла доступны имя, локальное имя, значение и атрибуты, поэтому структуру можно выяснить в процессе разбора.
Чем отличается СериализаторXDTO от ЗначениеВСтрокуВнутр?
СериализаторXDTO формирует стандартный XML, читаемый любой системой, но работает только с типами метаданных. ЗначениеВСтрокуВнутр создаёт внутренний формат платформы, который понимает только 1С, зато сериализует почти любые значения.
Как записать в XML спецсимволы, например амперсанд?
Используйте метод ЗаписатьТекст() объекта ЗаписьXML — он автоматически экранирует символы &, <, > и кавычки. Ручная конкатенация строк с подстановкой значений приводит к невалидному документу.
Работают ли эти методы в тонком и веб-клиенте?
ЧтениеXML, ЗаписьXML и сериализатор XDTO доступны на сервере и в толстом клиенте. В тонком и веб-клиенте работа с XML обычно выносится в серверные процедуры — это и надёжнее, и не нагружает клиентский канал.