Имя: Пароль:
1C
1С v8
Динамическое формирование пакета XDTO
0 Oz11
 
09.07.14
11:39
приветствую

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

пример:
есть документ, в котором должны быть выгружены 2а реквизита шапки (в виде уникальны идентификаторов) и 4и реквизита табличной части (так же УИДы, если их тип ссылочный). так же отдельно нужно будет выгружать "расшифровку", тоесть описание справочников, на который мы сослались через УИД.

структура файла может быть такой:
<Документ>                                 // описание документа
    <Организация>УИД_Организации</Организация>
    <Номер>000001</Номер>
    <Дата>09072014</Дата>
    <Состав>                               // описание табличной части
        <СтрокаТЧ НомерСроки = 1>          // описание строки ТЧ
            <Номенклатура>товар1</Номенклатура>    // товар строкой
            <Характеристика>х-ка1</Характеристика>    // х-ка строкой
            <Количество>1</Количество>    // количество числом
        </СтрокаТЧ>
    </Состав>
</Документ>
<Расшифровка>
    <Организация УИД = УИД_Организации>
        <Название>Контора</Название>   // строчное название компании
        <Название>ОКПО</Название>   // строчный ОКПО компании
    </Организация>
</Расшифровка>

Проблема в том что Пакет XDTO я не могу создать как объект конфигурации, так как выгружаемые свойства пользователь может задавать сам. (может не выгружать организацию вовсе или в табличной части не выгружать х-ку). поэтому пакет нужно наполнять динамически. проблема в том что раньше я с XDTO не работал, поэтому мои познания состоят из того что причитал в инете. как ни странно, но описания динамического формирования пакета я не встретил. может быть кто-то даст совет где можно почитать или скажет что это все бред.

заранее спасибо.
1 Maxus43
 
09.07.14
11:40
чойто не можешь создать пакет? пакет создавай с перечислением всех возможных полей, но ставь у них - необязательное. Пусть выбирает чего туда писать
2 Maxus43
 
09.07.14
11:41
>>но описания динамического формирования пакета я не встретил
потому что не в ту сторону думаешь
3 Oz11
 
09.07.14
11:43
(2) вот. у меня пока нет практического опыта работы в этом вопросе. есть теория в голове и то пока мутная. поэтому и прошу пояснить коротка или послать дальше читать теорию.
4 Maxus43
 
09.07.14
11:44
(3)>(1) не вариант чтоль?
5 Oz11
 
09.07.14
11:49
(4) не вариант создать пакет со всем возможным, так как через него будут выгружаться все документы. + при добавлении новых реквизитов в документ не хочется добавлять их в пакет.

сейчас у меня есть пакет, но он состоит из обязательных реквизитов документа типа номер, дата. и списка документов. а вот сами реквизиты планировал добавлять в пакет динамически. это вообще реализуемо и целесообразно ли?
6 Maxus43
 
09.07.14
11:52
я думаю что тут не совсем подходит. Пакет XDTO - это по сути стандарт, схема XML, по которой просто делать интергацию между системами. У тебя же нет схемы стабильной, это больше похоже на произвольный XML, значит, имхо, и разбирать этот XML придётся ручками, анализируя каждый элемент, атрибуит и прочее
7 Oz11
 
09.07.14
11:59
(6) тоесть ваш вариант - создать в конфигурации пакет XDTO, который будет содержать все возможные варианты выгрузки (все реквизиты всех документов и все табличные части всех документов). после этого заполнять в них только то, что выберет в настройках пользователь. соответственно типы создаваемых в пакете свойств можно определить заранее.
8 Maxus43
 
09.07.14
12:01
(7) да, но я думал что там пара доков. На всё про всё ты задолбаешся схему рисовать
9 Maxus43
 
09.07.14
12:01
тут надо больше смотреть в сторону целесообразности использования XDTO в данной задаче
10 Asmody
 
