helpf.pro
Регистрация
 0 
Распечатать

Сохранение реквизитов и табличных частей объектов в XML

Сохранение производится процедурой СохранитьРеквизитыИТабличныеЧасти. В качестве параметров она принимает сохраняемый объект и имя файла. Ссылочные реквизиты сохраняются в виде GUID.
Код 1C v 8.х
 Процедура СохранитьРеквизитыИТабличныеЧасти (Объект, ИмяФайлаXML=Неопределено) Экспорт
    ФайлXML = Новый ЗаписьXML;
    ФайлXML.ОткрытьФайл(ИмяФайлаXML);
    ФайлXML.ЗаписатьОбъявлениеXML();
    ФайлXML.ЗаписатьНачалоЭлемента("Root");
    ФайлXML.ЗаписатьАтрибут("Объект",Объект.Метаданные().Имя);
//Сохраняем реквизиты
    Для Каждого Реквизит Из Объект.Метаданные().Реквизиты Цикл
        ФайлXML.ЗаписатьНачалоЭлемента("Реквизит");
        ФайлXML.ЗаписатьАтрибут("Имя", Реквизит.Имя);
        ТипЗначения = ТипЗнч(Объект[Реквизит.Имя]);
        Если Не ТипЗначения = Тип("Неопределено") Тогда
            ФайлXML.ЗаписатьАтрибут("ИмяТипа", XMLТип(ТипЗначения).ИмяТипа);
            ФайлXML.ЗаписатьАтрибут("URI", XMLТип(ТипЗначения).URIПространстваИмен);
        КонецЕсли;
        ФайлXML.ЗаписатьТекст(XMLСтрока(Объект[Реквизит.Имя]));
        ФайлXML.ЗаписатьКонецЭлемента();
    КонецЦикла;
//Сохраняем табличные части
    Для Каждого ТЧ из Объект.Метаданные().ТабличныеЧасти Цикл
        ФайлXML.ЗаписатьНачалоЭлемента("ТабличнаяЧасть");
        ФайлXML.ЗаписатьАтрибут("Имя", ТЧ.Имя);
        Для Каждого СтрокаТЧ из Объект[ТЧ.Имя] Цикл
            ФайлXML.ЗаписатьНачалоЭлемента("ЭлементКоллекции");
            Для Каждого РеквизитТЧ Из ТЧ.Реквизиты Цикл
                ФайлXML.ЗаписатьНачалоЭлемента("Реквизит");
                ФайлXML.ЗаписатьАтрибут("Имя", РеквизитТЧ.Имя);
                ТипЗначения = ТипЗнч(СтрокаТЧ[РеквизитТЧ.Имя]);
                Если Не ТипЗначения = Тип("Неопределено") Тогда
                    ФайлXML.ЗаписатьАтрибут("ИмяТипа", XMLТип(ТипЗначения).ИмяТипа);
                    ФайлXML.ЗаписатьАтрибут("URI", XMLТип(ТипЗначения).URIПространстваИмен);
                КонецЕсли;
                ФайлXML.ЗаписатьТекст(XMLСтрока(СтрокаТЧ[РеквизитТЧ.Имя]));
                ФайлXML.ЗаписатьКонецЭлемента();
            КонецЦикла;
            ФайлXML.ЗаписатьКонецЭлемента();
        КонецЦикла;
        ФайлXML.ЗаписатьКонецЭлемента();
    КонецЦикла;
    Если Не ФайлXML=Null Тогда
        ФайлXML.ЗаписатьКонецЭлемента();
        ФайлXML.Закрыть();
    КонецЕсли;
КонецПроцедуры   

