Как выгрузить отчет из 1С в формат XML?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке механизмов обмена данными, например, для передачи отчетов во внешние системы (такие как SAP), программисты часто сталкиваются с задачей выгрузки отчета в формате XML. Стандартные инструменты рассылки отчетов в 1С предлагают ограниченный набор форматов. Попытка просто «дописать» XML в список доступных типов файлов через код часто приводит к ошибке «Поле объекта не обнаружено (XML)» или «Формат не поддерживается». Рассмотрим подробнее, почему это происходит и какими способами можно реализовать полноценную выгрузку.

Причина ограничения платформы

Первое, что нам необходимо уяснить: коллекция ТипФайлаТабличногоДокумента является системным перечислением, жестко зашитым в платформу 1С. В неё входят такие форматы, как XLSX, PDF, MXL, HTML и другие. Мы не можем программно добавить в этот список значение XML. Метод ТабличныйДокумент.Записать() не умеет самостоятельно преобразовывать визуальное представление таблицы в произвольную структуру XML. Поэтому, если нам требуется именно XML-файл, нам придется формировать его вручную или использовать механизмы сериализации данных.

Способ 1: Использование ЗаписьXML для формирования структуры

Если внешняя система (например, SAP) ожидает файл с конкретной структурой тегов и атрибутов, лучше всего воспользоваться объектом ЗаписьXML. Этот метод позволяет полностью контролировать содержимое файла. Разберем по шагам пример формирования такого файла:


ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ПутьКФайлу);
ЗаписьXML.ЗаписатьОбъявлениеXML();

ЗаписьXML.ЗаписатьНачалоЭлемента("ДанныеОтчета");

// Предположим, у нас есть выборка данных или Таблица Значений
Для Каждого Строка Из ТаблицаДанных Цикл
    ЗаписьXML.ЗаписатьНачалоЭлемента("Строка");
    ЗаписьXML.ЗаписатьАтрибут("Номенклатура", Строка.Наименование);
    ЗаписьXML.ЗаписатьАтрибут("Количество", Строка.Количество);
    
    ЗаписьXML.ЗаписатьНачалоЭлемента("Дополнительно");
    ЗаписьXML.ЗаписатьТекст(Строка.Комментарий);
    ЗаписьXML.ЗаписатьКонецЭлемента(); // Дополнительно
    
    ЗаписьXML.ЗаписатьКонецЭлемента(); // Строка
КонецЦикла;

ЗаписьXML.ЗаписатьКонецЭлемента(); // ДанныеОтчета
ЗаписьXML.Закрыть();

Этот способ является наиболее надежным, так как вы сами определяете, какие данные и в каком виде попадут в файл.

Способ 2: Сериализация через XDTO

Если нам нужно быстро выгрузить объект 1С (например, результат отчета, выгруженный в таблицу значений) в XML без жестких требований к именам тегов, можно использовать СериализаторXDTO. Проанализируем пример кода:


Сериализатор = Новый СериализаторXDTO(ФабрикаXDTO);
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл("C:\temp\report.xml");

// ТД - это ваш ТабличныйДокумент или ТаблицаЗначений
Сериализатор.ЗаписатьXML(ЗаписьXML, ТД);

ЗаписьXML.Закрыть();

Важное замечание: если вы сериализуете напрямую ТабличныйДокумент, в XML попадет описание всех свойств ячеек (шрифты, рамки, цвета). Для обмена данными это обычно избыточно и трудночитаемо для других систем. Для передачи именно данных лучше сначала выгрузить отчет в ТаблицуЗначений, а затем сериализовать её.

Способ 3: Прямая выгрузка из СКД в XML

Если ваш отчет построен на Системе компоновки данных (СКД), можно обойти стадию формирования ТабличногоДокумента. Выясним, как это сделать: вместо вывода в таблицу используйте ПроцессорВыводаРезультатаКомпоновкиДанныхВXML. Это позволит транслировать результат компоновки напрямую в поток XML, сохраняя иерархию данных, заданную в настройках отчета.

Особенности выполнения на сервере

Проанализируем ситуацию, когда выгрузка происходит по расписанию (в фоновом задании). В этом случае код выполняется на стороне сервера. Здесь часто возникают две ошибки:

  1. Неверный путь к файлу: Путь "C:\Users\Admin\Desktop" на сервере может не существовать или вести в папку профиля пользователя сервера, а не на ваш рабочий стол. Всегда используйте сетевые пути или папки, доступные серверу 1С.
  2. Права доступа: У пользователя, под которым запущен процесс rphost (обычно это USR1CV8), должны быть полные права на запись в целевой каталог.

Обходной путь через подмену расширения

В некоторых случаях, если структура файла не критична, можно воспользоваться «хитростью»: сохранить отчет в формате HTML, но указать расширение .xml. Рассмотрим этот вариант:


Результат.Расширение = ".xml";
Результат.ТипФайла = ТипФайлаТабличногоДокумента.HTML;

Программа сформирует корректный HTML-код (с тегами <tr>, <td>), но файл будет иметь расширение XML. Если принимающая сторона умеет парсить HTML-структуры, это может сработать как временное решение, но для серьезной интеграции с SAP этот метод не рекомендуется.

Таким образом, для реализации качественной выгрузки в XML необходимо отказаться от использования ТипФайлаТабличногоДокумента.XML и перейти к программному формированию файла через ЗаписьXML или механизмы XDTO, учитывая контекст выполнения кода на сервере.

← На главную