Как использовать XML‑файлы в 1С для обмена данными: импорт и экспорт отчетов

Узнайте, как в 1С работать с XML‑файлами: чтение, запись, импорт‑экспорт, валидация по XSD и оптимизация обмена данными для быстрой и надёжной интеграции.

Работа с XML в 1С: основы

Чтение XML‑документов

XML‑файлы часто приходят в виде выгрузки из сторонних систем – бухгалтерских, CRM, складских. В 1С их удобно читать через встроенный объект XMLReader или через DOMParser. Первый вариант позволяет последовательно просматривать узлы, что экономит память при обработке больших файлов. Пример чтения списка контрагентов:

Как использовать XML‑файлы в 1С для обмена данными: импорт и экспорт отчетов

Читатель = Новый XMLReader;
Если Читатель.УстановитьПутьКФайлу("Контрагенты.xml") Тогда
    Пока Читатель.Прочитать() Цикл
        Если Читатель.ИмяТекущегоЭлемента = "Контрагент" И Читатель.ТипУзла = ТипУзла.Элемент Тогда
            // получаем атрибуты и вложенные элементы
            Идентификатор = Читатель.ПолучитьЗначениеАтрибута("id");
            Наименование = Читатель.ПрочитатьТекст();
            // сохраняем в справочник
            Новый Контрагент(Идентификатор, Наименование);
        КонецЕсли;
    КонецЦикла;
КонецЕсли;

Если требуется произвести более сложный поиск, удобно загрузить весь документ в DOMDocument и пользоваться XPath‑запросами:

Док = Новый XMLDocument;
Док.Загрузить("Контрагенты.xml");
Контрагенты = Док.SelectNodes("//Контрагент[Статус='Активный']");
Для Каждого Кт Из Контрагенты Цикл
    // работа с узлом Кт
КонецЦикла;

Запись данных в XML

Для экспорта отчетов, реестров или любых табличных данных 1С предоставляет класс XMLWriter. Он формирует документ «на лету», поэтому не требует предварительной загрузки всей структуры в память. Ниже – типовой шаблон создания XML‑файла со списком товаров:

Запись = Новый XMLWriter;
Запись.УстановитьПутьКФайлу("Товары.xml");
Запись.СтартДокумента();
Запись.СтартЭлемента("Товары");

Для Каждого Товар Из Справочник.Товары Цикл
    Запись.СтартЭлемента("Товар");
    Запись.ЗаписатьАтрибут("Код", Товар.Код);
    Запись.ЗаписатьЭлемент("Наименование", Товар.Наименование);
    Запись.ЗаписатьЭлемент("Цена", Формат(Товар.Цена, "ЧГ=2"));
    Запись.КонецЭлемента(); // Товар
КонецЦикла;

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

При необходимости добавить комментарии или CDATA‑блоки, методы ЗаписатьКомментарий и ЗаписатьCDATA позволяют добавить дополнительные метаданные без нарушения структуры.

Работа с атрибутами и элементами

В XML‑документах часто используется комбинация атрибутов (для идентификации) и вложенных элементов (для детализированных данных). В 1С атрибуты читаются через методы ПолучитьЗначениеАтрибута и ЗаписатьАтрибут, а элементы – через ПрочитатьТекст или ЗаписатьЭлемент. Ниже – таблица сравнения типовых подходов к работе с атрибутами и элементами.

СценарийАтрибутЭлемент
Идентификатор записиКратко, уникально, не содержит пробелов (например, id=“123”)Не рекомендуется, усложняет парсинг
Текстовое описаниеОграничено длиной, не подходит для многострочного текстаПоддерживает любые символы, удобно для длинных описаний
Сериализация датЧасто в формате date=“2025-03-15”Можно использовать отдельный элемент <Дата>2025-03-15</Дата>

Выбирайте атрибуты для коротких, неизменяемых свойств, а элементы – для более сложных или объёмных данных. При импорте/экспорте важно поддерживать согласованность формата, чтобы избежать потери информации.

Импорт и экспорт XML в 1С 8.3

Настройка загрузки XML

Для корректного импорта XML‑данных в 1С 8.3 необходимо правильно настроить обработку файлов. Самый надёжный способ – использовать объект XMLDocument, который позволяет парсить документ, проверять его структуру и получать доступ к узлам через XPath.

Пошаговый порядок настройки:

  • Создайте обработку или внешнюю обработку, в которой будет реализована загрузка.
  • В свойствах обработки укажите путь к схеме XSD, если она доступна. Это обеспечит автоматическую валидацию.
  • В коде обработчика откройте файл через New XMLDocument, загрузите его методом Load и проверьте свойство IsValid.
  • Сопоставьте узлы XML с полями справочников/документов, используя GetNode и Value.

Пример кода, иллюстрирующий процесс загрузки:

