Имя: Пароль:
1C
1С v8
Вопрос про XDTO.
,
0 ll13
 
22.12.09
20:03
При выгрузке в XML через XDTO, все реквизиты должны быть заполнены(либо инициализированны пустыми значениями), иначе потом невозможно буде загрузить с помощью Объект = СериализаторXDTO.ПрочитатьXML(ЧтениеXML)
Вопрос : кто нибудь пользует XDTO для обмена между разнородными конфами ? Ведь вышеуказанный факт делает бесполезным XDTO в реальных условиях, когда у документа 50 реквизитов, обязательны 5, остальные 45 нужно инициализировать пустыми значениями...(
1 Рэйв
 
22.12.09
20:07
(0)Пусть побьют меня камнями, но слово "XDTO" слышу первый раз....Наверное я отсталый...Поэтому предпочитаю КД 2.0
2 Живой Ископаемый
 
22.12.09
20:19
Не переноси остальные 45 вообще - делов-то... исключи их схемы вовсе
3 ll13
 
22.12.09
20:22
Исключал, не работает (
Т.е. если в неком Объекте есть реквизит Реквизит1, а в файле переноса XML его нет то Объект = СериализаторXDTO.ПрочитатьXML(ЧтениеXML) выдаст ошибку ...
4 Живой Ископаемый
 
22.12.09
20:24
что-то ты не так  делаешь
5 ll13
 
22.12.09
20:28
Скиньте пример если есть.
6 Живой Ископаемый
 
22.12.09
20:31
есть книжка в сети.. переход от в80 к в81... ссылку конечно не дам.. там целая глава про хдто
7 ll13
 
22.12.09
20:38
У меня есть эта книга, там есть "игрушечный" пример, который разумеется отлично работает, перенести документ с 3-мя реквизитами проблемы не составляет.
Проблема - когда в документе есть к примеру 100 реквизитов, а обязательных для заполнения не больше 10-ти, в таком случае все остальные реквизиты необходимо, при выгрузке инициализировать пустыми значениями, т.е. ВСЕ реквизиты должны существовать в сериализованном виде.
8 acsent
 
22.12.09
20:42
покажи код
9 Claudio
 
22.12.09
20:51
(0) Вообще-то XDTO предполагался скорее для обмена между 1С и другими программами, а не между 2-мя базами. Зачем так изголяться, когда есть Конвертация данных?
10 Claudio
 
22.12.09
20:52
(1) Да, слегка отстал, XDTO появилось на 8.1
11 acsent
 
22.12.09
21:11
XDTO позволяет одним движение превратить XML в объект (не обязательно объект бд)
12 acsent
 
22.12.09
21:12
(11) Удобно для хранения настроек
13 Kasper076
 
22.12.09
21:43
(11) Абсолютно прав. Но и (0) тоже прав. Разбирался в свое время с этой темой. Все реквизиты объекта должны быть заполнены иначе, при загрузке, 1С не модет создать объект из его XML-представления. Вот полезная ссылка http://itland.ru/forum//index.php?showtopic=21932&pid=107069&st=0&#entry107069
14 ll13
 
23.12.09
10:34
(11) Превратить то превратишь, но только при условии что XML содержит ВСЕ реквизиты объекта(в том числе незаполненные). Эта особенность делает XDTO бесполезным при обмене данными между разнородными конфами. Кроме того крайне не надёжным, пример : Настроена перенос документа Д1 из базы Б1 в документ Д2 из базы Б2. Состав реквизитов документа не идентичен. Все работает отлично. Далее в базе Б2 у документа Д2 добавляем реквизит НеобязательныйНикомуНеНужныйРеквизит. И... все перенос больше не работает, его надо переписывать и дописывать сериализацию реквизита НеобязательныйНикомуНеНужныйРеквизит...
(13) Ссылку читал там игрушечный пример который работает замечательно, но где в реальность Вы видели документ с 3-ме реквизитами ?! )
15 ll13
 
25.12.09
14:12
Подниму ветку, проблема преобразования из XML -> Объект 1С, при отсутствии нескольких реквизитов в XML осталась не решена , можь кто решил эту задачу ?
16 Oftan_Idy
 
25.12.09
14:20
Да, с чего вы взяли что должны быть все реквизиты в пакете XDTO?
Все зависит от того как описана модель (xsd).
Для типа объета укажите фасет "Минимальное количество" = 0, и элемент можно вообще не включать в пакет.
17 Kasper076
 
25.12.09
14:41
(16) У типа объекта я не нашел фассета "Минимальное количество". Только у свойств оно есть.
18 Oftan_Idy
 
25.12.09
15:12
(17) Да, сори у свойства
19 ll13
 
25.12.09
15:42
А может у кого есть реально работающий пример обмена данными между конфами различной структуры, построенный на XDTO ?
20 Kasper076
 
25.12.09
15:56
(18) Т.е. те свойства у которых фасет МинимальноеКоличесто = 0 могут быть незаполненными? И вытекает ли отсюда, что те свойства у которых фасет МаксимальноКоличество = 0 могут быть в объекте источнике, но отсутствовать в объекте приемнике?
21 quest
 
25.12.09
15:58
странно, реквизти может быть не обязательным. Либо тип открытым.
22 Kasper076
 
25.12.09
16:02
(21) Как это в XSD-схеме обозначить?
23 quest
 
25.12.09
16:08
<xsd:complexType mixed="true" name="Документ">
       <xsd:all>
           <xsd:element name="Контрагент" nillable="true" type="tns:Контрагент"/>
24 quest
 
25.12.09
16:09
<xsd:anyAttribute namespace="##any" processContents="lax"/>
   </xsd:complexType>

рука дренулась. Сори
25 ll13
 
25.12.09
16:37
В таком случае что я делаю неправильно ?


1). Создал в конфигурации Документ1, с единственным реквизитом Реквизит1.
2). Экспортировал XML-схему конфы в файл shema.xsd
3). Выгрузил Документ1 при помощи кода:
Пути = Новый Массив();
Пути.Добавить("D:\shema.xsd");
МояФабрика = СоздатьФабрикуXDTO(Пути);    
ТипXDTO = МояФабрика.Тип("http://v8.1c.ru/8.1/data/enterprise/current-config", "DocumentObject.Документ1");
ОбъектXDTO = МояФабрика.Создать(ТипXDTO);
ОбъектXDTO.Ref = Документ1.Ссылка;
ОбъектXDTO.DeletionMark = Документ1.ПометкаУдаления;
ОбъектXDTO.Date   = Документ1.Дата;
ОбъектXDTO.Number = Документ1.Номер;
ОбъектXDTO.Posted = Документ1.Проведен;

