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