09.07.14
12:08
Динамически можно создать файл с нужной xsd-схемой, потом на его основе создать фабрику XDTO и с её помощью сериализовать объекты. Вот тут http://catalog.mista.ru/public/98019/ есть пример со слов "XDTO-пакет? Не нужен!"
11 Asmody
 
09.07.14
12:11
а вот тут http://catalog.mista.ru/public/254994/ есть описание того, как делать XDTO-пакет с открытыми типами
12 Oz11
 
09.07.14
12:16
большое спасибо за ссылки и за объяснение вообще. предлагаю тему не оставлять, я думаю она будет полезна в будущем.
13 Oz11
 
10.07.14
16:41
проблема решилась с помощью рекомендаций в посте (10). динамически собирается схема xsd, на ее основании создается своя фабрика, с помощью которой и происходит наполнение xml.
но тут возникла проблема. у меня логически файл xml разделен на конечное количество разделов:
1. описание списка выгружаемых документов. (содержит список документов, документ в свою очередь содержит список реквизитов и табличных частей)
2. описание ресурсного справочника 1 (выгрузка части или всего справочника из реквизитов документа в 1).
3. описание ресурсного справочника 2
4. ....

Запись происходит следующим образом:

        ЗаписьXML = Новый ЗаписьXML;
        
        ПараметрыЗаписиXML = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Ложь);
        
        ЗаписьXML.ОткрытьФайл(ИмяФайла, ПараметрыЗаписиXML); // произвольное имя файла
        
        ЗаписьXML.ЗаписатьОбъявлениеXML();
        
        // запишем список документов
        ЛокальнаяФабрикаXDTO.ЗаписатьXML(ЗаписьXML, СписокДокументовXDTO); // запись списка документов из пункта 1
        
        // запишем отдельно каждый из справочников-расшифровок
        Для каждого ЭлементСтруктурыСправочниковРесурсов Из СтруктураСправочниковРесурсов Цикл
            ЛокальнаяФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ЭлементСтруктурыСправочниковРесурсов.Значение); // попытка записи пунктов 2 - ..., которые находятся в структуре. ТУТ ОШИБКА
        КонецЦикла;
        
        ЗаписьXML.Закрыть();

получается что я не могу записать несколько отдельных "блоков" в XML. мне придется объединять все пункты в 1 общий?
14 Serginio1
 
10.07.14
18:53
15 Serginio1
 
10.07.14
18:56
Или можно воспользоваться Нетовским XmlSchema
http://msdn.microsoft.com/ru-ru/library/system.xml.schema.xmlschema(v=vs.110).aspx
16 Serginio1
 
11.07.14
11:22
(6) Хорошо такую схему генерить например из КД с формированием процедур обмена для обеих конфигураций на единой схеме. Премущества это отладка готового кода, скорость разбора, и тд
17 Oz11
 