XMLDoc = New XMLDocument; XMLDoc.Load(“C:\import\data.xml”); Если XMLDoc.IsValid Тогда КорректныеДанные = XMLDoc.SelectNodes("//Документ/Строка"); Для Каждого Строка Из КорректныеДанные Цикл // Пример маппинга полей НовыйДокумент = Документы.Продажа.СоздатьДокумент(); НовыйДокумент.Дата = Строка.GetNode(“Дата”).Value; НовыйДокумент.Сумма = Строка.GetNode(“Сумма”).Value; НовыйДокумент.Записать(); КонецЦикла; КонецЕсли;

Создание выгрузки XML‑отчётов

Выгрузка отчётов в XML обычно происходит в два этапа: формирование набора данных и их сериализация в файл. В 1С 8.3 есть готовый механизм XMLWriter, который позволяет писать корректный XML без ручного формирования строк.

Ключевые рекомендации:

  • Определите структуру выходного файла заранее – это облегчает парсинг на принимающей стороне.
  • Используйте атрибуты только при необходимости, они упрощают чтение, но могут усложнять валидацию.
  • Для больших объёмов данных применяйте потоковую запись, чтобы не перегружать оперативную память.

Ниже пример генерации XML‑отчёта о продажах за выбранный период:

Writer = New XMLWriter; Writer.WriteStartDocument(); Writer.WriteStartElement(“ОтчетПродаж”); Writer.WriteAttributeString(“ДатаНачала”, НачальнаяДата); Writer.WriteAttributeString(“ДатаОкончания”, КонечнаяДата);

Для Каждого Строка Из Выборка Цикл Writer.WriteStartElement(“Продажа”); Writer.WriteElementString(“Номер”, Строка.Номер); Writer.WriteElementString(“Дата”, Формат(Строка.Дата, “ДФ”)); Writer.WriteElementString(“Сумма”, Строка.Сумма); Writer.WriteEndElement(); // Продажа КонецЦикла;

Writer.WriteEndElement(); // ОтчетПродаж Writer.WriteEndDocument(); Writer.Save(“C:\export\sales_report.xml”);

Обработка ошибок импорта

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

Пример типовых ошибок и способы их устранения:

Код ошибкиОписаниеРекомендация
XML001Файл не соответствует XSD‑схемеПроверить соответствие полей, исправить структуру XML, обновить схему.
XML002Неверный формат датыИспользовать функцию StringToDate с указанием формата.
XML003Дублирование ключевого поляПеред записью выполнить проверку НайтиПоКоду и решить, обновлять запись или пропустить.
XML004Отсутствие обязательного узлаВвести проверку наличия узла перед чтением, добавить в журнал и продолжить импорт.

Типовой обработчик исключений может выглядеть так:

Попытка // Основной код импорта Исключение Ошибка = СведенияОбОшибке(); ЖурналОшибок.Добавить(Ошибка.Описание, Ошибка.Категория); Сообщить(“Импорт остановлен: " + Ошибка.Описание); КонецПопытки;

Регулярно просматривайте журнал, отбирайте повторяющиеся проблемы и вносите изменения в процесс загрузки. Это уменьшит количество ручных корректировок и повысит стабильность обмена данными.

Валидация XML‑данных в 1С

Подключение XML‑валидатора

Для начала работы с валидацией необходимо добавить в конфигурацию компоненту XMLValidator. Это делается через Конфигуратор → Сервис → Подключаемые компоненты. После установки появляется глобальная процедура ValidateXML(ТекстXML, ПутьКСхеме), к которой можно обращаться из обработок и внешних отчетов.

Иллюстрация

Пример простого вызова:

ТекстXML = Файлы.ПрочитатьТекст("C:\Temp\report.xml");
ПутьКСхеме = "C:\Schemas\report.xsd";
Результат = ValidateXML(ТекстXML, ПутьКСхеме);
Если Результат = НеОпределено Тогда
    Сообщить("XML прошёл проверку");
Иначе
    Сообщить("Найдены ошибки: " + Результат);
КонецЕсли;

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

Проверка по XSD‑схеме

Сама проверка делится на два этапа: загрузка схемы и валидация документа. При первом запуске компонент автоматически кэширует XSD‑файл, что ускоряет последующие запросы.

  • Загрузка схемы – XMLValidator.LoadSchema(ПутьКСхеме). В случае ошибки загрузки система выдаёт детальное сообщение о недоступных типах или несоответствиях пространств имен.
  • Валидация – XMLValidator.Validate(ТекстXML). Возвращаемое значение – список XMLValidationError, где каждый элемент содержит строку, колонку и описание проблемы.

Для массовой обработки отчетов часто используют цикл, где схема подгружается один раз, а проверка вызывается для каждого файла:

Схема = XMLValidator.LoadSchema("C:\Schemas\report.xsd");
Для Каждого Файл Из Файлы.ПолучитьСписок("C:\Exports\*.xml") Цикл
    Текст = Файлы.ПрочитатьТекст(Файл);
    Ошибки = XMLValidator.Validate(Текст);
    Если Ошибки &lt;> НеОпределено Тогда
        // дальше обработка ошибок (см. раздел «Логирование нарушений»)
    КонецЕсли;
