Формат XML стал де-факто стандартом для обмена данными между системами, и 1С:Предприятие не исключение. Бухгалтерские отчёты, каталоги товаров, банковские выписки — всё это часто приходит в виде XML-документов. Но как их правильно прочитать, если вы никогда раньше не работали с разметкой? Эта статья поможет разобраться с основами и перейти к продвинутым техникам обработки.

Многие пользователи 1С сталкиваются с проблемой: файл есть, а как его открыть и использовать данные — непонятно. Кто-то пытается вручную копировать информацию из блокнота, кто-то ищет плагины, а кто-то просто сдаётся и просит помощи у программистов. На самом деле, в 1С 8.3 есть встроенные инструменты для работы с XML, и ими может овладеть даже новичок. Главное — понять базовую структуру формата и научиться применять стандартные методы платформы.

Сегодня мы разберём:

  • 📂 Как открыть XML-файл в 1С без сторонних программ
  • 🔍 Какие инструменты платформы помогут прочитать данные
  • 💻 Готовые примеры кода для парсинга разных типов XML
  • ⚠️ Типичные ошибки и как их избежать

1. Что такое XML и почему его используют в 1С

XML (eXtensible Markup Language) — это текстовый формат, который позволяет структурировать данные с помощью тегов. В отличие от JSON или CSV, он поддерживает иерархию, атрибуты и пространства имён, что делает его идеальным для документооборота. В экосистеме 1С XML применяется для:

Вот лишь несколько примеров, где вы можете встретить XML в работе с 1С:

  • 📄 Обмен данными между базами (выгрузка/загрузка справочников, документов)
  • 🏦 Импорт банковских выписок и платёжных поручений
  • 📦 Интеграция с маркетплейсами (Ozon, Wildberries, Яндекс.Маркет)
  • 📊 Экспорт отчётности в контролирующие органы (ФНС, ПФР, ФСС)
  • 🔄 Обмен с внешними системами (CRM, WMS, ERP)

Основное преимущество XML в 1С — это встроенная поддержка на уровне платформы. Вам не нужно устанавливать дополнительные библиотеки или писать сложные парсеры: всё необходимое уже есть в стандартных объектах ЧтениеXML, ЗаписьXML и XDTO.

Однако у формата есть и минусы:

  • 🐢 Большой размер файлов по сравнению с бинарными форматами
  • 🤯 Сложность ручного редактирования при большой вложенности тегов
  • ⚠️ Чувствительность к регистру и синтаксическим ошибкам
📊 С какими XML-файлами вы чаще работаете в 1С?
Банковские выписки
Данные от маркетплейсов
Обмен между базами 1С
Отчётность для госорганов
Другое

2. Способы открытия XML-файлов в 1С

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

Самый простой метод — использовать встроенный механизм чтения из файла. Для этого:

  1. Поместите XML-файл в доступную папку (например, на рабочий стол или сетевой диск).
  2. В конфигураторе или предприятии откройте окно ввода кода (например, через Файл → Новый → Обработка).
  3. Используйте объект ЧтениеXML для загрузки данных.

Пример минимального кода для открытия файла:

ПутьКФайлу = "C:\Temp\data.xml";

Чтение = Новый ЧтениеXML();

Чтение.ОткрытьФайл(ПутьКФайлу);

Если XML приходит не из файла, а например, в виде строки (например, ответ от веб-сервиса), используйте метод УстановитьСтроку():

XMLСтрока = "<Root><Item>Тест</Item></Root>";

Чтение = Новый ЧтениеXML();

Чтение.УстановитьСтроку(XMLСтрока);

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

Чтение = Новый ЧтениеXML();

Чтение.ОткрытьФайл(ПутьКФайлу, Ложь); // Второй параметр "Ложь" включает потоковый режим

💡

Если XML-файл весит больше 50 МБ, обязательно используйте потоковое чтение (ОткрытьФайл(,, Ложь)), иначе 1С может зависнуть или выдать ошибку нехватки памяти.

Альтернативный способ — загрузка через XDTO-пакеты. Это более продвинутый метод, который подходит для работы со схемой XML (XSD). Например:

ФабрикаXDTO = Новый ФабрикаXDTO();

ПакетXDTO = ФабрикаXDTO.Package("http://example.com/schema");

