С появлением платформы 8.1 фирма “1С” представила механизм, носящий интригующее название XML Data Transfer Objects или, если коротко - XDTO. По традиции, документирование механизма составлял тот, кто хорошо разбирался в вопросе, а стало быть опустил “и так понятные” с его точки зрения моменты.
Целью данной статьи (или цикла статей, как получится) стало желание поделиться накопленным опытом. Мне кажется, многие неочевидные вещи в механизме XDTO необходимо осветить получше.
Предлагаю в статье осветить разницу между ФабрикойXDTO как свойством глобального контекста (т.е. который синглтон) и объектом, созданным через конструктор "Новый ФабрикаXDTO". Разница есть и весьма немалая.
(1) Yashazz, Я делал обмен между различными по структуре базами XDTO через свойство глобального контекста - намучился прилично пока придумал как сделать взаимосвязь между схемами двух баз. Когда уже сделал и начал мучить разработчиков в 1С по поводу ошибки передачит регистра сведений и AnyType - они сказали что правильно было бы создавать объекты из фабрики и заполнять их свойствами и потом уже их выгружать в XML.
// Создаем объект списка
ОбъектСписок = ФабрикаXDTO.Создать(ТипОбъектаСписок);
получил ошибку времени выполнения:
{Форма.Форма.Форма(8)}: Ошибка при вызове метода контекста (Создать)
ОбъектСписок = ФабрикаXDTO.Создать(ТипОбъектаСписок);
по причине:
Несоответствие типов (параметр номер '1')
(102) makfromkz, (110) только начал разбираться. Такая ошибка возникает если код выполняется на клиенте, например. Пространства имен, которые мы описываем в разделе "XDTO-пакеты", доступны только на сервере.
(16) ну вот по сути в (15) кусок затронули, вы просто говорите о хдто, как о панацее, хотя к примеру можно просто сериализовать дерево, тз или даже табличный документ. И не мучаясь перегнать данные.
Т.е. в вашем примере было бы удобней получить запросом ТЗ по сотрудникам и сериализовать ТЗ в 1 строку получить хмл, который потом на приемнике можно десериализовать в ТЗ и работать уже с ТЗ.
Ну это один из ньюансов, т.е. я понимаю, что статья о хдто, но все же, если потом толпы кодеров последуют вашему примеру не зная альтернатив, то это будет не хорошо для всех :)
Я бы хотел например увидеть вводную часть о сравнении.
Т.е. например есть задача - надо сделать вот так, это можно сделать так, так и вот так.
Если мы задачу усложним до вот такого уровня, то первый метод не подойдет, а второй и третий в самый раз.
А вот уж если вы хотите строить многоуровневое древо с не пересекающимися типами элементов в ветках, то используйте хдто.
Если вы хотите работать с веб сервисами и передавать данные сереализованные через хдто, то должны быть готовы что передаваться будет оно не в формате хмл, а в формате json-подобном. Если хотите формат хмл, то надо делать по другому.
Кроме того, там же есть ньюансы, при создании списков, там обязательно в хдто у элемента, который характеризует другой элемент (т.е. является, по сути, строкой в ТЗ) надо ставить максимальное количество "-1", ибо нифига не работает. Почему так, я если честно так и не разобрался, и принял за аксиому :)
Вы можете пролистать мои статьи, там я тоже использую хдто, и например взять их за основу примера, и сказать - так делать не надо, это тупо, а так можно, а в этом месте - автор вообще должен выпить йаду и убиться об стену.
Можно взять любую другую статью, но 1Сники привыкли учится в полевых действиях.
Разбор реальных примеров, как по мне, был всегда круче, чем разбор абстрактных. Так же - привяжите к публикации форум, что бы вас могли мучать вопросами. В камментах - оно не то :)
З.Ы. А вообще круто - я смотрю 1С мир начинает качественно развиваться, вот уже люди с многолетним опытом в узких сферах - делятся своим опытом, а это самое ценное. ИМХО
(18) DitriX, Смысл понятен. Статья самая первая и самая вводная. Хочется сделать постепенный переход к конкретным примерам.
Если не возражаете, отвечу по интересным мне пунктам:
вы просто говорите о хдто, как о панацее, хотя к примеру можно просто сериализовать дерево, тз или даже табличный документ. И не мучаясь перегнать данные
Наоборот, я говорю, что набил кучу шишек, и что документирование туманное. Механизм интересный, но не панацея ни разу.
Т.е. например есть задача - надо сделать вот так, это можно сделать так, так и вот так.
Если мы задачу усложним до вот такого уровня, то первый метод не подойдет, а второй и третий в самый раз.
А вот уж если вы хотите строить многоуровневое древо с не пересекающимися типами элементов в ветках, то используйте хдто
Ну это целая отдельная тема, нужно исследование, подбор примеров. Мне кажется Вы лучше меня такую напишете.
Кроме того, там же есть ньюансы, при создании списков, там обязательно в хдто у элемента, который характеризует другой элемент
Ага, нюансов куча. Именно обо всех нюансах (какие вспомню) и хочется рассказать.
Наоборот, я говорю, что набил кучу шишек, и что документирование туманное. Механизм интересный, но не панацея ни разу.
Вы знаете, очень часто, когда хочешь сказать одно, понимается совсем другое. Это ни хорошо, но плохо. Просто так оно и есть (по себе сужу). Но думаю ни раз все сталкивались с этим.
Ну это целая отдельная тема, нужно исследование, подбор примеров. Мне кажется Вы лучше меня такую напишете.
Ну так это же самое интересно. А лучше Вас я точно не напишу, ибо профан в этой теме. Т.е. я в нее тыкал, но не более :)
Ага, нюансов куча. Именно обо всех нюансах (какие вспомню) и хочется рассказать.
Ну вот тут Вы сами говорите о ньюансах, и что будете их описывать. Вот я и предложил - выбрать любой реальный пример из жизни. Я так понял примеры будут из Вашей жизни:) Это тоже хорошо, но там все 100% будет правильно :)
я смотрю 1С мир начинает качественно развиваться, вот уже люди с многолетним опытом в узких сферах - делятся своим опытом
а я вот вижу переписку куцей справки плюс выдержки пары других статей.
Автор, если XDTO - это для тебя просто, объясни работу фабрики XDTO.
Не перечисли свойства и методы, а объясни, по какому принципу там типизация происходит.
Т.е. - как оно работает на самом деле. Слабо, автор, которому "XDTO в 1С - это просто"?
(45) frc, Терпение, мой друг, все будет. Смотри: многим даже описанное не было известно. Чтобы не толочь воду в ступе, скажи, будь добр, что именно про типизацию ты хотел узнать? Могу ответить в личку, если вопрос срочный. В виде статьи будет позже. И насчет перепостов - статья на 100% моя. Каждое слово. Доказывать не собираюсь, если хочешь, можешь сам подоказывать - откуда и что я перепостил. Но более полезным, все-таки, будет, если мы вместе тут обозначим вопросы, которых нигде нет, и которые действительно НЕОБХОДИМО описать и рассказать.
наверное, им было лень поискать в инете или посмотреть справку? :)
что именно про типизацию ты хотел узнать?
непосредственно механизм работы, будь добр, озвучь :)
А то заявлено и распиарено одно, а работает как обычно - почти никак (в смысле - никакой настоящей типизации и автораспознования объектов, не говоря уже об общей "стандартизации схем по умолчанию" таких обменов между подобными интерфейсами коммерческих систем).
И насчет перепостов - статья на 100% моя
согласен, хорошо, пересказ других статей и справки. Свой-то труд - где? :)
если мы вместе тут обозначим вопросы
они давно все на поверхности - если ты действительно занимался этим:
- зачем прикручен XDTO в 1С.
- как и в каких случаях обмена он наиболее оптимален.
Случай передачи/обмена номенклатуры - абсолютно не оптимально ). Даже при обмене документами не особо оптимально - если перед этим была синхронизация номенклатуры и прочих ключевых справочников. Ну, и? :)
- какие жесткие ограничения существуют при обмене XDTO (начиная от наличия загруженным схем и заканчивая все тем же основополагающим вопросом "а как же работает эта пресловутая фабрика XDTO при чтении/десериализации").
- конкретные примеры (не один! один - это в музей или на плакат) использования с разбором "почему так решил" с последующим подробным разбором "шагов реализации".
Если бы я его разрабатывал, то дал бы точный ответ :) Мое предположение - упрощение работы с XML, абстрагирование от низкоуровневых понятий "Узлов" и оперирование объектами бизнес логики.
как и в каких случаях обмена он наиболее оптимален.
Случай передачи/обмена номенклатуры - абсолютно не оптимально ). Даже при обмене документами не особо оптимально
Я больше скажу - он вообще не оптимален. Вернее, он является надстройкой над средствами работы с XML, а значит - по определению не может работать быстрее, чем тот же DOM. Он повышает удобство, но не повышает скорость выполнения.
Свой-то труд - где? :)
Ах да, опять наезды... Свой труд - здесь, в статье. Полностью изложил, как я вижу подсистему, начиная от азов. Да, кто-то в сети наверняка делал что-то подобное, и что? Он тоже сделал эту работу. Я уже предложил тебе привести пример - откуда и что я стырил. Не привел? Извини, тогда это пустой трёп.
какие жесткие ограничения существуют при обмене XDTO (начиная от наличия загруженным схем и заканчивая все тем же основополагающим вопросом "а как же работает эта пресловутая фабрика XDTO при чтении/десериализации")
Во-первых, схемы загружать в конфигурацию не надо, их можно создавать динамически, фабрики тоже можно создавать динамически.
Во-вторых, поясни, будь добр свой вопрос "а как же работает эта пресловутая фабрика XDTO при чтении/десериализации". Что именно непонятно? Фабрика вообще не занимается сериализацией/десериализацией. Принцип работы объяснять в комментах к статье - слишком долго, тут тянет на отдельную заметку. поэтому, еще раз повторяю предложение - конкретный вопрос "почему она работает так, а не иначе" задать в личку, с примером кода.
конкретные примеры (не один! один - это в музей или на плакат) использования с разбором "почему так решил" с последующим подробным разбором "шагов реализации"
С удовольствием! Выкатывай пример кода и проблему - "вот это не работает, так, как я хочу - почему?".
Без конкретных вопросов и прикладных задач дальнейшее обсуждение не имеет смысла, ибо превращается в необоснованные наезды и обвинения в некомпетентности. Ты не прав, дружище ;)
Свой-то труд - где? :)
Ах да, опять наезды... Свой труд - здесь, в статье. XDTO - один на всех, кто-то в сети наверняка делал похожую работу, статьи не могут не перекликаться. Я уже предложил тебе привести пример - откуда и что я стырил. Не привел? Извини, тогда это пустой трёп.
Вернее, он является надстройкой над средствами работы с XML, а значит - по определению не может работать быстрее, чем тот же DOM
ну, приехали.
DOM - это те же "схемы", но включенные в сам файл обмена XML, давая возмжность перегружать данные без загрузки "схем" в конфигуратор.
Аналог DOM - это Конвертация обмена в 1С, только там "поиск 1С своего пути" все также ни к чему хорошему не привел.
XDTO - схемы уже загружены в конфигурацию базы-приемника, по ним читается входящий файл XML.
Так и где просматривается "разница в скорости"? )
Аналог DOM - это Конвертация обмена в 1С, только там "поиск 1С своего пути" все также ни к чему хорошему не привел.
XDTO - схемы уже загружены в конфигурацию базы-приемника, по ним читается входящий файл XML.
Так и где просматривается "разница в скорости"? )
DOM - аналог конвертации? или наоборот? Батенька, да вы вообще не в теме, я гляжу. А откуда же такая самоуверенная риторика?
DOM - аналог конвертации? или наоборот? да вы вообще не в теме, я гляжу
ага, вот и поймал тебя на первом же повороте :)
Теперь, видимо, про цикл статей можно больше не дискутировать :)
Итак, как работает DOM, а как - Конвертация? Вкратце, без воды: принцип, формат обмена, на чем основан DOM и на чем - Конвертация. Пять предложений.
ну уж нет, извини, это тебе плюсики ставят за "XDTO - это просто" все, кто им ни разу пользовался, ведясь на заголовок и пересказ желаемого функционала работы XDTO, вот и давай докажи реальными примерами, как это просто и легко :)
Без конкретных вопросов и прикладных задач дальнейшее обсуждение не имеет смысла
позволь, тогда я перефразирую тебя немного - "без конкретных ответов на конкретные вопросы и описание прикладных задач дальнейшие статьи (и эта тоже) на эту тему не имеют смысла" :)
А иначе - все это "превращается в обоснованный наезд и признание некомпетентности" в данном вопросе :)
Уж извини, это ты так бодро "это - просто!" статьи (и даже целый цикл!) про XDTO начал, наобещав и наполучав авансом сотни плюсов. Вот и отрабатывай реальным контентом, так сказать :)
ну уж нет, извини, это тебе плюсики ставят за "XDTO - это просто" все, кто им ни разу пользовался, ведясь на заголовок
Ну здесь вообще все просто. Каждый ставит плюсик, так, как считает нужным. Если материал ему полезен - ставит плюсик. Нет - не ставит. Или Вы считаете пользователей тупыми баранами, которые ставят плюсик только за заголовок? Все плюсики, сколько бы их не было - абсолютно заслужены только потому, что они существуют. И ровно столько человек сочли статью полезной. Тут и обсуждать нечего. Вас что, жаба душит?
Вот и отрабатывай реальным контентом
Я-то с радостью. Но я не получаю денег за эти статьи, заметь. А стало быть "отрабатывать" не обязан. Я действительно хочу поделиться опытом и прошу у читателей подкинуть описание реальных случаев, когда что-то было непонятно. Так статьи будут более эффективны, ибо будут рассматривать реально возникающие проблемы, а не те, которые я надумал. В конечном итоге, от более полезных статей выигрывает сообщество, а не я один.
Итак, как работает DOM, а как - Конвертация? Вкратце, без воды: принцип, формат обмена, на чем основан DOM и на чем - Конвертация. Пять предложений.
Я нигде не говорил, что знаю ВСЁ. Вот и сейчас, я смотрю на Ваш вопрос и не понимаю - а в чем вопрос? Возможно, что это я тупой, а возможно вопрос некорректно задан...
DOM, он же "объектная модель документа" - стандарт w3c, позволяющий оперировать деревом XML в оперативной памяти, в объектной стилистике. (причем тут конвертация?)
Конвертация данных - механизм фирмы "1С" позволяющий настроить соответствие данных между разными конфигурациями и выполнять обмен по так называемым "Правилам конвертации". Обмен выполняется посредством XML файлов. (Причем тут DOM?)
Я реально не понимаю, как они могут связаны напрямую. Поясните?
Уважаемый, что то я не заметил где Ваш труд ? Не вижу на Инфостарте ни одной Вашей разработки или статьи ...
А пустые понты гонять - много ума не надо. Уважающие себя люди сначала показывают свою работу, а потом критикуют чужую, а иначе это не более чем ничего не значащий поток сознания.
Во-первых, схемы загружать в конфигурацию не надо, их можно создавать динамически
итак, что такое "схемы XML" в 1С, и как они связаны с пакетами XDTO? Ну, и в кратце - как динамически (т.е. программно, так ведь?) создать/добавить новый объект XDTO конфигурации (без загрузки схемы), а не "достать" куцый тип данных из библиотеки "фабрика XDTO".
(61)
Вы бредите. DOM это совсем другое.
это у вас есть еще шанс не прожить всю свою жизнь в бреду.
(65)
DOM, он же "объектная модель документа" - стандарт w3c, позволяющий оперировать деревом XML в оперативной памяти
DOM - это движок, позволяющий работать с HTML, XHTML и XML-документами "по-своему", читая их в виде объектов.
А не "нечто", специально оперирующая там чем-то в оперативной памяти. В памяти все приложения чем-нибудь оперируют, и DOM никак не выделяется в этом направлении среди них - он не работает с железом, это сугубо программный интерфейс.
Поясните?
Поглядите единственную и побочную реализацию DOM в 1С - ДокументDOM.
Логическая DOM - это самодостаточная структура, описывающая объекты в формате XML.
Логическая Конвертация Данных - это самодостаточный пакет, сотсоящий из: схемы описания стурктуры ("правила...") и непосредственно самих данных, сохраненных в формате XML.
Логичеси XDTO - отдельно схемы (или наборы схем - пакеты, чего ты так и не понял до сих пор), отдельно данные в формате XML.
Вот видишь - все действительно просто, когда знаешь и понимаешь. И можно объяснить все - сколько там? три предложения?
И у тебя еще есть шанс двигаться в этом направлении, а не по общему широкому проспекту самообмана в 1С.
DOM - это движок, позволяющий работать с HTML, XHTML и XML-документами "по-своему", читая их в виде объектов.
А не "нечто", специально оперирующая там чем-то в оперативной памяти. В памяти все приложения чем-нибудь оперируют, и DOM никак не выделяется в этом направлении среди них - он не работает с железом, это сугубо программный интерфейс.
Поясните?
Что-то пахнет словоблудием.. Да, приложения чем-то оперируют. Спасибо, кэп.
Поглядите единственную и побочную реализацию DOM в 1С - ДокументDOM.
Логическая DOM - это самодостаточная структура, описывающая объекты в формате XML.
Логическая Конвертация Данных - это самодостаточный пакет, сотсоящий из: схемы описания стурктуры ("правила...") и непосредственно самих данных, сохраненных в формате XML.
Логичеси XDTO - отдельно схемы (или наборы схем - пакеты, чего ты так и не понял до сих пор), отдельно данные в формате XML.
Сильно пахнет словоблудием...
итак, что такое "схемы XML" в 1С, и как они связаны с пакетами XDTO? Ну, и в кратце - как динамически (т.е. программно, так ведь?) создать/добавить новый объект XDTO конфигурации (без загрузки схемы), а не "достать" куцый тип данных из библиотеки "фабрика XDTO".
Я нигде не говорил, про создание прикладных типов языка динамически. Я говорил про Пакеты. Развели срач, кидаясь язвительными фразами и пытаясь подменять понятия.. Кого вы пытаетесь на*бать, уважаемый?
Здесь сообщество профессионалов, а не трольчатник. Спорить с глупцом здесь ни у кого нет интереса. Дискуссия закончена. Диалог, от которого за версту несет школотой, для меня неинтересен. Спасибо за внимание.
(45) опоздал немного с камментами, но - прочтите верхние комментарии и скажите - где и что я не так сказал.
И вообще то вы всего лишь перефразировали мой текст в более агрессивной форме не понятно к кому направленной
(0) хорошая статья, все понятно.. xdto все же, имхо, подходит для обработки больших объемов данных со сложной структурой.. для простых вещей проще напрямую через xml обмен написать.. и кстати, в статье ни слова про загрузку.. ждем продолжения )
Автор молодец! Много раз пытался с чего-то начать работу по XDTO... Каждый раз останавливала мутность документации разработчика. А здесь - довольно простои понятно!
Тема очень нужная. Потому что спецификация xsd и ее реалазиция фирмой 1С - это разные вещи. В большинстве схем, которые приходят от других вендоров (SAP и др.) тупо не понимаются 1С.
(24) sikuda, Такую схему 1С не поймет. В ней нет типов, в ней описание узлов. Я в статье упомянул, что схема и модель данных это не одно и тоже, но не очень явно, а так, между делом...
В Вашей схеме сказано, что в документе XML один элемент и один атрибут. Все. Имен типов нет, в XDTO такое не загрузится, это нормально, это не вина 1С.
Для меня XDTO пакет встроенный в 1С реализующий схемы данных, но своим собственным способом.
Но проблема не в этом, а в том что эта типизиция объектов никак не пересекается с типами внутри 1С.
Зачем делать еще одну типизицию объектов не соответствующую стандартам, вопрос больше филосовский. Как у нас обычно говорят, так исторически сложилось(думаю что так и есть в 1С).
Но следуя большому и великому SAP. Майнстрим обменов и них идет через систему XI, основанную на XML схемах.
Надо задуматься.
(27) sikuda, Пакет XDTO это способ описать некий набор типов, который можно почерпнуть из схемы XML. Во второй схеме только один элемент. Он воспринимается, как корневое свойство. Если у него будет атрибут, то я честно говоря, не знаю, какой смысл все это будет иметь с точки зрения модели типов... Что будет означать данная схема для движка XDTO и зачем она такая нужна?
Что касается атрибутов и элементов на одном уровне, то это поддерживается, если вложено в complex-тип. Проверено. Вне типа - написал уже, что не вижу смысла в этом с точки зрения XDTO.
Теперь про разные, непересекающиеся типизации. Совсем не понял Ваших претензий. Есть данные, передаваемые во внешние системы посредством XML. Данные эти структурированы, согласно некоторой системе типов. С помощью XDTO мы можем абстрагироваться от слоя XML и работать с этими данными в объектном стиле, через точки.
Встроенные типы 1С просто имеют отображение на XML, но это именно отображение, сделанное через пакеты и фабрики и все такое прочее, т.е. тип XDTO CatalogRef и СправочникСсылка, это не одно и то же. Первое - инструмент обмена данными, второе - прикладной тип системы. Превращение одного в другое называется сериализацией... Суть претензии неясна...
Примерчик дал бы, но сейчас не при делах. На прошлой работе было дело. Но из (24) я думаю легко сделать вэб-сервис возвращающий этот тип с помощью вашей программы.
Р.S. В прошлой работе контора была серьезная. Для xml схем купила Altova XML Spy(стандарт де факто). И все ошибки проверяли в ней.
А суть проста из области философии. Для большинства 1С-ников я не могу в двух словах объяснить зачем нужен XDTO, и зачем нужно было делать столько дополнительных объектов в самой 1С. Только для сериализации элемента справочника или для сериализации других данных в 1С? В объектном стиле я работаю с объектами 1С, с XML схемами я работаю в XML.
В философии есть термин "бритва Окамы". Не следует привлекать новые сущности без самой крайней на то необходимости.
Вы молодцы. Вы расписали как это работает. И за это Вам большой плюс.
Каждому свое. Когда у меня есть стабильная XML схема, мне приятнее перевести ее в термины XDTO и работать, мысля объектами предметной области (сотрудниками и счетами), а не "узлами XML".
Так же XDTO избавляет от необходимости последовательной записи XML-файла. Можно подготовить необходимые объекты в процессе обработки данных, а затем просто присвоить их нужным реквизитам объекта XDTO.
30,31 Ребята так я Вам и пытаюсь втолковать, что связка XDTO -> XSD работает только в одну сторону (24,27).
По практике приходят тебе внешний вэб-сервис или xsd от javа(sap xi), dotnet. А в 1С через XDTO пакеты это не принимается никак. И у нас два пути
1. Делать XDTO -> XSD переделывая все под 1С
2. Используем внешние средства.
Или Вы живете только в вселенной 1С? Завидую..., нет пожелаю Вам интеграции с SAP :)))). Хорошее пожелание в плане карьеры...
(32) sikuda, Без проблем подключал внешние (не 1С-овские) веб-сервисы, никаких проблем. Разумеется, допускаю, что проблемы возможны, но надо бы примерчик сервиса, чтобы звучало не голословно.
Хорошее пожелание в плане карьеры
Таити, таити... нас и здесь неплохо кормят (с)
Мы про карьеру тут все в курсе, и сами умные;) С наступающим!
Кстати, взял Вашу схему из ответа 24. В 1С прекрасно грузится... Что у Вас там не получается, я может проблему не понял толком?
Или Вы живете только в вселенной 1С? Завидую..., нет пожелаю Вам интеграции с SAP :)))). Хорошее пожелание в плане карьеры...
Не понимаю что в этом пожелании хорошего в плане карьеры. Вы видимо уже забыли где оказались все SAP-еры когда случился "кризис" 2008 года? Не в SAP или OA счастье и не в 1С... :-)
(36) sikuda, Хм... я может чего-то недопонял?
1. Беру файлик Bad1C. Загружаю в конфигуратор, ничего не происходит...
2. Открываю в Liquid, вижу, что не задано пространство имен, задаю, повторяю пункт 1. Вуаля, схема загружена.
Читаем статью и видим, что пространство имен обязательно должно быть.
Сравните два файла. До и после. Тип стал другим? Пришлите файлик...
Или сделайте мне в 1С значение и атрибут на одном уровне. Там физически это не сделаешь.
(38) sikuda, Я все-таки, думаю, что не понимаю чего-то...
Вот мои файлики:
1 - исходный Bad + добавил пространство имен, чтобы грузилось в 1С
2 - Файл номер 1 загружен в пакет XDTO, после чего, выгружен из 1С обратно в схему
3 - сравнение 2-х файлов. Разница только в заголовке, где порядок атрибутов изменен, но смысл тот же.
Итого, файл логически остался тем же и декларирует один и тот же состав узлов XML.
Во всей этой истории мне просто хочется понять (я правда не понимаю), что означает Ваша фраза "XDTO -> XSD работает только в одну сторону" Что это значит? И в какую именно сторону? Как это выглядит при решении прикладных задач?
Возможно, я невнимателен и не вижу чего-то важного в Ваших примерах?
Да заметил targetNamespace критично для 1С. Спасибо, добавил себе в знания.
Жаль нельзя вернуть все что у меня не загружалсь в 1С и еще раз протестировать.
Фраза XDTO -> XSD. Означает что из хорошего XDTO пакета всегда получается правильная схема, а обратно не всегда верно.
я чего-то не понимаю, или Evil Beaver просто доописал нэймспэйс, по какой схеме должно грузится в 1С - "четко" по-пацански указав, каким образом нужно грузить, хотя Вы намекали, что если таковая стандартная для всех остальных схема тупо не будет загружена в 1С - ничего и не загрузится?
Автор, вся статья - три предложения:
- есть предопределенные схемы XML - XDTO называются;
- в эти схемы можно впихнуть все данные;
- схемы нужно загружать в таргет-конфу, иначе все бестолку.
Но! Если не будет продолжения - это будет подлость.
не будет никакого продолжения. Все описанное в статье - есть в десятках статей по инету.
А вот конкретиики применения, да пример разобрать подробно - кот наплакал.
А вот этим как раз и не будет никто заниматься, снова перепостят готовые статьи, и заработают миллион плюсиков.
Расскажу немного своего практического опыта. Для обмена данными между различными конфигурациями я поступил так. Выгрузил из двух баз схемы и в заголовке заменил пространство имен на произвольное. Затем загрузил в каждую из баз схему другой базы. При выгрузке данных в файле выгрузки подменял пространство имен на то, которое указывал в схемах.
Таким образом сериализацию и десереализацию данных удалось сделать посредством ФабрикиXDTO глобального контекста. Однако, как вы наверное догадываетесь, с десериализацией не все так гладко. Чтобы создать объект базы данных приемника приходится определять по заданным правилам обмена, соответствующий тип данных базы данных приемника (то же самое для реквизитов со ссылочным типом) и приводить строковые GUID к ссылкам. Вобщем получаем в базе-приемнике переданный XDTO объект с типизацией базы данных источника, а дальше его "ручками" "переливаем" в объект базы-приемника.
Плюс такого подхода в том что при изменении структуры баз не нужно вручную править схемы XDTO, а нужно просто перевыгрузить схемы баз и при необходимости откорректировать правила соответствия реквизитов. Изначально в голове представлялась простая схема обмена, по по факту кода, который "переливает" данные из объекта XDTO в объект базы-приемника получилось прилично. Большой ложкой дегтя была невозможность определить тип реквизита составного типа считанного объекта XDTO. Он указывался как AnyType и хотя в выгруженных данных указывался реальный тип выгруженного значения, но в считанном объекте узнать их было невозможно. Надеюсь сейчас это исправлено (я делал это года два назад на релизе 8.2.12), а мне пришлось ставить "костыли".
Единственная проблема которая возникает с этим обменом - при изменении состава реквизитов объектов, участвующих в обмене, обмен останавливается и требуется обновить схемы в конфигурациях. В остальном работает очень быстро и очень надежно. XDTO "рулит"!
(48) ZLENKO.PRO, переливать данные между разными конфигурациями, используя стандартные "платформенные" пакеты - занятие неблагодарное. Получится набор "костылей", за которым нужно пристально следить. Как мне кажется, для таких задач лучше использовать стандартный механизм "Конвертации данных".
XDTO лучше использовать, когда есть стабильная схема данных и набор четко обозначенных бизнес-объектов. Если же надо переливать универсальные данные по принципу "грузи все, что есть", то XDTO теряет свои преимущества и привносит излишнюю сложность.
Разумеется, это только мое мнение, оно запросто может быть ошибочным.
(49) К сожалению стандартный механизм "Конвертация данных" работал слишком медленно и очень ненадежно. Я не от хорошей жизни взялся ковырять XDTO.
У меня была задача организовать обмен между 1С: Розница и 1С: УПП. Первым делом мне надо было передать в Розницу прайс-лист на 10 тыс. номенклатуры с двумя типами цен - через стандартный механизм это загружалось 40 минут(!) (в практически пустую базу розницы) и через раз вываливалась ошибка нехватки памяти. Через XDTO то же самое передалось за 40 секунд (наверное можно было бы еще быстрее сделать, но не было времени оптимизировать код) и вот уже 2 года работает как часы.
через стандартный механизм это загружалось 40 минут(!)
ну Вы сравнили чтение "почти" текстового файла построчно и блоками из XDTO.
обмен между 1С: Розница и 1С: УПП...передать в Розницу прайс-лист на 10 тыс. номенклатуры с двумя типами цен...
Все уже изобретено и выдумано задолго до 1С - есть прекрасный быстрый обмен через DBF.
который "переливает" данные из объекта XDTO в объект базы-приемника получилось прилично.
Поэтому и вопрос к Evil Beaver - объясните работу фабрики XDTO.
А потом - на кой тогда все эти сложности, если, как в указаном примере, такого объекта нет в тагерте (тип-то из базы-источника), и его все равно нужно создавать вручную через создание соответствующего объекта в приемнике со всеми последующими плясками?
Т.е. так называемые "схемы" - сами по себе ничего не создают "по типам", а только помогают "быстро" найти уже существующие объекты. И даже тут проблемы - а тот ли объект найден? А тот ли ГУИД у него, или уже другой по каким-то причинам (а то и просто поработали с этим объектом уже в приемнике, а в "источник" еще не синхронизировали)? Ведь управлять "по какому ключу искать в приемнике" - мы не можем, все зашито в "фабрике" (это опять к вопросу "а как оно там работает?") - в отличие от "построчного" чтения в Конвертации, там хоть есть видимость выбора типа поиска (однако и там работает, как обычно, по принципу "поиск по коду почти никогда не работает даже при явном указании").
А реквизиты-примитивы перегружать - так зачем огород городить?
(53) frc, попробую ответить, если я правильно понял проблему..
Фабрика XDTO работает так, как я написал в статье - создает в контексте выполнения виртуальной машины 1С объект с типом ОбъектXDTO (или ЗначениеXDTO). С точки зрения самой фабрики этот объект еще и носит некий тип XDTO (тот, который ей указали при создании). Можно провести аналогию с COM. Если вы создали некий COM объект, то у него в отладчике будет всегда тип COMОбъект. Сам же объект реально является неким другим типом, например Word.Application. Так же и здесь - фабрика создала объект некоторого типа, о котором знает только она сама. Для среды исполнения это всегда ОбъектXDTO. Больше фабрика ничего не делает. Совсем. Она ничего не ищет по GUID, она не превращает кусочки XML в ссылки базы данных. Все это делать надо ручками. Немножко автоматизировать это позволяет СериализаторXDTO. Вот он как раз и ищет ссылки по GUID-ам. Т.е. занимается превращением объектов среды исполнения (ссылок ИБ, например) в объекты XDTO (которые для среды все на одно лицо, а для фабрики - разные). Данный процесс называется сериализацией. Обратный процесс - десериализация, когда из кусочков XML получаются объекты среды исполнения (например ссылки ИБ). Алгоритмы сериализации/десериализации для стандартных типов прошиты в платформе, а те типы, которые вы сделали сами - сами и сериализуете, ручками. Никакой магии. Т.е. превращение GUID в ссылку выполняет сериализатор, а не фабрика.
Сложность здесь в том, что XDTO все это дело пытается спрятать под ковер, но уши вылезают. Получается "закон дырявых абстракций" в действии. Про все это я планирую написать. Если очень интересно, задайте конкретный вопрос в личке, обсудим.
С точки зрения самой фабрики этот объект еще и носит некий тип XDTO
то у него в отладчике будет всегда тип COMОбъект
Немножко автоматизировать это позволяет СериализаторXDTO...обратный процесс - десериализация...когда из кусочков XML получаются объекты среды исполнения (например ссылки ИБ)
как раз получаем-то "объекты" из базы источника. Для приемника это не имеет никакого смысла.
Алгоритмы сериализации/десериализации для стандартных типов прошиты в платформе
вот и расскажите "просто и понятно", что это за алгоритмы, и какие "стандартные типы" и как они обрабатывают.
Это ведь просто, не так ли? :)
Т.е. превращение GUID в ссылку выполняет сериализатор
Так и пишите тогда - "поиск ссылки на объект в приемнике по ГУИД (и всегда ли по ГУИД?) - что я называю превращением GUID в ссылку, - выполняет сериализатор".
Видите, сколько у Вас за кадром остается при описании реальной картины дел :)
Если очень интересно, задайте конкретный вопрос в личке
да отвечайте здесь - вот конкретный вопрос: объекта в приемнике нет, а тип (описан в конфигурации, конечно же; если еще и типа не будет - для 1С это туши свет и бери отпуск за свой счет) - есть.
Так какого ляда вся так называемая королевская рать фабрика XDTO не может его создать?
что это за алгоритмы, и какие "стандартные типы" и как они обрабатывают.
Это ведь просто, не так ли? :)
Вот кусок кода:
Для Каждого Пакет Из ФабрикаXDTO.Пакеты Цикл
Сообщить(Пакет.URIПространстваИмен);
КонецЦикла;
Сериализацию/десериализацию всех типов, указанных в этих пакетах платформа должна обеспечивать автоматически. Пакеты, которые вы руками добавили в ПакетыXDTO, разумеется, она сериализовывать не может.
вот конкретный вопрос: объекта в приемнике нет, а тип (описан в конфигурации, конечно же; если еще и типа не будет - для 1С это туши свет и бери отпуск за свой счет) - есть.
Так какого ляда вся так называемая королевская рать фабрика XDTO не может его создать?
Дано: Объекта нет в приемнике, из источника он выгружен как СправочникОбъект, а не как СправочникСсылка.
Если из источника вышла СправочникСсылка, то объект на ее основе вообще никак не создать, надеюсь это не требует объяснений.
Идем дальше, сериализатор XDTO получив на вход ОбъектXDTO вернет СправочникОбъект, с установленными реквизитами, в т.ч. GUID. Если в приемнике и источнике изменен состав реквизитов объекта (или даже их порядок) - будет исключение, автоматическая сериализация не сработает. Полученный от сериализатора объект надо ручками записать в ИБ через Объект.Записать(). Никаких чудес.
(77) Обсуждать преимущества и недостатки обмена через DBF файлы по сравнению с XML считаю ниже точки зрения здравого смысла. Я думаю спор здесь неуместен :-) Признаюсь что был неправ в том что затронул эту тему.
(49) Если бы я взялся заново переписать этот механизм, то костылей получилось бы уже не так много. Просто тогда долго искал подход к решению задачи, а сроки уже поджимали. Единственный реально костыль там был из-за невозможности определить тип значения реквизита составного типа указанный как AnyType - надеюсь что это уже доработали, хотя разработчики из 1С отказались анализировать эту проблему сославшись на то что использовать фабрику глобального контекста для данной задачи неправильно. Только когда я ранее спрашивал как правильно - а в ответ тишина...
Ну а "Конвертация данных" механизм безусловно нужный и хороший, но в силу своей универсальности слишком громоздкий и медлительный. Мне нужно было обеспечить обмен документами со скоростью близкой к реалтайму для работы десяти (плановый минимум) супермаркетов (реально в часы пиковой нагрузки скорость примерно 1 чек в 5 секунд). Решение на базе конвертации не обеспечивало такой скорости обмена.
не увидел во всем сообщении ZLENKO.PRO и во фразе в частности: "реально в часы пиковой нагрузки скорость примерно 1 чек в 5 секунд" никаких показателей скорости чего-либо.
Если намекали на "тогда скорость обмена должна быть таковой или быстрей" - то тут, первое, намеки - это "не считается", а второе - она (скорсоть обмена) в данном случае скорей будет зависеть от скорости установки соединения с базой-приемником - если одно только соединение с ней будет устанавливаться минуту и больше, то и чеков будете перегружать уже 50-100 за раз, а то и больше. И, соответственно, дольше.
она (скорсоть обмена) в данном случае скорей будет зависеть от скорости установки соединения с базой-приемником - если одно только соединение с ней будет устанавливаться минуту и больше
Если бы Вы были пообразованее, то знали бы что COM соединение можно хранить в интервалах между обменами, а не инициализировать каждый раз заново. Но даже если не хранить инициализация COM соединения занимает не более 15 секунд. А под скоростью я понимаю то что сериализация даже относительно больших объектов (документ с десятками тысяч строк) в XDTO файл занимает менее секунды (точное время я не засекал). Никакой алгоритм выгрузки ни в DBF ни в CSV файл такой скорости не даст...
ну ладно.
если бы вы были посамообразованее, то знали бы, что до COM-соединения есть еще и установка сетевого соединения.
что то я не заметил где Ваш труд ?
извините, ошибся - подумал, что перевод стрелок - не самый прокаченый ваш скилл.
Уважающие себя люди сначала показывают свою работу
можете себе еще и орден дать - в качестве самоуважения.
а иначе это не более чем ничего не значащий поток сознания.
поздравляю, вы реализовали самое значимое достижение вашей жизни - обмен через XDTO.
Пусть даже и ненужный в данном случае - но ведь это не важно, так ведь? Зато теперь везде можно задвигать про "потоки сознания" и "сперва добейся!"
(67) ZLENKO.PRO,
А под скоростью я понимаю то что сериализация даже относительно больших объектов (документ с десятками тысяч строк) в XDTO файл занимает менее секунды
отлично, можно вас в книгу рекордов смело записать.
Вы - единственный в мире, кто смог обойти аппаратные ограничения записи файла на диск.
Зато теперь везде можно задвигать про "потоки сознания" и "сперва добейся!"
Я за свои 15 лет трудовой деятельности по разработке и внедрению информационных систем уже столько всего "задвинул" и "добился", что на самом деле мне глубоко все равно то что Вы не согласны с частью того что я тут написал. А вот Вы сначала выложите сюда на всеобщее обозрение свои достижения, тогда и критикуйте. А то читаеш это топик и в голову приходят слова из песни "Ничего нового" (С. Шнуров, группа Рубль).
Вы - единственный в мире, кто смог обойти аппаратные ограничения записи файла на диск
Я не понимаю о каких ограничениях Вы говорите. У меня файл в памяти создается и передается через COM соединение. Зачем мне его на HDD писать? Вот запустил тест на своем домашнем компьютере - скорость записи в память ~21 Гигабайт/секунду. Вы представляете себе документ объемом в 21 Гигабайт ?
P.S.: А даже если записывать на HDD - разве скорость записи современных HDD 200 Мегабайт/секунду мало?
Грубо можно разделить анализаторы XML файла на две группы DOM и SAX (некоторые говорят парсеры)
DOM - строит дерево в оперативной памяти...
SAX - анализирует XML основываясь на событиях.
В Конвертации 1С используется SAX анализатор (XMLЧтение, XMLЗапись) рассматривающий файл как последовательный поток тегов.
И спасибо 1С за такую реализацию, так как DOM при больших объемах файлов просто встанет.
(84) sikuda, Разве ЧтениеXML - это SAX? Я думал, что это простой последовательный XMLReader. Вроде как бы в SAX нужно подписки на события определять, наподобие "ПриВстречеВФайлеНекоторогоАтрибута()"?
Хорошая статья, в свое время тоже много что не получалось с XDTO, в следующей статье хотелось бы побольше про подводные камни в реализации 1С, коих кажется мне довольно много
86. Обычно XMLReader или типа XmlStreamReader относят по теории к SAX. Потому, что функция ПриВстречеВФайлеНекоторогоАтрибута() легко превращается в ПриВстречеСледующегоАтрибута() или точнее ПриВстречеСледующегоУзла().
Перенос данных КА 1.1 => КА 2 / УТ 11 (перенос документов, начальных остатков и справочной информации из "1С:Комплексная автоматизация", ред.1.1 в "1С:Комплексная автоматизация", ред. 2.х)
Перенос данных КА 1.1 => КА 2 / УТ 11 (перенос документов, начальных остатков и справочной информации из "1С:Комплексная автоматизация", ред.1.1 в "1С:Комплексная автоматизация", ред. 2.х)