Формирование XML-файлов в 1С:Предприятие 8.3 — одна из самых востребованных задач при интеграции с внешними системами, отчётностью или обменом данными между базами. Несмотря на кажущуюся сложность, процесс можно автоматизировать даже без глубоких знаний программирования. Главное — понимать структуру XML, уметь работать с объектами 1С и знать типичные «подводные камни», которые возникают при выгрузке данных.
В этой статье вы найдёте не только пошаговые инструкции для разных сценариев (от простой выгрузки справочников до сложных иерархических структур), но и уникальные приёмы ускорения процесса — например, как использовать XDTO-пакеты для генерации схем или как избежать ошибок кодировки при работе с кириллицей. Мы также разберём, какие инструменты встроены в платформу 1С 8.3 для упрощения задачи, и когда стоит прибегнуть к внешним обработкам.
Если вы ранее сталкивались с проблемами при формировании XML — например, файлы не проходили валидацию или данные «терялись» при выгрузке — здесь вы найдёте решения этих и других типичных ошибок. А для тех, кто только начинает осваивать обмен данными, мы подготовили чек-лист с минимальным набором действий для успешной выгрузки.
1. Подготовка к формированию XML: что нужно знать до начала работы
Прежде чем приступать к созданию XML-файла, определитесь с тремя ключевыми моментами:
- 📌 Цель выгрузки: для какой системы или сервиса предназначен файл? Например, требования к структуре XML для ФНС, ЭДО или маркетплейсов (Ozon, Wildberries) сильно отличаются.
- 📌 Источник данных: какие объекты 1С (справочники, документы, регистры) будут участвовать в выгрузке? От этого зависит выбор метода формирования.
- 📌 Формат и схема: есть ли готовая XSD-схема, по которой нужно формировать XML? Если нет — придётся разрабатывать структуру самостоятельно.
В 1С 8.3 есть несколько способов генерации XML:
- Встроенные механизмы (запись
XML,XDTO): подходят для простых задач и не требуют дополнительных обработок. - Конструктор выгрузки данных (в типовой конфигурации УТ 11, БП 3.0): удобен для стандартных обменов, но ограничен гибкостью.
- Внешние обработки (например, Универсальный обмен данными): позволяют настраивать сложные правила преобразования.
- Прямой код на
1С: максимальная гибкость, но требует знаний языка.
Если вы работаете с типовой конфигурацией (например, 1С:Бухгалтерия 3.0 или 1С:Управление торговлей 11), проверьте, есть ли в ней готовые обработки для нужного вам обмена. Например, для выгрузки данных в ФНС или ПФР уже предусмотрены стандартные механизмы — их проще адаптировать, чем создавать с нуля.
2. Способ 1: Формирование XML через запись XML (для простых структур)
Самый быстрый способ создать XML-файл — использовать объект ЗаписьXML. Он подходит для выгрузки простых данных, например, справочников с плоской структурой (без вложенных элементов). Рассмотрим пример выгрузки справочника Номенклатура:
// Создаём объект записи XML
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл("C:\Export\Номенклатура.xml","UTF-8");
// Начинаем документ и корневой элемент
ЗаписьXML.ЗаписатьОбъявлениеXML;
ЗаписьXML.ЗаписатьНачалоЭлемента("КаталогТоваров");
// Выгружаем данные из справочника
Выборка = Справочники.Номенклатура.Выбрать;
Пока Выборка.Следующий Цикл
ЗаписьXML.ЗаписатьНачалоЭлемента("Товар");
ЗаписьXML.ЗаписатьАтрибут("Код", Выборка.Код);
ЗаписьXML.ЗаписатьАтрибут("Наименование", Выборка.Наименование);
ЗаписьXML.ЗаписатьКонецЭлемента; // Закрываем элемент"Товар"
КонецЦикла;
// Закрываем корневой элемент и документ
ЗаписьXML.ЗаписатьКонецЭлемента; // Закрываем"КаталогТоваров"
ЗаписьXML.Закрыть;
Этот код создаст файл с такой структурой:
<?xml version="1.0" encoding="UTF-8"?>
<КаталогТоваров>
<Товар Код="00001" Наименование="Стул офисный" />
<Товар Код="00002" Наименование="Стол компьютерный" />
</КаталогТоваров>
⚠️ Внимание: При использовании ЗаписьXML следите за кодировкой. Если в данных есть кириллица, обязательно указывайте "UTF-8" при открытии файла. В противном случае символы превратятся в кракозябры.
☑️ Подготовка к выгрузке через ЗаписьXML
3. Способ 2: Использование XDTO для сложных структур
Если вам нужно сформировать XML со сложной иерархией (например, заказ с вложенными позициями, контрагентами и адресами), удобнее использовать XDTO-пакеты. Этот механизм позволяет:
- 🔹 Описывать структуру данных в виде схемы (аналог XSD).
- 🔹 Автоматически генерировать XML на основе объектов 1С.
- 🔹 Валидировать данные перед выгрузкой.
Пример создания XDTO-пакета и формирования XML:
- Создайте новый
XDTO-пакетв конфигураторе (Файл → Новый → XDTO-пакет). - Импортируйте схему (если есть) или опишите её вручную. Например, для заказа:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Заказ">
<xs:complexType>
<xs:sequence>
<xs:element name="Номер" type="xs:string"/>
<xs:element name="Дата" type="xs:date"/>
<xs:element name="Позиции">
<xs:complexType>
<xs:sequence>
<xs:element name="Позиция" maxOccurs="unbounded">
<xs:complexType>
<xs:element name="Товар" type="xs:string"/>
<xs:element name="Количество" type="xs:decimal"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Далее в модуле можно сформировать XML на основе этой схемы:
// Создаём фабрику XDTO
ФабрикаXDTO = Новый ФабрикаXDTO;
ФабрикаXDTO.ПространстваИмен.Добавить("http://example.com/orders","orders");
// Создаём объект заказа
ЗаказXDTO = ФабрикаXDTO.Sоздать("http://example.com/orders","Заказ");
ЗаказXDTO.Номер ="000123";
ЗаказXDTO.Дата = ТекущаяДата;
// Добавляем позиции
Позиции = ЗаказXDTO.Позиции.Добавить;
Позиция = Позиции.Позиция.Добавить;
Позиция.Товар ="Ноутбук";
Позиция.Количество = 2;
// Сериализуем в XML
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл("C:\Export\Заказ.xml");
ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ЗаказXDTO);
ЗаписьXML.Закрыть;
⚠️ Внимание: При работе с XDTO убедитесь, что пространства имён в схеме и коде совпадают. Ошибка в URI приведёт к пустому файлу или исключению.
Как проверить корректность XDTO-схемы?
Для валидации схемы можно использовать внешние инструменты, например, XML-валидаторы вроде XML Validator (https://www.xmlvalidation.com/) или плагины для VS Code. В самой 1С ошибки схемы отобразятся при попытке создать объект по некорректному XDTO-пакету.
4. Способ 3: Конструктор выгрузки данных (для типовых конфигураций)
Если вы работаете с типовой конфигурацией (например, 1С:Управление торговлей 11 или 1С:ERP), используйте встроенный Конструктор выгрузки данных. Он позволяет настраивать правила обмена без программирования:
- Откройте меню
Администрирование → Обмен данными → Настройка обмена. - Создайте новый обмен (например,
ВыгрузкаНоменклатурыВXML). - В конструкторе укажите:
- 📁 Источник данных (справочник
Номенклатура). - 📄 Формат файла — выберите
XML. - 🔧 Правила выгрузки — настройте соответствие полей 1С и XML-тегов.
- 📁 Источник данных (справочник
- Сохраните настройку и выполните выгрузку.
- 🚨 Ошибка кодировки: вместо кириллицы в файле появляются знаки
????илии.Решение: всегда указывайте кодировку
"UTF-8"при открытии файла. Если данные читаются из внешнего источника (например, Excel), предварительно конвертируйте их вUTF-8. - 🚨 Незакрытые теги: XML не проходит валидацию из-за отсутствия закрывающих тегов.
Решение: используйте
ЗаписьXML.ЗаписатьКонецЭлементадля каждого открытого тега. Для упрощения можно обернуть запись вПопытка...Исключение. - 🚨 Специальные символы: знаки
&,<,>ломают структуру XML.Решение: заменяйте их на сущности (
&,<,>) с помощью функцииСтрЗаменить. - 🚨 Ошибки XDTO: при сериализации возникает исключение
"Не найден тип XDTO".Решение: проверьте, что пространство имён в коде и схеме совпадают, и все типы описаны в XSD.
- ⚡ Пакетная запись: вместо построчной записи в файл накапливайте данные в строковой переменной, а затем записывайте её целиком.
- ⚡ Отключение транзакций: если выгрузка идёт из базы, временно отключите автотранзакции (
НачатьТранзакцию;→ЗафиксироватьТранзакцию;). - ⚡ Выборка порциями: используйте метод
ВыбратьПорциямидля выборки данных пачками по 100–500 записей. - ⚡ Кэширование: если данные не меняются часто, кэшируйте результат выгрузки и обновляйте файл только при изменениях.
Преимущество этого метода — скорость настройки. Однако он подходит только для стандартных объектов и не позволяет гибко управлять структурой XML. Например, если нужно выгрузить данные с группировкой или дополнительными расчётами, придётся дописывать код в модуле обработки.
| Способ формирования XML | Сложность | Гибкость | Когда использовать |
|---|---|---|---|
ЗаписьXML |
Низкая | Средняя | Простые структуры, небольшие объёмы данных |
XDTO |
Средняя | Высокая | Сложные иерархические данные, интеграция с внешними системами |
| Конструктор выгрузки | Низкая | Низкая | Типовые обмены в стандартных конфигурациях |
| Внешние обработки | Высокая | Максимальная | Уникальные форматы, нестандартные требования |
5. Типичные ошибки и как их избежать
При формировании XML в 1С 8.3 пользователи часто сталкиваются с одними и теми же проблемами. Вот самые распространённые из них и способы их решения:
⚠️ Внимание: Если вы работаете с 1С:Предприятием в файловом варианте, убедитесь, что путь к файлу выгрузки доступен для записи. В противном случае возникнет ошибка "Отказано в доступе". Для сетевых папок проверьте права пользователя.
Чтобы быстро найти незакрытые теги в большом XML-файле, откройте его в браузере (например, Chrome). Браузер подсветит первую ошибку и укажет строку, где она возникла.
6. Оптимизация и ускорение выгрузки больших объёмов данных
Если вам нужно выгрузить тысячи записей (например, весь справочник Контрагенты), стандартные методы могут работать слишком медленно. Вот несколько приёмов для ускорения:
Пример оптимизированного кода для выгрузки большого справочника:
// Создаём буфер для накопления данных
БуферXML = Новый СтроковыйПоток;
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроковыйПоток(БуферXML);
ЗаписьXML.ЗаписатьОбъявлениеXML;
ЗаписьXML.ЗаписатьНачалоЭлемента("Контрагенты");
// Выгружаем данными порциями по 500 записей
Выборка = Справочники.Контрагенты.ВыбратьПорциями(500);
Пока Выборка.СледующаяПорция Цикл
Пока Выборка.Следующий Цикл
ЗаписьXML.ЗаписатьНачалоЭлемента("Контрагент");
ЗаписьXML.ЗаписатьАтрибут("ИНН", Выборка.ИНН);
ЗаписьXML.ЗаписатьТекст(Выборка.Наименование);
ЗаписьXML.ЗаписатьКонецЭлемента;
КонецЦикла;
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента; // Закрываем"Контрагенты"
// Сохраняем результат в файл
БуферXML.Записать("C:\Export\Контрагенты.xml", КодировкаТекста.UTF8);
Этот подход ускоряет выгрузку в 3–5 раз по сравнению с построчной записью.
Для выгрузки более 10 000 записей используйте пакетную обработку или специализированные инструменты вроде 1С:Конвертация данных. Они оптимизированы для работы с большими объёмами.
7. Проверка и валидация сформированного XML
Перед отправкой XML-файла в внешнюю систему обязательно проверьте его на корректность. Вот минимальный чек-лист:
- Валидация структуры: используйте онлайн-валидаторы (например, XML Validation от W3Schools) или инструменты вроде XML Spy.
- Проверка кодировки: откройте файл в Notepad++ и убедитесь, что кодировка определена как
UTF-8 без BOM. - Тестовая загрузка: если возможно, протестируйте загрузку файла в целевую систему (например, в личном кабинете ФНС или ЭДО).
Для автоматической проверки в 1С можно использовать следующий код:
// Проверяем, что файл является корректным XML
Попытка
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл("C:\Export\Номенклатура.xml");
ЧтениеXML.ПрочитатьОбъявлениеXML; // Если ошибка, файл некорректен
Сообщить("XML корректен!");
Исключение
Сообщить("Ошибка в XML:" + ОписаниеОшибки);
КонецПопытки;
⚠️ Внимание: Некоторые системы (например, маркетплейсы) требуют строгого соответствия XSD-схеме, включая порядок тегов и атрибутов. Даже если XML валиден, он может быть отклонён из-за несоответствия схеме.
8. Готовые решения и внешние обработки
Если вам нужно регулярно формировать XML по сложным правилам, рассмотрите готовые решения:
- 🔧 Универсальный обмен данными (от 1С): позволяет настраивать правила преобразования данных в XML/JSON без программирования.
- 🔧 Конвертация данных 2.0/3.0: инструмент для миграции и обмена данными между базами, поддерживает выгрузку в XML.
- 🔧 Обработки от партнёров: на сайте Infostart или 1С-Сообщество можно найти бесплатные и платные обработки для специфических задач (например, выгрузка для Wildberries или Озон).
Пример использования Универсального обмена данными:
- Установите обработку из каталога 1С (
Файл → Открыть → Добавить из файла). - Создайте новое правило обмена, укажите источник (например, документ
РеализацияТоваровУслуг). - Настройте соответствие полей 1С и XML-тегов.
- Выполните выгрузку и сохраните файл.
⚠️ Внимание: Перед использованием внешних обработок проверьте их совместимость с вашей версией 1С 8.3. Некоторые решения могут не работать в последних релизах платформы.
Где скачать проверенные обработки для XML?
Рекомендуем использовать официальные источники:
- Каталог решений на сайте 1С (https://solutions.1c.ru/)
- Infostart (https://infostart.ru/)
- 1С-Сообщество (https://community.1c.ru/)
Избегайте скачивания обработок с непроверенных сайтов — они могут содержать вредоносный код.
FAQ: Частые вопросы по формированию XML в 1С 8.3
Можно ли сформировать XML без программирования?
Да, в типовых конфигурациях (УТ 11, БП 3.0) есть встроенные обработки для выгрузки данных в XML. Например, для обмена с ФНС или ЭДО используйте меню Отчетность → Регламентированные отчёты. Также можно воспользоваться Конструктором выгрузки данных (см. раздел 4).
Как выгрузить в XML данные с вложенными табличными частями (например, заказ с позициями)?
Для иерархических структур удобнее использовать XDTO (раздел 3) или писать код с вложенными циклами. Пример для заказа с позициями:
ЗаписьXML.ЗаписатьНачалоЭлемента("Заказ");
ЗаписьXML.ЗаписатьАтрибут("Номер", Документ.Номер);
// Выгружаем табличную часть"Товары"
ЗаписьXML.ЗаписатьНачалоЭлемента("Позиции");
Для Каждого СтрокаТовары Из Документ.Товары Цикл
ЗаписьXML.ЗаписатьНачалоЭлемента("Позиция");
ЗаписьXML.ЗаписатьАтрибут("Товар", СтрокаТовары.Номенклатура);
ЗаписьXML.ЗаписатьАтрибут("Количество", СтрокаТовары.Количество);
ЗаписьXML.ЗаписатьКонецЭлемента;
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента; // Закрываем"Позиции"
ЗаписьXML.ЗаписатьКонецЭлемента; // Закрываем"Заказ"
Почему при выгрузке в XML теряются русские буквы?
Этоная проблема с кодировкой. Решения:
- Укажите
"UTF-8"при открытии файла:ЗаписьXML.ОткрытьФайл(...,"UTF-8"). - Если данные читаются из внешнего источника (например, DBF или Excel), предварительно конвертируйте их в
UTF-8. - Проверьте настройки региональных стандартов в 1С (
Администрирование → Настройки программы → Региональные).
Как автоматизировать выгрузку XML по расписанию?
Для автоматической выгрузки настройте регламентное задание:
- Создайте обработку с кодом формирования XML.
- В конфигураторе перейдите в
Общие → Регламентные задания. - Добавьте новое задание, укажите обработку и расписание (например, ежедневно в 23:00).
- Настройте отправку файла по FTP или email (если нужно).
Для отправки по FTP используйте объект FTPСоединение:
FTP = Новый FTPСоединение("ftp.example.com", 21,"user","password");
FTP.ЗагрузитьФайл("C:\Export\data.xml","/incoming/data.xml");
Какие есть альтернативы XML в 1С для обмена данными?
Если XML не подходит (например, из-за сложности парсинга), рассмотрите:
- 📄 JSON: легче парсится, компактнее. В 1С 8.3 поддерживается через
ЗаписьJSON/ЧтениеJSON. - 📄 CSV/Excel: удобно для табличных данных, но теряется структура.
- 📄 Протокол oData: для интеграции с 1С:EDT или внешними системами.
- 📄 Direct Connect: для обмена между базами 1С без промежуточных файлов.
Пример выгрузки в JSON:
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.ОткрытьФайл("C:\Export\data.json");
ЗаписьJSON.ЗаписатьНачалоОбъекта;
ЗаписьJSON.ЗаписатьСвойство("Номер","000123");
ЗаписьJSON.ЗаписатьКонецОбъекта;
ЗаписьJSON.Закрыть;