XML-выгрузка из 1С: от готовых обработок до своего кода
Содержание
Создать файл XML для выгрузки из 1С можно тремя путями: типовой обработкой «Универсальный обмен данными в формате XML» (нужны правила обмена), через XDTO-пакет по XSD-схеме получателя или своим кодом на объекте ЗаписьXML. Выбор зависит от одного вопроса: кто задаёт формат файла — 1С или принимающая сторона.
Если файл уходит в другую базу 1С, хватит готовых инструментов. Если его ждёт сайт, банк, маркетплейс или складская программа со своей схемой, без XDTO или ручной записи не обойтись.
Что выяснить до выгрузки XML: формат, схема, объём
Самая частая причина переделок — начали писать выгрузку, не получив от получателя спецификацию. Перед работой соберите пять ответов.
- 📄 Есть ли XSD-схема. Если получатель прислал файл
.xsd, структуру не придумываете — берёте из схемы. Если схемы нет, попросите хотя бы образец XML, который система уже принимает. - 🔤 Кодировка. Почти всегда UTF-8. Старые системы иногда требуют
windows-1251— это задаётся при открытии файла. - 🏷️ Пространство имён. У схемы обычно есть
targetNamespace. Если корневой элемент записан без него, валидатор получателя файл отклонит. - 📅 Форматы значений. Даты в XML пишут как
2026-10-07T00:00:00, числа — с точкой и без пробелов между разрядами. Логические —true/false. - 📦 Объём и частота. Сто строк раз в месяц и сто тысяч каждую ночь — разные задачи. Для больших файлов подходит только потоковая запись.
Сразу договоритесь, что считается «новыми» данными: всё за период, изменения с прошлой выгрузки или полный срез. От этого зависит запрос, которым вы отбираете данные.
Сравнение способов выгрузки из 1С в XML
| Способ | Когда подходит | Нужен программист | Ограничения |
|---|---|---|---|
| «Выгрузка и загрузка данных XML» | Перенос данных между базами одной конфигурации | Нет | Формат внутренний, другой системе не подходит |
| «Универсальный обмен данными в формате XML» | Обмен между разными конфигурациями 1С | Для правил — да | Нужны правила из «Конвертации данных» |
| Синхронизация данных (EnterpriseData) | Типовой обмен между современными конфигурациями | Нет | Только между программами, которые поддерживают формат |
| XDTO-пакет по XSD | Внешняя система прислала схему | Да | Нужно изменить конфигурацию или загружать схему из файла |
Код на ЗаписьXML | Простая структура, нет схемы, большой объём | Да | Структуру и проверку делаете сами |
Первые три способа решают задачу «1С → 1С». Последние два — «1С → что угодно».
Выгрузка в XML без программирования: типовые обработки
Обработка «Выгрузка и загрузка данных XML»
Это внешняя обработка (файл вида ВыгрузкаЗагрузкаДанныхXML83.epf), которую распространяют вместе с методическими материалами по платформе. Она выгружает выбранные справочники, документы и регистры в XML в формате, который понимает только 1С.
Порядок работы:
- Откройте обработку через
Файл → Открыть(в «Такси» — главное меню с иконкой из трёх полос). - На вкладке выгрузки отметьте флажками нужные объекты метаданных и, если нужно, задайте период.
- Укажите имя файла и нажмите кнопку выгрузки.
- В базе-приёмнике той же конфигурации откройте ту же обработку и загрузите файл.
Загружайте такой файл только в базу той же конфигурации и, желательно, того же релиза. При разных структурах объекты попадут не туда или загрузка упадёт.
Обработка «Универсальный обмен данными в формате XML»
Она встроена в типовые конфигурации на БСП. Если её нет в разделах, включите команду Все функции: главное меню → Сервис → Параметры → флажок «Отображать команду “Все функции”». Затем Все функции → Обработки и найдите обработку в списке.
Работает обработка не сама по себе, а по правилам обмена — XML-файлу, который описывает, какой объект источника во что превращается в приёмнике. Правила готовят в конфигурации «Конвертация данных » (редакция 2.x). Для части типовых пар программ готовые правила поставляются фирмой-разработчиком вместе с релизами.
Шаги выгрузки:
- На вкладке «Выгрузка» укажите файл правил и нажмите загрузку правил.
- Задайте период и, при необходимости, отборы по правилам выгрузки.
- Укажите имя файла данных и запустите выгрузку.
- Проверьте протокол обмена: объекты, которые не удалось выгрузить, перечислены там.
Файл, созданный по правилам, всё равно «понимает» только 1С с такой же обработкой на стороне приёмника. Внешней системе он не подойдёт, даже если открывается в браузере.
Создание XML по XSD-схеме через XDTO
Когда получатель прислал схему, самый надёжный путь — XDTO. Платформа сама построит структуру объектов по схеме, проверит типы и запишет файл ровно так, как описано в XSD.
Вариант 1. XDTO-пакет в конфигурации
- Откройте конфигуратор, в дереве метаданных:
Общие → XDTO-пакеты. - Через контекстное меню выполните импорт XML-схемы и выберите файл
.xsd. - Платформа создаст пакет с типами и пространством имён из схемы.
- Обновите конфигурацию базы данных.
Плюс — типы видны в конфигураторе, удобно разрабатывать. Минус — изменение типовой конфигурации усложняет её обновление.
Вариант 2. Фабрика XDTO из файла схемы
Без правки конфигурации схему можно загрузить прямо при выгрузке. Это удобно для внешней обработки:
ПутьКСхеме = "C:\Обмен\orders.xsd";
ПространствоИмен = "urn:example:orders";
Фабрика = СоздатьФабрикуXDTO(ПутьКСхеме);
ТипЗаказ = Фабрика.Тип(ПространствоИмен, "Order");
Заказ = Фабрика.Создать(ТипЗаказ);
Заказ.Number = "000123";
Заказ.Customer = "ООО Ромашка";
// Проверка по схеме до записи: при ошибке будет исключение
Заказ.Проверить();
Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл("C:\Обмен\order.xml", "UTF-8");
Запись.ЗаписатьОбъявлениеXML();
Фабрика.ЗаписатьXML(Запись, Заказ, "Order", ПространствоИмен);
Запись.Закрыть();
Имена типов и свойств (Order, Number, Customer) здесь условные — берите их из своей схемы. Свойство, которое по схеме может повторяться (maxOccurs больше 1), — это список: элементы добавляют методом Добавить().
Что делает XDTO за вас
- ✅ ставит пространство имён и префиксы;
- ✅ пишет элементы в порядке, заданном схемой;
- ✅ приводит даты и числа к формату XML;
- ✅ ловит пропущенные обязательные элементы методом
Проверить().
Если схема ссылается на другие XSD через import или include, держите все файлы в одной папке. Иначе фабрика не построится и вы получите ошибку о ненайденном типе.
Запись XML-файла кодом через ЗаписьXML
Когда схемы нет, а структура простая, быстрее записать файл вручную. Объект ЗаписьXML пишет данные потоком: в памяти не держится весь документ, поэтому так выгружают и сотни тысяч строк.
Пример: выгрузка контрагентов из Бухгалтерии предприятия 3.0 с отступами, временным файлом и корректными значениями.
Процедура ВыгрузитьКонтрагентов(ИмяФайла) Экспорт
Запрос = Новый Запрос(
"ВЫБРАТЬ
| Контрагенты.Код КАК Код,
| Контрагенты.Наименование КАК Наименование,
| Контрагенты.ИНН КАК ИНН
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| НЕ Контрагенты.ЭтоГруппа
| И НЕ Контрагенты.ПометкаУдаления");
Выборка = Запрос.Выполнить().Выбрать();
ВременныйФайл = ИмяФайла + ".tmp";
Параметры = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Истина);
Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл(ВременныйФайл, Параметры);
Запись.ЗаписатьОбъявлениеXML();
Запись.ЗаписатьНачалоЭлемента("Контрагенты");
Запись.ЗаписатьАтрибут("ДатаВыгрузки", XMLСтрока(ТекущаяДатаСеанса()));
Пока Выборка.Следующий() Цикл
Запись.ЗаписатьНачалоЭлемента("Контрагент");
Запись.ЗаписатьАтрибут("Код", СокрЛП(Выборка.Код));
Запись.ЗаписатьНачалоЭлемента("Наименование");
Запись.ЗаписатьТекст(Выборка.Наименование);
Запись.ЗаписатьКонецЭлемента();
Запись.ЗаписатьНачалоЭлемента("ИНН");
Запись.ЗаписатьТекст(СокрЛП(Выборка.ИНН));
Запись.ЗаписатьКонецЭлемента();
Запись.ЗаписатьКонецЭлемента(); // Контрагент
КонецЦикла;
Запись.ЗаписатьКонецЭлемента(); // Контрагенты
Запись.Закрыть();
// Готовый файл появляется под рабочим именем только целиком
Если Новый Файл(ИмяФайла).Существует() Тогда
УдалитьФайлы(ИмяФайла);
КонецЕсли;
ПереместитьФайл(ВременныйФайл, ИмяФайла);
КонецПроцедуры
Три приёма, которые экономят время на отладке
XMLСтрока()для любых значений, кроме строк. Функция переводит дату, число и булево в формат XML : дату — в2026-10-07T00:00:00, число — с точкой и без пробелов. Если писать число черезСтрока(), в файл попадёт неразрывный пробел между разрядами, и получатель его не разберёт.- Временный файл. Если внешняя система забирает файлы из папки по расписанию, она может схватить недописанный XML. Запись в
.tmpи переименование в конце снимают проблему. - Третий параметр
ПараметрыЗаписиXMLвключает отступы. Файл с переносами строк легко читать глазами при отладке. Для «боевого» обмена отступы можно выключить — файл станет меньше.
Спецсимволы (&, <, >) в тексте ЗаписатьТекст() экранирует сам, вручную заменять их не нужно.
Если у получателя есть пространство имён, объявите его сразу после открытия корневого элемента методом ЗаписатьСоответствиеПространстваИмен("", "urn:...").
Внешняя обработка или изменение конфигурации
Для разовой или периодической выгрузки код удобно оформить внешней обработкой (.epf): конфигурацию трогать не нужно, обновления не страдают. Расширение конфигурации
нужно, если выгрузка должна работать как регламентное задание или из кнопки в форме документа.
Проверка XML-файла перед отправкой получателю
Не отдавайте первый файл в работу, не проверив его. Минимальный порядок такой.
- Корректность XML. Откройте файл в браузере. Если он показал дерево элементов — синтаксис верный. Ошибка с номером строки означает незакрытый тег или недопустимый символ.
- Соответствие схеме. Если есть XSD, прогоните файл через валидатор. На Linux и в WSL работает
xmllint:
xmllint --noout --schema orders.xsd order.xml
- Проверка средствами 1С. Прочитайте готовый файл обратно через фабрику — платформа выбросит исключение с описанием, где файл расходится со схемой:
Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл("C:\Обмен\order.xml");
Попытка
Объект = Фабрика.ПрочитатьXML(Чтение, Фабрика.Тип(ПространствоИмен, "Order"));
Объект.Проверить();
Сообщить("Файл соответствует схеме");
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
Чтение.Закрыть();
- Контроль данных. Сравните число записей в файле с отчётом в 1С за тот же период. Пустые обязательные поля — частая причина отказа, хотя по схеме файл формально верен.
Автоматическая выгрузка XML по расписанию
Когда выгрузка отлажена, её запуск руками превращается в рутину. Есть два рабочих варианта.
Регламентное задание
В конфигураторе или расширении: Общие → Регламентные задания. Создайте задание, укажите метод серверного общего модуля (например, ту же процедуру ВыгрузитьКонтрагентов) и расписание — скажем, ежедневно в 02:00.
- 🖥️ Клиент-серверная база. Задания выполняет сервер 1С, пользователи могут быть не в программе. Путь к файлу должен быть доступен именно серверу и учётной записи, от которой работает служба.
- 📁 Файловая база. Регламентные задания выполняются только пока в базе открыт хотя бы один сеанс. На ночь никто не оставит программу открытой — для файлового варианта надёжнее второй способ.
Планировщик Windows и параметр /Execute
Платформа умеет при запуске сразу открыть внешнюю обработку. Пропишите в планировщике задачу с такой командой:
"C:\Program Files\1cv8\<версия>\bin\1cv8.exe" ENTERPRISE /F"D:\Bases\Buh" /N"Обмен" /P"пароль" /Execute"D:\Обмен\ВыгрузкаXML.epf" /DisableStartupMessages
Для серверной базы вместо /F укажите /S"сервер\имябазы". В модуле формы обработки вызовите выгрузку в обработчике открытия и затем завершите сеанс командой ЗавершитьРаботуСистемы(Ложь) — иначе окно 1С останется висеть и займёт лицензию.
Заведите для выгрузки отдельного пользователя с правами только на чтение нужных данных. Пароль в командной строке виден всем, у кого есть доступ к планировщику, поэтому полные права такому пользователю давать нельзя.