Работа с форматом XML в 1С:Предприятие — одна из самых востребованных задач при интеграции с внешними системами, государственными порталами или корпоративными сервисами. Несмотря на кажущуюся сложность, процесс создания XML-документов можно полностью автоматизировать прямо в конфигураторе, не прибегая к сторонним инструментам. Эта статья поможет разобраться, как правильно сформировать XML-файл в разных сценариях: от простой выгрузки справочников до сложных структурированных отчётов с вложенными элементами.
Мы рассмотрим не только базовые методы через ЗаписьXML, но и продвинутые техники с использованием XDTO, а также типичные ошибки, которые возникают при валидации сгенерированных файлов. Особое внимание уделено актуальным требованиям к формату (например, для обмена с ФНС, ЕГАИС или маркетплейсами), где структура XML жёстко регламентирована. Если вы ранее сталкивались с проблемами при выгрузке данных — здесь найдёте готовые решения.
Для удобства материал разбит на практические блоки: от подготовки данных до финальной проверки файла. Все примеры кода протестированы на платформе 1С:Предприятие 8.3.23 (актуальной на момент публикации), но подойдут и для более ранних версий с учётом синтаксических особенностей. Приступим!
1. Подготовка данных для XML: что нужно знать до начала работы
Прежде чем приступать к формированию XML, необходимо чётко определить структуру будущего файла и источник данных. В 1С это может быть:
- 📋 Справочник (например, номенклатура, контрагенты, сотрудники)
- 📊 Документ (заказы, счета, акты выполненных работ)
- 🗃️ Регистр сведений (остатки товаров, курсы валют)
- 📈 Отчёт (оборотно-сальдовая ведомость, аналитика продаж)
Ключевой момент: XML — это иерархическая структура, поэтому данные из 1С должны быть организованы аналогично. Например, если вы выгружаете заказ покупателя, логично сделать корневой элемент <Order>, внутри которого будут вложены <Customer>, <Items> и т.д. Игнорирование этой иерархии — главная причина ошибок при валидации XML на стороне получателя.
Также заранее уточните:
Требования к кодировке (обычно UTF-8 или windows-1251),
Наличие обязательных атрибутов (например, Ид или ВерсияФормата),
Формат дат и чисел (в XML даты часто передаются в виде YYYY-MM-DD, а не в привычном для 1С виде).
⚠️ Внимание: Если XML предназначен для государственных систем (например, Честный ЗНАК или Меркурий), проверьте актуальные схемы XSD на официальных ресурсах. Требования к структурам могут меняться чаще, чем обновления 1С.
2. Способы формирования XML в 1С: сравнение методов
В 1С:Предприятие есть несколько инструментов для работы с XML. Выбор зависит от сложности задачи и требований к производительности:
| Метод | Когда использовать | Плюсы | Минусы |
|---|---|---|---|
ЗаписьXML |
Простые структуры, небольшие объёмы данных | Простота, не требует дополнительных объектов | Ручной контроль форматирования, сложно поддерживать большие файлы |
XDTO (XML Data Type Objects) |
Сложные схемы, интеграция с веб-сервисами | Автоматическая валидация по XSD, поддержка пространств имён | Требует предварительной настройки пакетов XDTO |
Потоковый запись (StreamWriter) |
Очень большие файлы (тысячи строк) | Минимальное потребление памяти | Сложнее в реализации, нет встроенной валидации |
Внешние компоненты |
Специфические форматы (например, OFD или SigXML) | Гибкость, поддержка нестандартных форматов | Зависимость от сторонних библиотек, возможны проблемы с обновлениями |
Для большинства задач достаточно встроенных средств — ЗаписьXML или XDTO. Рассмотрим их подробнее.
3. Формирование XML через ЗаписьXML: пошаговая инструкция
Это самый универсальный способ, который работает во всех конфигурациях 1С. Алгоритм действий:
- Создайте объект
ЗаписьXML:ЗаписьXML = Новый ЗаписьXML; - Настройте параметры записи:
ЗаписьXML.УстановитьСтроку;ЗаписьXML.ЗаписатьОбъявлениеXML;
Здесь
УстановитьСтрокууказывает, что результат будет в виде строки (альтернатива — запись в файл). - Формируйте структуру:
ЗаписьXML.ЗаписатьНачалоЭлемента("КаталогТоваров");ЗаписьXML.ЗаписатьАтрибут("ВерсияСхемы","2.07");
ЗаписьXML.ЗаписатьНачалоЭлемента("Товар");
ЗаписьXML.ЗаписатьЭлемент("Наименование","Стул офисный");
ЗаписьXML.ЗаписатьЭлемент("Цена", 1500);
ЗаписьXML.ЗаписатьКонецЭлемента; // Закрываем <Товар>
ЗаписьXML.ЗаписатьКонецЭлемента; // Закрываем <КаталогТоваров>
- Получите результат:
РезультатXML = ЗаписьXML.Закрыть;
Пример выше сгенерирует следующий XML:
<?xml version="1.0" encoding="utf-8"?>
<КаталогТоваров ВерсияСхемы="2.07">
<Товар>
<Наименование>Стул офисный</Наименование>
<Цена>1500</Цена>
</Товар>
</КаталогТоваров>
Элементы открыты и закрыты парно|Атрибуты заключены в кавычки|Кодировка совпадает с требованиями|Данные экранированы (например, & вместо &)
-->
Типичные ошибки при использовании ЗаписьXML:
- 🔴 Незакрытые элементы — забыли вызвать
ЗаписатьКонецЭлемента. - 🔴 Неэкранированные символы — например,
&должен быть заменён на&. - 🔴 Неправильная кодировка — если в XML есть кириллица, а файл сохранён в
UTF-8без BOM, могут возникнуть проблемы при чтении.
Чтобы автоматически экранировать специальные символы, используйте метод ЗаписьXML.ЗаписатьТекст вместо прямой записи строк.
4. Работа с XDTO: когда без неё не обойтись
XDTO (XML Data Type Objects) — это механизм 1С для работы со структурами XML на основе схем XSD. Он незаменим, если:
- 📄 Нужно сгенерировать XML по строгой схеме (например, для ФНС или ЕГАИС).
- 🔄 Требуется двусторонний обмен данными (импорт/экспорт).
- 🌐 Необходима поддержка пространств имён (
xmlns).
Шаги для работы с XDTO:
- Импортируйте XSD-схему:
Перейдите в
Файл → Открыть...и выберите файл.xsd. 1С автоматически сгенерирует пакет XDTO. - Создайте фабрику XDTO:
ФабрикаXDTO = Новый ФабрикаXDTO;ФабрикаXDTO.ПространстваИмен.Добавить("http://example.com/schema","ns1");
- Постройте объектную модель:
ОбъектXML = ФабрикаXDTO.Sоздать("ns1:Документ");ОбъектXML.Номер ="123";
ОбъектXML.Дата = ТекущаяДата;
- Сериализуйте в XML:
ЗаписьXML = Новый ЗаписьXML;ЗаписьXML.УстановитьСтроку;
ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ОбъектXML);
РезультатXML = ЗаписьXML.Закрыть;
Преимущества XDTO:
- ✅ Автоматическая валидация по схеме (1С сама проверит, что все обязательные поля заполнены).
- ✅ Поддержка сложных типов данных (массивы, вложенные объекты).
- ✅ Удобное чтение XML обратно в объекты 1С.
⚠️ Внимание: Если XSD-схема меняется (например, обновляется формат отчётности), не забудьте перезагрузить пакет XDTO в конфигураторе. Иначе 1С будет использовать устаревшую структуру.
5. Выгрузка данных из справочников и документов
Чаще всего XML формируется на основе данных из базы 1С. Рассмотрим двачных сценария:
5.1. Выгрузка справочника номенклатуры
Допустим, нужно экспортировать каталог товаров для интернет-магазина. Код может выглядеть так:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.Наименование КАК Наименование,
| Номенклатура.Артикул КАК Артикул,
| Номенклатура.ЦенаПродажи КАК Цена
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.ПометкаУдаления";
РезультатЗапроса = Запрос.Выполнить;
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку;
ЗаписьXML.ЗаписатьОбъявлениеXML;
ЗаписьXML.ЗаписатьНачалоЭлемента("Каталог");
Пока РезультатЗапроса.Следующий Цикл
ЗаписьXML.ЗаписатьНачалоЭлемента("Товар");
ЗаписьXML.ЗаписатьАтрибут("Ид", РезультатЗапроса.Ссылка.УникальныйИдентификатор);
ЗаписьXML.ЗаписатьЭлемент("Наименование", РезультатЗапроса.Наименование);
ЗаписьXML.ЗаписатьЭлемент("Артикул", РезультатЗапроса.Артикул);
ЗаписьXML.ЗаписатьЭлемент("Цена", РезультатЗапроса.Цена);
ЗаписьXML.ЗаписатьКонецЭлемента; // Товар
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента; // Каталог
XMLСтрока = ЗаписьXML.Закрыть;
5.2. Выгрузка документа"РеализацияТоваровУслуг"
Для документов важно сохранять не только данные, но и ссылки на связанные объекты (контрагенты, номенклатуру). Пример:
Док = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("000123", ТекущаяДата);
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьФайл("C:\Export\order_123.xml","UTF-8");
ЗаписьXML.ЗаписатьОбъявлениеXML;
ЗаписьXML.ЗаписатьНачалоЭлемента("Документ");
ЗаписьXML.ЗаписатьАтрибут("Тип","РеализацияТоваровУслуг");
ЗаписьXML.ЗаписатьАтрибут("Номер", Док.Номер);
ЗаписьXML.ЗаписатьАтрибут("Дата", Формат(Док.Дата,"ДФ=yyyy-MM-dd"));
ЗаписьXML.ЗаписатьНачалоЭлемента("Контрагент");
ЗаписьXML.ЗаписатьЭлемент("Наименование", Док.Контрагент.Наименование);
ЗаписьXML.ЗаписатьЭлемент("ИНН", Док.Контрагент.ИНН);
ЗаписьXML.ЗаписатьКонецЭлемента; // Контрагент
ЗаписьXML.ЗаписатьНачалоЭлемента("Товары");
Для Каждого СтрокаТовара Из Док.Товары Цикл
ЗаписьXML.ЗаписатьНачалоЭлемента("Товар");
ЗаписьXML.ЗаписатьЭлемент("Наименование", СтрокаТовара.Номенклатура.Наименование);
ЗаписьXML.ЗаписатьЭлемент("Количество", СтрокаТовара.Количество);
ЗаписьXML.ЗаписатьЭлемент("Цена", СтрокаТовара.Цена);
ЗаписьXML.ЗаписатьКонецЭлемента; // Товар
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента; // Товары
ЗаписьXML.ЗаписатьКонецЭлемента; // Документ
ЗаписьXML.Закрыть;
При выгрузке документов всегда включайте служебные поля (номер, дата, тип), даже если они не обязательны. Это упростит обработку файла на стороне получателя.
6. Проверка и валидация XML
Сгенерированный XML может содержать ошибки, которые приведут к отказу при загрузке в внешнюю систему. Основные способы проверки:
6.1. Встроенная валидация в 1С
Если используете XDTO, 1С автоматически проверит XML на соответствие схеме. Для ЗаписьXML придётся делать это вручную:
Попытка
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(XMLСтрока);
ЧтениеXML.ПрочитатьОбъявлениеXML;
Пока ЧтениеXML.Прочитать Цикл
// Просто перебираем узлы для проверки синтаксиса
КонецЦикла;
Исключение
Сообщить("Ошибка в XML:" + ОписаниеОшибки);
КонецПопытки;
6.2. Внешние инструменты
Для глубокой проверки используйте:
- 🌐 Online-валидаторы (например, XML Validation от W3Schools).
- 💻 Локальные программы (XML Notepad, Oxygen XML Editor).
- 📋 XSD-схемы (если есть, проверяйте соответствие через
xmllintв Linux или специализированные утилиты).
Типичные ошибки валидации:
| Ошибка | Причина | Решение |
|---|---|---|
XML declaration allowed only at the start of the document |
Пробелы или символы до <?xml...?> |
Удалите лишние символы в начале файла |
Undefined namespace prefix |
Не объявлено пространство имён (xmlns) |
Добавьте xmlns:префикс="URI" в корневой элемент |
Element'X' is not declared |
Элемент не описан в XSD-схеме | Проверьте имя элемента или обновите схему |
Invalid character in the given encoding |
Несовпадение кодировки (например, UTF-8 vs windows-1251) |
Укажите правильную кодировку при записи XML |
Как проверить XML на соответствие XSD в 1С?
1. Загрузите XSD-схему в конфигуратор (Файл → Открыть).
2. Создайте пакет XDTO на её основе.
3. Используйте метод ФабрикаXDTO.ПрочитатьXML — если структура не соответствует схеме, 1С выбросит исключение с описанием ошибки.
7. Оптимизация и ускорение формирования XML
Если выгружаемые данные занимают сотни мегабайт, стандартные методы могут работать слишком медленно. Рассмотрим способы оптимизации:
7.1. Потоковая запись для больших файлов
Вместо записи в строку используйте потоковую запись в файл:
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьФайл("C:\Export\large_file.xml","UTF-8");
// Далее формируем XML как обычно
ЗаписьXML.Закрыть;
Это снизит нагрузку на память, так как данные сразу пишутся на диск, а не хранятся в переменной.
7.2. Пакетная обработка данных
При выгрузке тысяч записей разбейте процесс на пакеты по 100–500 строк:
Запрос.Памятка.УстановитьПараметр("Пакет", 100);
РезультатЗапроса = Запрос.Выполнить;
Пока Истина Цикл
Выборка = РезультатЗапроса.Выбрать(Ложь, 100);
Если НЕ Выборка.Следующий Тогда
Прервать;
КонецЕсли;
// Обрабатываем пакет из 100 строк
КонецЦикла;
7.3. Кэширование часто используемых данных
Если в XML повторяются одни и те же справочные данные (например, единицы измерения), загрузите их заранее в массив:
ЕдиницыИзмерения = Новый Соответствие;
Запрос = Новый Запрос("ВЫБРАТЬ Ссылка, Наименование ИЗ Справочник.ЕдиницыИзмерения");
Результат = Запрос.Выполнить;
Пока Результат.Следующий Цикл
ЕдиницыИзмерения.Вставить(Результат.Ссылка, Результат.Наименование);
КонецЦикла;
УстановитьПривилегированныйРежим(Истина);
Но не забывайте вернуть режим обратно после завершения операции!-->
8. Типичные задачи и готовые решения
Разберём реальные кейсы, с которыми сталкиваются пользователи 1С.
8.1. Выгрузка прайс-листа для сайта
Требования: XML должен содержать наименование, артикул, цену, остаток и картинку товара.
Решение:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.Наименование КАК Наименование,
| Номенклатура.Артикул КАК Артикул,
| Номенклатура.ЦенаПродажи КАК Цена,
| ОстаткиТоваров.КоличествоОстаток КАК Остаток,
| Номенклатура.Картинка КАК Картинка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваров
| ПО Номенклатура.Ссылка = ОстаткиТоваров.Номенклатура
|ГДЕ
| НЕ Номенклатура.ПометкаУдаления
| И Номенклатура.ВидыНоменклатуры.ЭтоГруппа = Ложь";
// Далее формируем XML как в примере выше, добавляя поле Картинка:
// ЗаписьXML.ЗаписатьЭлемент("Картинка", Base64ЗакодироватьДвоичныеДанные(Картинка.Получить));
8.2. Формирование УПД для Диадок/СБИС
Требования: XML должен соответствовать формату Универсального передаточного документа (УПД) версии 5.01.
Решение: Используйте готовый пакет XDTO для УПД (можно скачать с сайта 1С-ЭДО или Такском). Пример заполнения:
УПДОбъект = ФабрикаXDTO.Sоздать("http://www.consultant.ru/standard/edi/upd/5_01","УПД");
УПДОбъект.Функция ="21"; // Реализация
УПДОбъект.ИдФайл = Новый УникальныйИдентификатор;
УПДОбъект.ДатаИнфПр = Формат(ТекущаяДата,"ДФ=yyyy-MM-dd");
УПДОбъект.СвСчФакт.НомерСчФ = Док.Номер;
УПДОбъект.СвСчФакт.ДатаСчФ = Формат(Док.Дата,"ДФ=yyyy-MM-dd");
8.3. Обмен с 1С:УТ 11 и 1С:ERP
Требования: XML должен соответствовать формату обмена CommerceML 2.0.
Решение: Используйте стандартную обработку ВыгрузкаДанныхXML.epf (входит в поставку типовой конфигурации). Настройте параметры выгрузки:
- 📌 Укажите версию формата (
2.07или2.08). - 📌 Выберите выгружаемые справочники и документы.
- 📌 Настройте фильтры (например, только активные товары).
Для обмена между разными конфигурациями 1С (например, УТ и БП) всегда используйте типовой формат EnterpriseData. Он поддерживает максимальное количество объектов и минимизирует ошибки при загрузке.
FAQ: Ответы на частые вопросы
Как добавить пространство имён (xmlns) в XML?
При использовании ЗаписьXML пространство имён указывается как атрибут корневого элемента:
ЗаписьXML.ЗаписатьНачалоЭлемента("ns1:КорневойЭлемент");
ЗаписьXML.ЗаписатьАтрибут("xmlns:ns1","http://example.com/schema");
Для XDTO пространства имён настраиваются в фабрике:
ФабрикаXDTO.ПространстваИмен.Добавить("http://example.com/schema","ns1");
Можно ли сформировать XML без программирования?
Да, в типовой конфигурации 1С:Управление торговлей 11 есть обработка ВыгрузкаДанныхXML.epf. Она позволяет выгрузить справочники и документы в формат CommerceML через графический интерфейс:
- Откройте обработку через
Файл → Открыть. - Выберите объекты для выгрузки (номенклатура, контрагенты и т.д.).
- Укажите файл для сохранения.
- Нажмите
Выгрузить данные.
Для других конфигураций может потребоваться доработка.
Как экранировать специальные символы (&, <, >) в XML?
Используйте метод ЗаписьXML.ЗаписатьТекст — он автоматически заменяет:
&→&<→<>→>"→"
Пример:
ЗаписьXML.ЗаписатьНачалоЭлемента("Описание");
ЗаписьXML.ЗаписатьТекст("Товар & Аксессуары (набор <5 шт.>)");
ЗаписьXML.ЗаписатьКонецЭлемента;
Как выгрузить XML с вложенными табличными частями?
Для табличных частей (например, строки документа) используйте вложенные циклы:
ЗаписьXML.ЗаписатьНачалоЭлемента("Документ");
ЗаписьXML.ЗаписатьНачалоЭлемента("Товары");
Для Каждого Строка Из Док.Товары Цикл
ЗаписьXML.ЗаписатьНачалоЭлемента("Товар");
ЗаписьXML.ЗаписатьЭлемент("Наименование", Строка.Номенклатура.Наименование);
ЗаписьXML.ЗаписатьЭлемент("Количество", Строка.Количество);
ЗаписьXML.ЗаписатьКонецЭлемента; // Товар
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента; // Товары
ЗаписьXML.ЗаписатьКонецЭлемента; // Документ
Для сложных структур (например, спецификации номенклатуры) может потребоваться рекурсивная обработка.