XML из 1С:Предприятия 8.3: от ЗаписьXML до выгрузки по XSD-схеме

· 9 мин

Содержание

XML-файл в 1С создают кодом через объект ЗаписьXML или через XDTO, если у получателя есть XSD-схема. Для переноса данных между базами 1С программировать не нужно: подходит встроенная обработка «Универсальный обмен данными в формате XML».

Частое заблуждение: «сохраню отчёт как XML». Табличный документ 1С в XML не сохраняется. Нужна именно выгрузка: программа сама формирует теги, атрибуты и кодировку. Ниже код, который можно вставить во внешнюю обработку и запустить в 1С 8.3 на любой типовой конфигурации.

Что решить до выгрузки XML: формат, структура и способ

Начните не с кода, а с вопроса «кто будет читать файл». От ответа зависит способ.

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

Перед стартом соберите у получателя:

  • 📄 пример готового файла или XSD-схему;
  • 🔤 кодировку (UTF-8 или windows-1251);
  • 🏷 пространство имён (xmlns), если оно есть;
  • 📅 формат дат и чисел;
  • 📦 правило имени файла и максимальный размер.

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

Создание XML файла в 1С без программирования

Для обмена между базами 1С подходит обработка «Универсальный обмен данными в формате XML». В конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) она встроена. Найти её можно через меню «Все функции» → ветка «Обработки». Если команды «Все функции» нет, включите её в главном меню: Сервис → Параметры, флажок «Отображать команду “Все функции”».

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

Второй вариант — внешняя обработка «Выгрузка и загрузка данных XML». Она переносит объекты как есть, без правил, но только между базами с одинаковой конфигурацией. Для чужой системы такой файл не годится: внутри теги во внутреннем формате 1С.

Загрузку чужого XML делайте сначала в копии базы. Файл, выгруженный из другой версии конфигурации, может перезаписать справочники.

Как создать XML через объект ЗаписьXML: пример кода

ЗаписьXML пишет файл последовательно: открыли элемент, записали содержимое, закрыли. Память почти не расходуется, поэтому способ подходит и для 200 тысяч строк.

Минимальный рабочий пример

Процедура выгружает контрагентов Бухгалтерии 3.0 в файл. Код выполняется на сервере.

&НаСервереБезКонтекста
Процедура ВыгрузитьКонтрагентовВXML(ИмяФайла)

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

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

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

	Пока Выборка.Следующий() Цикл
		Запись.ЗаписатьНачалоЭлемента("Partner");
		Запись.ЗаписатьАтрибут("code", СокрЛП(Выборка.Код));

		Запись.ЗаписатьНачалоЭлемента("Name");
		Запись.ЗаписатьТекст(Выборка.Наименование);
		Запись.ЗаписатьКонецЭлемента();

		Запись.ЗаписатьНачалоЭлемента("INN");
		Запись.ЗаписатьТекст(СокрЛП(Выборка.ИНН));
		Запись.ЗаписатьКонецЭлемента();

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

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

КонецПроцедуры

Что делает каждый метод:

  1. ПараметрыЗаписиXML("UTF-8", "1.0", Истина) — кодировка, версия XML и отступы. Третий параметр Истина делает файл читаемым глазами.
  2. ЗаписатьОбъявлениеXML() — первая строка <?xml version="1.0" encoding="UTF-8"?>.
  3. ЗаписатьНачалоЭлемента и ЗаписатьКонецЭлемента — открывают и закрывают тег. Их число должно совпадать, иначе файл не прочитается.
  4. ЗаписатьАтрибут — атрибут вызывают сразу после открытия элемента, до текста и вложенных тегов.
  5. ЗаписатьТекст — значение внутри тега.
  6. Закрыть() — сбрасывает буфер на диск. Без этого вызова файл останется пустым или обрежется.

Даты, числа и булевы значения