Чтение = Новый ЧтениеXML();

Чтение.ОткрытьФайл(ПутьКФайлу);

ДокументXDTO = ПакетXDTO.ПрочитатьXML(Чтение);

Выбор метода зависит от структуры вашего XML:

СпособКогда использоватьПлюсыМинусы
ЧтениеXMLПростые XML без схемыБыстро, не требует настройкиНет валидации по XSD
XDTOXML со схемой (XSD)Проверка структуры, типовая обработкаТребует предварительную настройку пакетов
Внешние компонентыСложные XML с пространствами имёнГибкость, поддержка стандартовДополнительные зависимости
Ручной парсингОчень специфичные форматыПолный контрольТрудоёмко, ошибкоопасно

3. Пошаговый разбор XML: от тегов к данным

Теперь, когда файл открыт, нужно извлечь из него данные. Рассмотрим процесс на примере типичного XML-документа с каталогом товаров:

Допустим, у нас есть файл catalog.xml такого вида:

<?xml version="1.0" encoding="utf-8"?>

<Catalog>

<Item id="1001">

<Name>Ноутбук</Name>

<Price>45000</Price>

<Stock>15</Stock>

</Item>

<Item id="1002">

<Name>Монитор</Name>

<Price>22000</Price>

<Stock>8</Stock>

</Item>

</Catalog>

Чтобы прочитать этот файл в 1С, выполните следующие шаги:

  1. Откройте файл для чтения:
    Чтение = Новый ЧтениеXML();
    

    Чтение.ОткрытьФайл("C:\Temp\catalog.xml");

  2. Пропустите XML-декларацию (если есть):
    Чтение.Пропустить(); // Пропускаем <?xml ... ?>
  3. Перейдите к корневому элементу:
    Если Чтение.ТипУзла() = ТипУзлаXML.НачалоЭлемента Тогда
    

    ИмяЭлемента = Чтение.Имя;

    КонецЕсли;

  4. Организуйте цикл по дочерним элементам:
    Пока Чтение.Читать() Цикл
    

    Если Чтение.ТипУзла() = ТипУзлаXML.НачалоЭлемента Тогда

    Если Чтение.Имя = "Item" Тогда

    // Обработка товара

    КонецЕсли;

    КонецЕсли;

    КонецЦикла;

Для извлечения данных из тега <Item> можно использовать такой код:

Атрибуты = Чтение.Атрибуты;

IDТовара = Атрибуты.Получить("id");

Пока Чтение.Читать() Цикл

Если Чтение.ТипУзла() = ТипУзлаXML.НачалоЭлемента Тогда

ТекущийТег = Чтение.Имя;

Чтение.Читать(); // Переходим к содержимому тега

Если ТекущийТег = "Name" Тогда

Наименование = Чтение.Значение;

ИначеЕсли ТекущийТег = "Price" Тогда

Цена = Чтение.Значение;

ИначеЕсли ТекущийТег = "Stock" Тогда

Остаток = Чтение.Значение;

КонецЕсли;

ИначеЕсли Чтение.ТипУзла() = ТипУзлаXML.КонецЭлемента Тогда

Если Чтение.Имя = "Item" Тогда

Прервать; // Завершили обработку одного товара

КонецЕсли;

КонецЕсли;

КонецЦикла;

После этого у вас в переменных будут данные одного товара: IDТовара, Наименование, Цена и Остаток. Их можно записать в справочник или таблицу значений для дальнейшей обработки.

Открыть файл через ЧтениеXML|Проверить тип текущего узла|Обработать атрибуты элемента|Извлечь данные из дочерних тегов|Закрыть файл после обработки-->

4. Работа с пространствами имён и сложными структурами

Не все XML-файлы так просты, как в предыдущем примере. Часто встречаются документы с пространствами имён (namespaces), которые усложняют парсинг. Например, банковские выписки или файлы обмена с госорганами могут выглядеть так:

<ns1:Document xmlns:ns1="urn:some:namespace">

<ns1:Header>...</ns1:Header>

<ns1:Body>

<ns1:Transaction>...</ns1:Transaction>

</ns1:Body>

</ns1:Document>

Чтобы правильно обработать такой XML, нужно учитывать пространства имён при чтении тегов. В 1С для этого используется метод ЛокальноеИмя(), который возвращает имя тега без префикса пространства.

