Выгрузка из 1С в XML: обработки, СКД, код и XDTO на практике

· 9 мин

Содержание

Сохранить данные 1С в XML без программирования можно обработкой «Выгрузка и загрузка данных XML»: открыть её через Файл → Открыть, отметить нужные справочники и документы, указать имя файла и нажать Выгрузить данные. Для своего формата XML пишут код на объектах ЗаписьXML и СериализаторXDTO, а для отчёта — выводят результат СКД в таблицу значений и сериализуют её.

Частое заблуждение: «отчёт можно сохранить в XML кнопкой сохранения». Нельзя. Табличный документ 1С сохраняется в MXL, XLSX, PDF, DOCX, HTML, ODS и TXT, но не в XML. Чтобы выгрузить данные из 1С в формат XML , нужен один из способов ниже. Какой — зависит от того, кто и где будет читать файл.

С чего начать: какой способ сохранения в XML подходит вам

Перед выгрузкой ответьте на два вопроса. Куда пойдёт файл: в такую же базу 1С, в другую конфигурацию или во внешнюю систему? И есть ли у вас доступ к Конфигуратору или хотя бы право открывать внешние обработки?

СпособКогда подходитЧто нужноОграничения
Обработка «Выгрузка и загрузка данных XML»Перенос данных между базами с одинаковой конфигурациейПрава на внешние обработкиВ другую конфигурацию не загрузить
«Универсальный обмен данными в формате XML»Перенос между разными конфигурациямиПравила обмена из «Конвертации данных»Без правил не работает
Выгрузка регламентированного отчётаСдача отчётности через другую программуЗаполненный отчётТолько формат контролирующего органа
Отчёт на СКД + кодНужен XML с итогами отчётаРазработчик или внешняя обработкаПишется один раз под задачу
ЗаписьXML и СериализаторXDTOСвой формат или формат платформыНавыки встроенного языкаНужна проверка на чужой стороне
Веб-сервис, HTTP-сервис, ODataВнешняя система забирает данные самаПубликация базы на веб-сервереНужен администратор
Куда пойдёт XML-файл?

Перед загрузкой XML в рабочую базу сделайте резервную копию. Выгрузка безопасна, а вот загрузка перезаписывает объекты с теми же ссылками.

Штатные обработки для выгрузки данных 1С в XML

Универсальная «Выгрузка и загрузка данных XML»

Это внешняя обработка, файл ВыгрузкаЗагрузкаДанныхXML83.epf. Она входит в состав дисков ИТС и поставляется вместе с типовыми конфигурациями у партнёров. Обработка пишет данные в формате самой платформы: каждый объект со всеми реквизитами, табличными частями и ссылками.

Порядок работы:

  1. Откройте базу в режиме 1С:Предприятие под пользователем с полными правами.
  2. Выберите Файл → Открыть (в «Такси» — меню с тремя полосками в левом верхнем углу) и укажите файл обработки.
  3. На вкладке выгрузки укажите имя файла XML.
  4. В дереве отметьте объекты: справочники, документы, регистры сведений, константы.
  5. При необходимости задайте период для документов.
  6. Нажмите Выгрузить данные и дождитесь сообщения о завершении.

💡 Флажок выгрузки связанных объектов тянет за собой всё, на что ссылаются выбранные данные. Выгружаете 50 документов — в файл попадут контрагенты, номенклатура, склады из этих документов. Файл станет больше, зато в новой базе не будет «битых» ссылок.

Универсальный обмен по правилам конвертации

Если база-приёмник на другой конфигурации, например из старой УТ в Бухгалтерию 3.0, формат платформы не годится. Структура объектов отличается.

Здесь работает связка: правила обмена (XML-файл, созданный в конфигурации «Конвертация данных ») и обработка «Универсальный обмен данными в формате XML». В конфигурациях на БСП она встроена, найти её проще всего через Все функции → Обработки.

Если команды «Все функции» нет, включите её: Сервис и настройки → Параметры, флажок «Отображать команду “Все функции”».

Для типовых переходов готовые правила уже есть в поставке конфигурации-приёмника. Писать свои правила имеет смысл, только если готовых нет.

Выгрузка регламентированного отчёта в XML

Отчёты в ФНС, СФР и Росстат сохраняются в XML прямо из формы. Откройте отчёт в Отчеты → Регламентированные отчеты, проверьте его и нажмите Выгрузить. Программа предложит папку и сама назовёт файл по правилам формата.

Перед выгрузкой 1С проверит отчёт на соответствие формату. Если есть ошибки, файл не сохранится, пока их не исправить.

Как сохранить отчёт СКД в формат XML

Отчёт на системе компоновки данных не выводит XML напрямую. Обходной путь — вывести результат в таблицу значений, а уже её записать в XML.

Ключевой приём — ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений. Он отдаёт результат в виде таблицы, без оформления табличного документа.

