![]() |
![]() |
|
v8: Использование XDTO серилизации при обмене данными между конфигурациями | ☑ | ||
---|---|---|---|---|
0
miron16
25.03.08
✎
09:48
|
Огромная просьба, тем кому нечего сказать - лучше не говорите, отправка на ИТС без конкретики тоже самое.
Для всех отальных предлагаю немного подесскутировать по вопросам реализации XDTO. Ненашел ни одной статьи которая смогла бы дать понять зачем он вообще нужен. То что для выгрузки/загрузки это понятно, но чем он отличается от выгрузок через XML... как раньше им пользовались в 8.0??? |
|||
1
Андрюха
25.03.08
✎
09:52
|
Аббревиатура XDTO расшифровывается как XML Data Transfer Objects. XDTO является механизмом объектного моделирования данных, описываемых с помощью схемы XML.
|
|||
2
miron16
25.03.08
✎
09:54
|
Это хорошо, но зачем отходить от старых методов?
в чем его превосходство? Что такое фабрики... хотелось бы чуть больше конкретики |
|||
3
Андрюха
25.03.08
✎
09:58
|
Механизм XDTO реализован с помощью набора объектов встроенного языка и объекта конфигурации XDTO пакет. Возможно выполнение следующих действий:
* создание XDTO пакета с помощью импорта схемы XML; * добавление нового XDTO пакета в дерево конфигурации и последующее его редактирование; * экспорт существующего XDTO пакета в схему XML. Также система 1С:Предприятие 8 поддерживает возможность экспорта набора XML схем данных конфигурации. Редактирование XDTO пакета осуществляется в специальном окне, отображающем иерархическую структуру XDTO пакета. |
|||
4
miron16
25.03.08
✎
10:04
|
не очень понятна сама схема использования.
Сначала создается XML схема базы приемника, загружается в XDTO пакет базы источника, и делается выгрузка в файл обмена? как то так? |
|||
5
Андрюха
25.03.08
✎
10:07
|
На основании обекта 1 раз описаного СериализаторXDTO ты можешь выливать в XML какие нужно объекты
|
|||
6
miron16
25.03.08
✎
10:09
|
Андрюха, СериализаторXDTO - это как я понимаю пространство имен?
Я совсем не понимаю как это работает.... не можешь по шагам расписать |
|||
7
Андрюха
25.03.08
✎
10:10
|
// Получить ссылку на элемент справочника Номенклатура |
|||
8
miron16
25.03.08
✎
10:11
|
я видел этот код. мне не понятно что такое Фабрика
|
|||
9
Андрюха
25.03.08
✎
10:18
|
Фабрики XDTO создается на основе схемы или набора схем XML:
ЗаписьXML = Новый ЗаписьXML; |
|||
10
miron16
25.03.08
✎
10:21
|
а для чего они нужны???
на самом деле я понял проблему свою. Я не понимаю последовательности действий. Я не понимаю что такое XML схема, что такое Фабрики XDTO, и где вообще этот код писать. |
|||
11
Андрюха
25.03.08
✎
10:24
|
XML схема конфигурации-приемника выгружается из конфигурации-примника - в дереве конфигурации правой кнопочкой щелкай по узлу "Пакеты XDTO" и выбирай "Экспорт XML-схемы данных конфигурации"
|
|||
12
miron16
25.03.08
✎
10:25
|
это понятно... дальше
|
|||
13
Андрюха
25.03.08
✎
10:26
|
Дальше для выгрузки смотри (9), где в качестве ИмяФайла используй экспортированный файл.
|
|||
14
miron16
25.03.08
✎
10:28
|
а где все это делать то?????=)
|
|||
15
Андрюха
25.03.08
✎
10:28
|
Ну и потом создавай ТипОбъектаXDTO для тех объектов, которые требуется выгрузить:
ТипРеализация = Фабрика.Тип("http://v8.1c.ru/8.1/data/enterprise/current-config", "DocumentObject.Реализация"); |
|||
16
Андрюха
25.03.08
✎
10:29
|
(14) Создай новую обработку МойаВыгрузко
|
|||
17
miron16
25.03.08
✎
10:30
|
щас попробую
|
|||
18
miron16
25.03.08
✎
10:34
|
точно вместо ИмяФайла ???
|
|||
19
miron16
25.03.08
✎
10:35
|
роцедура КнопкаВыполнитьНажатие(Кнопка)
// Вставить содержимое обработчика. ЗаписьXML = Новый ЗаписьXML; ИмяФайла ="XML_схема_УТ_CRM.xsd"; ЗаписьXML.ОткрытьФайл(ИмяФайла); Пути = Новый Массив(); Пути.Добавить("C:\DestinatonConf.xsd"); Фабрика = СоздатьФабрикуXDTO(Пути); ТипРеализация = Фабрика.Тип("http://v8.1c.ru/8.1/data/enterprise/current-config", "DocumentObject.Реализация"); КонецПроцедуры |
|||
20
Андрюха
25.03.08
✎
10:36
|
Фабрика создается на основании выгруженной схемы
|
|||
21
miron16
25.03.08
✎
10:40
|
Процедура КнопкаВыполнитьНажатие(Кнопка)
// Вставить содержимое обработчика. ЗаписьXML = Новый ЗаписьXML; ИмяФайла ="XML_выгрузка.xml"; ЗаписьXML.ОткрытьФайл(ИмяФайла); Пути = Новый Массив(); Пути.Добавить("C:\XML_схема_УТ_CRM.xsd"); Фабрика = СоздатьФабрикуXDTO(Пути); ТипРеализация = Фабрика.Тип("http://v8.1c.ru/8.1/data/enterprise/current-config", "DocumentObject.Реализация"); КонецПроцедуры |
|||
22
miron16
25.03.08
✎
10:40
|
так?
|
|||
23
Андрюха
25.03.08
✎
10:40
|
Да!
|
|||
24
miron16
25.03.08
✎
10:41
|
воооо
|
|||
25
Андрюха
25.03.08
✎
10:41
|
Но ты не создал ОбъектXDTO по типу, и объект 1С конфигурации-источника
|
|||
26
miron16
25.03.08
✎
10:41
|
а дальше что делать? до сюда вроде понятно ( кроме последней строки ТипРеализация = Фабрика.Тип("http://v8.1c.ru/8.1/data/enterprise/current-config", "DocumentObject.Реализация");)
|
|||
27
Андрюха
25.03.08
✎
10:43
|
ТипРеализация - это пример создания типа объекта XDTO для документа Реализация. Если планируется выгрузка других объектов, то работать нужно будет с ихними типами
|
|||
28
miron16
25.03.08
✎
10:45
|
а если их несколько ... допустим справочники номенклатура...у него же есть подчиненные... единицы измерения например
|
|||
29
Андрюха
25.03.08
✎
10:45
|
Потом из типов с помощью фабрики будешь создашь объекты выгрузки
ОбъектДокРеализация = Фабрика.Создать(ТипРеализация); |
|||
30
miron16
25.03.08
✎
10:48
|
Подведем черту на данном этапе
ЗаписьXML = Новый ЗаписьXML; ИмяФайла ="XML_выгрузка.xml"; ЗаписьXML.ОткрытьФайл(ИмяФайла); Пути = Новый Массив(); Пути.Добавить("C:\XML_схема_УТ_CRM.xsd"); Фабрика = СоздатьФабрикуXDTO(Пути); это - шапка...она не зависит от количества видов объектов ТипРеализация = Фабрика.Тип("http://v8.1c.ru/8.1/data/enterprise/current-config", "DocumentObject.Реализация"); ТипРеализация = Фабрика.Тип("http://v8.1c.ru/8.1/data/enterprise/current-config", "DocumentObject.Расходная"); Это набираются все выгружаемы типы ( по типам туда конфигурации-приемника) все так? |
|||
31
Андрюха
25.03.08
✎
10:48
|
(28) Выгрузишь значит сперва справочник единиц для номенклатуры, а при выгрухке самой номенклатуры будешь юзать УникальныйИдентификатор()
|
|||
32
Андрюха
25.03.08
✎
10:48
|
(30) Да
|
|||
33
miron16
25.03.08
✎
10:51
|
получается, чтобы настроить обмен между разными конфигурациями - это нет то и просто?
|
|||
34
miron16
25.03.08
✎
10:51
|
Андрюха, что ты мне посоветуешь, ну и другим кто будет это читать, изучить для лучшего понимания всего этого?
|
|||
35
Андрюха
25.03.08
✎
10:53
|
(33) Наоборот, с помощью XDTO это как 2 пальца об асфальт
|
|||
36
Андрюха
25.03.08
✎
10:54
|
Кстати, мы еще только на пол пути
|
|||
37
miron16
25.03.08
✎
10:55
|
что то я не могу воткнуться... если чтобы один справочник синхронизировать это надо столько делать... очередность выгрузки подчиненных справочников...а в документе такого вообще море
|
|||
38
miron16
25.03.08
✎
10:56
|
в том то и дело, что мы ещё на пол пути а я уже не понимаю..=)
|
|||
39
Андрюха
25.03.08
✎
10:57
|
(37) Подчиненные-то явным образом вроде можно не выгружать. Оно само по-идее должно все затащить
|
|||
40
miron16
25.03.08
✎
10:58
|
вот смотри...есть документ Событие в УТ, простой документ.... давай на его примере попробуем синхронизировать? (конфы пока одинаковые...ут)??? есть ли у тебя время и желание?
|
|||
41
Андрюха
25.03.08
✎
10:59
|
Теперь создаем объекты выгрузки (29) и соответствующие им объекты из конфы-источника:
ОбъектДокРеализация = Фабрика.Создать(ТипРеализация); |
|||
42
Андрюха
25.03.08
✎
11:03
|
Потом заполяем поля:
ОбъектДокРеализация.Ссылка = РеализацияОбъект.Ссылка.УникальныйИдентификатор(); |
|||
43
miron16
25.03.08
✎
11:04
|
ЗаписьXML = Новый ЗаписьXML;
ИмяФайла ="XML_выгрузка.xml"; ЗаписьXML.ОткрытьФайл(ИмяФайла); Пути = Новый Массив(); Пути.Добавить("C:\XML_схема_УТ_CRM.xsd"); Фабрика = СоздатьФабрикуXDTO(Пути); ТипСобытия = Фабрика.Тип("http://v8.1c.ru/8.1/data/enterprise/current-config", "DocumentObject.Событие"); ОбъектДокСобытие = Фабрика.Создать(ТипСобытия); СобытиеОбъект = СобытиеОбъект.ПолучитьОбъект(); так? |
|||
44
Андрюха
25.03.08
✎
11:06
|
Ну и записать
Фабрика.ЗаписатьXML(ЗаписьXML, ОбъектДокРеализация); И так постепенно все выгружаешь что нужно. А загрузка вообще ни о чем: ЧтениеXML = Новый ЧтениеXML; |
|||
45
Андрюха
25.03.08
✎
11:06
|
(43) Так
|
|||
46
miron16
25.03.08
✎
11:07
|
там же есть табличные поля..как с ними быть?
|
|||
47
miron16
25.03.08
✎
11:14
|
ЗаписьXML = Новый ЗаписьXML;
ИмяФайла ="XML_выгрузка.xml"; ЗаписьXML.ОткрытьФайл(ИмяФайла); Пути = Новый Массив(); Пути.Добавить("C:\XML_схема_УТ_CRM.xsd"); Фабрика = СоздатьФабрикуXDTO(Пути); ТипСобытия = Фабрика.Тип("http://v8.1c.ru/8.1/data/enterprise/current-config", "DocumentObject.Событие"); ОбъектДокСобытие = Фабрика.Создать(ТипСобытия); СобытиеОбъект = СобытиеОбъект.ПолучитьОбъект(); ОбъектДокСобытие.Ссылка = СобытиеОбъект.Ссылка.УникальныйИдентификатор(); ОбъектДокСобытие.ПометкаУдаления = СобытиеОбъект.ПометкаУдаления; ОбъектДокСобытие.Дата = СобытиеОбъект.Дата; ОбъектДокСобытие.Номер = СобытиеОбъект.Номер; ОбъектДокСобытие.Проведен = СобытиеОбъект.Проведен; ОбъектДокСобытие.Комментарий = СобытиеОбъект.Комментарий; ОбъектДокСобытие.КраткийСоставДокумента = СобытиеОбъект.КраткийСоставДокумента; ОбъектДокСобытие.Ответственный = СобытиеОбъект.Ответственный.УникальныйИдентификатор(); Фабрика.ЗаписатьXML(ЗаписьXML, ОбъектДокСобытие); ЗаписьXML.Закрыть(); Ругается на строку СобытиеОбъект = СобытиеОбъект.ПолучитьОбъект(); |
|||
48
Андрюха
25.03.08
✎
11:15
|
(46) Это "КраткийСоставДокумента"
|
|||
49
Андрюха
25.03.08
✎
11:16
|
(47) Кури "ПолучитьОбъект" в синтаксис-помощнике
|
|||
50
miron16
25.03.08
✎
11:35
|
ЗаписьXML = Новый ЗаписьXML;
ИмяФайла ="XML_выгрузка.xml"; ЗаписьXML.ОткрытьФайл(ИмяФайла); Пути = Новый Массив(); Пути.Добавить("C:\XML_схема_УТ_CRM.xsd"); Фабрика = СоздатьФабрикуXDTO(Пути); ТипСобытие = Фабрика.Тип("http://v8.1c.ru/8.1/data/enterprise/current-config", "DocumentObject.Событие"); ОбъектДокСобытие = Фабрика.Создать(ТипСобытие); СобытиеОбъект = СобытиеОбъект.ПолучитьОбъект(); ОбъектДокСобытие.Ссылка = СобытиеОбъект.Ссылка.УникальныйИдентификатор(); ОбъектДокСобытие.ПометкаУдаления = СобытиеОбъект.ПометкаУдаления; ОбъектДокСобытие.Дата = СобытиеОбъект.Дата; ОбъектДокСобытие.Номер = СобытиеОбъект.Номер; ОбъектДокСобытие.Проведен = СобытиеОбъект.Проведен; ОбъектДокСобытие.Комментарий = СобытиеОбъект.Комментарий; ОбъектДокСобытие.КраткийСоставДокумента = СобытиеОбъект.КраткийСоставДокумента; ОбъектДокСобытие.Ответственный = СобытиеОбъект.Ответственный.УникальныйИдентификатор(); Фабрика.ЗаписатьXML(ЗаписьXML, ОбъектДокСобытие); ЗаписьXML.Закрыть(); |
|||
51
miron16
25.03.08
✎
11:41
|
ЗаписьXML = Новый ЗаписьXML;
ИмяФайла ="XML_выгрузка.xml"; ЗаписьXML.ОткрытьФайл(ИмяФайла); Пути = Новый Массив(); Пути.Добавить("C:\XML_схема_УТ_CRM.xsd"); Фабрика = СоздатьФабрикуXDTO(Пути); ТипСобытие = Фабрика.Тип("http://v8.1c.ru/8.1/data/enterprise/current-config", "DocumentObject.Событие"); ОбъектДокСобытие = Фабрика.Создать(ТипСобытие); ДокВыборка = Документы.Событие.Выбрать(); Пока ДокВыборка.Следующий() Цикл СобытиеОбъект = ДокВыборка.ПолучитьОбъект(); ОбъектДокСобытие.Ссылка = СобытиеОбъект.Ссылка.УникальныйИдентификатор(); ОбъектДокСобытие.ПометкаУдаления = СобытиеОбъект.ПометкаУдаления; ОбъектДокСобытие.Дата = СобытиеОбъект.Дата; ОбъектДокСобытие.Номер = СобытиеОбъект.Номер; ОбъектДокСобытие.Проведен = СобытиеОбъект.Проведен; ОбъектДокСобытие.Комментарий = СобытиеОбъект.Комментарий; ОбъектДокСобытие.КраткийСоставДокумента = СобытиеОбъект.КраткийСоставДокумента; ОбъектДокСобытие.Ответственный = СобытиеОбъект.Ответственный.УникальныйИдентификатор(); КонецЦикла; Фабрика.ЗаписатьXML(ЗаписьXML, ОбъектДокСобытие); ЗаписьXML.Закрыть(); |
|||
52
Андрюха
25.03.08
✎
11:45
|
(51) Запись в цикле делай
|
|||
53
miron16
25.03.08
✎
11:46
|
ОбъектДокСобытие.Ссылка = СобытиеОбъект.Ссылка.УникальныйИдентификатор();
{Форма.Форма(16)}: Поле объекта не обнаружено (Ссылка) ОбъектДокСобытие.Ссылка = СобытиеОбъект.Ссылка.УникальныйИдентификатор(); |
|||
54
Андрюха
25.03.08
✎
11:48
|
И когда будешь читать, учти что
ТвойОбъект = СериализаторXDTO.ПрочитатьXML(ЧтениеXML); |
|||
55
Андрюха
25.03.08
✎
11:49
|
(53) Попробуй:
ОбъектДокСобытие.Ref = СобытиеОбъект.Ссылка.УникальныйИдентификатор(); |
|||
56
miron16
25.03.08
✎
11:52
|
сработало и дальше пошли ошибки.... я понял что надо английскими писать
ЗаписьXML = Новый ЗаписьXML; ИмяФайла ="XML_выгрузка.xml"; ЗаписьXML.ОткрытьФайл(ИмяФайла); Пути = Новый Массив(); Пути.Добавить("C:\XML_схема_УТ_CRM.xsd"); Фабрика = СоздатьФабрикуXDTO(Пути); ТипСобытие = Фабрика.Тип("http://v8.1c.ru/8.1/data/enterprise/current-config", "DocumentObject.Событие"); ОбъектДокСобытие = Фабрика.Создать(ТипСобытие); ДокВыборка = Документы.Событие.Выбрать(); Пока ДокВыборка.Следующий() Цикл СобытиеОбъект = ДокВыборка.ПолучитьОбъект(); ОбъектДокСобытие.Ref = СобытиеОбъект.Ссылка.УникальныйИдентификатор(); ОбъектДокСобытие.DeletionMark = СобытиеОбъект.ПометкаУдаления; ОбъектДокСобытие.Date = СобытиеОбъект.Дата; ОбъектДокСобытие.Number = СобытиеОбъект.Номер; ОбъектДокСобытие.Posted = СобытиеОбъект.Проведен; ОбъектДокСобытие.Комментарий = СобытиеОбъект.Комментарий; ОбъектДокСобытие.КраткийСоставДокумента = СобытиеОбъект.КраткийСоставДокумента; ОбъектДокСобытие.Ответственный = СобытиеОбъект.Ответственный.УникальныйИдентификатор(); Фабрика.ЗаписатьXML(ЗаписьXML, ОбъектДокСобытие); ЗаписьXML.Закрыть(); КонецЦикла; |
|||
57
Андрюха
25.03.08
✎
11:54
|
Ну вот так должно работать четко
|
|||
58
miron16
25.03.08
✎
12:02
|
Спасибо Андрюха... буду в этом дальше разбираться...
|
|||
59
Aloex
25.03.08
✎
12:16
|
Господа обьясните на каком произошло создание "C:\XML_схема_УТ_CRM.xsd"?
|
|||
60
Aloex
25.03.08
✎
12:34
|
(59)+Вопрос снят.
|
|||
61
Aloex
25.03.08
✎
13:57
|
Ай нид хелп.
ОбъектДокСобытие.Товары = СобытиеОбъект.Товары;//табличная часть Поле объекта недоступно для записи (Товары) ОбъектДокСобытие.Товары = СобытиеОбъект.Товары; что не так? |
|||
62
Андрюха
25.03.08
✎
14:54
|
(61) Табличные части выгружаются так:
ОбъектДокСобытие.КраткийСоставДокумента = СобытиеОбъект.КраткийСоставДокумента; |
|||
63
Aloex
25.03.08
✎
15:11
|
(62) В этом случае происходит следующая ошибка
Поле объекта не обнаружено (КраткийСоставДокумента) ОбъектДокСобытие.КраткийСоставДокумента = СобытиеОбъект.КраткийСоставДокумента; Сама процедура имеет вид: ЗаписьXML = Новый ЗаписьXML; ИмяФайла ="C:\12XML_выгрузка.xml"; ЗаписьXML.ОткрытьФайл(ИмяФайла); Пути = Новый Массив(); Пути.Добавить("C:\ИмпортXSDO.xsd"); Фабрика = СоздатьФабрикуXDTO(Пути); ТипПоступлениеТоваровУслуг = Фабрика.Тип("http://v8.1c.ru/8.1/data/enterprise/current-config", "DocumentObject.ПоступлениеТоваровУслуг"); ОбъектДокСобытие = Фабрика.Создать(ТипПоступлениеТоваровУслуг); ДокВыборка = Документы.ПоступлениеТоваровУслуг.Выбрать(); Пока ДокВыборка.Следующий() Цикл СобытиеОбъект = ДокВыборка.ПолучитьОбъект(); ОбъектДокСобытие.Ref = СобытиеОбъект.Ссылка.УникальныйИдентификатор(); ОбъектДокСобытие.DeletionMark = СобытиеОбъект.ПометкаУдаления; ОбъектДокСобытие.Date = СобытиеОбъект.Дата; ОбъектДокСобытие.Number = СобытиеОбъект.Номер; ОбъектДокСобытие.Posted = СобытиеОбъект.Проведен; ОбъектДокСобытие.Комментарий = СобытиеОбъект.Комментарий; ОбъектДокСобытие.КраткийСоставДокумента = СобытиеОбъект.КраткийСоставДокумента; ОбъектДокСобытие.Ответственный = СобытиеОбъект.Ответственный.УникальныйИдентификатор(); Фабрика.ЗаписатьXML(ЗаписьXML, ОбъектДокСобытие); ЗаписьXML.Закрыть(); КонецЦикла; |
|||
64
Aloex
25.03.08
✎
15:55
|
fg.
|
|||
65
Aloex
26.03.08
✎
09:50
|
UP
|
|||
66
Kasper076
24.05.08
✎
10:23
|
Не получается последовательная запись объектов с помощью ФабрикиXDTO. Т.е. один объект прекрасно записывается, а вот второй уже нет.
|
|||
67
Kyrales
24.05.08
✎
13:55
|
(66) Покажи код, чего там делаешь
|
|||
68
Kasper076
25.05.08
✎
12:16
|
Уже разобрался как делать.
|
|||
69
Kasper076
26.05.08
✎
09:24
|
C последовательны добавлением объектов разобрался. Теперь возник другой вопрос.
В схеме конфигурации приемника табличная часть Товары документа ПоступлениеТоваровУслуг имеет тип "DocumentTabularSectionRow.ПоступлениеТоваровУслуг.Товары", а в конфигурации источнике XMLТип(ТипЗнч(ТабличнаяЧастьТовары)) возвращает Неопределено, равно как и НовыйСериализаторXDTO.XMLТипЗнч(ТабличнаяЧастьТовары); |
|||
70
leo_d
07.08.08
✎
13:04
|
По представленному примеру сделал:
ЗаписьXML = Новый ЗаписьXML; ИмяФайла ="D:\XML_выгрузка.xml"; ЗаписьXML.ОткрытьФайл(ИмяФайла); Пути = Новый Массив(); Пути.Добавить("D:\111.xsd"); Фабрика = СоздатьФабрикуXDTO(Пути); ТипНоменклатура = Фабрика.Тип("http://v8.1c.ru/8.1/data/enterprise/current-config", "CatalogObject.Номенклатура"); ОбъектСпрНоменклатура = Фабрика.Создать(ТипНоменклатура); СпрВыборка = Справочники.Номенклатура.Выбрать(); Пока СпрВыборка.Следующий() Цикл НоменклатураОбъект = СпрВыборка.ПолучитьОбъект(); ОбъектСпрНоменклатура.Ref = НоменклатураОбъект.Ссылка.УникальныйИдентификатор(); ОбъектСпрНоменклатура.Isfolder = НоменклатураОбъект.Ссылка.ЭтоГруппа; ОбъектСпрНоменклатура.Parent = НоменклатураОбъект.Ссылка.Родитель.УникальныйИдентификатор(); ОбъектСпрНоменклатура.Description = НоменклатураОбъект.Ссылка.Наименование; ОбъектСпрНоменклатура.Code = НоменклатураОбъект.Ссылка.Код; ОбъектСпрНоменклатура.DeletionMark = НоменклатураОбъект.ПометкаУдаления; Фабрика.ЗаписатьXML(ЗаписьXML, ОбъектСпрНоменклатура); КонецЦикла; ЗаписьXML.Закрыть(); Выдает ошибку: {Форма.Форма(29)}: Ошибка при вызове метода контекста (ЗаписатьXML) Фабрика.ЗаписатьXML(ЗаписьXML, ОбъектСпрНоменклатура); по причине: по причине: Ошибочный порядок записи XML Подскажите, плииз, как выйти из ситуации |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |