Выгрузка данных 1С в XML-файл: обработка, код, XDTO и HTTP
Содержание
Сохранить данные в 1С в XML без программирования можно внешней обработкой «Выгрузка и загрузка данных XML» (файл ВыгрузкаЗагрузкаДанныхXML83.epf): открыть её через Главное меню → Файл → Открыть, отметить объекты, указать имя файла и нажать «Выгрузить данные». Если нужен XML в формате, который ждёт другая программа, файл придётся собирать кодом через объект ЗаписьXML или пакет XDTO.
Часто проблема не в самой выгрузке, а в том, что файл «не открывается» у получателя: не та кодировка, сломанный символ в наименовании, дата в виде 07.10.2026 0:00:00. Ниже разобраны все рабочие способы по порядку — от кнопки до HTTP-сервиса, плюс то, что ломает XML на практике.
Какой способ сохранения в XML выбрать
Сначала определите, кто будет читать файл. От этого зависит всё остальное.
| Способ | Когда подходит | Что получится | Ограничения |
|---|---|---|---|
| Обработка «Выгрузка и загрузка данных XML» | Перенос справочников и документов между базами одной конфигурации | XML во внутреннем формате 1С | Чужая программа такой файл не разберёт |
| Формат EnterpriseData | Обмен между разными типовыми конфигурациями (БП, УТ, УНФ) | XML по общей схеме обмена | Нужна поддержка формата в обеих базах |
ЗаписьXML в коде | Выгрузка под заданную структуру: банк, сайт, учётная система партнёра | Ровно те теги, что вы описали | Нужен Конфигуратор или внешняя обработка |
СериализаторXDTO | Быстро сохранить объект целиком и потом загрузить обратно в 1С | XML со всеми реквизитами и ссылками | Структура жёстко задана платформой |
| Пакет XDTO по XSD | Партнёр прислал XSD-схему | XML, проверенный по схеме | Схему нужно импортировать в конфигурацию |
| HTTP-сервис | Внешней системе нужен XML по запросу, без файлов | Ответ сервера с XML в теле | Нужна публикация базы на веб-сервере |
Если нужно выгрузить отчёт, а не объекты базы, XML обычно не лучший выбор. Табличный документ сохраняется кнопкой «Сохранить» в xlsx, pdf, html и другие форматы — для передачи человеку этого достаточно.
Не путайте выгрузку данных с двумя похожими операциями в Конфигураторе:
- 📦
Администрирование → Выгрузить информационную базусоздаёт файл.dt— это двоичный архив всей базы, не XML; - 🗂
Конфигурация → Выгрузить конфигурацию в файлысохраняет в XML метаданные (структуру, модули, формы), а не сами справочники и документы.
Выгрузка без программирования: универсальная обработка XML
Обработка «Выгрузка и загрузка данных XML» распространяется фирмой 1С как универсальная и не входит в состав типовых конфигураций. Для платформы 8.3 нужен файл с суффиксом 83. Версия для 8.2 в базе на 8.3 может не открыться или работать с ошибками.
Порядок выгрузки
- Сделайте копию базы , в которую потом будете загружать данные. В исходной базе выгрузка ничего не меняет.
- Запустите 1С:Предприятие под пользователем с полными правами.
- Откройте обработку:
Главное меню (☰) → Файл → Открыть, выберите файл.epf. Платформа покажет предупреждение о безопасности внешнего файла — подтвердите открытие, если источник файла вам известен. - На вкладке «Выгрузка» задайте период, если выгружаете документы. Без периода уйдут все документы за всё время.
- В дереве объектов отметьте нужные справочники, документы, регистры сведений.
- Укажите путь и имя файла, например
C:\Exchange\nomenklatura.xml. - Нажмите «Выгрузить данные» и дождитесь сообщения о завершении.
Что попадёт в файл
Обработка выгружает объекты вместе со ссылками на связанные элементы. Отметили документ «Реализация» — в файл попадут и контрагент, и номенклатура, и договор из него. Поэтому файл часто получается заметно больше, чем ждёшь.
Загрузка такого XML в базу перезаписывает объекты с теми же уникальными идентификаторами. Загружайте только в копию или после резервной копии рабочей базы.
Главное ограничение: обе базы должны быть на одной конфигурации, желательно одного релиза. Если в базе-приёмнике нет какого-то реквизита или справочника, загрузка остановится с ошибкой или оставит «битые» ссылки.
Обмен между разными конфигурациями
Для переноса между БП 3.0, УТ 11 и УНФ в типовых конфигурациях на БСП есть ручная выгрузка в формате EnterpriseData. Удобнее всего найти её поиском по слову «EnterpriseData» в списке Все функции (команда включается в Сервис и настройки → Параметры → Отображать команду "Все функции"). Файл в этом формате тоже XML, но по общей схеме, которую понимают обе стороны.
Выгрузка данных в XML кодом через ЗаписьXML
Когда получатель задал свою структуру тегов, файл собирают построчно объектом ЗаписьXML. Он пишет последовательно, не держит весь документ в памяти, поэтому подходит и для выгрузки сотен тысяч строк.
Базовые методы, которых хватает для большинства выгрузок:
- 📝
ОткрытьФайл(ИмяФайла, Кодировка)илиУстановитьСтроку()— куда писать; - 🏷
ЗаписатьОбъявлениеXML()— строка<?xml version="1.0" encoding="UTF-8"?>; - 🔓
ЗаписатьНачалоЭлемента(Имя)иЗаписатьКонецЭлемента()— открыть и закрыть тег; - 🔖
ЗаписатьАтрибут(Имя, Значение)— атрибут текущего тега; - ✏️
ЗаписатьТекст(Строка)— содержимое тега; - 💾
Закрыть()— сбросить данные в файл.
Пример: выгрузка номенклатуры в файл
Пример для серверной процедуры в модуле внешней обработки. Он выгружает код, наименование и артикул товаров, а в корневой тег пишет дату выгрузки.
Процедура ВыгрузитьНоменклатуруВXML(ИмяФайла) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Код КАК Код,
| Номенклатура.Наименование КАК Наименование,
| Номенклатура.Артикул КАК Артикул
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.ЭтоГруппа
| И НЕ Номенклатура.ПометкаУдаления";
Выборка = Запрос.Выполнить().Выбрать();
Параметры = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Истина);
Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл(ИмяФайла, Параметры);
Запись.ЗаписатьОбъявлениеXML();
Запись.ЗаписатьНачалоЭлемента("Catalog");
Запись.ЗаписатьАтрибут("created", XMLСтрока(ТекущаяДатаСеанса()));
Пока Выборка.Следующий() Цикл
Запись.ЗаписатьНачалоЭлемента("Item");
Запись.ЗаписатьАтрибут("code", СокрЛП(Выборка.Код));
Запись.ЗаписатьНачалоЭлемента("Name");
Запись.ЗаписатьТекст(Выборка.Наименование);
Запись.ЗаписатьКонецЭлемента();
Запись.ЗаписатьНачалоЭлемента("Article");
Запись.ЗаписатьТекст(Выборка.Артикул);
Запись.ЗаписатьКонецЭлемента();
Запись.ЗаписатьКонецЭлемента(); // Item
КонецЦикла;
Запись.ЗаписатьКонецЭлемента(); // Catalog
Запись.Закрыть();
КонецПроцедуры
Третий параметр ПараметрыЗаписиXML включает отступы — файл удобно читать глазами. Для машинного обмена отступы можно выключить, файл станет меньше.
Символы <, > и & в тексте экранировать вручную не нужно: ЗаписатьТекст и ЗаписатьАтрибут делают это сами. Наименование «Ремень <кожа> & пряжка» в файле станет Ремень <кожа> & пряжка.
Запись в строку вместо файла
Если XML нужно не сохранить на диск, а отправить в HTTP-запросе или положить в реквизит, вызовите Запись.УстановитьСтроку() вместо ОткрытьФайл. Тогда Закрыть() вернёт готовый текст:
Запись = Новый ЗаписьXML;
Запись.УстановитьСтроку("UTF-8");
// ... те же вызовы ЗаписатьНачалоЭлемента / ЗаписатьТекст ...
ТекстXML = Запись.Закрыть();
Файл пишется там, где выполняется код. Процедура на сервере сохранит файл на диск сервера 1С, а не на компьютер пользователя. Чтобы отдать файл пользователю, сформируйте XML в строку или во временный файл на сервере, поместите результат во временное хранилище и получите его на клиенте.
Сериализация объектов через XDTO
Иногда структура тегов не важна: надо сохранить документ «как есть» и потом загрузить его обратно в такую же базу. Для этого есть сериализация — платформа сама описывает все реквизиты и табличные части.
СериализаторXDTO: объект целиком
Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл(ИмяФайла, "UTF-8");
Запись.ЗаписатьОбъявлениеXML();
ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
СериализаторXDTO.ЗаписатьXML(Запись, ДокументОбъект);
Запись.Закрыть();
Обратное чтение — через ЧтениеXML и СериализаторXDTO.ПрочитатьXML(Чтение). Метод вернёт объект, который останется записать методом Записать().
Чем такой вариант отличается от универсальной обработки:
- 🔗 ссылки на справочники записываются как уникальные идентификаторы, сами элементы справочников не выгружаются;
- 🧩 сериализуются и коллекции: структура, массив, соответствие, таблица значений — удобно для собственных настроек и кэшей;
- ⛔ не сериализуются значения, у которых нет XML-представления, например
ТабличныйДокументнапрямую или объекты интерфейса.
Для простых значений есть глобальные функции ЗаписатьXML(Запись, Значение) и ПрочитатьXML(Чтение) — они работают так же, но без лишнего объекта.
Пакет XDTO по схеме партнёра
Когда партнёр прислал XSD-схему, правильнее не собирать теги вручную, а загрузить схему в конфигурацию:
- В Конфигураторе откройте ветку
Общие → XDTO-пакеты. - В контекстном меню выберите импорт XML-схемы и укажите файл
.xsd. - В коде создавайте объекты через
ФабрикаXDTO.Создать(ТипXDTO), заполняйте свойства и записывайтеФабрикаXDTO.ЗаписатьXML(Запись, ОбъектXDTO).
Плюс подхода: при заполнении свойство с неверным типом или пропущенный обязательный элемент вызовет ошибку в 1С, а не у получателя. Файл, который прошёл через фабрику, гарантированно соответствует схеме.
Изменение конфигурации (новый XDTO-пакет) в типовой базе на поддержке лучше делать через расширение. Иначе следующее обновление потребует ручного объединения.
Отдача XML через HTTP-сервис
Если внешняя система — сайт, мобильное приложение, сервис логистики — сама забирает данные, файлы не нужны. Она отправляет GET-запрос, 1С отвечает XML.
Как устроено
- В Конфигураторе (или в расширении) создайте объект в ветке
Общие → HTTP-сервисы, задайте корневой URL, напримерstock. - Добавьте шаблон URL, например
/items, и методGETс процедурой-обработчиком. - Опубликуйте базу:
Администрирование → Публикация на веб-серверев Конфигураторе, отметьте HTTP-сервис. Нужен установленный IIS или Apache и модуль веб-расширения 1С.
Обработчик формирует XML в строку и кладёт его в ответ:
Функция ItemsGET(Запрос)
Запись = Новый ЗаписьXML;
Запись.УстановитьСтроку("UTF-8");
Запись.ЗаписатьОбъявлениеXML();
Запись.ЗаписатьНачалоЭлемента("Items");
// ... выборка и запись элементов ...
Запись.ЗаписатьКонецЭлемента();
ТекстXML = Запись.Закрыть();
Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-Type", "application/xml; charset=utf-8");
Ответ.УстановитьТелоИзСтроки(ТекстXML, КодировкаТекста.UTF8);
Возврат Ответ;
КонецФункции
Адрес сервиса будет вида http://сервер/имя_публикации/hs/stock/items.
Для доступа к сервису заведите в базе отдельного пользователя с правами только на нужные данные. Не отдавайте внешней системе логин администратора.
Есть и вариант без разработки: стандартный интерфейс OData. После публикации и настройки состава объектов он отдаёт данные справочников и документов по REST-адресам вида /odata/standard.odata/.... Формат ответа по умолчанию — XML (Atom), по параметру $format=json — JSON. Структура при этом определяется платформой, а не вами.
Кодировка, спецсимволы и форматы значений
Большинство жалоб «файл из 1С не читается» относятся к этому разделу.
Кодировка
- ✅ UTF-8 — стандарт по умолчанию, указывайте его, если получатель не требует иного;
- 🔤 если нужна
windows-1251, передайте её вОткрытьФайл(ИмяФайла, "windows-1251")— объявление XML получит тот жеencoding; - ❗ кодировка в объявлении и фактическая кодировка файла должны совпадать. Если сохранить строку из
УстановитьСтроку()черезЗаписьТекстав другой кодировке, получатель увидит «кракозябры».
Отдельный случай — метка BOM в начале UTF-8 файла. Часть внешних систем её не принимает. Проверить просто: откройте файл в любом HEX-редакторе — если первые байты EF BB BF, метка есть.
Недопустимые символы
XML версии 1.0 запрещает управляющие символы с кодами 0–31, кроме табуляции (9), перевода строки (10) и возврата каретки (13). В 1С они попадают в наименования при копировании из PDF, писем, других программ. Внешне строка выглядит нормально, а парсер получателя падает.
Простая функция очистки перед записью:
Функция ОчиститьДляXML(Знач Строка)
Результат = "";
Для Позиция = 1 По СтрДлина(Строка) Цикл
Символ = Сред(Строка, Позиция, 1);
Код = КодСимвола(Символ);
Если Код < 32 И Код <> 9 И Код <> 10 И Код <> 13 Тогда
Продолжить;
КонецЕсли;
Результат = Результат + Символ;
КонецЦикла;
Возврат Результат;
КонецФункции
Вызывайте её для всех текстовых полей, пришедших от пользователей: наименования, комментарии, адреса.
Даты, числа, булево
Не используйте Строка() для значений, которые пишете в XML. Она форматирует по региональным настройкам сеанса. Используйте XMLСтрока():
| Значение | Строка() | XMLСтрока() |
|---|---|---|
| Дата 07.10.2026 | 07.10.2026 0:00:00 | 2026-10-07T00:00:00 |
| Число 1250,5 | 1 250,5 | 1250.5 |
| Булево Истина | Да | true |
Пробел-разделитель тысяч и запятая в числе — частая причина того, что сумма у получателя «обнуляется» или вызывает ошибку разбора.