рубрики: 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» загрузить изменения обратно в элемент справочника.
Данный код в 1С 8.3.9 не работает. Пишет «Ошибка преобразования данных XDTO» или «Значение недопустимого типа»
Спасибо за комментарий! Когда писал статью делал обработку на 8.2 для толстого клиента. Надо будет на 8.3 для тонкого попробовать.
Александр, сделал обработку на 8.3.8 на управляемой форме. Дописал немножко статью и выложил для скачивания обработку. На моей базе код отработал. Скорее всего дело было в том, что в примере ищется элемент справочника по наименованию, а в том же ЗУП 2.5 и в ЗУП 3.1, например, наименование валюты рубли немного разное. Возможно просто не был найден элемент справочника, из-за этого и ошибка. В тестовой обработке можно элемент справочника выбрать непосредственно в поле. Пробуйте.
Попробовал. Все работает, спасибо. Посмотрел небольшие отличия в коде. По ходу поиск по наименованию с последующим получением объекта (элемента справочника) и сериализацией в XML (как я делал) не канает т.к. потом при десериализации возникает ошибка. Хотя сам сгенерированный платформой XML-текст в обоих случаях идентичен