Имя: Пароль:
1C
1С v8
XSD схема программно с нуля.
,
0 Vadyasha
 
19.06.13
09:40
Доброго времени суток! Подскажите, как в 1с 8.2 создать XML схему программно. Только не через ЗаписьXML и не через DOM (по сути тот же разбор тегов).  Смысл в том чтобы уложить графическую структуру схемы в XML. Обратный процесс  (построение графической структуры) я сделал через  механизм XDTO. Очень удобно и просто.
1 Vadyasha
 
19.06.13
17:40
Спасибо за помощь! Разобрался сам. Через объект СхемаXML. Создаем пустой и добавляем КомпонентыSX. И не каких НачалоЭлемента и тд.
2 Vadyasha
 
19.06.13
17:41
КомпонентыXS
3 mikecool
 
19.06.13
17:55
какой умный новичок, маладец
4 Serginio1
 
19.06.13
18:32
Да уж ни одного примера для создания схемы
ОпределениеПростогоТипаXS
ОпределениеСоставногоТипаXS
СписокКомпонентXS

Поделись кодом
5 Vadyasha
 
20.06.13
10:09
// в данном случае в ЧтениеXML Заготовок схемы (корневой элемент)    

ЧтениеXML = Новый ЧтениеXML;
   ЧтениеXML.УстановитьСтроку(ТекстСхемы );

   ПостроительDOM = Новый ПостроительDOM;
   ДокументDOM    = ПостроительDOM.Прочитать(ЧтениеXML);
   
   ПостроительСхем = Новый ПостроительСхемXML;
   НоваяСхема = ПостроительСхем.СоздатьСхемуXML(ДокументDOM);
   
// Это коллекции элементов графической структуры в форме (дерево значений)
   КоллекцияЭлементов         = СтруктураСхемыДанных.ПолучитьЭлементы();
   КоллекцияКорневогоЭлемента = КоллекцияЭлементов[0].ПолучитьЭлементы();
   
   КоллекцияДиректив      = КоллекцияКорневогоЭлемента[0].ПолучитьЭлементы();
   КоллекцияСвойств       = КоллекцияКорневогоЭлемента[1].ПолучитьЭлементы();
   КоллекцияТиповЗначений = КоллекцияКорневогоЭлемента[2].ПолучитьЭлементы();
   КоллекцияТиповОбъектов = КоллекцияКорневогоЭлемента[3].ПолучитьЭлементы();
   
   
   
    // Директивы
   Для каждого Элемент Из КоллекцияДиректив Цикл
       Директива = Новый ИмпортXS;
       Директива.ПространствоИмен = Элемент.Имя;
       НоваяСхема.Директивы.Добавить(Директива);
   КонецЦикла;
   

   // Свойства
   Для каждого Элемент Из КоллекцияСвойств Цикл
       
       Если Элемент.Форма = "Элемент" Тогда
           Свойство = Новый ОбъявлениеЭлементаXS;
       КонецЕсли;
       
       Если Элемент.Форма = "Атрибут" Тогда
           Свойство = Новый ОбъявлениеАтрибутаXS;
       КонецЕсли;

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

// и т.д.    
                                           
   НоваяСхема.ОбновитьЭлементDOM();
   ЗаписьXML = Новый ЗаписьXML;
   ЗаписьXML.УстановитьСтроку();
   ЗаписьDOM = Новый ЗаписьDOM;
   ЗаписьDOM.Записать(НоваяСхема.ДокументDOM, ЗаписьXML);
   СхемаДляЗаписи = ЗаписьXML.Закрыть();
6 Vadyasha
 
20.06.13
10:12
Получается работа со схемой как с объектом. Очень удобно.
7 Serginio1
 
20.06.13
10:19
Спасибо. Интересно. Меня почему интересует. В том же КД идет обмен без схемы, хотя её можно создать и при этом размер выгружаемых данных будет меньше и его легче читать и писать. Схему передавать вместе с данными.
8 badboychik
 
20.06.13
10:43
А почему размер будет меньше
9 Serginio1
 