&НаСервере
Функция ВыгрузитьОтчетВXML(СхемаКомпоновки, Настройки)

    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    Макет = КомпоновщикМакета.Выполнить(СхемаКомпоновки, Настройки, , ,
        Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));

    Процессор = Новый ПроцессорКомпоновкиДанных;
    Процессор.Инициализировать(Макет);

    Таблица = Новый ТаблицаЗначений;
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
    ПроцессорВывода.УстановитьОбъект(Таблица);
    ПроцессорВывода.Вывести(Процессор);

    Запись = Новый ЗаписьXML;
    Запись.УстановитьСтроку("UTF-8");
    СериализаторXDTO.ЗаписатьXML(Запись, Таблица);
    Возврат Запись.Закрыть();

КонецФункции

Функция возвращает текст XML. Обратите внимание на генератор макета: без типа ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений вывод в коллекцию значений не сработает.

Такой XML — это сериализованная таблица значений в формате платформы. Другая база 1С прочитает его через СериализаторXDTO.ПрочитатьXML. Внешней системе обычно удобнее свой формат: тогда пройдите по строкам Таблица и запишите их через ЗаписьXML, как в следующем разделе.

💡 Для ручных разовых задач есть путь проще: сохранить отчёт в XLSX, а XML собрать уже в Excel. Это работает, если получатель не требует строгой схемы.

Программная выгрузка в XML: ЗаписьXML и СериализаторXDTO

Выгрузка в формате платформы

Самый короткий путь — сериализатор. Он сам запишет все реквизиты и табличные части объекта.

&НаСервереБезКонтекста
Процедура ВыгрузитьНоменклатуру(ИмяФайла)

    Запись = Новый ЗаписьXML;
    Запись.ОткрытьФайл(ИмяФайла, "UTF-8");
    Запись.ЗаписатьОбъявлениеXML();
    Запись.ЗаписатьНачалоЭлемента("Данные");
    Запись.ЗаписатьСоответствиеПространстваИмен("v8", "http://v8.1c.ru/8.1/data/enterprise/current-config");
    Запись.ЗаписатьСоответствиеПространстваИмен("xs", "http://www.w3.org/2001/XMLSchema");
    Запись.ЗаписатьСоответствиеПространстваИмен("xsi", "http://www.w3.org/2001/XMLSchema-instance");

    Выборка = Справочники.Номенклатура.Выбрать();
    Пока Выборка.Следующий() Цикл
        СериализаторXDTO.ЗаписатьXML(Запись, Выборка.ПолучитьОбъект());
    КонецЦикла;

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

КонецПроцедуры

Объявления пространств имён в корневом элементе не обязательны, но без них каждый объект в файле повторит их у себя. На выгрузке в 10 000 элементов это лишние мегабайты.

Выгрузка в собственный формат

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