Не склеивайте значения через Строка(): получите 07.10.2026 0:00:00 и 1 234,5 с неразрывным пробелом. Для XML есть функция XMLСтрока():

Значение в 1ССтрока()XMLСтрока()
Дата 07.10.202607.10.2026 0:00:002026-10-07T00:00:00
Число 1234,51 234,51234.5
Булево ИстинаДаtrue

Если получатель ждёт только дату без времени, используйте Формат(Дата, "ДФ=yyyy-MM-dd").

Пространство имён и запись в строку

Когда у формата есть xmlns, объявите его сразу после открытия корневого элемента:

Запись.ЗаписатьНачалоЭлемента("Partners");
Запись.ЗаписатьСоответствиеПространстваИмен("", "urn:example:partners");

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

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

Файл для пользователя в клиент-серверной базе

ОткрытьФайл на сервере пишет файл на диск сервера, а не на компьютер бухгалтера. Порядок такой:

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

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

Выгрузка в XML по XSD-схеме через XDTO

Если получатель прислал XSD, писать теги вручную незачем. Схему загружают в конфигурацию, и 1С сама знает типы, порядок элементов и обязательные поля.

Шаг 1. Загрузите схему

  1. В Конфигураторе откройте ветку Общие → XDTO-пакеты.
  2. Через контекстное меню ветки импортируйте XML-схему и укажите файл .xsd.
  3. Посмотрите URI пространства имён в свойствах пакета — он нужен в коде.

Править типовую конфигурацию ради пакета неудобно: слетит поддержка. Пакет можно добавить в расширение конфигурации .

Шаг 2. Заполните объект и запишите файл

URI = "urn:example:partners";
ТипСписка = ФабрикаXDTO.Тип(URI, "PartnersType");
ТипЭлемента = ФабрикаXDTO.Тип(URI, "PartnerType");

Список = ФабрикаXDTO.Создать(ТипСписка);
Пока Выборка.Следующий() Цикл
	Элемент = ФабрикаXDTO.Создать(ТипЭлемента);
	Элемент.code = СокрЛП(Выборка.Код);
	Элемент.Name = Выборка.Наименование;
	Элемент.INN = СокрЛП(Выборка.ИНН);
	Список.Partner.Добавить(Элемент);
КонецЦикла;

Список.Проверить(); // исключение, если не заполнено обязательное

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

В ФабрикаXDTO.Тип передают имя типа (complexType) из схемы, а не имя элемента. Повторяющийся элемент (maxOccurs="unbounded") превращается в список: в него добавляют через Добавить.

Плюс способа — порядок тегов и типы контролирует платформа. Минус — весь объект держится в памяти. Для файлов на сотни мегабайт комбинируйте: шапку пишите через ЗаписьXML, а повторяющиеся блоки — через ФабрикаXDTO.ЗаписатьXML в тот же поток.

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

Нужно перенести документы в другую базу той же конфигурации? СериализаторXDTO записывает объект со всеми реквизитами и табличными частями одной строкой:

Запись.ЗаписатьНачалоЭлемента("Data");
Пока Выборка.Следующий() Цикл
	СериализаторXDTO.ЗаписатьXML(Запись, Выборка.Ссылка.ПолучитьОбъект());
КонецЦикла;
Запись.ЗаписатьКонецЭлемента();

Обратно объект читают через СериализаторXDTO.ПрочитатьXML(ЧтениеXML). Формат внутренний, внешняя система его не поймёт.

Кодировка и спецсимволы в XML-файле

Ошибки кодировки — главная причина фразы «файл не открывается у получателя».

UTF-8 или windows-1251

Кодировку задают в ОткрытьФайл или в ПараметрыЗаписиXML, и она же попадает в объявление. Многие форматы ФНС и старые банковские шлюзы ждут windows-1251. Современные API почти всегда работают с UTF-8.

Символ, которого нет в выбранной кодировке, испортит файл. Типичный случай: в наименовании контрагента эмодзи или китайский иероглиф, а файл пишется в windows-1251.

