Выгрузка из 1С в XML: обработки, СКД, код и XDTO на практике
Содержание
Сохранить данные 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 или пакет XDTO, построенный по схеме получателя.Перед загрузкой XML в рабочую базу сделайте резервную копию. Выгрузка безопасна, а вот загрузка перезаписывает объекты с теми же ссылками.
Штатные обработки для выгрузки данных 1С в XML
Универсальная «Выгрузка и загрузка данных XML»
Это внешняя обработка, файл ВыгрузкаЗагрузкаДанныхXML83.epf. Она входит в состав дисков ИТС и поставляется вместе с типовыми конфигурациями у партнёров. Обработка пишет данные в формате самой платформы: каждый объект со всеми реквизитами, табличными частями и ссылками.
Порядок работы:
- Откройте базу в режиме 1С:Предприятие под пользователем с полными правами.
- Выберите
Файл → Открыть(в «Такси» — меню с тремя полосками в левом верхнем углу) и укажите файл обработки. - На вкладке выгрузки укажите имя файла XML.
- В дереве отметьте объекты: справочники, документы, регистры сведений, константы.
- При необходимости задайте период для документов.
- Нажмите
Выгрузить данныеи дождитесь сообщения о завершении.
💡 Флажок выгрузки связанных объектов тянет за собой всё, на что ссылаются выбранные данные. Выгружаете 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 не сохраняется или не загружается: частые проблемы
ОткрытьФайл совпадает с объявлением в первой строке файла и с тем, что ждёт получатель: UTF-8 или windows-1251.ДокументDOM, одна большая строка). Пишите потоком в файл через ЗаписьXML.ОткрытьФайл, а выборку делайте запросом порциями.Обработка «Выгрузка и загрузка данных XML» при загрузке пишет объекты в режиме обмена данными, без проверок и бизнес-логики. Документы могут оказаться без движений: после загрузки их перепроводят, например групповым перепроведением за период.
Частые вопросы
Можно ли выгрузить в XML всю базу целиком?
.dt через Конфигуратор: она быстрее и надёжнее. XML нужен, когда переносите часть данных.Чем XML-выгрузка отличается от выгрузки конфигурации в файлы?
Подойдёт ли файл из 1С 8.3 для загрузки в другую версию платформы?
Как выгрузить в XML только изменённые данные?
Что лучше для интеграции: XML или JSON?
ЗаписьJSON, а OData отдаёт по параметру $format=json.