Выгрузка XML из 1С 8.3: ЗаписьXML, XDTO и обмен по расписанию

· 10 мин

Содержание

Сделать XML в 1С 8.3 проще всего объектом ЗаписьXML: открыть файл, записать объявление, затем элементы, атрибуты и текст, и закрыть запись. Если формат жёстко задан схемой XSD партнёра, файл создают через XDTO. Если данные нужно перенести между одинаковыми базами 1С, хватит СериализаторXDTO или типовой обработки выгрузки.

Выбор зависит от того, кто будет читать файл. Свой формат для сайта или маркетплейса — ЗаписьXML. Чужая схема с проверкой — XDTO. Другая база 1С — встроенная сериализация или механизм обмена. Ниже код, который работает в любой конфигурации на платформе 8.3: Бухгалтерии 3.0, УТ 11, ЗУП 3.1, самописной.

Где XML нужен в 1С и что выбрать под задачу

XML в 1С появляется всякий раз, когда данные уходят наружу или приходят извне:

  • 🛒 выгрузка каталога и остатков на сайт или в интернет-магазин;
  • 🔄 обмен между базами 1С: Бухгалтерия ↔ УТ, центральная база ↔ филиалы;
  • 🏦 интеграция с банком, логистикой, CRM через файлы или HTTP-сервисы;
  • 📦 передача заказов и прайсов контрагенту в его формате;
  • 🧾 электронная отчётность и ЭДО — там XML формирует сама типовая конфигурация, руками его не пишут.

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

СпособКогда братьПлюсыМинусы
ЗаписьXMLСвой формат, сайт, простые выгрузкиБыстро, потоково, мало памятиСтруктуру держите в коде сами
DOM (ДокументDOM)Нужно править готовое дерево перед записьюМожно вставлять узлы в любое местоВесь документ в памяти, медленно на больших объёмах
XDTO по XSDПартнёр дал схему, нужна валидацияТипы и проверка по схемеНужен XDTO-пакет или фабрика, порог входа выше
СериализаторXDTOПеренос объектов между одинаковыми базамиОдна строка кода на объектФормат понятен только 1С
Типовой обмен (EnterpriseData, «Универсальный обмен»)Регулярная синхронизация баз 1СНастраивается без кодаПравить правила конвертации сложно

Что подготовить в базе перед выгрузкой XML

Код для XML пишут в одном из трёх мест. От этого зависит, какие права и настройки нужны.

  1. Внешняя обработка (файл .epf). Подходит для разовой выгрузки и не трогает конфигурацию. Пользователю нужна роль с правом интерактивного открытия внешних обработок. В конфигурациях на БСП при открытии появится предупреждение защиты от опасных действий — его подтверждают или отключают в карточке пользователя.
  2. Расширение конфигурации (.cfe). Для постоянной выгрузки в типовой базе без снятия с поддержки.
  3. Модуль самой конфигурации. Если база уже доработана и снята с поддержки.

Ещё три вещи проверьте заранее:

  • 📁 Где окажется файл. Код на сервере пишет на диск сервера 1С, а не на компьютер пользователя. У пользователя, под которым работает служба сервера, должны быть права на запись в эту папку.
  • 🔤 Кодировка. Уточните у принимающей стороны: UTF-8 или Windows-1251, нужен ли BOM.
  • 📐 Формат. Попросите пример файла или схему XSD. Без образца вы будете угадывать имена тегов.

Для отладки создайте внешнюю обработку в конфигураторе: Файл → Новый → Внешняя обработка. Добавьте форму и кнопку, код положите в серверную процедуру формы.

Пошаговая инструкция: как создать XML в 1С объектом ЗаписьXML

ЗаписьXML пишет документ последовательно, тег за тегом. Каждый открытый элемент нужно закрыть парным вызовом.

Шаг 1. Откройте файл и запишите объявление

Запись = Новый ЗаписьXML;
Параметры = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Истина); // Истина — отступы для читаемости
Запись.ОткрытьФайл("C:\Exchange\catalog.xml", Параметры);
Запись.ЗаписатьОбъявлениеXML(); // <?xml version="1.0" encoding="UTF-8"?>

Третий параметр ПараметрыЗаписиXML включает отступы. Для обмена с программами их можно выключить, файл станет компактнее.

Шаг 2. Запишите корневой элемент и атрибуты

Запись.ЗаписатьНачалоЭлемента("Catalog");
Запись.ЗаписатьАтрибут("date", XMLСтрока(ТекущаяДатаСеанса()));
Запись.ЗаписатьАтрибут("version", "1");

Атрибуты пишут сразу после ЗаписатьНачалоЭлемента, до вложенных тегов и текста.

Шаг 3. Выведите данные в цикле

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

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
	Запись.ЗаписатьНачалоЭлемента("Item");
	Запись.ЗаписатьАтрибут("id", XMLСтрока(Выборка.Ссылка)); // UUID ссылки
	
	Запись.ЗаписатьНачалоЭлемента("Code");
	Запись.ЗаписатьТекст(СокрЛП(Выборка.Код));
	Запись.ЗаписатьКонецЭлемента();
	
	Запись.ЗаписатьНачалоЭлемента("Name");
	Запись.ЗаписатьТекст(Выборка.Наименование);
	Запись.ЗаписатьКонецЭлемента();
	
	Запись.ЗаписатьНачалоЭлемента("Article");
	Запись.ЗаписатьТекст(Выборка.Артикул);
	Запись.ЗаписатьКонецЭлемента();
	
	Запись.ЗаписатьКонецЭлемента(); // Item
КонецЦикла;

ЗаписатьТекст сам экранирует <, > и &. Подменять их вручную на &lt; не нужно, иначе получится двойное экранирование.

Шаг 4. Закройте корень и файл

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

На выходе получится файл такого вида:

<?xml version="1.0" encoding="UTF-8"?>
<Catalog date="2026-10-07T10:15:00" version="1">
	<Item id="5a1f3c2e-...">
		<Code>00-00000012</Code>
		<Name>Кабель ВВГнг 3х2,5</Name>
		<Article>VVG-325</Article>
	</Item>
</Catalog>

Шаг 5. Отдайте файл пользователю

В тонком клиенте и веб-клиенте серверный код не видит диск пользователя. Порядок такой:

  1. На сервере пишите во временный файл: ИмяФайла = ПолучитьИмяВременногоФайла("xml").
  2. Поместите его во временное хранилище: Адрес = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайла), УникальныйИдентификатор).
  3. Удалите временный файл на сервере: УдалитьФайлы(ИмяФайла).
  4. На клиенте сохраните по адресу. В конфигурациях на БСП это ФайловаяСистемаКлиент.СохранитьФайл, в остальных — асинхронные методы получения файла с сервера.

Как всегда форматировать значения: XMLСтрока

Даты, числа и булевы значения не пишите через Строка(). Она форматирует их по региональным настройкам: дата станет «07.10.2026 10:15:00», в числе появится неразрывный пробел между разрядами. XMLСтрока() даёт стандартный вид:

ЗначениеСтрока()XMLСтрока()
Дата07.10.2026 10:15:002026-10-07T10:15:00
Число 12500,512 500,512500.5
БулевоДаtrue
СсылкаКабель ВВГнг 3х2,5уникальный идентификатор

Как создать XML по схеме XSD через XDTO

Когда партнёр присылает XSD, писать теги вручную рискованно. Ошибка в порядке элементов или обязательном поле всплывёт только на его стороне. XDTO строит объект по схеме и проверяет его до записи.

Вариант А. XDTO-пакет в конфигурации или расширении

  1. В конфигураторе раскройте ветку Общие → XDTO-пакеты.
  2. Нажмите правой кнопкой и выберите импорт XML-схемы, укажите файл .xsd.
  3. Посмотрите в свойствах пакета его пространство имён (URI) — оно понадобится в коде.
URI = "http://example.com/orders"; // пространство имён из схемы
ТипЗаказ = ФабрикаXDTO.Тип(URI, "Order");
Заказ = ФабрикаXDTO.Создать(ТипЗаказ);
Заказ.Number = "А-1024";
Заказ.Date = ТекущаяДатаСеанса();
Заказ.Total = 15400.00;

Заказ.Проверить(); // вызовет исключение, если нарушена схема

Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл("C:\Exchange\order.xml", "UTF-8");
Запись.ЗаписатьОбъявлениеXML();
ФабрикаXDTO.ЗаписатьXML(Запись, Заказ, "Order", URI);
Запись.Закрыть();

Имена типов и свойств (Order, Number, Total) берите из схемы, регистр букв важен. Вложенные сложные типы создают тем же ФабрикаXDTO.Создать и присваивают в свойство родителя. Повторяющийся элемент — это список: в него добавляют методом Добавить().

Вариант Б. Фабрика из файла схемы без изменения конфигурации

Во внешней обработке можно построить фабрику прямо из файла: Фабрика = СоздатьФабрикуXDTO("C:\Schemas\orders.xsd"). Дальше работа та же, только вместо глобальной ФабрикаXDTO используйте переменную Фабрика. Это удобно, когда схема часто меняется и пересобирать конфигурацию ради неё не хочется.

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

Выгрузка объектов 1С в XML: сериализация и типовые обработки

Для переноса справочников и документов между базами с одной конфигурацией писать формат не нужно. Платформа умеет сериализовать объект целиком:

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

Читают такой файл обратным методом СериализаторXDTO.ПрочитатьXML. Ссылки при этом сохраняются по уникальным идентификаторам, поэтому объект встанет на своё место, а не задвоится.

Без программирования те же задачи решают типовыми средствами:

  • 🔁 Синхронизация данных в типовых конфигурациях на формате EnterpriseData — для Бухгалтерии, УТ, Розницы между собой.
  • 🧰 Универсальный обмен данными в формате XML — обработка, которая выгружает данные по правилам из «Конвертации данных».
  • 🗂️ Выгрузка и загрузка данных XML — универсальная обработка для переноса отдельных объектов между базами с одинаковой структурой метаданных.

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

Типичные ошибки при формировании XML в 1С

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

Автоматическая выгрузка XML по расписанию

Ручной запуск обработки быстро надоедает. Выгрузку остатков на сайт обычно ставят на расписание.

Регламентное задание

  1. В конфигураторе или расширении создайте общий модуль с флажком «Сервер».
  2. Опишите в нём экспортную процедуру выгрузки, например ВыгрузитьКаталогXML().
  3. В ветке Общие → Регламентные задания добавьте задание, в поле «Имя метода» выберите эту процедуру.
  4. Отметьте «Использование» и задайте расписание: например, каждые 30 минут с 8:00 до 20:00.
  5. Обновите конфигурацию базы данных.

В клиент-серверной базе задание выполняет сервер 1С сам. В файловой базе регламентные задания выполняются, только пока открыт хотя бы один сеанс клиента. Для круглосуточной выгрузки файловый вариант ненадёжен.

Дополнительная обработка в конфигурациях на БСП

Этот приём часто упускают. Бухгалтерия 3.0, УТ 11, ЗУП 3.1 позволяют запускать по расписанию внешнюю обработку без правки конфигурации:

  1. В модуле обработки опишите функцию СведенияОВнешнейОбработке() с видом «Дополнительная обработка» и командой с типом запуска «Вызов серверного метода».
  2. Зарегистрируйте файл в разделе Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки.
  3. В карточке обработки для серверной команды задайте расписание.

Обработка останется внешней. При обновлении типовой конфигурации её не придётся переносить.

Добавьте в выгрузку запись в журнал регистрации через ЗаписьЖурналаРегистрации: сколько позиций выгружено и куда. Когда сайт пожалуется на пустой каталог, вы сразу увидите, отработало ли задание.

Готовые примеры XML для частых задач

XML в строку для HTTP-запроса

Чтобы отправить данные в веб-сервис, файл на диске не нужен:

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

HTTPЗапрос = Новый HTTPЗапрос("/api/import");
HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/xml; charset=utf-8");
HTTPЗапрос.УстановитьТелоИзСтроки(ТекстXML, КодировкаТекста.UTF8);

Элементы с пространством имён

Многие схемы требуют xmlns в корне. Объявите его сразу после открытия корневого элемента:

Запись.ЗаписатьНачалоЭлемента("Catalog");
Запись.ЗаписатьСоответствиеПространстваИмен("", "http://example.com/catalog");

Пустой префикс делает пространство имён пространством по умолчанию для всех вложенных тегов.

Пустые и необязательные теги

Если значения нет, решите с получателем заранее: тег пропускать или писать пустым. Для пропуска оберните запись в условие Если ЗначениеЗаполнено(Выборка.Артикул) Тогда. Пустой элемент получится, если вызвать ЗаписатьНачалоЭлемента и сразу ЗаписатьКонецЭлемента без текста.

Вложенные табличные части

Документ с товарами выгружают двумя уровнями: шапка — атрибутами или тегами документа, строки — элементами внутри тега Items. Удобно делать один запрос с итогами по ссылке документа или два вложенных обхода выборки: внешний по документам, внутренний по строкам.

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

Можно ли сделать XML в 1С без программирования?
Да, если задача типовая. Обмен между базами настраивают через синхронизацию данных, отчётность и ЭДО выгружаются в XML кнопками в самих документах. Код нужен для своего формата — сайта, маркетплейса, партнёра.
Чем ЗаписьXML отличается от ЗаписатьXML?
ЗаписьXML — объект, который пишет теги. ЗаписатьXML — глобальная функция и метод СериализаторXDTO: они сериализуют значение 1С целиком через уже открытую ЗаписьXML.
Как выгрузить XML в кодировке Windows-1251?
Передайте строку «windows-1251» в ОткрытьФайл или в ПараметрыЗаписиXML. Объявление XML получит ту же кодировку автоматически.
Как прочитать XML обратно в 1С?
Объектом ЧтениеXML для потокового разбора, ПостроительDOM для разбора в дерево, ФабрикаXDTO.ПрочитатьXML для файлов по схеме.
Работает ли этот код в веб-клиенте?
Да, если формирование идёт на сервере, а файл передаётся пользователю через временное хранилище. Прямой записи на диск пользователя из серверного кода нет.