Пример кода для работы с пространствами имён:

Чтение = Новый ЧтениеXML();

Чтение.ОткрытьФайл("C:\Temp\bank.xml");

Пока Чтение.Читать() Цикл

Если Чтение.ТипУзла() = ТипУзлаXML.НачалоЭлемента Тогда

ЛокИмя = Чтение.ЛокальноеИмя();

Если ЛокИмя = "Transaction" Тогда

// Обработка транзакции

Сообщение = Новый СообщениеПользователю();

Сообщение.Текст = "Найдена транзакция: " + Чтение.Значение;

Сообщение.Сообщить();

КонецЕсли;

КонецЕсли;

КонецЦикла;

Для упрощения работы со сложными XML рекомендуется:

  • 🔍 Использовать XDTO, если есть схема (XSD). Это автоматически разрешит пространства имён.
  • 📝 Вести журнал обработки, чтобы отлаживать ошибки.
  • 🛠️ Для повторяющихся задач создавать обработки с готовыми функциями.
Как узнать пространство имён в XML?

Пространство имён обычно указывается в атрибуте xmlns корневого элемента, например:

<Root xmlns="http://example.com/ns">

или с префиксом:

<ns:Root xmlns:ns="http://example.com/ns">

В 1С можно получить URI пространства имён через метод URIПространстваИмен() объекта ЧтениеXML.

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

5. Типичные ошибки при чтении XML и как их избежать

Даже опытные разработчики иногда сталкиваются с проблемами при работе с XML в 1С. Вот наиболее распространённые ошибки и способы их решения:

1. Ошибка "Неверный формат XML"

  • 🔹 Причина: Файл повреждён или содержит недопустимые символы.
  • 🔹 Решение: Откройте XML в Notepad++ или VS Code и проверьте на валидность (например, через онлайн-валидатор). Убедитесь, что кодировка файла совпадает с указанной в декларации (encoding="utf-8").

2. Не читаются кириллические символы

  • 🔹 Причина: Несовпадение кодировок (например, файл в windows-1251, а чтение идёт как utf-8).
  • 🔹 Решение: Явно укажите кодировку при открытии:
    Чтение.ОткрытьФайл(ПутьКФайлу,, КодировкаТекста.UTF8); // или Windows

3. Пропущены данные внутри тегов

  • 🔹 Причина: Неправильная обработка вложенных элементов или отсутствие проверки типа узла.
  • 🔹 Решение: Всегда проверяйте ТипУзла() перед чтением значения:
    Если Чтение.ТипУзла() = ТипУзлаXML.Текст Тогда
    

    Значение = Чтение.Значение;

    КонецЕсли;

4. Ошибка "Не найден атрибут"

  • 🔹 Причина: Атрибут записан с другим регистром или в другом пространстве имён.
  • 🔹 Решение: Используйте Атрибуты.Найти() с точным именем:
    Атрибут = Чтение.Атрибуты.Найти("id");
    

    Если Атрибут = Неопределено Тогда

    // Атрибут отсутствует

    Иначе

    ID = Атрибут.Значение;

    КонецЕсли;

5. Зависание при чтении большого файла

  • 🔹 Причина: Файл обрабатывается не в потоковом режиме.
  • 🔹 Решение: Используйте ОткрытьФайл(,, Ложь) для потокового чтения.
💡

Всегда проверяйте XML на валидность ПЕРЕД обработкой в 1С. Это сэкономит часы отладки.

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

ЗаписьЖурналаРегистрации(НСтр("ru = 'Чтение XML'"), УровеньЖурналаРегистрации.Информация,, "Текущий тег: " + Чтение.Имя);
-->

6. Продвинутые техники: XDTO и преобразование в таблицы

Для работы со сложными XML, особенно если есть схема (XSD), удобно использовать XDTO (XML Data Binding). Этот механизм позволяет связать XML-структуру с объектами 1С, что упрощает чтение и запись данных.

Рассмотрим пример работы с XDTO на базе XML с банковской выпиской:

Шаг 1. Создайте XDTO-пакет

  1. В конфигураторе откройте дерево объектов и найдите ветку XDTO-пакеты.
  2. Создайте новый пакет и укажите пространство имён из вашего XML (например, urn:swift:xsd$bank.statement).
  3. Импортируйте схему XSD, если она есть, или опишите структуру вручную.

