Выгрузка данных 1С в XML-файл: обработка, код, XDTO и HTTP

· 10 мин

Содержание

Сохранить данные в 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. Сделайте копию базы , в которую потом будете загружать данные. В исходной базе выгрузка ничего не меняет.
  2. Запустите 1С:Предприятие под пользователем с полными правами.
  3. Откройте обработку: Главное меню (☰) → Файл → Открыть, выберите файл .epf. Платформа покажет предупреждение о безопасности внешнего файла — подтвердите открытие, если источник файла вам известен.
  4. На вкладке «Выгрузка» задайте период, если выгружаете документы. Без периода уйдут все документы за всё время.
  5. В дереве объектов отметьте нужные справочники, документы, регистры сведений.
  6. Укажите путь и имя файла, например C:\Exchange\nomenklatura.xml.
  7. Нажмите «Выгрузить данные» и дождитесь сообщения о завершении.

Что попадёт в файл

Обработка выгружает объекты вместе со ссылками на связанные элементы. Отметили документ «Реализация» — в файл попадут и контрагент, и номенклатура, и договор из него. Поэтому файл часто получается заметно больше, чем ждёшь.

Загрузка такого 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 включает отступы — файл удобно читать глазами. Для машинного обмена отступы можно выключить, файл станет меньше.

Символы <, > и & в тексте экранировать вручную не нужно: ЗаписатьТекст и ЗаписатьАтрибут делают это сами. Наименование «Ремень <кожа> & пряжка» в файле станет Ремень &lt;кожа&gt; &amp; пряжка.

Запись в строку вместо файла

Если XML нужно не сохранить на диск, а отправить в HTTP-запросе или положить в реквизит, вызовите Запись.УстановитьСтроку() вместо ОткрытьФайл. Тогда Закрыть() вернёт готовый текст:

Запись = Новый ЗаписьXML;
Запись.УстановитьСтроку("UTF-8");
// ... те же вызовы ЗаписатьНачалоЭлемента / ЗаписатьТекст ...
ТекстXML = Запись.Закрыть();

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

Сериализация объектов через XDTO

Иногда структура тегов не важна: надо сохранить документ «как есть» и потом загрузить его обратно в такую же базу. Для этого есть сериализация — платформа сама описывает все реквизиты и табличные части.

СериализаторXDTO: объект целиком

Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл(ИмяФайла, "UTF-8");
Запись.ЗаписатьОбъявлениеXML();

ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
СериализаторXDTO.ЗаписатьXML(Запись, ДокументОбъект);

Запись.Закрыть();

Обратное чтение — через ЧтениеXML и СериализаторXDTO.ПрочитатьXML(Чтение). Метод вернёт объект, который останется записать методом Записать().

Чем такой вариант отличается от универсальной обработки:

  • 🔗 ссылки на справочники записываются как уникальные идентификаторы, сами элементы справочников не выгружаются;
  • 🧩 сериализуются и коллекции: структура, массив, соответствие, таблица значений — удобно для собственных настроек и кэшей;
  • ⛔ не сериализуются значения, у которых нет XML-представления, например ТабличныйДокумент напрямую или объекты интерфейса.

Для простых значений есть глобальные функции ЗаписатьXML(Запись, Значение) и ПрочитатьXML(Чтение) — они работают так же, но без лишнего объекта.

Пакет XDTO по схеме партнёра

Когда партнёр прислал XSD-схему, правильнее не собирать теги вручную, а загрузить схему в конфигурацию:

  1. В Конфигураторе откройте ветку Общие → XDTO-пакеты.
  2. В контекстном меню выберите импорт XML-схемы и укажите файл .xsd.
  3. В коде создавайте объекты через ФабрикаXDTO.Создать(ТипXDTO), заполняйте свойства и записывайте ФабрикаXDTO.ЗаписатьXML(Запись, ОбъектXDTO).

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

Изменение конфигурации (новый XDTO-пакет) в типовой базе на поддержке лучше делать через расширение. Иначе следующее обновление потребует ручного объединения.

Отдача XML через HTTP-сервис

Если внешняя система — сайт, мобильное приложение, сервис логистики — сама забирает данные, файлы не нужны. Она отправляет GET-запрос, 1С отвечает XML.

Как устроено

  1. В Конфигураторе (или в расширении) создайте объект в ветке Общие → HTTP-сервисы, задайте корневой URL, например stock.
  2. Добавьте шаблон URL, например /items, и метод GET с процедурой-обработчиком.
  3. Опубликуйте базу: Администрирование → Публикация на веб-сервере в Конфигураторе, отметьте 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.202607.10.2026 0:00:002026-10-07T00:00:00
Число 1250,51 250,51250.5
Булево ИстинаДаtrue

Пробел-разделитель тысяч и запятая в числе — частая причина того, что сумма у получателя «обнуляется» или вызывает ошибку разбора.

Ошибки при сохранении данных в XML

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

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

Можно ли открыть XML из 1С в Excel?
Да, Excel открывает XML как таблицу, если структура плоская: один корневой тег и повторяющиеся строки. Вложенные элементы и сериализованные объекты в Excel читаются плохо.
Чем XML-выгрузка отличается от файла .dt?
Файл .dt — полная копия базы в двоичном виде для Конфигуратора. XML содержит только выбранные данные и читается любой программой.
Как сделать выгрузку в XML по расписанию?
Поместите процедуру выгрузки в общий модуль и вызовите её из регламентного задания. В клиент-серверной базе путь к файлу должен быть доступен службе сервера 1С.
Можно ли проверить XML по XSD-схеме средствами 1С?
Да, если схема импортирована в XDTO-пакет: при чтении файла через ФабрикаXDTO несоответствие схеме вызовет ошибку с указанием элемента.
Подойдёт ли JSON вместо XML?
Если получатель согласен — да, для JSON в 1С есть объект ЗаписьJSON с похожими методами. Банки, госсистемы и старые учётные программы чаще требуют именно XML.