При разработке механизмов обмена данными, например, для передачи отчетов во внешние системы (такие как SAP), программисты часто сталкиваются с задачей выгрузки отчета в формате XML. Стандартные инструменты рассылки отчетов в 1С предлагают ограниченный набор форматов. Попытка просто «дописать» XML в список доступных типов файлов через код часто приводит к ошибке «Поле объекта не обнаружено (XML)» или «Формат не поддерживается». Рассмотрим подробнее, почему это происходит и какими способами можно реализовать полноценную выгрузку.
Первое, что нам необходимо уяснить: коллекция ТипФайлаТабличногоДокумента является системным перечислением, жестко зашитым в платформу 1С. В неё входят такие форматы, как XLSX, PDF, MXL, HTML и другие. Мы не можем программно добавить в этот список значение XML. Метод ТабличныйДокумент.Записать() не умеет самостоятельно преобразовывать визуальное представление таблицы в произвольную структуру XML. Поэтому, если нам требуется именно XML-файл, нам придется формировать его вручную или использовать механизмы сериализации данных.
Если внешняя система (например, SAP) ожидает файл с конкретной структурой тегов и атрибутов, лучше всего воспользоваться объектом ЗаписьXML. Этот метод позволяет полностью контролировать содержимое файла. Разберем по шагам пример формирования такого файла:
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ПутьКФайлу);
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьНачалоЭлемента("ДанныеОтчета");
// Предположим, у нас есть выборка данных или Таблица Значений
Для Каждого Строка Из ТаблицаДанных Цикл
ЗаписьXML.ЗаписатьНачалоЭлемента("Строка");
ЗаписьXML.ЗаписатьАтрибут("Номенклатура", Строка.Наименование);
ЗаписьXML.ЗаписатьАтрибут("Количество", Строка.Количество);
ЗаписьXML.ЗаписатьНачалоЭлемента("Дополнительно");
ЗаписьXML.ЗаписатьТекст(Строка.Комментарий);
ЗаписьXML.ЗаписатьКонецЭлемента(); // Дополнительно
ЗаписьXML.ЗаписатьКонецЭлемента(); // Строка
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента(); // ДанныеОтчета
ЗаписьXML.Закрыть();
Этот способ является наиболее надежным, так как вы сами определяете, какие данные и в каком виде попадут в файл.
Если нам нужно быстро выгрузить объект 1С (например, результат отчета, выгруженный в таблицу значений) в XML без жестких требований к именам тегов, можно использовать СериализаторXDTO. Проанализируем пример кода:
Сериализатор = Новый СериализаторXDTO(ФабрикаXDTO);
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл("C:\temp\report.xml");
// ТД - это ваш ТабличныйДокумент или ТаблицаЗначений
Сериализатор.ЗаписатьXML(ЗаписьXML, ТД);
ЗаписьXML.Закрыть();
Важное замечание: если вы сериализуете напрямую ТабличныйДокумент, в XML попадет описание всех свойств ячеек (шрифты, рамки, цвета). Для обмена данными это обычно избыточно и трудночитаемо для других систем. Для передачи именно данных лучше сначала выгрузить отчет в ТаблицуЗначений, а затем сериализовать её.
Если ваш отчет построен на Системе компоновки данных (СКД), можно обойти стадию формирования ТабличногоДокумента. Выясним, как это сделать: вместо вывода в таблицу используйте ПроцессорВыводаРезультатаКомпоновкиДанныхВXML. Это позволит транслировать результат компоновки напрямую в поток XML, сохраняя иерархию данных, заданную в настройках отчета.
Проанализируем ситуацию, когда выгрузка происходит по расписанию (в фоновом задании). В этом случае код выполняется на стороне сервера. Здесь часто возникают две ошибки:
rphost (обычно это USR1CV8), должны быть полные права на запись в целевой каталог.В некоторых случаях, если структура файла не критична, можно воспользоваться «хитростью»: сохранить отчет в формате HTML, но указать расширение .xml. Рассмотрим этот вариант:
Результат.Расширение = ".xml";
Результат.ТипФайла = ТипФайлаТабличногоДокумента.HTML;
Программа сформирует корректный HTML-код (с тегами <tr>, <td>), но файл будет иметь расширение XML. Если принимающая сторона умеет парсить HTML-структуры, это может сработать как временное решение, но для серьезной интеграции с SAP этот метод не рекомендуется.
Таким образом, для реализации качественной выгрузки в XML необходимо отказаться от использования ТипФайлаТабличногоДокумента.XML и перейти к программному формированию файла через ЗаписьXML или механизмы XDTO, учитывая контекст выполнения кода на сервере.