четверг, 3 апреля 2014 г.

1С. Запись/чтение "ТаблицыЗначений" в/из XML

Область применения:
Переноса данных из одной конфигурации в другую, перенос данных между обработками, да, в принципе, для любого переноса данных.

Функция сохранения таблицы значений в XML:
Функция СохранитьТаблицуЗначенийВXML(Таблица, ФайлXML)
    Попытка
        Запись = Новый ЗаписьXML();
        Запись.ОткрытьФайл(ФайлXML);   
    Исключение
        Сообщить("Ошибка при создание XML файла! " + Символы.ПС + ОписаниеОшибки());
        Возврат Ложь;
    КонецПопытки;      
    
    Запись.ЗаписатьОбъявлениеXML();
    Запись.ЗаписатьНачалоЭлемента("root"); 
    
    МасКолонки = Новый Массив();
    Запись.ЗаписатьНачалоЭлемента("columns");  
    Для Ном = 0 по Таблица.Колонки.Количество()-1 цикл         
        Колонка = Таблица.Колонки[Ном];
        МасКолонки.Добавить(Колонка.Имя);
        
        Запись.ЗаписатьНачалоЭлемента("colum");
        Запись.ЗаписатьАтрибут("Name",Колонка.Имя);
        Запись.ЗаписатьАтрибут("Type",Строка(Колонка.ТипЗначения));
        Запись.ЗаписатьКонецЭлемента();  // colum      
    КонецЦикла;    
    Запись.ЗаписатьКонецЭлемента();  // columns
    
    Запись.ЗаписатьНачалоЭлемента("records");  
    Для Каждого СтрТаблицы из Таблица цикл
        
        Запись.ЗаписатьНачалоЭлемента("record");
        Для каждого ИмяКолонки из МасКолонки цикл
            Запись.ЗаписатьНачалоЭлемента(ИмяКолонки);
            Значение = Строка(СтрТаблицы[ИмяКолонки]);
            Запись.ЗаписатьСекциюCDATA(Значение);
            Запись.ЗаписатьКонецЭлемента();
        КонецЦикла;        
        Запись.ЗаписатьКонецЭлемента();
    КонецЦикла;    
    
    Запись.ЗаписатьКонецЭлемента();  // records    
    Запись.ЗаписатьКонецЭлемента();  // root       
    Запись.Закрыть();
    
    Возврат Истина;
КонецФункции



Функция чтения таблицы значений из XML:
Функция ЗагрузитьТаблицаЗначенийИзXML(ФайлXML)
    
    Попытка
        Чтение = Новый ЧтениеXML();
        Чтение.ОткрытьФайл(ФайлXML);   
    Исключение
        Сообщить("Ощибка при чтение данных из XML!" + Символы.ПС + ОписаниеОшибки());
    КонецПопытки;     
    
    ТЗ = Новый ТаблицаЗначений;
    Атрибут = Новый Соответствие;
    МассивКолонок = Новый Массив; 
    ТаблицаПостроена = Ложь;
    
    // Строим таблицу значений     
    Пока Чтение.Прочитать() Цикл       
        // Данные по колонке пошли
        Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента и Чтение.Имя = "colum" тогда
            Атрибут.Очистить();
            Пока Чтение.ПрочитатьАтрибут() цикл
                Атрибут[Чтение.Имя] = Чтение.Значение;             
            КонецЦикла;
            ТЗ.Колонки.Добавить(Атрибут["Name"], Новый ОписаниеТипов(Атрибут["Type"]));
            МассивКолонок.Добавить(Атрибут["Name"]);
        КонецЕсли;         
        
        // Данные по колонке закончились
        Если Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента и Чтение.Имя = "columns" тогда     
            ТаблицаПостроена = Истина;
        КонецЕсли;
        
        Если Не ТаблицаПостроена тогда
            Продолжить;
        КонецЕсли;         
        
        // Началась запись в таблице значений
        Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента и Чтение.Имя = "record" тогда                     
            ЗаписьТЗ = ТЗ.Добавить();         
            Пока Чтение.Прочитать() цикл                           
                // Конец данных по записи
                Если Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента и Чтение.Имя = "record" тогда
                    Прервать;
                КонецЕсли; 
                
                // Есть такая колонка в нашей ТаблицеЗначений
                Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента и
                     МассивКолонок.Найти(Чтение.Имя) <> Неопределено тогда
                    
                    ИмяКолонки = Чтение.Имя;
                    Чтение.Прочитать();
                    Если Чтение.ТипУзла = ТипУзлаXML.Текст тогда
                        ЗаписьТЗ[ИмяКолонки]= СокрЛП(Чтение.Значение);
                    КонецЕсли;                     
                КонецЕсли;                                             
            КонецЦикла;                           
        КонецЕсли; // Данные в таблице
        
    КонецЦикла;
    Возврат ТЗ;
КонецФункции

Комментариев нет:

Отправить комментарий