Шаг 2. Прочитайте XML через XDTO

ФабрикаXDTO = Новый ФабрикаXDTO();

Пакет = ФабрикаXDTO.Package("urn:swift:xsd$bank.statement");

ЧтениеXML = Новый ЧтениеXML();

ЧтениеXML.ОткрытьФайл("C:\Temp\statement.xml");

Документ = Пакет.ПрочитатьXML(ЧтениеXML);

Шаг 3. Извлеките данные из объекта XDTO

СписокТранзакций = Документ.Transactions;

Для Каждого Транзакция Из СписокТранзакций Цикл

Дата = Транзакция.Date;

Сумма = Транзакция.Amount;

Назначение = Транзакция.Description;

// Запись в документ 1С

КонецЦикла;

Преимущества XDTO:

  • 🔧 Автоматическая валидация по схеме XSD.
  • 📌 Типизация данных (например, даты и числа преобразуются автоматически).
  • 🔄 Удобное преобразование в объекты 1С (справочники, документы).

Если у вас нет схемы XSD, но нужно преобразовать XML в таблицу значений для дальнейшей обработки, можно использовать такой подход:

ТаблицаДанных = Новый ТаблицаЗначений();

ТаблицаДанных.Колонки.Добавить("Наименование");

ТаблицаДанных.Колонки.Добавить("Цена");

Чтение = Новый ЧтениеXML();

Чтение.ОткрытьФайл("C:\Temp\catalog.xml");

Пока Чтение.Читать() Цикл

Если Чтение.ТипУзла() = ТипУзлаXML.НачалоЭлемента И Чтение.Имя = "Item" Тогда

НоваяСтрока = ТаблицаДанных.Добавить();

Пока Чтение.Читать() Цикл

Если Чтение.ТипУзла() = ТипУзлаXML.НачалоЭлемента Тогда

Тег = Чтение.Имя;

Чтение.Читать();

Если Тег = "Name" Тогда

НоваяСтрока.Наименование = Чтение.Значение;

ИначеЕсли Тег = "Price" Тогда

НоваяСтрока.Цена = Чтение.Значение;

КонецЕсли;

ИначеЕсли Чтение.ТипУзла() = ТипУзлаXML.КонецЭлемента И Чтение.Имя = "Item" Тогда

Прервать;

КонецЕсли;

КонецЦикла;

КонецЕсли;

КонецЦикла;

Готовая таблица значений может быть передана в отчёт, обработку или использована для массового создания элементов справочников.

7. Автоматизация: обработки и фоновые задания

Если чтение XML — регулярная задача, имеет смысл автоматизировать процесс. В 1С это можно сделать несколькими способами:

1. Создание обработки с графическим интерфейсом

  • 📁 Добавьте в обработку поля для выбора файла и кнопку "Загрузить".
  • 🔄 Реализуйте логику чтения XML в модуле обработки.
  • 📊 Добавьте вывод результатов в таблицу на форме.

Пример кода для кнопки:

Процедура ЗагрузитьXML(Команда)

ПутьКФайлу = ПолноеИмяФайла; // Поле ввода на форме

Если НЕ ЗначениеЗаполнено(ПутьКФайлу) Тогда

Предупреждение("Укажите файл XML!");

Возврат;

КонецЕсли;

Результат = ПрочитатьXMLФайл(ПутьКФайлу); // Ваша функция чтения

ЭлементыФормы.ТаблицаРезультатов.Значение = Результат;

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

2. Фоновое задание для регулярной загрузки

Если XML-файлы поступают по расписанию (например, ежедневные выписки от банка), настройте фоновое задание:

  1. В конфигураторе создайте новый объект Фоновое задание.
  2. Укажите расписание (например, каждый день в 9:00).
  3. В модуле задания реализуйте логику чтения XML из заданной папки.

Пример кода для фонового задания:

Процедура Выполнить(Параметры) Экспорт

Папка = "C:\IncomingXML\";

Файлы = НайтиФайлы(Папка + "*.xml");

Для Каждого Файл Из Файлы Цикл

Попытка

Данные = ПрочитатьXMLФайл(Файл.ПолноеИмя);