// Реквизит1 намеренно не заполняю !!!

ИмяФайла = "D:\perenos.xml";
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ИмяФайла);
МояФабрика.ЗаписатьXML(ЗаписьXML,ОбъектXDTO);
ЗаписьXML.Закрыть();

Пытаюсь загрузить документ:
ИмяФайла = "D:\perenos.xml";
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ИмяФайла);
Документ1 = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
Документ1.ОбменДанными.Загрузка = Истина;
Документ1.Записать(РежимЗаписиДокумента.Запись);
ЧтениеXML.Закрыть();

Получаю :
Ошибка при вызове метода контекста (ПрочитатьXML): Ошибка преобразования данных XDTO:
НачалоСвойства: {http://v8.1c.ru/8.1/data/enterprise/current-config}DocumentObject.Документ1    Форма: Элемент    Тип: {http://v8.1c.ru/8.1/data/enterprise/current-config}DocumentObject.Документ1
   Документ1 = СериализаторXDTO.ПрочитатьXML(ЧтениеXML); .....

Если при выгрузке Реквизит1 заполнить то всё отлично работает.
Как это можно обойти ?
26 ll13
 
25.12.09
19:08
Подниму...
28 quest
 
25.12.09
23:42
выгрузи схему xsd. посмотри описание. на край - забей болт на 1С и сам опиши как тебе надо.
29 ll13
 
28.12.09
12:53
(28) Выгрузил, посмотрел ... вопрос в том что я там должен(не должен) увидеть.
Схема как схема, урезал её оставив в ней описание только одного(выгружаемого) документа. результат тот же...(
30 Sonny
 
28.12.09
15:28
Тоже пытался одолеть эту ошибку. В конце концов плюнул и написал свою выгрузку/загрузку через XML без использования встроенных сериализаторов.
Подозреваю, что как ни извращайся со схемой при выгрузке, результирующий файл будет одинаковым. Во всяком случае мне не удалось добиться, чтобы информация о необязательных реквизитах попадала в файл выгрузки. Есть подозрение, что СериализаторXDTO при загрузке все же должен "знать": какие реквизиты являются необязательными. А откуда он это узнает, если в файле об этом ни байта? Возможно успеха добиться можно, используя схему при загрузке данных.
31 ll13
 
28.12.09
16:48
(30) Тоже не помогает уже пробовал подсунуть схему результат тот же :(

ИмяФайла = "D:\perenos.xml";
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ИмяФайла);
Пути = Новый Массив();
Пути.Добавить("D:\shema.xsd");
МояФабрика = СоздатьФабрикуXDTO(Пути);
МойСериализатор = Новый СериализаторXDTO(МояФабрика);
Документ1 = МойСериализатор.ПрочитатьXML(ЧтениеXML);
Документ1.ОбменДанными.Загрузка = Истина;
Документ1.Записать(РежимЗаписиДокумента.Запись);
ЧтениеXML.Закрыть();
32 niko8
 
29.12.09
11:39
Не очень вникал ч суть проблемы. Но что ознасает свойставо Возможно пустое.
XDTO использовал для работы с Web сервисом. А для выгрузки и загрузки документов в XML существует обработка на ИТС, можно поковырять ее и посмотреть как там реализованно.
33 ll13
 
29.12.09
18:13
(32) Ничего не означает, в теории признак того что свойство может быть пустым, на практике это ничего не меняет. Свойства "Фиксированное" и "По умолчанию" так же не влияют на формирование xml-документа...
34 Kasper076
 
30.12.09
13:40
Я тут вот о чем подумал. Если при загрузке через свойство глобального контекста СериализаторXDTO 1С использует XSD схему той конфы, в которую мы загружаем данные. Эту схему мы изменить ни как не можем. Следовательно при загрузке нужно использовать нашу собственную схему, которую мы использовали при выгрузке.В результате будет создан некий объект из сериализованных данных. Но он не будет являться объектом БД (т.е. справочником или документом). Но значениями свойств этого объекта можно уже будет заполнить свойства объекта БД. Что-то вроде ЗаполнитьЗначенияСвойств(ОбъкетXDTO,ОбъектБД).
35 ll13
 
30.12.09
15:46
(34) Вариант вполне жизнеспособный.
Ещё вариант: у необязательных реквизитов в схеме поставить на всякий случай nillable="true", затем при выгрузке заполняем реквизиты которые нужны и вызываем процедуру
Процедура ИнициализироватьПоУмолчанию(ОбъектXDTO)
// Все реквизиты которые забиваются Неопределенно в схеме должны иметь nillable="true"
ТипСписокXDTO = Тип("СписокXDTO");
Для каждого СвойствоОбъектаXDTO Из ОбъектXDTO.Свойства() Цикл
 Если НЕ ТипЗнч(ОбъектXDTO[СвойствоОбъектаXDTO.Имя]) = ТипСписокXDTO Тогда
   Если НЕ ОбъектXDTO.Установлено(СвойствоОбъектаXDTO) Тогда
     ОбъектXDTO[СвойствоОбъектаXDTO.Имя] = Неопределено;                
   КонецЕсли;
 КонецЕсли;
КонецЦикла;
КонецПроцедуры

Затем с чистой совестью пишем ОбъектXDTO в XML
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший