Разработка и Конфигурация · 10 мин
Как создать XML-документ в 1С
Как создать XML-документ в 1С: объект ЗаписьXML, XDTO-пакеты, сериализация объектов, кодировки и проверка результата. Примеры кода и частые ошибки.
XML — основной формат обмена данными в экосистеме 1С: через него выгружаются документы в банки, налоговую, системы ЕГАИС и «Честный знак», обмениваются данными распределённые базы. В платформе «1С:Предприятие 8.3» есть три рабочих способа сформировать XML: низкоуровневая запись через объект ЗаписьXML, работа через XDTO-пакеты по схеме и сериализация объектов конфигурации. Выбор зависит от того, есть ли формальная схема (XSD) и насколько строгий формат требует получатель файла.
Для большинства прикладных задач достаточно объекта ЗаписьXML: он позволяет последовательно записать элементы, атрибуты и текст, контролируя структуру вручную. Если формат регламентирован XSD-схемой (например, обмен с ФНС или банком), правильнее использовать фабрику XDTO — она проверяет типы и обязательность полей ещё на этапе записи. Сериализация подходит, когда нужно выгрузить объект конфигурации «как есть» между базами 1С.
Выбор способа создания XML под задачу
Прежде чем писать код, определите, кто будет читать файл. Если это произвольная внешняя система с простой структурой — подойдёт ручная запись. Если формат строго регламентирован и есть XSD-схема — только XDTO, иначе любое расхождение в типах или порядке элементов приведёт к отказу приёмника. Если нужно перенести данные между двумя базами 1С — сериализация сохранит ссылки и типы автоматически.
Сравнение вариантов
Полный контроль над структурой, подходит для простых и нестандартных форматов. Нет проверки по схеме — ошибки обнаружатся только у получателя.
Запись по XSD-схеме с проверкой типов и обязательных полей. Требует загрузки схемы и более громоздкого кода.
Выгрузка объектов конфигурации между базами 1С. Не подходит для обмена с внешними системами, не знающими внутренние типы 1С.
Создание XML через объект ЗаписьXML
Объект ЗаписьXML работает последовательно: вы открываете элемент, пишете его атрибуты и содержимое, закрываете. Порядок вызовов строго определяет структуру документа, поэтому код удобно строить, повторяя вложенность целевого формата. Запись возможна в файл на диске, в строку в памяти или во временное хранилище.
Типовой пример — выгрузка списка товаров в файл:
Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл("C:\Обмен\Товары.xml", "UTF-8");
Запись.ЗаписатьОбъявлениеXML();
Запись.ЗаписатьНачалоЭлемента("Товары");
Для Каждого Строка Из ТаблицаТоваров Цикл
Запись.ЗаписатьНачалоЭлемента("Товар");
Запись.ЗаписатьАтрибут("Код", Строка(Строка.Код));
Запись.ЗаписатьНачалоЭлемента("Наименование");
Запись.ЗаписатьТекст(Строка.Наименование);
Запись.ЗаписатьКонецЭлемента(); // Наименование
Запись.ЗаписатьНачалоЭлемента("Цена");
Запись.ЗаписатьТекст(Формат(Строка.Цена, "ЧРД=.; ЧГ=0"));
Запись.ЗаписатьКонецЭлемента(); // Цена
Запись.ЗаписатьКонецЭлемента(); // Товар
КонецЦикла;
Запись.ЗаписатьКонецЭлемента(); // Товары
Запись.Закрыть();
Вызов Закрыть() обязателен: без него файл останется незавершённым и, скорее всего, невалидным. Если запись ведётся в строку, вместо ОткрытьФайл используется УстановитьСтроку("UTF-8"), а результат забирается методом Закрыть(), который вернёт готовый текст XML.
- 1Создайте объект: Новый ЗаписьXML
- 2Откройте запись: ОткрытьФайл() для файла или УстановитьСтроку() для строки
- 3Запишите объявление XML методом ЗаписатьОбъявлениеXML()
- 4Последовательно запишите элементы, атрибуты и текст, соблюдая вложенность
- 5Вызовите Закрыть() и проверьте результат в текстовом редакторе или браузере
Запись атрибутов, пространств имён и специальных значений
Атрибуты записываются только между ЗаписатьНачалоЭлемента и первым дочерним содержимым — после записи текста или вложенного элемента добавить атрибут уже нельзя. Все значения передаются строками, поэтому числа и даты нужно предварительно привести к нужному формату: даты обычно в ISO-виде ГГГГ-ММ-ДД, числа — с точкой как разделителем и без разделителей групп.
Если формат требует пространства имён, используйте вариант ЗаписатьНачалоЭлемента("Имя", "URI-пространства") и ЗаписатьСоответствиеПространстваИмен. Спецсимволы (&, <, >, кавычки) платформа экранирует автоматически при записи текста и атрибутов — вручную подставлять & не нужно, иначе получите двойное экранирование.
Создание XML через XDTO-пакеты по схеме
Когда формат задан XSD-схемой — например, электронные документы для ФНС, банковские выписки, отчётность — ручная запись чревата ошибками в типах и порядке элементов. XDTO-пакеты решают это: схема загружается в конфигурацию (ветка «XDTO-пакеты» в дереве конфигуратора), а код работает с типизированными объектами.
Общая схема кода выглядит так:
URI = "http://example.org/schemas/order";
ТипЗаказ = ФабрикаXDTO.Пакеты.Получить(URI).Получить("Заказ");
Заказ = ФабрикаXDTO.Создать(ТипЗаказ);
Заказ.Номер = "А-102";
Заказ.Дата = ТекущаяДатаСеанса();
Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл("C:\Обмен\Заказ.xml", "UTF-8");
Запись.ЗаписатьОбъявлениеXML();
ФабрикаXDTO.ЗаписатьXML(Запись, Заказ);
Запись.Закрыть();
Попытка присвоить значение неверного типа или пропустить обязательное свойство вызовет исключение сразу при записи — это и есть главное преимущество подхода. Минус в том, что схему нужно поддерживать: при смене версии формата пакет в конфигурации придётся обновить.
Сериализация объектов конфигурации
Для переноса данных между базами 1С удобен сериализатор XDTO: он превращает объект конфигурации (документ, элемент справочника) в XML вместе со ссылками и типами, а на стороне приёмника восстанавливает его обратно. Это основа типовых механизмов обмена и планов обмена.
Запись = Новый ЗаписьXML;
Запись.УстановитьСтроку("UTF-8");
СериализаторXDTO.ЗаписатьXML(Запись, ДокументОбъект);
ТекстXML = Запись.Закрыть();
Ограничение принципиальное: такой XML понятен только платформе 1С. Передавать его внешней системе бессмысленно — она не знает внутренние типы вроде CatalogRef.Номенклатура. Для интеграции с внешними системами используйте ЗаписьXML или XDTO по открытой схеме.
Кодировка, форматирование и проверка результата
Кодировка задаётся параметром при открытии записи. Стандарт де-факто — UTF-8; UTF-16 и windows-1251 требуются только если их явно ожидает приёмник. Несовпадение кодировки — частая причина «кракозябр» и отказов загрузки русских наименований, при этом сам файл остаётся формально валидным.
Проверять результат удобно в три приёма. Сначала откройте файл в браузере: он покажет дерево и сразу сообщит о синтаксической ошибке с номером строки. Затем прочитайте файл обратно через ЧтениеXML в той же 1С — это подтвердит, что структура читается. Наконец, если формат регламентирован, прогоните файл через валидатор XSD-схемы или тестовый приёмник контрагента.
Как проверить результат
Дерево элементов отображается без сообщений об ошибке
Браузер показывает ошибку разбора с номером строки
Русский текст читается корректно
Кракозябры — несовпадение кодировки записи и чтения
Файл читается до конца без исключений
Исключение о незакрытом элементе или неверном символе
Схема принимает документ
Ошибки типов, пропущенные обязательные элементы
Типичные ошибки при создании XML в 1С
Большинство проблем возникает не из-за сложности формата, а из-за мелочей: незакрытые элементы, неверный формат дат, ручное экранирование. Ниже — то, что чаще всего ломает обмен.
Отдельный класс ошибок — логические: файл валиден, но порядок элементов не совпадает со схемой приёмника. XML для многих форматов чувствителен к последовательности дочерних элементов, поэтому сверяйте порядок записи с документацией на формат, а не только состав полей.
Частые вопросы
Как создать XML в строку, а не в файл?
Используйте Запись.УстановитьСтроку("UTF-8") вместо ОткрытьФайл. После записи всех элементов вызовите Текст = Запись.Закрыть() — метод вернёт готовую строку с XML. Так удобно передавать документ в HTTP-запрос или веб-сервис без промежуточного файла.
Как записать CDATA-секцию?
Для этого есть метод ЗаписатьCDATA(Текст). Он нужен, когда внутрь элемента требуется вставить фрагмент, который не должен разбираться как XML, — например, HTML-описание товара. Внутри CDATA экранирование не применяется.
Можно ли создать XML без программирования?
Частично: типовые конфигурации содержат готовые обработки выгрузки (обмен с банками, ЭДО, выгрузка справочников), которые формируют XML без кода. Универсального конструктора произвольного XML в платформе нет — для нестандартного формата потребуется код или внешняя обработка.
Чем отличается ЗаписьXML от ЗаписьТекста при создании XML?
ЗаписьТекста просто пишет символы и ничего не знает о структуре XML: вы сами следите за тегами и экранированием. ЗаписьXML контролирует вложенность элементов, экранирует спецсимволы и формирует корректное объявление документа, поэтому для XML всегда предпочтительнее.
Как выгрузить большой объём данных, не загружая всё в память?
ЗаписьXML пишет последовательно и потоково: выгружайте данные порциями через запрос с обходом результата, записывая каждый элемент сразу. Не накапливайте весь XML в строке — при больших объёмах это приводит к расходу памяти и замедлению сервера.
Почему приёмник отклоняет файл, хотя браузер открывает его без ошибок?
Браузер проверяет только синтаксис XML, а приёмник — ещё и соответствие схеме: типы значений, обязательность полей, порядок элементов, формат дат. Прогоните файл через XSD-валидацию и сверьте форматы дат и чисел с документацией на формат.
Что важно запомнить
Для произвольного формата используйте ЗаписьXML с обязательным Закрыть(), для регламентированных форматов — XDTO-пакеты по XSD-схеме, для обмена между базами 1С — сериализацию. Кодировка UTF-8, даты в ISO-формате, спецсимволы экранирует платформа. Результат проверяйте браузером, обратным чтением и валидацией по схеме.