20.06.13
12:53
(8) Уже не помню. Но премущество схемы в описании типов.
Атриьуты меньше места занимают чем элементы. Но не это главное. Проще писать кодогенератор для сериализации десериализации на основании объектаXDTO.
Для примера сериализация по Схеме загружающей конфигурации происходит достаточно быстро, а код для загрузки вообще минимален и загрузка происходит очень быстро даже очень больших объемов.
10 Serginio1
 
24.06.13
12:00
Немного помучился но вот так можно простую схему создать

Функция СоздатьСхему(UriПространстваИмен) Экспорт
   ЧтениеXML=новый ЧтениеXML;
Стр="<?xml version=""1.0"" encoding=""UTF-8""?>
|<xs:schema xmlns:tns="""+UriПространстваИмен+""" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" targetNamespace="""+UriПространстваИмен+""" attributeFormDefault=""unqualified"" elementFormDefault=""qualified"">
|</xs:schema>";
ЧтениеXML.УстановитьСтроку(стр);

   ПостроительDOM = Новый ПостроительDOM;
   ДокументDOM    = ПостроительDOM.Прочитать(ЧтениеXML);
   
   ПостроительСхем = Новый ПостроительСхемXML;
   НоваяСхема = ПостроительСхем.СоздатьСхемуXML(ДокументDOM);
   НоваяСхема.ОбновитьЭлементDOM();
   возврат НоваяСхема
КонецФункции

Функция СоздатьТип(ИмяТипа) Экспорт
   Тип=новый ОпределениеСоставногоТипаXS;
   Тип.Имя=ИмяТипа;
   Часть=новый ГруппаМоделиXS;
   
   Содержимое=новый ФрагментXS;
   Содержимое.Часть=Часть;
   
   Тип.Содержимое=Содержимое;

  возврат тип    

КонецФункции // СоздатьТип()

Функция СоздатьЭлемент(ИмяЭлемента,UriПространстваИмен,ИмяТипа) Экспорт

Элемент=Новый ОбъявлениеЭлементаXS;//Новый ФрагментXS;
   Элемент.Имя=ИмяЭлемента;
   Элемент.ИмяТипа=новый РасширенноеИмяXML(UriПространстваИмен, ИмяТипа);
   возврат Элемент
   

КонецФункции // СоздатьЭлемент()

Процедура СоздатьЭлементСписок(Элемент) Экспорт

Контейнер=Элемент.Контейнер.Контейнер;
Контейнер.МинимальноВходит=0;
Контейнер.МаксимальноВходит="unbounded";

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

Процедура ЗаписатьСхему(Схема,ИмяФайла) Экспорт
   схема.ОбновитьЭлементDOM();
   
   ЗаписьDOM=Новый ЗаписьDOM;
   ЗаписьXML = Новый ЗаписьXML;
   ЗаписьXML.ОткрытьФайл(ИмяФайла);
   ЗаписьDOM.Записать(схема.ДокументDOM,ЗаписьXML);

КонецПроцедуры
11 Serginio1
 
24.06.13
12:03
Создание схемы

URIПространстваИмен="http://www.TestShema.ru/sample";
       Схема=СоздатьСхему(URIПространстваИмен);
       ИмяТипа="ТипСтруктура";
       Тип=СоздатьТип(ИмяТипа);
       
       Элемент=СоздатьЭлемент("СтроковыйЭлемент","http://www.w3.org/2001/XMLSchema", "string");
       Элемент2=СоздатьЭлемент("ЧисловойЭлемент","http://www.w3.org/2001/XMLSchema", "decimal");
       Фрагменты=Тип.Содержимое.Часть.Фрагменты;
       Фрагменты.Добавить(Элемент);
       Фрагменты.Добавить(Элемент2);
       
       Схема.Содержимое.Добавить(тип);
       
       Тип2=СоздатьТип("ТипСписок");
       Элемент=СоздатьЭлемент("Список",URIПространстваИмен,ИмяТипа);
       
       Фрагменты=Тип2.Содержимое.Часть.Фрагменты;
       Фрагменты.Добавить(Элемент);
       СоздатьЭлементСписок(Элемент);
       
       Схема.Содержимое.Добавить(тип2);
       
       ИмяФайла="d:\1СБазы\СхемаТестовая2.xsd";
       ЗаписатьСхему(Схема,ИмяФайла);
12 Serginio1
 
24.06.13
12:04
И её использование

Функция СоздатьФабрику(ИмяФайла,СсылкаNull=0) Экспорт
   
   
           Фабрика = СоздатьФабрикуXDTO(ИмяФайла);
           ТипNull=Фабрика.Тип("http://www.w3.org/2001/XMLSchema","anySimpleType");
           СсылкаNull=Фабрика.Создать(ТипNull);
           Возврат   Фабрика

   
КонецФункции // СоздатьФабрику()
   
   Функция СоздатьЗаписьXML(Файл,UriПространстваИменПоУмолчанию) Экспорт
   ЗаписьXML=Новый ЗаписьXML;
   ЗаписьXML.ОткрытьФайл(Файл);
   ЗаписьXML.ЗаписатьОбъявлениеXML();
   
   ЗаписьXML.ЗаписатьНачалоЭлемента(XMLСтрока("Данные"));
   ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("", UriПространстваИменПоУмолчанию);
   ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xsi", "http://www.w3.org/2001/XMLSchema-instance");
   ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xs", "http://www.w3.org/2001/XMLSchema");
    возврат ЗаписьXML
 КонецФункции


URIПространстваИмен="http://www.TestShema.ru/sample";
       Схема=СоздатьСхему(URIПространстваИмен);
       ИмяТипа="ТипСтруктура";
       Тип=СоздатьТип(ИмяТипа);
       
       Элемент=СоздатьЭлемент("СтроковыйЭлемент","http://www.w3.org/2001/XMLSchema", "string");
       Элемент2=СоздатьЭлемент("ЧисловойЭлемент","http://www.w3.org/2001/XMLSchema", "decimal");
       Фрагменты=Тип.Содержимое.Часть.Фрагменты;
       Фрагменты.Добавить(Элемент);
       Фрагменты.Добавить(Элемент2);
       
       Схема.Содержимое.Добавить(тип);
       
       Тип2=СоздатьТип("ТипСписок");
       Элемент=СоздатьЭлемент("Список",URIПространстваИмен,ИмяТипа);
       
       Фрагменты=Тип2.Содержимое.Часть.Фрагменты;
       Фрагменты.Добавить(Элемент);
       СоздатьЭлементСписок(Элемент);
       
       Схема.Содержимое.Добавить(тип2);
       
       ИмяФайла="d:\1СБазы\СхемаТестовая2.xsd";
       ЗаписатьСхему(Схема,ИмяФайла);
       
       
       Фабрика=СоздатьФабрику(ИмяФайла);
       
       ТипСтруктура=Фабрика.Тип(URIПространстваИмен,"ТипСтруктура");
       ТипСписок   =Фабрика.Тип(URIПространстваИмен,"ТипСписок");
       Список=Фабрика.Создать(ТипСписок);
       
       Структура=Фабрика.Создать(ТипСтруктура);
       Структура.СтроковыйЭлемент="Элемент 1";
       Структура.ЧисловойЭлемент=1;
       
       Список.Список.Добавить(Структура);
       
       Структура=Фабрика.Создать(ТипСтруктура);
       Структура.СтроковыйЭлемент="Элемент 2";
       Структура.ЧисловойЭлемент=2.1;
       
       Список.Список.Добавить(Структура);
       Файл="d:\1СБазы\СхемаТестовая2.xml";
       Запись=СоздатьЗаписьXML(Файл,UriПространстваИмен);
       
       Фабрика.ЗаписатьXML(Запись, Список);
       Запись.ЗаписатьКонецЭлемента();
       Запись.Закрыть();
       Запись=0;
       
       
       ЧтениеXML=Новый ЧтениеXML;
       ЧтениеXML.ОткрытьФайл(Файл);
       ЧтениеXML.ПерейтиКСодержимому();
       ЧтениеXML.Прочитать();


         Пока ЧтениеXML.ТипУзла<>ТипУзлаXML.КонецЭлемента Цикл

           ОбъектXDTO=Фабрика.ПрочитатьXML(ЧтениеXML,Фабрика.Тип(ЧтениеXML.URIПространстваИмен,ЧтениеXML.Имя));
          КонецЦикла;

ЧтениеXML.Закрыть();
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой