Введение
XML (eXtensible Markup Language) - один из самых популярных форматов для обмена данными между различными системами. В 1С работа с XML используется для:
-
Обмена данными между базами 1С
-
Интеграции с другими программами и веб-сервисами
-
Создания универсальных выгрузок для отчетности
-
Резервного копирования данных
В этой статье мы разберем два основных подхода к работе с XML в 1С.
Способ 1: Простая выгрузка и загрузка через ЗаписьXML и ЧтениеXML
Этот подход подходит для простых структур данных, когда нам нужно быстро выгрузить или загрузить данные без сложной структуры.
Выгрузка данных в XML
bsl// Процедура для выгрузки справочника "Контрагенты" в XML &НаСервере Процедура ВыгрузитьКонтрагентовВXML(ПутьКФайлу) // Создаем объект для записи XML ЗаписьXML = Новый ЗаписьXML; ЗаписьXML.ОткрытьФайл(ПутьКФайлу); // Начинаем запись документа ЗаписьXML.ЗаписатьОбъявлениеXML(); ЗаписьXML.ЗаписатьНачалоЭлемента("Контрагенты"); // Выбираем все элементы справочника Контрагенты Выборка = Справочники.Контрагенты.Выбрать(); Пока Выборка.Следующий() Цикл ЗаписьXML.ЗаписатьНачалоЭлемента("Контрагент"); ЗаписьXML.ЗаписатьНачалоЭлемента("Наименование"); ЗаписьXML.ЗаписатьТекст(Выборка.Наименование); ЗаписьXML.ЗаписатьКонецЭлемента(); ЗаписьXML.ЗаписатьНачалоЭлемента("ИНН"); ЗаписьXML.ЗаписатьТекст(Выборка.ИНН); ЗаписьXML.ЗаписатьКонецЭлемента(); ЗаписьXML.ЗаписатьНачалоЭлемента("КПП"); ЗаписьXML.ЗаписатьТекст(Выборка.КПП); ЗаписьXML.ЗаписатьКонецЭлемента(); ЗаписьXML.ЗаписатьКонецЭлемента(); // Контрагент КонецЦикла; ЗаписьXML.ЗаписатьКонецЭлемента(); // Контрагенты ЗаписьXML.Закрыть(); Сообщить("Выгрузка завершена! Файл: " + ПутьКФайлу); КонецПроцедуры
Результат выгрузки (пример):
xml<?xml version="1.0" encoding="UTF-8"?> <Контрагенты> <Контрагент> <Наименование>ООО "Ромашка"</Наименование> <ИНН>7712345678</ИНН> <КПП>771201001</КПП> </Контрагент> <Контрагент> <Наименование>АО "Весна"</Наименование> <ИНН>7723456789</ИНН> <КПП>772301002</КПП> </Контрагент> </Контрагенты>
Загрузка данных из XML
bsl// Процедура для загрузки контрагентов из XML &НаСервере Процедура ЗагрузитьКонтрагентовИзXML(ПутьКФайлу) // Создаем объект для чтения XML ЧтениеXML = Новый ЧтениеXML; ЧтениеXML.ОткрытьФайл(ПутьКФайлу); // Переменные для хранения текущих данных ТекНаименование = ""; ТекИНН = ""; ТекКПП = ""; // Читаем XML Пока ЧтениеXML.Прочитать() Цикл // Обрабатываем начало элемента "Контрагент" Если ЧтениеXML.ИмяЭлемента = "Контрагент" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда // Сбрасываем значения для нового контрагента ТекНаименование = ""; ТекИНН = ""; ТекКПП = ""; ИначеЕсли ЧтениеXML.ИмяЭлемента = "Наименование" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда ЧтениеXML.Прочитать(); ТекНаименование = ЧтениеXML.Значение; ИначеЕсли ЧтениеXML.ИмяЭлемента = "ИНН" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда ЧтениеXML.Прочитать(); ТекИНН = ЧтениеXML.Значение; ИначеЕсли ЧтениеXML.ИмяЭлемента = "КПП" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда ЧтениеXML.Прочитать(); ТекКПП = ЧтениеXML.Значение; // Обрабатываем конец элемента "Контрагент" - создаем элемент ИначеЕсли ЧтениеXML.ИмяЭлемента = "Контрагент" И ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда // Создаем нового контрагента Попытка Если Не ПустаяСтрока(ТекНаименование) Тогда НовыйКонтрагент = Справочники.Контрагенты.СоздатьЭлемент(); НовыйКонтрагент.Наименование = ТекНаименование; НовыйКонтрагент.ИНН = ТекИНН; НовыйКонтрагент.КПП = ТекКПП; НовыйКонтрагент.Записать(); Сообщить("Добавлен: " + ТекНаименование); КонецЕсли; Исключение Сообщить("Ошибка при создании контрагента: " + ТекНаименование); КонецПопытки; КонецЕсли; КонецЦикла; ЧтениеXML.Закрыть(); Сообщить("Загрузка завершена!"); КонецПроцедуры
Способ 2: Работа с XDTO (XML Data Transfer Objects)
XDTO - более мощный и структурированный способ работы с XML, который позволяет работать со сложными XML-схемами.
Создание фабрики XDTO и загрузка схемы
bsl// Создаем фабрику XDTO ФабрикаXDTO = Новый ФабрикаXDTO; // Загружаем пространство имен и схему ПространствоИмен = ФабрикаXDTO.ОпределитьПространствоИмен("http://example.com/myschema");
Выгрузка данных через XDTO
bsl&НаСервере Процедура ВыгрузитьЧерезXDTO(ПутьКФайлу) ФабрикаXDTO = Новый ФабрикаXDTO; ПространствоИмен = ФабрикаXDTO.ОпределитьПространствоИмен("http://example.com/contractors"); // Создаем корневой элемент КорневойЭлемент = ФабрикаXDTO.Создать(ПространствоИмен, "Контрагенты"); // Добавляем контрагентов Выборка = Справочники.Контрагенты.Выбрать(); Пока Выборка.Следующий() Цикл КонтрагентXDTO = ФабрикаXDTO.Создать(ПространствоИмен, "Контрагент"); КонтрагентXDTO.Свойство("Наименование").УстановитьЗначение(Выборка.Наименование); КонтрагентXDTO.Свойство("ИНН").УстановитьЗначение(Выборка.ИНН); КонтрагентXDTO.Свойство("КПП").УстановитьЗначение(Выборка.КПП); КорневойЭлемент.Свойство("Контрагент").ДобавитьЗначение(КонтрагентXDTO); КонецЦикла; // Записываем в файл ЗаписьXML = Новый ЗаписьXML; ЗаписьXML.ОткрытьФайл(ПутьКФайлу); ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, КорневойЭлемент); ЗаписьXML.Закрыть(); КонецПроцедуры
Загрузка данных через XDTO
bsl&НаСервере Процедура ЗагрузитьЧерезXDTO(ПутьКФайлу) ФабрикаXDTO = Новый ФабрикаXDTO; // Читаем XML ЧтениеXML = Новый ЧтениеXML; ЧтениеXML.ОткрытьФайл(ПутьКФайлу); КорневойЭлемент = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML); ЧтениеXML.Закрыть(); // Обрабатываем данные Если КорневойЭлемент <> Неопределено Тогда КоллекцияКонтрагентов = КорневойЭлемент.Свойство("Контрагент").Значение; Для Каждого КонтрагентXDTO Из КоллекцияКонтрагентов Цикл Наименование = КонтрагентXDTO.Свойство("Наименование").Значение; ИНН = КонтрагентXDTO.Свойство("ИНН").Значение; КПП = КонтрагентXDTO.Свойство("КПП").Значение; // Создаем элемент в справочнике Попытка НовыйКонтрагент = Справочники.Контрагенты.СоздатьЭлемент(); НовыйКонтрагент.Наименование = Наименование; НовыйКонтрагент.ИНН = ИНН; НовыйКонтрагент.КПП = КПП; НовыйКонтрагент.Записать(); Сообщить("Загружен: " + Наименование); Исключение Сообщить("Ошибка: " + Наименование); КонецПопытки; КонецЦикла; КонецЕсли; КонецПроцедуры
Практический пример: Универсальная обработка для обмена
Создадим простую внешнюю обработку для выгрузки и загрузки любых данных.
bsl// В модуле внешней обработки &НаКлиенте Процедура Выгрузить(Команда) СтандартнаяОбработкаВыбораФайла = СтандартнаяОбработкаВыбораФайла(); Если СтандартнаяОбработкаВыбораФайла.Выбран Тогда ВыгрузитьДанныеНаСервере(СтандартнаяОбработкаВыбораФайла.ПолноеИмяФайла); КонецЕсли; КонецПроцедуры; &НаСервере Процедура ВыгрузитьДанныеНаСервере(ПутьКФайлу) // Здесь можно добавить выбор типа данных для выгрузки ВыгрузитьКонтрагентовВXML(ПутьКФайлу); КонецПроцедуры; &НаКлиенте Процедура Загрузить(Команда) СтандартнаяОбработкаВыбораФайла = СтандартнаяОбработкаВыбораФайла(); Если СтандартнаяОбработкаВыбораФайла.Выбран Тогда ЗагрузитьДанныеНаСервере(СтандартнаяОбработкаВыбораФайла.ПолноеИмяФайла); КонецЕсли; КонецПроцедуры;
Советы и лучшие практики
-
Обработка ошибок: Всегда оборачивайте операции с XML в блоки
Попытка...Исключение -
Валидация данных: Проверяйте данные перед загрузкой
-
Кодировка: Указывайте правильную кодировку при работе с XML
-
Производительность: Для больших объемов данных используйте пакетную обработку
-
Логирование: Ведите лог операций выгрузки/загрузки
Заключение
Работа с XML в 1С - мощный инструмент для интеграции и обмена данными. Начните с простых методов ЗаписьXML/ЧтениеXML для базовых задач и переходите к XDTO для сложных структур данных и интеграции с веб-сервисами.
Практикуйтесь на тестовых данных, и вскоре вы сможете легко настраивать обмен данными между различными системами!
