В этой статье мы рассмотрим класс \Bitrix\Main\XmlWriter
из фреймворка 1С-Битрикс, который упрощает экспорт данных в формате XML. Класс предоставляет удобные методы для открытия файла, записи в него контента с учетом вложенных структур и закрытия файла. Также мы разберём сценарии пошагового экспорта больших объёмов данных из базы.

Содержание
- Общее описание
- Пример подключения и создания объекта
- Методы класса
XmlWriter
- Простой пример экспорта
- Пошаговый экспорт больших объёмов (итерационный)
- Заключение
1. Общее описание
Класс XmlWriter является частью модуля main
и располагается по пути:
bitrix/modules/main/lib/xmlwriter.php
Он предназначен для удобной записи структурированных данных в формате XML с возможностью:
- Гибкой настройки кодировки.
- Автоматического создания или дописывания в существующий файл.
- Пошаговой записи больших объёмов данных (например, при экспорте из базы).
- Удобного управления вложенными структурами.
Все вызовы методов производятся последовательно, что позволяет легко контролировать процесс формирования XML-файла.
2. Пример подключения и создания объекта
Перед началом работы нужно убедиться, что в вашем скрипте или классе подключается пространство имён:
use Bitrix\Main\XmlWriter;
Далее можно создать объект, передав ему массив параметров:
// Создание экземпляра XmlWriter
$export = new \Bitrix\Main\XmlWriter([
'file' => '/upload/export/data.xml', // путь к файлу относительно корня сайта
'create_file' => true, // если true, то при создании заново удалит старый файл
'charset' => SITE_CHARSET, // кодировка файла, по умолчанию — кодировка сайта
'lowercase' => true, // приводить ли все теги к нижнему регистру
'tab' => 0 // с какой табуляции начать запись
]);
Обратите внимание:
- Параметр
file
должен содержать путь к файлу относительно корня сайта. - Если указан
create_file => true
, и предыдущий файл существует и доступен для записи, то он будет перезаписан. lowercase
приtrue
автоматически приводит все имена тегов к нижнему регистру.- Параметр
tab
можно использовать, если собираетесь дописывать файл не с начала, а уже к существующей структуре.
3. Методы класса XmlWriter
Ниже перечислены основные методы, которые нужно знать, чтобы полноценно работать с классом.
3.1. __construct(array $params)
Описание: Метод-конструктор, вызывается при создании экземпляра класса. Именно здесь инициализируются все настройки.
Основные параметры ($params
):
- file (
string
) — путь к файлу, в который будет производиться запись. - create_file (
bool
) — приtrue
удалит старый файл и создаст новый (если он уже существовал и был доступен для записи). - charset (
string
) — кодировка, по умолчанию берётся константаSITE_CHARSET
. - lowercase (
bool
) — еслиtrue
, теги приводятся к нижнему регистру. - tab (
int
) — уровень табуляции, с которого начинать запись. Например, полезно при дописывании.
Пример использования:
$export = new \Bitrix\Main\XmlWriter([
'file' => '/upload/export/data.xml',
'create_file' => true,
'charset' => 'UTF-8',
'lowercase' => false,
'tab' => 0
]);
3.2. writeItem(array $item, string $wrapperTag = '')
Описание: Записывает один элемент (массив) в XML-файл. Если указать $wrapperTag
, то элемент будет «обрамлён» соответствующим тегом. При обнаружении в значении массива вложенного массива метод рекурсивно вызовет сам себя для записи вложенных структур.
Пример использования:
$data = [
'name' => 'Example',
'fields' => [
'field1' => 'value1',
'field2' => 'value2'
]
];
// Обрамляем в тег <item>
$export->writeItem($data, 'item');
// Альтернативно: можно не указывать второй параметр, тогда просто записывает структуру, но без вложенного тега
$export->writeItem($data);
Результат в файле:
<item>
<name>Example</name>
<fields>
<field1>value1</field1>
<field2>value2</field2>
</fields>
</item>
3.3. writeFullTag(string $code, string $value)
Описание: Записывает в XML-файл один полный тег вида <code>value</code>
. Если value
пустая строка, тогда будет создан самозакрывающийся тег <code />
.
Пример использования:
$export->writeFullTag('title', 'Тестовая запись');
$export->writeFullTag('emptyTag', ''); // выведет <emptyTag />
3.4. writeEndTag(string $code)
Описание: Записывает конечный (закрывающий) тег.
Например, если мы раньше писали writeBeginTag('items')
, в конце нужно корректно закрыть этот тег:
$export->writeEndTag('items');
3.5. writeBeginTag(string $code)
Описание: Записывает начальный (открывающий) тег.
Пример использования:
$export->writeBeginTag('products');
Это выведет:
<products>
Чтобы закрыть </products>
, необходимо вызвать writeEndTag('products')
.
3.6. openFile()
Описание: Открывает файл для записи и начинает XML-запись. Если файл не существует, он будет создан. Если файл уже есть, то может быть дописан (при условии, что он доступен для записи).
Важно! Если используется create_file => true
в конструкторе и старый файл доступен для записи, он будет удалён перед созданием нового.
Пример использования:
$export->openFile();
После вызова openFile()
в начале файла автоматически добавляется служебная строка:
<?xml version="1.0" encoding="UTF-8"?>
3.7. closeFile()
Описание: Закрывает открытый файл. Вызывать обязательно после окончания записи, чтобы корректно завершить работу с ресурсом файла.
Пример использования:
$export->closeFile();
3.8. getErrors()
Описание: Возвращает массив ошибок, накопленных за время работы с классом.
Пример использования:
$errors = $export->getErrors();
if (!empty($errors)) {
foreach ($errors as $error) {
// $error->getMessage(), $error->getCode()
echo "Ошибка: " . $error->getMessage() . " (код " . $error->getCode() . ")";
}
}
4. Простой пример экспорта
Ниже приведён пример кода, в котором создаётся объект класса XmlWriter
, открывается файл для записи, формируется структура и записывается в файл, а затем файл закрывается.
use Bitrix\Main\XmlWriter;
$export = new XmlWriter([
'file' => '/upload/export/items.xml',
'create_file' => true,
'charset' => SITE_CHARSET,
'lowercase' => true
]);
// Открываем файл
$export->openFile();
// Начинаем запись блока items
$export->writeBeginTag('items');
// Пример массива для записи
$test = [
'name' => 'Tra & tata',
'time' => time(),
'array' => [
'one' => 1,
'two' => 2,
'subarray' => [
't1' => 1,
't2' => 2
]
]
];
// Записываем элемент test в обёртку <item>
$export->writeItem($test, 'item');
// Вторым параметром мы передаём обрамляющий тег для массива
$export->writeItem(['item' => $test]);
// Закрываем тег items
$export->writeEndTag('items');
// Проверяем, были ли ошибки
$errors = $export->getErrors();
if (!empty($errors)) {
foreach ($errors as $error) {
// Обрабатываем ошибки
}
}
// Закрываем файл
$export->closeFile();
Данный код в результате сформирует файл items.xml
со структурой:
<?xml version="1.0" encoding="UTF-8"?>
<items>
<item>
<name>Tra & tata</name>
<time>1679912345</time>
<array>
<one>1</one>
<two>2</two>
<subarray>
<t1>1</t1>
<t2>2</t2>
</subarray>
</array>
</item>
<item>
<item>
<name>Tra & tata</name>
<time>1679912345</time>
<array>
<one>1</one>
<two>2</two>
<subarray>
<t1>1</t1>
<t2>2</t2>
</subarray>
</array>
</item>
</item>
</items>
Обратите внимание, что во втором случае (при вызове $export->writeItem(['item' => $test]);
) мы получаем дополнительный внутренний уровень <item><name>...</name></item>
.
5. Пошаговый экспорт больших объёмов (итерационный)
Основное преимущество класса XmlWriter
– возможность пошаговой записи (например, по шагам мастера экспорта, если нужно выгружать большое количество данных и не хочется формировать весь массив данных сразу в памяти).
Пример кода, где мы не создаём файл заново на каждом шаге, а дописываем в существующий:
use Bitrix\Main\XmlWriter;
// Предположим, у нас есть переменная $step, которая указывает,
// на каком шаге экспорта мы сейчас находимся.
$export = new XmlWriter([
'file' => '/upload/export/items.xml',
'create_file' => ($step == 0), // Файл создаётся только на первом шаге
'charset' => SITE_CHARSET,
'lowercase' => true
]);
$export->openFile();
// На самом первом шаге (step = 0) открываем общий тег <items>
if ($step == 0) {
$export->writeBeginTag('items');
}
// Условно, на каждом шаге у нас есть выборка $test, которую нужно дописать в XML
$test = [
'name' => 'Sample ' . $step,
'time' => time(),
'array' => [
'one' => 1,
'two' => 2
]
];
// Пишем очередной элемент
$export->writeItem($test, 'item');
// На самом последнем шаге (например, step = $maxSteps - 1) закрываем общий тег
if ($step == $maxSteps - 1) {
$export->writeEndTag('items');
}
// Закрываем файл
$export->closeFile();
Суть такого подхода:
- При первом шаге мы создаём (или пересоздаём) файл (параметр
create_file => true
). - Записываем заголовок (
<?xml version="1.0" encoding="..."?>
), открываем корневой тег (например,<items>
). - На каждом промежуточном шаге не создаём файл заново и не закрываем
<items>
. Просто дописываем нужные данные (при этом параметрcreate_file
ужеfalse
). - На последнем шаге в конце дописываем закрывающий тег
</items>
. - Закрываем файл
closeFile()
, чтобы завершить запись и освободить ресурс.
Таким образом, даже если у нас массив данных в десятки тысяч записей, можно разбить выгрузку на порции, исключив чрезмерную нагрузку на память.
6. Заключение
Класс \Bitrix\Main\XmlWriter
– удобный инструмент для экспорта больших структурированных данных в XML. Его главное преимущество – гибкость и возможность пошаговой записи, что очень актуально для проектов на 1С-Битрикс, где нужно формировать файлы выгрузки (например, для обмена с внешними системами, маркетплейсами и т.д.).
Основные рекомендации:
- Продумайте кодировку и корректно укажите
charset
, если используете отличную от кодировки сайта. - Если файл уже существует и дописывается, устанавливайте
create_file => false
, чтобы не перезаписывать его. - Используйте
getErrors()
для контроля возможных проблем с доступом к файлу (например, если нет прав на запись). - При больших объёмах данных разбивайте экспорт на шаги, используя механизмы шагов (
$step
), и открывайте/закрывайте теги в нужный момент.
Таким образом, вы сможете эффективно генерировать и дополнять XML-файл, соответствующий вашим бизнес-задачам, не перегружая сервер.