&НаСервереБезКонтекста
Функция ВыгрузитьКонтрагентов()

    Запрос = Новый Запрос(
    "ВЫБРАТЬ
    |    Контрагенты.Наименование КАК Наименование,
    |    Контрагенты.ИНН КАК ИНН
    |ИЗ
    |    Справочник.Контрагенты КАК Контрагенты
    |ГДЕ
    |    НЕ Контрагенты.ЭтоГруппа
    |    И НЕ Контрагенты.ПометкаУдаления");
    Выборка = Запрос.Выполнить().Выбрать();

    Запись = Новый ЗаписьXML;
    Запись.УстановитьСтроку("UTF-8");
    Запись.ЗаписатьОбъявлениеXML();
    Запись.ЗаписатьНачалоЭлемента("Контрагенты");
    Запись.ЗаписатьАтрибут("Дата", XMLСтрока(ТекущаяДатаСеанса()));

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

    Запись.ЗаписатьКонецЭлемента();
    Возврат Запись.Закрыть();

КонецФункции

Экранировать символы <, > и & в наименованиях не нужно: ЗаписьXML сделает это сама.

Где окажется файл

В клиент-серверной базе код &НаСервере пишет файл на диск сервера 1С, а не на компьютер пользователя. Чтобы файл оказался у пользователя, на сервере формируйте строку или двоичные данные и помещайте их во временное хранилище. На клиенте файл получают методом НачатьПолучениеФайлаССервера или ПолучитьФайл.

Вариант со строкой (УстановитьСтроку и возврат Закрыть()) удобен для небольших выгрузок. Для больших пишите во временный файл (ПолучитьИмяВременногоФайла("xml")), затем передавайте Новый ДвоичныеДанные(ИмяФайла).

Выгрузка данных в XML через XDTO, веб-сервисы и OData

Пакет XDTO по схеме получателя

Когда у получателя есть схема XSD, удобнее всего импортировать её в конфигурацию как пакет XDTO. В Конфигураторе: ветка Общие → XDTO-пакеты, контекстное меню, команда импорта схемы XML. После этого объекты формата создаются кодом:

ТипКонтрагент = ФабрикаXDTO.Тип("http://example.ru/exchange", "Контрагент");
Контрагент = ФабрикаXDTO.Создать(ТипКонтрагент);
Контрагент.ИНН = "7701234567";
Контрагент.Наименование = "ООО Ромашка";
Контрагент.Проверить();
ФабрикаXDTO.ЗаписатьXML(Запись, Контрагент);

Здесь http://example.ru/exchange — пространство имён из схемы получателя, у вас оно будет своим. Метод Проверить() вызывает исключение, если объект не соответствует схеме: пропущен обязательный элемент, значение не того типа.

Без изменения конфигурации схему можно загрузить на лету: СоздатьФабрикуXDTO(ИмяФайлаXSD) вернёт фабрику, с которой работают так же.

Веб-сервисы и HTTP-сервисы

Веб-сервис 1С (SOAP) сам отдаёт XML: описываете операции в конфигурации, публикуете базу на веб-сервере, и внешняя система вызывает методы. HTTP-сервис гибче: формат ответа вы собираете кодом, тем же ЗаписьXML.

Стандартный интерфейс OData

Без единой строки кода внешняя система может читать данные по адресу вида http://сервер/база/odata/standard.odata/Catalog_Номенклатура. По умолчанию ответ приходит в XML (формат Atom), с параметром $format=json — в JSON.

Для этого базу публикуют на веб-сервере и указывают, какие объекты доступны через OData. Состав задают программно методом УстановитьСоставСтандартногоИнтерфейсаOData или внешней обработкой настройки OData.

Проверка XML-файла: валидация и обработка ошибок

Готовый файл стоит проверить до отправки. Ошибку, найденную у себя, исправить быстрее, чем по письму от получателя.

Проверка внутри 1С

  • 🧩 Читаемость: откройте файл через ЧтениеXML и пройдите циклом Пока Чтение.Прочитать(). Если файл битый, на этом шаге будет исключение с номером строки.
  • 📐 Соответствие схеме: прочитайте файл через фабрику, построенную по XSD (СоздатьФабрикуXDTO), методом Фабрика.ПрочитатьXML(Чтение). Несоответствие схеме вызовет исключение.
  • 🔁 Обратная загрузка: для формата платформы загрузите файл в пустую копию базы . Это лучшая проверка, что ничего не потерялось.

Код выгрузки оборачивайте в Попытка … Исключение. В блоке исключения закрывайте ЗаписьXML и пишите текст ошибки в журнал регистрации через ЗаписьЖурналаРегистрации. Иначе файл останется занятым процессом, а причину сбоя придётся искать заново.

Попытка
    СериализаторXDTO.ЗаписатьXML(Запись, Объект);
Исключение
    ЗаписьЖурналаРегистрации("Выгрузка XML", УровеньЖурналаРегистрации.Ошибка, , Объект.Ссылка,
        ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;

Такой приём не обрывает всю выгрузку из-за одного кривого элемента: он попадёт в журнал, а остальные запишутся.

Проверка вне 1С

  • 🌐 Браузер: откройте файл в браузере. Если разметка нарушена, он покажет строку и позицию ошибки.
  • 🛠 Утилита xmllint: команда xmllint --noout --schema schema.xsd file.xml проверит файл по схеме и выведет все несоответствия списком.

Почему файл XML не сохраняется или не загружается: частые проблемы

Диагностика: выберите симптом

Обработка «Выгрузка и загрузка данных XML» при загрузке пишет объекты в режиме обмена данными, без проверок и бизнес-логики. Документы могут оказаться без движений: после загрузки их перепроводят, например групповым перепроведением за период.

Частые вопросы

Можно ли выгрузить в XML всю базу целиком?
Технически да, но для переноса всей базы есть выгрузка в файл .dt через Конфигуратор: она быстрее и надёжнее. XML нужен, когда переносите часть данных.
Чем XML-выгрузка отличается от выгрузки конфигурации в файлы?
Команда Конфигуратора «Выгрузить конфигурацию в файлы» сохраняет в XML метаданные: справочники, формы, модули. Данные пользователей туда не попадают.
Подойдёт ли файл из 1С 8.3 для загрузки в другую версию платформы?
Формат платформы стабилен между релизами 8.3, но конфигурация на обеих сторонах должна совпадать. Разница в релизе конфигурации даёт ошибки на изменённых объектах.
Как выгрузить в XML только изменённые данные?
Регулярно выгружать изменения позволяют планы обмена: они регистрируют, какие объекты менялись после прошлой выгрузки. Обычная обработка выгружает всё, что отмечено.
Что лучше для интеграции: XML или JSON?
Если у получателя есть XSD или SOAP — XML. Для современных REST-сервисов чаще берут JSON: 1С пишет его объектом ЗаписьJSON, а OData отдаёт по параметру $format=json.