ОбработатьДанные(Данные); // Ваша логика обработки

ПереместитьФайл(Файл.ПолноеИмя, Папка + "Archive\" + Файл.Имя);

Исключение

ЗаписьЖурналаРегистрации(НСтр("ru = 'Ошибка обработки XML'"), УровеньЖурналаРегистрации.Ошибка,, ОписаниеОшибки());

КонецПопытки;

КонецЦикла;

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

3. Интеграция с HTTP-сервисами

Если XML приходит по API (например, от маркетплейса), используйте HTTPСоединение для загрузки данных:

HTTP = Новый HTTPСоединение("api.example.com");

Запрос = Новый HTTPЗапрос("/orders.xml");

Ответ = HTTP.Получить(Запрос);

Если Ответ.КодСостояния = 200 Тогда

ЧтениеXML = Новый ЧтениеXML();

ЧтениеXML.УстановитьСтроку(Ответ.ПолучитьТекст());

// Дальнейшая обработка

Иначе

Сообщить("Ошибка загрузки: " + Ответ.КодСостояния);

КонецЕсли;

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

8. Оптимизация и безопасность при работе с XML

При интенсивной работе с XML в 1С важно следить за производительностью и безопасностью. Вот несколько рекомендаций:

1. Оптимизация скорости чтения

  • 🚀 Для больших файлов (>10 МБ) используйте потоковое чтение (ОткрытьФайл(,, Ложь)).
  • 🗃️ Если нужно прочитать только часть данных, пропускайте ненужные узлы с помощью Пропустить().
  • 🔄 Кэшируйте часто используемые XML-файлы в базе (например, в регистре сведений).

2. Безопасность

  • 🔒 Проверяйте XML на наличие вредоносного кода (например, XXE-атак). Отключите обработку внешних сущностей:
    ЧтениеXML.ЗапретитьОбработкуВнешнихСущностей(Истина);
  • 🛡️ Ограничивайте размер загружаемых файлов (например, не более 50 МБ).
  • 🔐 Храните чувствительные данные (пароли, токены) не в XML, а в защищённых хранилищах 1С.

3. Логирование и мониторинг

  • 📝 Ведите журнал обработки XML (успешные и ошибочные операции).
  • 🔔 Настройте оповещения при критических ошибках (например, через email или Telegram-бот).
  • 📊 Анализируйте время выполнения операций для выявления "узких мест".

Пример безопасного чтения XML с защитой от XXE:

Чтение = Новый ЧтениеXML();

Чтение.ЗапретитьОбработкуВнешнихСущностей(Истина); // Защита от XXE

Чтение.ОткрытьФайл(ПутьКФайлу);

Попытка

// Обработка XML

Исключение

ЗаписьЖурналаРегистрации(НСтр("ru = 'Ошибка XML'"), УровеньЖурналаРегистрации.Ошибка,, ОписаниеОшибки());

Сообщить("Ошибка при чтении XML: " + ОписаниеОшибки());

КонецПопытки;

Если вы работаете с XML от внешних источников (банки, госорганы, партнёры), всегда проверяйте:

  • 🔍 Соответствие структуры XML ожидаемой схеме.
  • 📅 Актуальность данных (например, дату формирования выписки).
  • 🔢 Корректность числовых значений (например, суммы в выписке не должны быть отрицательными).
💡

Всегда запрещайте обработку внешних сущностей (ЗапретитьОбработкуВнешнихСущностей(Истина)) при чтении XML из ненадёжных источников.

Для сложных интеграций рассмотрите возможность использования промежуточного слоя (например, микросервиса), который будет предварительно валидировать и преобразовывать XML перед передачей в 1С. Это снизит нагрузку на базу и повысит надёжность.

FAQ: Ответы на частые вопросы

Как прочитать XML с кириллическими символами, если они отображаются кракозябрами?

Проблема обычно связана с неверной кодировкой. Попробуйте явно указать кодировку при открытии файла:

Чтение.ОткрытьФайл(ПутьКФайлу,, КодировкаТекста.Windows); // или UTF8

Если это не помогает, откройте файл в Notepad++ и посмотрите его текущую кодировку в меню Кодировки. Затем используйте соответствующую кодировку в 1С.

Можно ли прочитать XML прямо из строки без сохранения в файл?

Да, для этого используйте метод