За чтение объекта отвечают процедуры ЗагрузитьРеквизитыИТабличныеЧасти и ЗагрузитьОбъектРекурсивно. Чтобы прочитать объект вызывается первая, ей передаются объект, который необходимо заполнить, и имя файла. Вторая является вспомогательной.
Код 1C v 8.х
 Процедура ЗагрузитьРеквизитыИТабличныеЧасти(Объект, ИмяФайлаXML=Неопределено) Экспорт
    Если Не ИмяФайлаXML = Неопределено Тогда
        ФайлXML = Новый ЧтениеXML;
        ФайлXML.ОткрытьФайл(ИмяФайлаXML);
        Пока ФайлXML.Прочитать() Цикл
            Если ФайлXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
                ЗагрузитьОбъектРекурсивно(ФайлXML, Объект, ФайлXML.Имя);
            КонецЕсли
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры
Процедура ЗагрузитьОбъектРекурсивно(ФайлXML, Объект, знач ИмяУзла)
    ИмяТипа = "";
    ПространствоИмен = "";
    Пока ФайлXML.ПрочитатьАтрибут() Цикл
        Если ФайлXML.Имя = "ИмяТипа" Тогда
            ИмяТипа = ФайлXML.Значение;
        ИначеЕсли ФайлXML.Имя = "URI" Тогда
            ПространствоИмен = ФайлXML.Значение;
        КонецЕсли;
    КонецЦикла;
    Пока ФайлXML.Прочитать() Цикл
        Если ФайлXML.ТипУзла = ТипУзлаXML.КонецЭлемента И ФайлXML.Имя = ИмяУзла Тогда
            Возврат;
        ИначеЕсли ФайлXML.ТипУзла = ТипУзлаXML.Текст Тогда
            ТипОбъекта = ИзXMLТипа(ИмяТипа, ПространствоИмен);
            Если НЕ ТипОбъекта = Неопределено тогда
                Объект = XMLЗначение(ТипОбъекта, ФайлXML.Значение);
            КонецЕсли;
        ИначеЕсли ФайлXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
            ИмяТекУзла = ФайлXML.Имя;
            Если ФайлXML.Имя = "ЭлементКоллекции" Тогда
                ЗагрузитьОбъектРекурсивно(ФайлXML, Объект.Добавить(), ИмяТекУзла);
            Иначе
                Если ФайлXML.ПрочитатьАтрибут() Тогда
                    ЗагрузитьОбъектРекурсивно(ФайлXML, Объект[ФайлXML.Значение], ИмяТекУзла);
                КонецЕсли;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры   

В приложенном файле - Скачивать файлы может только зарегистрированный пользователь! - демонстрационная обработка, позволяющая сохранить ссылочный объект БД в файл и заполнить объект из файла. Заполняемый объект должен быть того же типа, что и сохраненный, а также он должен быть предварительно создан, сохранен в ИБ и выбран в поле "Ссылка".
Разместил:   Версии: | 8.x |  Дата:   Прочитано: 15797
 0 
Распечатать
Возможно, вас также заинтересует
Как заполнить табличную часть формы программно? 8
Нужно по кнопке Заполнить - сформировать данные для заполнения табличных частей и заполнить их. Форма имеет вид: Рядом с кнопкой Записать и закрыть добавлена кнопка Заполнить документ , код ее команды: // Код заполнения ТЧ НаСервере П
17 правил для составления оптимального ЗАПРОСа к данным базы 1С 53
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ
1C и Google Maps 21
была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было реш
1C: Enterprise Development Tools 52
И вот случилось долгожданное: Вышел 1C: Enterprise Development Tools - это среда для разработки конфигурации в IDE Eclipse. С сайта 1С: « 1C:Enterprise Development Tools » – это инструмент нового поколения для разработчиков бизнес-приложений систем
1Cv8.1CD - Файл данных достиг максимального размера! 9
1С выдает предупреждение " Файл данных достиг максимального размера" . Подскажите из - за чего это и как можно решить ? Превышен размер файла, обычно это сообщение возникает, когда размер файла 1Cv8.1CD приближается к 10 гигабайтам или размер ка
Посмотреть все результаты поиска похожих
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.
Загрузка... Дождитесь завершения!