Разработка и Конфигурация · 12 мин
Как записать файл XML в 1С: инструкция с примерами кода
Как записать XML-файл в 1С: объект ЗаписьXML, запись данных, выгрузка справочников и документов, кодировка, проверка результата и типичные ошибки.
Запись XML-файла — одна из самых частых задач при обмене данными между 1С и внешними системами: банками, маркетплейсами, сайтами, другими учётными программами. В платформе 1С:Предприятие для этого есть встроенный объект ЗаписьXML, который работает на любом релизе платформы 8.3 без дополнительных компонент и лицензий.
Задача решается двумя способами: программная запись через встроенный язык — когда нужен произвольный формат файла, и типовые механизмы обмена (планы обмена, универсальный формат EnterpriseData) — когда данные передаются между конфигурациями 1С. Ниже разобраны оба подхода с готовым кодом, который можно адаптировать под свою задачу.
Важно понимать: XML — это текстовый файл с жёсткой структурой. Ошибка в одном теге делает весь документ нечитаемым для принимающей системы, поэтому после записи файл нужно обязательно проверять на корректность.
Какие способы записи XML существуют в 1С
Платформа предлагает несколько механизмов, и выбор зависит от задачи. Программная запись через объект ЗаписьXML даёт полный контроль над структурой файла — это основной способ, когда формат задан внешней системой (например, спецификацией банка или маркетплейса).
Для обмена между конфигурациями 1С фирма «1С» предоставляет готовые решения: планы обмена, универсальный формат EnterpriseData, подсистему обмена данными из Библиотеки стандартных подсистем. Они самостоятельно формируют XML, и писать код записи не нужно.
Третий вариант — сериализация объектов через ЗаписатьXML() из XDTO-пакета. Он подходит, когда нужно выгрузить объект конфигурации (документ, элемент справочника) в XML одной командой, но формат при этом определяется платформой, а не вами.
Сравнение вариантов
Полный контроль над структурой файла. Подходит для обмена с внешними системами. Требует написания кода.
Готовый обмен между конфигурациями 1С без программирования. Не подходит для произвольных внешних форматов.
Быстрая выгрузка объекта конфигурации одной командой. Формат определяет платформа, внешние системы его обычно не принимают.
Базовый пример: запись XML через объект ЗаписьXML
Объект ЗаписьXML работает последовательно: вы открываете файл, записываете элементы один за другим и закрываете файл. Порядок вызовов строго определяет структуру документа. Ниже минимальный рабочий пример, который создаёт файл с одним элементом.
Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл("C:\Обмен\test.xml", "UTF-8");
Запись.ЗаписатьОбъявлениеXML();
Запись.ЗаписатьНачалоЭлемента("Данные");
Запись.ЗаписатьНачалоЭлемента("Товар");
Запись.ЗаписатьАтрибут("Код", "000001");
Запись.ЗаписатьТекст("Кабель сетевой");
Запись.ЗаписатьКонецЭлемента();
Запись.ЗаписатьКонецЭлемента();
Запись.Закрыть();
Метод ЗаписатьОбъявлениеXML() добавляет строку <?xml version="1.0" encoding="UTF-8"?> — многие внешние системы требуют её наличия. Метод Закрыть() обязателен: без него данные могут остаться в буфере, и файл окажется пустым или обрезанным.
Результат выполнения примера — файл следующего содержания:
<?xml version="1.0" encoding="UTF-8"?>
<Данные>
<Товар Код="000001">Кабель сетевой</Товар>
</Данные>
- 1Создайте объект: Запись = Новый ЗаписьXML
- 2Откройте файл с указанием пути и кодировки: ОткрытьФайл(Путь, "UTF-8")
- 3Запишите объявление XML методом ЗаписатьОбъявлениеXML()
- 4Запишите корневой элемент, затем вложенные элементы и атрибуты
- 5Закройте все открытые элементы методом ЗаписатьКонецЭлемента()
- 6Вызовите Запись.Закрыть() и проверьте, что файл появился на диске
Как выгрузить данные справочника в XML
Типовая практическая задача — выгрузить в файл список элементов справочника или табличную часть документа. Для этого выполняется запрос или выборка, а в цикле для каждой строки записывается свой элемент. Пример выгрузки номенклатуры:
Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл(ПутьКФайлу, "UTF-8");
Запись.ЗаписатьОбъявлениеXML();
Запись.ЗаписатьНачалоЭлемента("Номенклатура");
Запрос = Новый Запрос(
"ВЫБРАТЬ Код, Наименование
|ИЗ Справочник.Номенклатура
|ГДЕ НЕ ПометкаУдаления");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Запись.ЗаписатьНачалоЭлемента("Товар");
Запись.ЗаписатьАтрибут("Код", Выборка.Код);
Запись.ЗаписатьНачалоЭлемента("Наименование");
Запись.ЗаписатьТекст(Выборка.Наименование);
Запись.ЗаписатьКонецЭлемента();
Запись.ЗаписатьКонецЭлемента();
КонецЦикла;
Запись.ЗаписатьКонецЭлемента();
Запись.Закрыть();
Обратите внимание: помеченные на удаление элементы в примере исключены отбором в запросе — это защищает принимающую систему от «мусорных» данных. Если выгружаете ссылки, даты или булевы значения, приводите их к строковому виду, который ожидает приёмник: у дат в 1С и во внешних системах часто разные форматы.
Для больших объёмов (десятки тысяч строк) объект ЗаписьXML подходит хорошо — он пишет потоково и не держит весь файл в памяти. Узким местом обычно становится запрос к данным, а не сама запись.
Кодировка, путь к файлу и права доступа
Кодировка указывается вторым параметром метода ОткрытьФайл(). Стандарт де-факто для обмена — UTF-8, и большинство внешних систем ожидают именно её. Если спецификация требует windows-1251 или UTF-16, укажите это явно — несовпадение кодировки объявления и фактической кодировки файла делает документ невалидным.
Путь к файлу зависит от того, где выполняется код. В клиент-серверном режиме код общего модуля с признаком «Сервер» выполняется на сервере 1С, и путь C:\Обмен\... будет указывать на диск сервера, а не компьютера пользователя. Если файл должен оказаться у пользователя, запишите его на сервере во временное хранилище и передайте на клиент, либо выполняйте запись на клиенте.
Учётная запись, под которой работает сервер 1С (обычно USR1CV8), должна иметь права на запись в целевой каталог. Отсутствие прав — самая частая причина ошибки «Ошибка доступа к файлу» в клиент-серверных базах.
Как проверить, что файл записался корректно
Простой факт появления файла на диске ничего не гарантирует: он может быть пустым, обрезанным или содержать синтаксически неверный XML. Минимальная проверка — открыть файл в браузере или текстовом редакторе: браузеры показывают ошибку разбора с указанием строки, если XML невалиден.
Программно корректность проверяется обратным чтением: создайте объект ЧтениеXML, откройте записанный файл и прочитайте его до конца в цикле. Если структура нарушена (незакрытый тег, некорректный символ), чтение вызовет исключение с указанием позиции ошибки.
Для обмена по формальной спецификации (XSD-схема) одной синтаксической проверки мало — файл должен соответствовать схеме. Валидацию по XSD можно выполнить через объект ЧтениеXML с включённой проверкой или внешними средствами до отправки файла приёмнику.
Как проверить результат
Файл на диске, размер соответствует объёму данных
Файл отсутствует или размер 0 байт — метод Закрыть() не вызван или ошибка прав доступа
Браузер показывает дерево XML без сообщений об ошибке
Ошибка разбора с номером строки — нарушена структура тегов
Русский текст читается
Кракозябры — несовпадение кодировки файла и объявления
Файл читается до конца без исключений
Исключение при чтении — файл невалиден
Типичные ошибки при записи XML
Большинство проблем при записи XML в 1С сводится к нескольким повторяющимся сценариям. Их знание экономит часы отладки, особенно когда файл уходит во внешнюю систему и ошибка обнаруживается только на стороне приёмника.
Отдельно стоит упомянуть специальные символы. Значения, содержащие &, <, > и кавычки, объект ЗаписьXML экранирует автоматически при записи текста и атрибутов. А вот если вы собираете XML конкатенацией строк (чего делать не следует), экранировать символы придётся вручную — и это классический источник невалидных файлов.
Когда вместо ручной записи использовать типовые механизмы
Если обе стороны обмена — конфигурации 1С, писать код записи XML вручную обычно не нужно. Планы обмена с правилами конвертации или универсальный формат EnterpriseData формируют файл автоматически, включая регистрацию изменений, контроль версий и разрешение коллизий.
Ручная запись оправдана, когда формат задан извне: спецификация банка, API маркетплейса, требования госуслуги, интеграция с самописной системой. В этих случаях структуру файла диктует внешняя сторона, и типовые механизмы её не воспроизведут.
Промежуточный вариант — XDTO-пакеты: вы описываете схему данных в конфигураторе, а платформа сама сериализует объекты в XML по этой схеме. Это удобно для сложных многоуровневых структур, где ручная запись через ЗаписьXML превращается в сотни строк кода.
Как выбрать подход
Частые вопросы
Можно ли записать XML без создания файла на диске, например в строку?
Да. Вместо ОткрытьФайл() используйте метод УстановитьСтроку() с указанием кодировки, а после записи получите результат методом Закрыть() — он вернёт строку с готовым XML. Это удобно для передачи данных через HTTP или хранилище значений без промежуточных файлов.
Почему файл записывается, но внешняя система его не принимает?
Чаще всего причины три: несовпадение кодировки, отсутствие или неверное объявление XML в первой строке и несоответствие структуры XSD-схеме приёмника. Проверьте файл в браузере, затем сравните его с эталонным примером из документации принимающей системы — расхождение обычно видно сразу.
Как записать XML в кодировке windows-1251?
Передайте кодировку вторым параметром: Запись.ОткрытьФайл(Путь, "windows-1251"). Объявление XML, записанное методом ЗаписатьОбъявлениеXML(), автоматически укажет ту же кодировку. Убедитесь, что приёмник действительно требует 1251 — для современных систем стандартом является UTF-8.
Где выполняется код записи в клиент-серверной базе и куда попадёт файл?
Код выполняется там, где определён контекст: в серверной процедуре — на сервере 1С, в клиентской — на компьютере пользователя. Файл создаётся на той машине, где выполняется код. Чтобы передать файл с сервера пользователю, поместите его во временное хранилище и на клиенте сохраните через ПолучитьФайл() или диалог сохранения.
Чем отличается ЗаписьXML от ЗаписатьXML()?
ЗаписьXML — объект для ручного формирования произвольного XML: вы сами определяете теги, атрибуты и структуру. ЗаписатьXML() — глобальный метод сериализации: он выгружает объект конфигурации (документ, справочник) в XML формата платформы одной командой, но управлять структурой результата нельзя.
Нужны ли права администратора для записи XML-файла?
Для самой записи XML административные права в 1С не требуются — достаточно права выполнения кода. Но у учётной записи, под которой работает процесс (пользователь сеанса на клиенте или USR1CV8 на сервере), должны быть права файловой системы на запись в целевой каталог.
Что важно запомнить
Запись XML в 1С выполняется объектом ЗаписьXML: открытие файла, последовательная запись элементов, обязательный вызов Закрыть(). Указывайте кодировку UTF-8, учитывайте, на какой стороне (клиент или сервер) выполняется код, и всегда проверяйте готовый файл обратным чтением. Для обмена между конфигурациями 1С предпочтительнее типовые планы обмена — ручная запись нужна только для внешних форматов.