КонецЦикла;

Логирование нарушений

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

ПолеОписание
ДатаДата и время обнаружения ошибки
ФайлИмя проверяемого XML‑файла
СтрокаНомер строки, где возникло несоответствие
КолонкаПозиция в строке
ОписаниеТекстовое сообщение валидатора

Запись в журнал выглядит так:

Запись = ВалидацияXML_Журнал.СоздатьЗапись();
Запись.Дата = ТекущаяДата();
Запись.Файл = Файл;
Запись.Строка = Ошибка.Строка;
Запись.Колонка = Ошибка.Колонка;
Запись.Описание = Ошибка.Сообщение;
Запись.Записать();

Регулярный просмотр журнала позволяет быстро реагировать на изменения форматов данных у контрагентов и поддерживать устойчивый процесс интеграции.

Оптимизация обмена XML‑сообщениями

Сокращение размера файлов

Большинство обменов данными в 1С происходит через XML‑файлы, которые могут быстро «разрастаться», особенно при передаче больших табличных частей. Сокращение объёма уменьшает нагрузку на сеть, ускоряет чтение/запись и снижает риск таймаутов.

Пример

Основные приёмные:

  • Удаление пустых элементов и атрибутов. В 1С легко настроить выгрузку так, чтобы генерировались только заполненные поля.
  • Сжатие данных. Применяйте GZIP или ZIP‑архивы непосредственно к XML‑файлу перед отправкой; 1С поддерживает работу с архивами через Объект.ЗначениеИзАрхива.
  • Использование коротких имён тегов. Вместо &lt;НаименованиеТовара> можно применять &lt;NТ&gt;, если обе стороны согласовали схему.
  • Замена повторяющихся строк таблиц на ссылки. Создайте отдельный словарь (например, список статусов) и в основной таблице храните только идентификатор.

Пример до и после оптимизации:

СостояниеРазмер (байт)Примечание
Исходный XML124 560Полные имена тегов, пустые атрибуты
После удаления пустых элементов102 340-6 % объёма
После сжатия GZIP28 900Сокращение более 75 %

Кеширование схем

Каждый раз, когда 1С читает входящий XML, она проверяет соответствие схеме (XSD). При больших объёмах запросов постоянный парсинг схемы заметно тормозит. Кеширование решает эту проблему.

Как реализовать:

  • Сохраните объект СхемаXML в глобальном контексте (например, в Объект.Значение).
  • При первом получении сообщения загрузите XSD из файловой системы или из конфигурации и поместите его в кеш.
  • Для последующих сообщений используйте уже загруженную схему, передавая её в функцию ПроверитьСтруктуруXML(ТекстXML, Схема).

Плюсы кеширования:

— снижение времени валидации до 30 %; — уменьшение нагрузки на процессор; — более предсказуемое время отклика, что критично при интеграциях в реальном времени.

Вопросы и ответы

Как прочитать большой XML‑файл в 1С без перегрузки памяти?

Для последовательного чтения используйте объект XMLReader. Он читает узлы один за другим, что позволяет обрабатывать файлы любого размера, не загружая весь документ в память.

Когда следует переключаться с XMLReader на DOMDocument?

Если требуется выполнять сложный поиск, использовать XPath‑запросы или работать с узлами несколькими способами, загрузите документ в XMLDocument (DOM) после предварительной валидации.

Как сформировать XML‑файл «на лету» в 1С?

Для потоковой записи используйте класс XMLWriter. Он открывает файл, пишет элементы и атрибуты по мере обхода данных, не требуя полной загрузки структуры в память.

В каких случаях лучше хранить данные в атрибутах, а в каких — в элементах?

Атрибуты подходят для коротких, неизменяемых значений (идентификаторы, коды). Элементы лучше использовать для длинных текстов, многострочных описаний и дат, когда требуется поддержка любых символов.

Как проверить XML‑файл по XSD‑схеме в 1С?

Подключите компоненту XMLValidator и вызовите ValidateXML(ТекстXML, ПутьКСхеме). Функция вернёт список ошибок XMLValidationError или НеОпределено, если проверка пройдена.

Как организовать журнал ошибок импорта XML?

Создайте регистр сведений (например, ВалидацияXML_Журнал**) и при возникновении исключения заполняйте его полями: дата, файл, строка, колонка, описание. Это обеспечивает постоянный контроль и быстрый поиск повторяющихся проблем.

**

Как уменьшить размер передаваемых XML‑сообщений?

Удаляйте пустые элементы и атрибуты, используйте короткие имена тегов, заменяйте повторяющиеся строки словарём, а затем сжимайте файл с помощью GZIP или ZIP перед отправкой.

Как ускорить валидацию больших объёмов XML‑сообщений?

Кешируйте объект XSD‑схемы в глобальном контексте (например, Объект.Значение) и используйте его повторно для всех сообщений. Это сокращает время загрузки схемы до 30 % и уменьшает нагрузку на процессор.

**

Статьи по схожей тематике