Все об 1С8 - просто и доступно

Добавить в Избранное  Сделать Стартовой  Написать письмо

Главная Статьи Вопрос-ответ Экспресс-справочник Гостевая книга
Статьи по 1С

Чтение данных из файла XML и запись данных в файл XML с использованием 1С

Для обмена данными между 1С-решениями - как между собой, так и со сторонней системой - существует много возможностей. Это через планы обмена, и разовые загрузки и выгрузки данных при помощи обработки Универсальный обмен данными в формате XML и всякие другие. Здесь будет представлен вариант выгрузки и загрузки данных обработкой без использования правил, с использованием функций записи и чтения XML с использованием 1С. А воспользуемся мы этими функциями записи и чтения XML для выгрузки и загрузки данных физических лиц. Выгружать и загружать будем наименование, дату рождения, ИНН. Обработка может выгружать данные из, например, ЗУП 3.1 и загружать, например, в БП 3.0 или ЕРП. Это одни из самых распространенных конфигураций.
Также добавим в обработку таблицу значений, в которую будем загружать прочитанные данные из файла. В этой таблице значений добавим пару колонок. в которой покажем, найдено физическое лицо или нет. Обработчики создания новых физических лиц реализованы в рамках примера не будут.
 
Открываем конфигуратор и создаем новую внешнюю обработку.


Создание внешней обработки для чтения и записи данных XML

Добавляем форму обработки и на нее помещаем две кнопки: Загрузить данные и Выгрузить данные. Также на форму  добавим таблицу значений и путь к файлу для записи и чтения данных в формате XML. Для наглядности перед записью данных в формате XML в файл выведем эти данные в таблицу значений. Добавим кнопку на форму Заполнить список физических лиц и по нажатию на нее выберем запросом данные из справочника Физические лица, затем результат выборки поместим в таблицу значений.

Пример обработки записи и чтения данных XML

Заполнение списка физических лиц производится при помощи запроса к справочнику Физические лица и дальнейшим помещением результата в табличную часть. Листинг здесь не приводится.

Теперь поместим в обработчик кнопки "Выгрузить данные" следующий код:

	Если Не ЗначениеЗаполнено(Объект.ПутьКФайлу) Тогда
		Возврат;
	КонецЕсли;
	
	Если Объект.ФизическиеЛица.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	
	ФайлЗаписи = Новый ЗаписьXML;
	ФайлЗаписи.ОткрытьФайл(Объект.ПутьКФайлу, "UTF-8");
	ФайлЗаписи.ЗаписатьОбъявлениеXML();
	
	ФайлЗаписи.ЗаписатьНачалоЭлемента("ФизическиеЛица");
	
	ФайлЗаписи.ЗаписатьНачалоЭлемента("Конфигурация");
	ФайлЗаписи.ЗаписатьТекст(ПолучитьВерсиюМетаданных());
	ФайлЗаписи.ЗаписатьКонецЭлемента();

	Для Каждого ТекСтрока Из Объект.ФизическиеЛица Цикл
		
		ФайлЗаписи.ЗаписатьНачалоЭлемента("ФизическоеЛицо");
		
		ФайлЗаписи.ЗаписатьАтрибут("Наименование", ТекСтрока.ФизическоеЛицо);
		ФайлЗаписи.ЗаписатьАтрибут("ДатаРождения", Строка(Формат(ТекСтрока.ДатаРождения, "ДФ=dd.MM.yyyy")));
		ФайлЗаписи.ЗаписатьАтрибут("ИНН", ?(ЗначениеЗаполнено(ТекСтрока.ИНН), ТекСтрока.ИНН, "000000000000"));
		
		ФайлЗаписи.ЗаписатьКонецЭлемента();

	КонецЦикла;
	
	ФайлЗаписи.ЗаписатьКонецЭлемента();
В обработчике кнопки Загрузить данные вставим иной код. В ходе выполнения чтения из файла XML в данном примере данные помещаются в структуру для передачи в функцию для заполнения табличной части. У пользователя может быть свой алгоритм обработки прочитанных данных.

	
	Если Не ЗначениеЗаполнено(Объект.ПутьКФайлу) Тогда
		Возврат;
	КонецЕсли;
	
	ФайлПроверки = Новый Файл(Объект.ПутьКФайлу);
	Если НЕ ФайлПроверки.Существует() Тогда
        	Возврат;
    	КонецЕсли;
	
	ФайлПроверки = Неопределено;
	
	ЧтениеXML = Новый ЧтениеXML;
	ЧтениеXML.ОткрытьФайл(Объект.ПутьКФайлу);
	
	СтруктураДанныхФЛ = Новый Структура;
	Сч = 0;

	
	Пока ЧтениеXML.Прочитать() Цикл 
		
		ОбработкаПрерыванияПользователя(); //Если надобно экстренно прервать работу
		
		Если (ЧтениеXML.Имя = "ФизическоеЛицо") И (ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента)  Тогда
			
			Наименование 	= СокрЛП(ЧтениеXML.ПолучитьАтрибут("Наименование"));
			ДатаРождения 	= СокрЛП(ЧтениеXML.ПолучитьАтрибут("ДатаРождения"));
			ИНН 		= СокрЛП(ЧтениеXML.ПолучитьАтрибут("ИНН"));
			
			СтруктураДанныхФЛ.Вставить("СтрокаДанных" + Сч, Наименование + "::" + ДатаРождения + "::" + ?(ИНН = "000000000000", "", ИНН));
			Сч = Сч + 1;
			
		КонецЕсли;
		
	КонецЦикла;
	
	ЧтениеXML.Закрыть();

	ЗаполнитьТЧФизическиеЛица(СтруктураДанныхФЛ);


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

Пример обработки и файла для чтения данных можно скачать тут