15.07.14
11:08
послушайте мой план, к которому пришел в ходе работы на этой задачей:
1. нужно создать схему xsd для того чтобы писать/читать файл xml с данными самого обмена. у меня это создание происходит с помощью простого наполнения xml (ЗаписатьНачалоЭлемента, ЗаписатьАтрибут).
2. создание фабрики и подстановка ей файла, сформированного на 1м пункте плана.
3. заполнения файла данными посредством создания описаний типов, находящихся в фабрике (как пример: ДанныеXDTO = ЛокальнаяФабрикаXDTO.Создать(ЛокальнаяФабрикаXDTO.Тип("http://abmcloud.com/XMLSchema";, "Data"))).
4. в базе приемнике следует получить тот же файл xsd, который был получен в пункте 1.
5. создать фабрику и с помощью (Данные = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);) прочитать данный файла.
6. разбор прочитанных в пункте 5 данных в виде объектной модели. (документы представлены типом ОбъектXDTO и имеющими свойства (реквизиты шапки) и табличный части (как тип СписокXDTO).

для начала спрошу правильно ли у меня выстроена схема работы, так как я не использую СериализаторXDTO, описанный в посте (14)?
18 Oz11
 
15.07.14
11:11
для понимания привожу схему xsd, сформированную вручную в пункте 1, вышеописанного плана:

<xs:schema xmlns:tns="http://abmcloud.com/XMLSchema"; xmlns:xs="http://www.w3.org/2001/XMLSchema"; targetNamespace="http://abmcloud.com/XMLSchema"; attributeFormDefault="unqualified" elementFormDefault="qualified">
    <xs:simpleType name="ID">
        <xs:list itemType="xs:string"/>
    </xs:simpleType>
    <xs:complexType name="Data">
        <xs:sequence>
            <xs:element name="dataDocument" type="tns:DocumentList"/>
            <xs:element name="dataResource" type="tns:ResourceList"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="TabularLine_ПриходнаяНакладная_Состав">
        <xs:sequence>
            <xs:element name="Номенклатура" type="xs:string" nillable="true"/>
            <xs:element name="Характеристика" type="xs:string" nillable="true"/>
            <xs:element name="Количество" type="xs:decimal" nillable="true"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="TabularList_ПриходнаяНакладная_Состав">
        <xs:sequence>
            <xs:element name="tabularLine" type="tns:TabularLine_ПриходнаяНакладная_Состав" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="Document_ПриходнаяНакладная">
        <xs:sequence>
            <xs:element name="document_id" type="tns:ID"/>
            <xs:element name="document_type" type="xs:string"/>
            <xs:element name="document_held" type="xs:boolean"/>
            <xs:element name="document_data" type="xs:dateTime"/>
            <xs:element name="document_number" type="xs:string"/>
            <xs:element name="organization" type="xs:string" nillable="true"/>
            <xs:element name="shop" type="xs:string" nillable="true"/>
            <xs:element name="store" type="xs:string" nillable="true"/>
            <xs:element name="client" type="xs:string" nillable="true"/>
            <xs:element name="dogovor" type="xs:string" nillable="true"/>
            <xs:element name="tabularList_Состав" type="tns:TabularList_ПриходнаяНакладная_Состав"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="DocumentList_ПриходнаяНакладная">
        <xs:sequence>
            <xs:element name="document" type="tns:Document_ПриходнаяНакладная" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="DocumentList">
        <xs:sequence>
            <xs:element name="documentList_ПриходнаяНакладная" type="tns:DocumentList_ПриходнаяНакладная"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="ResourceLine_client">
        <xs:sequence>
            <xs:element name="id" type="tns:ID"/>
            <xs:element name="name" type="xs:string" nillable="true"/>
            <xs:element name="inn" type="xs:string" nillable="true"/>
            <xs:element name="okpo" type="xs:string" nillable="true"/>
            <xs:element name="main_dogovor" type="xs:string" nillable="true"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="ResourceList_client">
        <xs:sequence>
            <xs:element name="resourceLine" type="tns:ResourceLine_client" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element name="searchUnit" type="xs:string"/>
            <xs:element name="resourceType" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="ResourceLine_dogovor">
        <xs:sequence>
            <xs:element name="id" type="tns:ID"/>
            <xs:element name="date" type="xs:date" nillable="true"/>
            <xs:element name="vid" type="xs:string" nillable="true"/>
            <xs:element name="start_date" type="xs:date" nillable="true"/>
            <xs:element name="finish_date" type="xs:date" nillable="true"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="ResourceList_dogovor">
        <xs:sequence>
            <xs:element name="resourceLine" type="tns:ResourceLine_dogovor" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element name="searchUnit" type="xs:string"/>
            <xs:element name="resourceType" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="ResourceList">
        <xs:sequence>
            <xs:element name="resourceList_client" type="tns:ResourceList_client"/>
            <xs:element name="resourceList_dogovor" type="tns:ResourceList_dogovor"/>
        </xs:sequence>
    </xs:complexType>
</xs:schema>
19 Oz11
 
15.07.14
11:40
прием