Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 2
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> XDTO-пакеты. Неименованные типы          
Vofka Подменю пользователя
сообщение 12.12.11, 15:50
Сообщение #1

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13956
Из: Киев
Спасибо сказали: 4523 раз
Рейтинг: 3646.4

В продолжение к посту XDTO-пакеты, xml, xml schema несколько слов о неименованных типах.

Давайте посмотрим, что будет, если в конструкторе XDTO-пакета к свойству добавить определение типа и, в свою очередь, добавить туда еще свойств:



Как видите, свойства "Адрес" и "Телефон" сложного типа ("ОбъектXDTO"). А телефон еще и списковый тип (я задал "Максимальное количество" равное трем).

Вот XML-схема этого пакета:

< xs:schema xmlns:tns="http://www.1c.ru/demos/products"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.1c.ru/demos/products"
attributeFormDefault="unqualified" elementFormDefault="qualified">
   < xs:complexType name="Клиент">
      < xs:sequence>
         < xs:element name="Фамилия" type="xs:string"/>
         < xs:element name="Имя" type="xs:string"/>
         < xs:element name="Адрес">
            < xs:complexType>
               < xs:sequence>
                  < xs:element name="Город" type="xs:string"/>
                  < xs:element name="Улица" type="xs:string"/>
                  < xs:element name="Дом" type="xs:int"/>
               < /xs:sequence>
            < /xs:complexType>
         < /xs:element>
         < xs:element name="Телефон" maxOccurs="3">
            < xs:complexType>
               < xs:sequence>
                  < xs:element name="КодГорода" type="xs:string"/>
                  < xs:element name="Номер" type="xs:string"/>
                  < xs:element name="Добавочный" type="xs:string"/>
               < /xs:sequence>
            < /xs:complexType>
         < /xs:element>
      < /xs:sequence>
   < /xs:complexType>
< /xs:schema>


Вот код, который создает объект этого типа:

    клиент.Фамилия = "Нуралиев";
    клиент.Имя = "Борис";


Телефоны рассмотрим немного позже, а вот как заполнить реквизит "Адрес"? По логике, это нужно сделать как в примере с номенклатурой и единицами измерения из [необходимо зарегистрироваться для просмотра ссылки]. Создать "ОбъектXDTO" с типом таким же, как у свойства "Адрес". Но у этого типа нет самостоятельного имени, а значит, вызвать "ФабрикаXDTO.Тип(...)", чтобы получить этот самый тип, не получится. Но это не значит, что самого типа нет. Просто он содержится в типе "клиентТип". Давайте посмотрим на него более внимательно:



Как видите, имени у типа нет, но сам объект "ТипОбъектаXDTO" существует. Значит, адрес мы можем заполнить вот таким кодом:

    клиент.Адрес = ФабрикаXDTO.Создать(клиентТип.Свойства.Получить("Адрес").Тип);
    клиент.Адрес.Город = "Москва";
    клиент.Адрес.Улица = "Селезневская";
    клиент.Адрес.Дом = 21;


Теперь и с телефонами ситуация проясняется. Свойство "Телефон" имеет тип "СписокXDTO", а синтакс-помощник говорит, что у этого типа есть метод "Добавить", которому передается "ОбъектXDTO". Вот код, который добавляет телефоны:

    телефонТип = клиентТип.Свойства.Получить("Телефон").Тип;

    нТелефон = ФабрикаXDTO.Создать(телефонТип);
    нТелефон.КодГорода = "495";
    нТелефон.Номер = "737-92-57";
    нТелефон.Добавочный = "*0";
    клиент.Телефон.Добавить(нТелефон);

    нТелефон = ФабрикаXDTO.Создать(телефонТип);
    нТелефон.КодГорода = "495";
    нТелефон.Номер = "681-44-07";
    нТелефон.Добавочный = "*0";
    клиент.Телефон.Добавить(нТелефон);


В итоге я получил вот такой XML:

< ?xml version="1.0" encoding="UTF-8" ?> 
< Клиент xmlns="http://www.1c.ru/demos/products"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  < Фамилия>Нуралиев< /Фамилия>
  < Имя>Борис< /Имя>
  < Адрес>
    < Город>Москва< /Город>
    < Улица>Селезневская< /Улица>
    < Дом>21< /Дом>
  < /Адрес>
  < Телефон>
    < КодГорода>495< /КодГорода>
    < Номер>737-92-57< /Номер>
    < Добавочный>*0< /Добавочный>
  < /Телефон>
  < Телефон>
    < КодГорода>495< /КодГорода>
    < Номер>681-44-07< /Номер>
    < Добавочный>*0< /Добавочный>
  < /Телефон>


Напоследок хочу подарить вам небольшую рекурсивную процедуру, которая заполняет все свойства вот таких неименованных типов, кроме списковых:

// Заполняет все свойства объектов, которые в качестве типа имеют неименованый тип "ОбъектXDTO"
Процедура ЗаполнитьСвойстваОбъектаXDTO(ОбъектXDTO, тФабрикаXDTO)
    ТипОбъектаXDTO = ОбъектXDTO.Тип();
    Для каждого СвойствоXDTO Из ТипОбъектаXDTO.Свойства Цикл
        флТипНеИменованый = ПустаяСтрока(СвойствоXDTO.Тип.Имя);
        флСвойствоНеСписковое = (СвойствоXDTO.НижняяГраница=1) и (СвойствоXDTO.ВерхняяГраница=1);
        Если флТипНеИменованый и флСвойствоНеСписковое Тогда
            тЗначениеСвойства = тФабрикаXDTO.Создать(СвойствоXDTO.Тип);
            Если Тип(тЗначениеСвойства) = Тип("ОбъектXDTO") Тогда
                ЗаполнитьСвойстваОбъектаXDTO(тЗначениеСвойства, тФабрикаXDTO);
            КонецЕсли;
            ОбъектXDTO.Установить(СвойствоXDTO,тЗначениеСвойства);
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры // ЗаполнитьСвойстваОбъектаXDTO


Естественно, вы можете доработать ее по своему вкусу.

На сегодня на этом все, а вам я желаю хорошего дня и хорошего кода.

[необходимо зарегистрироваться для просмотра ссылки]

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 26.05.24, 11:40
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!