Некоторые программы на стороне получателя требуют метку BOM в начале UTF-8 файла, другие на ней спотыкаются. Её включают третьим параметром: Запись.ОткрытьФайл(ИмяФайла, "UTF-8", Истина). Ставьте Истина только если получатель об этом просил.

Амперсанд, кавычки и управляющие символы

ЗаписатьТекст и ЗаписатьАтрибут сами экранируют &, <, > и кавычки. Не заменяйте их вручную на &amp;: получите двойное экранирование, и в файле окажется ООО &amp;amp; Ко.

Другое дело — управляющие символы с кодами ниже 32. Они попадают в базу при копировании из Excel или PDF, и XML 1.0 их не допускает. Почистите текстовые поля перед записью:

Функция ОчиститьДляXML(Знач Текст)
	Результат = "";
	Для Позиция = 1 По СтрДлина(Текст) Цикл
		Символ = Сред(Текст, Позиция, 1);
		Код = КодСимвола(Символ);
		Если Код >= 32 Или Код = 9 Или Код = 10 Или Код = 13 Тогда
			Результат = Результат + Символ;
		КонецЕсли;
	КонецЦикла;
	Возврат Результат;
КонецФункции

Текст, который надо передать без обработки (HTML-фрагмент, вложенный XML), записывают методом ЗаписатьСекциюCDATA.

Как проверить созданный XML файл

Проверка в три уровня — от быстрой к строгой.

1. Правильно ли сформирован файл. Откройте его в браузере. Незакрытый тег или неверная кодировка дадут сообщение с номером строки.

2. Соответствует ли схеме. Самая надёжная проверка — прочитать файл обратно через XDTO по той же XSD:

Фабрика = СоздатьФабрикуXDTO("C:\Обмен\partners.xsd");
Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(ИмяФайла);
Попытка
	Объект = Фабрика.ПрочитатьXML(Чтение, Фабрика.Тип(URI, "PartnersType"));
	Объект.Проверить();
	Сообщить("Файл соответствует схеме");
Исключение
	Сообщить(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Чтение.Закрыть();

Вне 1С то же делает утилита xmllint:

xmllint --noout --schema partners.xsd partners.xml

3. Совпадает ли смысл. Схема пропустит пустой ИНН, если поле необязательное. Сравните 2-3 записи с эталоном получателя: формат дат, разделитель дробной части, ведущие нули в кодах.

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

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

Когда файл нужен каждый день, процедуру выгрузки выносят из кнопки в расписание.

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

  1. Перенесите процедуру в серверный общий модуль (можно в расширении).
  2. В Конфигураторе создайте объект в ветке Общие → Регламентные задания и укажите эту процедуру как метод.
  3. Задайте расписание и включите флажок «Использование».
  4. Путь к файлу берите из константы или настройки, а не из кода: каталог на сервере и у разработчика разный.

Учтите права: в клиент-серверной базе задание выполняет служба сервера 1С. Её учётная запись должна иметь доступ на запись в сетевую папку. Иначе задание падает с ошибкой доступа, хотя у вас вручную всё работает.

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

Планировщик Windows

Для файловой базы надёжнее запускать 1С из планировщика с внешней обработкой. Обработка в обработчике открытия формы делает выгрузку и завершает работу:

"C:\Program Files\1cv8\8.3.xx.xxxx\bin\1cv8.exe" ENTERPRISE /F"D:\Bases\Buh" /N"Обмен" /P"пароль" /Execute"D:\Scripts\export_xml.epf" /DisableStartupMessages

Вместо 8.3.xx.xxxx подставьте папку установленной версии платформы.

Пароль в задании планировщика хранится открытым текстом. Заведите для выгрузки отдельного пользователя 1С с минимальными правами или используйте аутентификацию операционной системы.

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

Перед запуском выгрузки по расписанию
Выполнено: 0 / 5

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

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