Профессия — 1С

Рукопашный бой Карташ

Категории

Запись и чтение объектов базы через XML

рубрики: XML | Дата: 16 Декабрь, 2015
Скачать обработку с примерами из статьи: professia1c_ReadWriteObjectXML.epf
Платформа: 8.3; Тип формы: управляемая.

В этой статье будет рассмотрена запись и чтение в(из) XML объектов базы данных 1С 8 (справочники, документы и т.д.) с помощью таких объектов как ЗаписьXML и ЧтениеXML.
Точнее хочется показать насколько элементарно это делается. В документации можно встретить информацию о том, что эти объекты предназначены для последовательного чтения и записи XML. И у тех кто никогда с этим не сталкивался может возникнуть впечатление, что для того чтобы записать или прочитать элемент справочника или документ, необходимо построчно обходить файл XML и по отдельности считывать каждый реквизит. Но к счастью все гораздо проще.




Рассмотрим это на примере справочника «Валюты», т.к. он встречается практически в любой конфигурации. Для начала запишем элемент справочника в файл XML. Делается это буквально парой строк:



	СправочникОбъект = Справочники.Валюты.НайтиПоНаименованию("RUR").ПолучитьОбъект();
	
	ЗаписьХМЛ = Новый ЗаписьXML;
	ЗаписьХМЛ.ОткрытьФайл("D:\musor\test.xml");
	ЗаписатьXML(ЗаписьХМЛ, СправочникОбъект);
	ЗаписьХМЛ.Закрыть();
	

В результате получим xml файл примерно такого содержания:


	<CatalogObject.Валюты>
		<Ref>3291e69e-955a-11e0-8275-0017313c4f3f</Ref>
		<DeletionMark>false</DeletionMark>
		<Code>643</Code>
		<Description>RUR</Description>
		<НаименованиеПолное>Российский рубль</НаименованиеПолное>
		<ПараметрыПрописиНаРусском>рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2</ПараметрыПрописиНаРусском>
	</CatalogObject.Валюты>
	

А теперь прочитаем файл и запишем прочитанный объект в справочник:



	ЧтениеХМЛ = Новый ЧтениеXML;
	ЧтениеХМЛ.ОткрытьФайл("D:\musor\test.xml");
	СправочникОбъект = ПрочитатьXML(ЧтениеХМЛ);
	СправочникОбъект.Записать();
	

Как видно все элементарно просто.

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




И это тоже можно сделать с легкостью при помощи метода УстановитьСтроку(). И тогда строчка кода ЗаписьХМЛ.Закрыть() вместо того чтобы записать файл вернет нам строку содержащую xml. Для начала создадим процедуру которая будет записывать элемент справочника из строки, которая будет передаваться ей в параметре:



	Процедура ПрочитатьСтрокуХМЛ(СтрокаХМЛ)

		ЧтениеХМЛ = Новый ЧтениеXML;
		ЧтениеХМЛ.УстановитьСтроку(СтрокаХМЛ);
		СправочникОбъект = ПрочитатьXML(ЧтениеХМЛ);
		СправочникОбъект.Записать();

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

А теперь сохраним элемент справочника в строку xml и используя только что созданную процедуру перезапишем его:



	СправочникОбъект = Справочники.Валюты.НайтиПоНаименованию("RUR").ПолучитьОбъект();
	
	ЗаписьХМЛ = Новый ЗаписьXML;
	ЗаписьХМЛ.УстановитьСтроку();
	ЗаписатьXML(ЗаписьХМЛ, СправочникОбъект);
	СтрокаХМЛ = ЗаписьХМЛ.Закрыть();
	
	ПрочитатьСтрокуХМЛ(СтрокаХМЛ);
	

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

Тестовая обработка

Поскольку код, описанный выше, тестировался на платформе 8.2 в обычной форме, решил в качестве проверки сделать тестовую обработку для платформы 8.3 на управляемой форме. Скачать ее вы можете по ссылке в заголовке статьи.

Код для записи и чтения строки XML остался практически таким же, как приведен выше. Внешне она выглядит следующим образом:

Можно выбрать любой элемент справочника и по кнопке «Записать элемент справочника в XML» сформировать для него строку XML, которая отобразиться в текстовом поле. Далее можно прямо в текстовом поле отредактировать какой-нибудь реквизит и нажатием кнопки «Прочитать элемент справочника из XML» загрузить изменения обратно в элемент справочника.

4 комментария на «“Запись и чтение объектов базы через XML”»

  1. Александр:

    Данный код в 1С 8.3.9 не работает. Пишет «Ошибка преобразования данных XDTO» или «Значение недопустимого типа»

    • Owner:

      Спасибо за комментарий! Когда писал статью делал обработку на 8.2 для толстого клиента. Надо будет на 8.3 для тонкого попробовать.

    • Owner:

      Александр, сделал обработку на 8.3.8 на управляемой форме. Дописал немножко статью и выложил для скачивания обработку. На моей базе код отработал. Скорее всего дело было в том, что в примере ищется элемент справочника по наименованию, а в том же ЗУП 2.5 и в ЗУП 3.1, например, наименование валюты рубли немного разное. Возможно просто не был найден элемент справочника, из-за этого и ошибка. В тестовой обработке можно элемент справочника выбрать непосредственно в поле. Пробуйте.

      • Александр:

        Попробовал. Все работает, спасибо. Посмотрел небольшие отличия в коде. По ходу поиск по наименованию с последующим получением объекта (элемента справочника) и сериализацией в XML (как я делал) не канает т.к. потом при десериализации возникает ошибка. Хотя сам сгенерированный платформой XML-текст в обоих случаях идентичен

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

   

2018г. Профессия — 1С. Обмен опытом по программированию в 1С