Обмен данными через XML — один из ключевых механизмов интеграции 1С:Предприятие с внешними системами: бухгалтерскими программами, CRM, интернет-магазинами или госорганами. Несмотря на распространённость форматов JSON и CSV, XML остаётся стандартом для структурированного обмена благодаря поддержке встроенных средств 1С, возможности валидации через XSD-схемы и совместимости с большинством государственных сервисов (например, ФНС или Росстат).
Эта статья поможет разобраться, как читать и записывать XML в 1С 8.3, настраивать обмен с внешними системами, обрабатывать типичные ошибки и оптимизировать производительность. Мы рассмотрим как ручные методы через встроенный язык, так и автоматизированные инструменты — УниверсальныеФорматыОбменаДанными, ЗаписьXML/ЧтениеXML, а также интеграцию с веб-сервисами. Особое внимание уделим обмену с 1С:Бухгалтерией и 1С:УТ через XML, так как это наиболее востребованные сценарии среди пользователей.
Если вы никогда не работали с XML в 1С, начните с базовых примеров чтения и записи файлов. Опытным разработчикам будут полезны разделы про обработку больших файлов и оптимизацию обмена через Потоки.
1. Основы XML в 1С: структура и терминология
Перед тем как приступать к практике, важно понять, что такое XML в контексте 1С. Это текстовый формат, который хранит данные в виде иерархической структуры с тегами. Например, файл обмена товарами между 1С:УТ и сайтом может выглядеть так:
<Каталог>
<Товар>
<Наименование>Монитор 24"</Наименование>
<Артикул>MON-001</Артикул>
<Цена>18000</Цена>
</Товар>
</Каталог>
В 1С для работы с XML используются следующие ключевые объекты:
- 📄
ЗаписьXML— класс для создания XML-файлов. - 📖
ЧтениеXML— класс для парсинга существующих файлов. - 🔄
XDTO— механизм для работы сXSD-схемами (валидация и генерация структур). - 🔗
УниверсальныеФорматыОбменаДанными— стандартный функционал для обмена между конфигурациями 1С.
Важно отличать простой XML (произвольная структура) от типизированного (с привязкой к XSD-схеме). Последний чаще используется в госотчётности (например, СБИС или Контур.Диадок), где требуется строгая валидация.
2. Чтение XML в 1С: пошаговая инструкция
Рассмотрим, как загрузить данные из XML в 1С 8.3 на примере файла с товарами. Предположим, у нас есть файл catalog.xml следующей структуры:
<Каталог>
<Товар Ид="1">
<Наименование>Ноутбук</Наименование>
<Цена>50000</Цена>
</Товар>
<Товар Ид="2">
<Наименование>Смартфон</Наименование>
<Цена>30000</Цена>
</Товар>
</Каталог>
Для чтения файла используем объект ЧтениеXML:
// Подключаем файл
ПутьКФайлу = "C:\obmen\catalog.xml";
Чтение = Новый ЧтениеXML();
Чтение.ОткрытьФайл(ПутьКФайлу);
// Обрабатываем узлы
Пока Чтение.Прочитать() Цикл
Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Если Чтение.Имя = "Товар" Тогда
Ид = Чтение.ЗначениеАтрибута("Ид");
ИначеЕсли Чтение.Имя = "Наименование" Тогда
Наименование = Чтение.ПрочитатьТекст();
ИначеЕсли Чтение.Имя = "Цена" Тогда
Цена = Чтение.ПрочитатьТекст();
КонецЕсли;
КонецЕсли;
КонецЦикла;
Чтение.Закрыть();
Этот код последовательно считывает все узлы файла и извлекает данные. Для удобства можно использовать рекурсивную обработку, если структура XML вложенная.
☑️ Подготовка к чтению XML
⚠️ Внимание: Если XML-файл содержит кириллицу, убедитесь, что он сохранён в кодировке UTF-8. В противном случае 1С может неправильно интерпретировать символы, что приведёт к ошибкам при чтении.
3. Запись XML в 1С: создание файлов обмена
Для генерации XML в 1С используется объект ЗаписьXML. Рассмотрим пример создания файла со списком контрагентов:
// Создаём объект записи
Запись = Новый ЗаписьXML();
Запись.ОткрытьФайл("C:\obmen\contractors.xml", "UTF-8");
// Записываем корневой элемент
Запись.ЗаписатьНачалоЭлемента("Контрагенты");
// Добавляем данных (например, из справочника)
Выборка = Справочники.Контрагенты.Выбрать();
Пока Выборка.Следующий() Цикл
Запись.ЗаписатьНачалоЭлемента("Контрагент");
Запись.ЗаписатьАтрибут("Ид", Выборка.Ссылка.УникальныйИдентификатор());
Запись.ЗаписатьТекст("Наименование", Выборка.Наименование);
Запись.ЗаписатьТекст("ИНН", Выборка.ИНН);
Запись.ЗаписатьКонецЭлемента(); // Закрываем Контрагент
КонецЦикла;
Запись.ЗаписатьКонецЭлемента(); // Закрываем Контрагенты
Запись.Закрыть();
Ключевые моменты:
- 📌 Всегда указывайте кодировку (
"UTF-8") при открытии файла. - 🔄 Используйте
ЗаписатьАтрибут()для добавления атрибутов тега (например,Ид="123"). - 📝 Для больших файлов (>10 000 строк) используйте потоковую запись через
ЗаписьXML.ОткрытьПоток().
⚠️ Внимание: При записи дат в XML используйте форматГГГГ-ММ-ДД(например,2026-05-20). В противном случае внешняя система может некорректно интерпретировать данные.
4. Обмен данными между конфигурациями 1С через XML
Для обмена между разными базами 1С (например, 1С:Бухгалтерия и 1С:ЗУП) удобно использовать стандартный механизм УниверсальныеФорматыОбменаДанными. Он позволяет:
- 🔄 Экспортировать справочники и документы в XML.
- 📥 Импортировать данные с автоматическим сопоставлением объектов.
- 🔍 Контролировать версии обмена.
Пример выгрузки справочника Номенклатура:
// Создаём пакет обмена
Пакет = Новый ПакетОбмена();
Пакет.ИмяФайла = "nomenklatura.xml";
// Добавляем данные
Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
Пакет.ДобавитьОбъект(Выборка.Ссылка);
КонецЦикла;
// Записываем в файл
Пакет.Записать();
Для импорта используйте метод Прочитать():
Пакет = Новый ПакетОбмена();
Пакет.Прочитать("C:\obmen\nomenklatura.xml");
Пакет.Загрузить();
Преимущества этого подхода:
| Способ обмена | Плюсы | Минусы |
|---|---|---|
УниверсальныеФорматыОбменаДанными |
Автоматическое сопоставление объектов, контроль версий | Требует одинаковых конфигураций или ручной настройки правил |
Ручной ЗаписьXML/ЧтениеXML |
Гибкость, работа с любыми структурами | Трудоёмкость при сложных схемах |
XDTO (с XSD-схемой) |
Валидация, поддержка стандартов (например, УПД) | Сложность настройки для новичков |
Если обмен происходит регулярно, настройте регламентное задание в 1С для автоматической выгрузки XML по расписанию (например, ежедневно в 23:00).
5. Обработка ошибок при работе с XML
Типичные ошибки при работе с XML в 1С и способы их решения:
- 🚨
Ошибка при чтении XML: неверный формат— проверьте кодировку файла и наличие закрывающих тегов. - 🚨
Атрибут не найден— убедитесь, что имя атрибута указано верно (регистр имеет значение!). - 🚨
Несоответствие типов данных— например, попытка записать число в текстовом поле.
Для отладки используйте конструкцию Попытка...Исключение:
Попытка
ЧтениеXML.ОткрытьФайл(ПутьКФайлу);
// ... код чтения ...
Исключение
Сообщить("Ошибка: " + ОписаниеОшибки());
ЗаписатьЛог(ОписаниеОшибки()); // Для анализа
КонецПопытки;
Если ошибка связана с XSD-валидацией, проверьте:
- 🔍 Соответствие структуры XML схеме.
- 🔍 Наличие обязательных полей.
- 🔍 Формат данных (например, дата должна быть в
YYYY-MM-DD).
Как проверить XML на валидность?
Используйте онлайн-валидаторы (например, XMLValidation) или встроенные средства 1С через XDTOПакеты.ПрочитатьXML() с указанием схемы XSD.
6. Оптимизация работы с большими XML-файлами
При обработке файлов объёмом >100 МБ стандартные методы ЧтениеXML/ЗаписьXML могут работать медленно. Для ускорения используйте:
- 🚀 Потоковую обработку — чтение/запись данных порциями.
- 🚀
DOM-парсинг (для сложных структур) черезXDTOМодель. - 🚀 Разбивку на части — обработку файла в несколько этапов.
Пример потокового чтения:
Чтение = Новый ЧтениеXML();
Чтение.ОткрытьФайл(ПутьКФайлу);
Пока Чтение.Прочитать() Цикл
Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
// Обрабатываем только нужные узлы
Если Чтение.Имя = "Товар" Тогда
Данные = ОбработатьТовар(Чтение);
ЗаписатьВБазу(Данные);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Для записи больших файлов используйте ЗаписьXML.ОткрытьПоток():
Поток = Новый ЗаписьДвоичныхДанных();
Поток.ОткрытьФайл("big_file.xml");
Запись = Новый ЗаписьXML();
Запись.ОткрытьПоток(Поток);
// ... запись данных ...
Запись.Закрыть();
⚠️ Внимание: При потоковой обработке избегайте хранения всех данных в памяти. Используйте временные таблицы или запись в базу по мере чтения.
Для файлов >1 ГБ рассмотрите возможность использования внешних инструментов (например, Python или C#) для предварительной обработки XML перед загрузкой в 1С.
7. Интеграция с веб-сервисами через XML (SOAP)
1С поддерживает обмен данными с веб-сервисами по протоколу SOAP, который часто использует XML для передачи данных. Например, для отправки данных в ФНС или ПФР.
Пример вызова SOAP-сервиса:
// Создаём HTTP-соединение
HTTPСоединение = Новый HTTPСоединение("https://service.example.com/wsdl");
// Формируем XML-запрос
Запрос = Новый ЗаписьXML();
Запрос.ОткрытьСтроку();
Запрос.ЗаписатьОбъявлениеXML();
Запрос.ЗаписатьНачалоЭлемента("soap:Envelope");
Запрос.ЗаписатьНачалоЭлемента("soap:Body");
Запрос.ЗаписатьНачалоЭлемента("GetDataRequest");
Запрос.ЗаписатьТекст("Parameter", "Value");
Запрос.ЗаписатьКонецЭлемента(); // GetDataRequest
// ... закрываем теги ...
XMLСтрока = Запрос.Закрыть();
// Отправляем запрос
Ответ = HTTPСоединение.Постить("/endpoint", XMLСтрока);
// Обрабатываем ответ
Чтение = Новый ЧтениеXML();
Чтение.ОткрытьСтроку(Ответ.ПолучитьТекст());
Особенности работы с SOAP:
- 🔌 Требуется
WSDL-описание сервиса для генерации прокси-классов в 1С. - 🔐 Часто нужна аутентификация (например, через
HTTP-заголовкиилиWS-Security). - 📡 Для отладки используйте Postman или SoapUI.
8. Примеры готовых решений для типичных задач
Рассмотрим реальные сценарии использования XML в 1С:
| Задача | Решение | Пример кода |
|---|---|---|
Выгрузка справочника Номенклатура для сайта |
ЗаписьXML + цикл по справочнику |
|
| Импорт курсов валют из ЦБ РФ | Парсинг XML с сайта ЦБ через ЧтениеXML |
|
| Обмен с 1С:Бухгалтерией (выгрузка документов) | УниверсальныеФорматыОбменаДанными |
|
Для автоматизации рутинных задач (например, ежедневной выгрузки прайс-листов) создайте внешнюю обработку с графическим интерфейсом, где пользователь сможет:
- 📁 Выбирать путь к файлу.
- 🔄 Настраивать фильтры (например, только активные товары).
- ⚙️ Указывать формат даты/чисел.
Для обмена с 1С:УТ 11 и 1С:ERP используйте стандартные обработки "ВыгрузкаЗагрузкаДанныхXML", которые идут в комплекте с конфигурацией.
FAQ: Частые вопросы по работе с XML в 1С
Как преобразовать XML в таблицу значений?
Используйте цикл чтения ЧтениеXML и динамически добавляйте строки в ТаблицаЗначений:
ТЗ = Новый ТаблицаЗначений();
ТЗ.Колонки.Добавить("Наименование");
ТЗ.Колонки.Добавить("Цена");
Пока Чтение.Прочитать() Цикл
Если Чтение.Имя = "Товар" Тогда
Строка = ТЗ.Добавить();
Строка.Наименование = Чтение.ПрочитатьТекст("Наименование");
Строка.Цена = Чтение.ПрочитатьТекст("Цена");
КонецЕсли;
КонецЦикла;
Можно ли редактировать XML прямо в 1С без выгрузки?
Да, с помощью объекта XDTOМодель или DOM-парсера. Например:
Документ = Новый DOMДокумент();
Документ.Загрузить("file.xml");
Узел = Документ.ПолучитьЭлементыПоИмени("Цена")[0];
Узел.ТекстовоеСодержимое = "25000";
Документ.Сохранить("file_updated.xml");
Но для простых правок удобнее использовать внешние редакторы (например, Notepad++ с плагином XML Tools).
Как валидировать XML по XSD-схеме в 1С?
Используйте механизм XDTO:
Фабрика = Новый ФабрикаXDTO();
Фабрика.ПространстваИмен.Добавить("http://example.com/schema", "file.xsd");
Пакет = Фабрика.SчитатьXML(Новый ПотокВПамяти(XMLСтрока));
Если структура не соответствует схеме, будет выброшено исключение.
Какие альтернативы XML есть в 1С?
В зависимости от задачи:
- 📄 JSON — для обмена с веб-приложениями (используйте
ЧтениеJSON/ЗаписьJSON). - 📑 CSV — для простых табличных данных (например, прайс-листы).
- 📊 Excel — через
ЧтениеТабличногоДокумента.
XML остаётся предпочтительным для сложных иерархических структур и госотчётности.
Как ускорить обмен данными между двумя базами 1С?
Рекомендации:
- 🚀 Используйте прямое подключение через
COM-соединениевместо XML. - 🚀 Настройте регламентные задания на ночное время.
- 🚀 Применяйте инкрементальную выгрузку (только изменённые данные).
- 🚀 Для больших объёмов используйте распределённую инфобазу.