XML из 1С:Предприятия 8.3: от ЗаписьXML до выгрузки по XSD-схеме
Содержание
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
Запись.Закрыть();
КонецПроцедуры
Что делает каждый метод:
ПараметрыЗаписиXML("UTF-8", "1.0", Истина)— кодировка, версия XML и отступы. Третий параметрИстинаделает файл читаемым глазами.ЗаписатьОбъявлениеXML()— первая строка<?xml version="1.0" encoding="UTF-8"?>.ЗаписатьНачалоЭлементаиЗаписатьКонецЭлемента— открывают и закрывают тег. Их число должно совпадать, иначе файл не прочитается.ЗаписатьАтрибут— атрибут вызывают сразу после открытия элемента, до текста и вложенных тегов.ЗаписатьТекст— значение внутри тега.Закрыть()— сбрасывает буфер на диск. Без этого вызова файл останется пустым или обрежется.
Даты, числа и булевы значения
Не склеивайте значения через Строка(): получите 07.10.2026 0:00:00 и 1 234,5 с неразрывным пробелом. Для XML есть функция XMLСтрока():
| Значение в 1С | Строка() | XMLСтрока() |
|---|---|---|
| Дата 07.10.2026 | 07.10.2026 0:00:00 | 2026-10-07T00:00:00 |
| Число 1234,5 | 1 234,5 | 1234.5 |
| Булево Истина | Да | true |
Если получатель ждёт только дату без времени, используйте Формат(Дата, "ДФ=yyyy-MM-dd").
Пространство имён и запись в строку
Когда у формата есть xmlns, объявите его сразу после открытия корневого элемента:
Запись.ЗаписатьНачалоЭлемента("Partners");
Запись.ЗаписатьСоответствиеПространстваИмен("", "urn:example:partners");
Иногда файл на диске не нужен: XML уходит в HTTP-запрос или в реквизит. Тогда вместо ОткрытьФайл вызовите УстановитьСтроку, а Закрыть() вернёт готовый текст:
Запись = Новый ЗаписьXML;
Запись.УстановитьСтроку("UTF-8");
// ... те же вызовы ЗаписатьНачалоЭлемента / ЗаписатьТекст ...
ТекстXML = Запись.Закрыть();
Файл для пользователя в клиент-серверной базе
ОткрытьФайл на сервере пишет файл на диск сервера, а не на компьютер бухгалтера. Порядок такой:
- На сервере получите путь
ПолучитьИмяВременногоФайла("xml")и запишите туда XML. - Прочитайте файл в
Новый ДвоичныеДанные(Путь)и положите вПоместитьВоВременноеХранилище. - Удалите временный файл через
УдалитьФайлы(Путь). - На клиенте сохраните данные по адресу хранилища. В конфигурациях на БСП для этого есть
ФайловаяСистемаКлиент.СохранитьФайл.
В веб-клиенте другого пути нет: прямой доступ к диску пользователя из ЗаписьXML там закрыт.
Выгрузка в XML по XSD-схеме через XDTO
Если получатель прислал XSD, писать теги вручную незачем. Схему загружают в конфигурацию, и 1С сама знает типы, порядок элементов и обязательные поля.
Шаг 1. Загрузите схему
- В Конфигураторе откройте ветку
Общие → XDTO-пакеты. - Через контекстное меню ветки импортируйте XML-схему и укажите файл
.xsd. - Посмотрите 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; Ко.
Другое дело — управляющие символы с кодами ниже 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С. Её учётная запись должна иметь доступ на запись в сетевую папку. Иначе задание падает с ошибкой доступа, хотя у вас вручную всё работает.
В файловой базе регламентные задания выполняются только пока открыт хотя бы один сеанс 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С с минимальными правами или используйте аутентификацию операционной системы.
Добавьте в процедуру журнал: дату, число записей и путь к файлу. Когда получатель спросит, почему вчерашнего файла нет, ответ будет за минуту.