Механизм XDTO

12.05.20

Интеграция - Перенос данных 1C

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

Доброго времени суток! В настоящей публикации хочу поделиться опытом изучения и применения XDTO. Изложенное представляет собой  конспект проделанной работы. Традиционно вначале условлюсь:

- статья отражает приобретенный самостоятельно опыт и результаты попытки разобраться в тематике, а не является сугубо теоретическим материалом, претендующим на какую-либо "академичность"

- предварительно я не осведомлялся "как это реализовано в типовых"

- возможно имеются более оптимальные реализации и понимание, хотелось бы узнать

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

Однако реализовать что-то и понять почему это выполняется именно так, не одно и то же. Остались вопросы, вэлком к обсуждению.

1. Схема, т.н. XSD, лежит в основе, загружается во вкладку XDTO-пакеты. Написать ее можно в обычном блокноте, достаточно просто. Формат XSD описывают два увесистых даташита, размещены на сайте консорциума w3c. Спустя некоторое время изучения я понял два обстоятельства: далеко не все возможности стандарта используются платформой и не обязательно уметь создавать схемы вручную (в большинстве случаев пожалуй достаточно будет возможностей, предоставляемых в конфигураторе).

2. Импорт XSD в дерево метаданных. Вот тут меня ожидали первые сюрпризы. Для одного и того же файла XML с данными можно написать более одной XSD, все будут валидировать файл. Но для пакета XDTO нужно знать, что xs:simpleType это подветка "Типы значений", xs:complexType подветка "Типы объектов". При этом, например, оба описания

 

  <xs:element name="Документ_ПрисвоениеИНН_ДокументыЗаявителя">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="ВидДокумента" type="xs:string"/>
            <xs:element name="Описание" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

и

 
 <xs:complexType name="Документ_ПрисвоениеИНН_ДокументыЗаявителя">
    <xs:sequence>
        <xs:element name="ВидДокумента" type="xs:string"/>
        <xs:element name="Описание" type="xs:string"/>
    </xs:sequence>
</xs:complexType>

 определят следующий элемент

 
<Документ_ПрисвоениеИНН_ДокументыЗаявителя>
    <ВидДокумента>Справка</ВидДокумента>
    <Описание>Об уплате пошлины</Описание>
</Документ_ПрисвоениеИНН>

1С примет корректно схему по второму образцу. Почему, осталось вопросом. Объяснение конечно какое-то должно быть, думаю кроется в стандарте.

3. Общее понимание модели XDTO. Попытался это выразить на рисунке ниже. На данный момент осталось непонятным назначение подветки "Свойства" в пакете (ветка XDTO-пакеты), для каких целей и как ее использовать.

4. Работа с типами, фабрикой, организация переноса данных между конфигурациями. Насколько мне стало понятно, одной из основ концепции (с точки зрения интеграции) XML, XSD, XDTO лежит типизация. В конечном счете иерархия какого-либо набора данных сводится к примитивным и/или простым типам. И это, думается, "кошмар" для 1С-ника. Например, когда к нам приходят данные в виде <Калибр>200-02</Калибр> в XSD должно быть описано что это: число, строка, значение перечисления. А также, что в нашей системе "Калибр" нужно поместить в реквизит "ДиаметрИзделия" такого-то объекта. Но это еще не все, о чем нужно позаботиться и с чем можно столкнуться. Например вызов

 
п1 = "nonNegativeInteger";
п2 = "http://www.w3.org/2001/XMLSchema";
ИзXMLТипа(п1, п2);

возвращает Неопределено, а вот

 
п1 = "decimal";
п2 = "http://www.w3.org/2001/XMLSchema";
ИзXMLТипа(п1, п2);

уже ожидаемое Тип("Число"). Коллеги, возможно это понятный результат и кто-то воскликнет "очевидно же!". Но для меня это на данный момент отнесено в категории "знать и учитывать при разработке" и "не понятно, даже могу объяснить почему должно быть по-другому".

5. Перенос данных между двумя разными справочниками, документами. При организации переноса справочник-справочник или документ-документ с реквизитами примитивных и простых типов, без табличных частей, трудностей не возникло. Первый кейс. Вот как выглядел мой пакет:

Простой пример, в сети и методичках достаточно таких примеров. Пошел второй кейс - перенос тех же объектов, но уже с реквизитами-перечислениями, табличными частями. На этом этапе пакет выглядел так:

Прежде, чем это сделать возник стопор. Как? Оперировать категориями привычной объектная модель данных 1С здесь не получилось. Для понимания, нарисовал такую простенькую схему:

Что пришлось здесь понимать.

Во-первых, перечисление. В XML это <Пол>Мужской</Пол>, т.е. тип строка. Как при загрузке понять, что value это значение перечисления? Вот здесь типизация и типы значений по схеме. При десериализации мы находим, что данное свойству соответствует прикладной тип "ПеречислениеСсылка.Пол".

Во-вторых, табличная часть. Разыменование здесь не применимо. Для табличной части создан отдельный тип объекта "Справочник_ФизическиеЛица_КонтактныеСведения", указываемый в качестве типа объекта "КонтактныеСведения". Тогда мозаика сложилась. Не совсем очевидно при подходе "в лоб". Согласитесь, при объектной и запросной техниках работы мы привыкли работать с табличными частями как с неотъемлемой частью объекта. На прикладном уровне так и есть, хотя физически хранится раздельно. Да и в модель типов метаданных, признаю, укладывается ровно. В общем, некоторую заминку у меня вызвало додумывание необходимости оформить табличную часть как отдельный объект, а не пытаться настроить как-то "внутри владельца".

6. Почему все не так наглядно, как при использовании встроенного сериализатора. Все тривиально, когда мы используем "бортовой" сериализатор. Платформа безошибочно запишет/прочитает экземпляр данных справочника, документа и т.д. Когда же мы читаем объект, тип которого (как мы допускаем) отсутствует в дереве метаданных конфигурации, то обо всем нужно заботиться самим. Очередная схема. Нарисовал для наглядности собственного же понимания, использовал как шпаргалку:

Вот здесь меня ожидал еще один сюрприз. Называется он СписокXDTO. Используется для представления однотипного набора данных, в данном случае табличной части. За гранью понятого для меня так и остался факт того, что мы не можем обращаться к коллекции как элементу объекта XDTO. Почему существует два метода (ПолучитьXDTO и ПолучитьСписок). При этом не обнаружил иной возможности определить, что свойство это список, кроме как проанализировать значения верхней и нижней границы. Либо проверять возврат одного из двух методов, но при списке ПолучитьXDTO уходит в исключение, хотя должно давать Неопределено -> и тогда понимаем что это список (версия платформы 8.3.17.109).

Кстати еще о списке и XSD. Неявная трансляция свойства типа объекта пакета в СписокXDTO происходит, если из XSD заехало определение элемента комплексного типа, с указанием значений атрибутов minOccurs и maxOccurs. Когда unbounded - список, иначе - просто фасет. Вот этот прием (во втором кейсе) некоторое время выносил мозг до того, как быть освоенным. На мой взгляд такая дефиниция несуразна.

Последний сюрприз (пора с ними заканчивать) назвал ожидание и реальность. Третий кейс. Пакет:

В этой задаче мне необходимо было решить задачу переноса списков экземпляров базы данных справочника, документа. Ожидание: предполагал, что на транспорт можно будет передавать экземпляры по мере формирования. Реальность: создаем контейнер. Отдельный "списочный" тип с unbounded-свойством, а типом которого уже будет наш объект. Снова типизация.

ПОДВОДИМ ИТОГ

Поставленные задачи удалось решить. Кому будет интересно, отправлю пары источник-приемник (в dt) по трем кейсам. Пишите в телегу. Для чего публикую? Хотелось бы поделиться опытом, а еще больше получить его. Поэтому прошу все дельные комментарии, конструктивные советы, подтверждения/опровержения, сильные/слабые стороны в комментариях. Материал имеется еще. Внимания заслуживает механика выгрузки/загрузки, кодирование, приемы. Возможно, кто-то поделится этим в обсуждениях.

Благодарю за внимание!

Интеграция XDTO XSD

См. также

SALE! 10%

Перенос данных 1C Программист Платформа 1С v8.3 1С:Управление производственным предприятием 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Перенос документов, начальных остатков и справочной информации из УПП 1.3 в ERP 2 | из УПП 1.3 в УТ 11 | из УПП в КА 2 | Правила конвертации (КД 2) | Более 360 предприятий выполнили переход с использованием этого продукта! | Сэкономьте время - используйте готовое решение для перехода! | Позволяет перенести из УПП 1.3 в ERP / УТ 11 / КА 2 всю возможную информацию | В переносе есть фильтр по организации и множество других опциональных параметров выгрузки | Есть несколько алгоритмов выгрузки остатков на выбор

55778 50200 руб.

04.08.2015    166488    333    277    

373

SALE! 20%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

Правила в универсальном формате обмена для ERP 2.5, КА 2.5, УТ 11.5, БП 3.0, Розница, УНФ, для последних версий конфигураций. Ссылки на другие конфигурации в описании публикации. Правила совместимы со всеми другими версиями конфигураций новыми и старыми, поддерживающими обмен и синхронизацию в формате EnterpriseData. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

26280 22338 руб.

12.06.2017    141529    798    297    

419

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УПП 1.3 (1.3.234.x) и БП 3.0 (3.0.161.x). Правила подходят для версии ПРОФ и КОРП.

35000 руб.

15.12.2021    24026    169    51    

127

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 Оперативный учет 1С:Управление торговлей 10 Россия Управленческий учет Платные (руб)

Перенос данных из 1С:Управление торговлей 10.3 в 1С:Управление торговлей 11.5 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УТ 10.3 (10.3.88.x) и УТ 11.5 (11.5.19.x).

35000 руб.

23.07.2020    51273    228    69    

185

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Программист Платформа 1С v8.3 Сложные периодические расчеты 1С:Комплексная автоматизация 1.х 1С:Управление производственным предприятием 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Платные (руб)

Правила переноса кадровых и расчетных данных и справочной информации из "1С:УПП1.3" или "1С:КА 1.1" в "1С:ЗУП 3.1 | Разработан в формате КД 2 (правила конвертации данных) | При выгрузке есть фильтр по организациям | Обновляется при выходе новых релизов 1С | Развитие алгоритмов | Расчетные документы переносятся в документ "Перенос данных" | Создаются документы "Начальная штатная расстановка" и "Начальная задолженность по зарплате", переносятся кадровые документы

55778 50200 руб.

29.10.2018    56210    59    105    

61

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена | Можно выполнить переход с УПП на БП 3 или запускать выгрузку данных за выбранный период времени | Переносятся документы, начальные остатки и вся справочная информация | Есть фильтр по организации и множество других параметров выгрузки | Поддерживается несколько сценариев работы: как первичный полный перенос, так и перенос только новых документов | Перенос данных возможен в "1С: Бухгалтерия 3.0" версии ПРОФ, КОРП или базовую | Переход с "1С: УПП1.3" / "1С:КА 1.1" на "1С:БП3.0" с помощью правил конвертации будет максимально комфортным! | Можно бесплатно проверить перенос на вашем сервере!

48278 43450 руб.

25.02.2015    171178    303    257    

378

SALE! 15%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 Платформа 1C v8.2 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Управление производственным предприятием Россия Платные (руб)

Регулярный обмен, выгрузка, перенос из КА 1.1, УПП 1.3, УТ 10.3 для обмена с любыми конфигурациями, поддерживающими обмен в формате EnterpriseData (КД3) - БП 3.0, ERP, КА 2, УТ 11, Розница 2, УНФ 1.6 и другими. Правила для старых и доработанных конфигураций не требуют синхронного обновления и совместимы с новыми и будущими конфигурациями. Обмен по расписанию, через папку, FTP, почту.

15300 13005 руб.

18.02.2016    186886    589    509    

526

Перенос данных 1C Программист Бухгалтер Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет НДФЛ ФОМС, ЕФС Платные (руб)

Обработки для быстрого перехода с конфигураций «КАМИН:Расчет заработной платы 3.0», «КАМИН:Зарплата для бизнеса 4.0» и «КАМИН:Зарплата 5.0» на конфигурацию «Зарплата и управление персоналом» версии 3.1.

12000 руб.

25.09.2016    80675    311    250    

264
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. awk 744 12.05.20 08:13 Сейчас в теме
1С примет корректно схему по второму образцу. Почему, осталось вопросом.

1. А ты сторонним валидатором проверял?
2. Если сторонний валидатор принял (я что-то не уверен в этом), то ответ: "1С плохо работает со встроенными, (а главное) анонимными типами".
2. awk 744 12.05.20 08:21 Сейчас в теме
(1) А если сторонний валидатор, скажет то же самое, то скорее всего, причина в разных пространствах имен.
3. FlyVodolaz 22.05.20 12:44 Сейчас в теме
XSD это ООП по сути.
Типы значений - это как переменные модуля, которые могут быть структурами. Типы объектов - это как классы.
В итоге при разработке нового класса вы сами решаете как организовать. В качестве типов полей вы можете использовать имеющие переменные модуля (типы значений), использовать другие классы (типы объектов). А можете и объявить свой подчиненный класс для свойства. Т.е. табличныю часть не обязательно выносить в отдельный объект. Просто создайте поле и не указывая его тип выберите добавить/определение типа/тип объекта и укажите все свойства табличной части в этом же объекте. Вы можете наследовать открытые классы и переопределять их (свойство базовый тип у типа объекта). А по поводу nonNegativeInteger, так в 1С нет типа такого. Как собственно и float, integer, double, byte...
4. Demlan 19.09.20 16:39 Сейчас в теме
Получаю фабрику из WSОпределения на мобильном. Создаю объект XDTO. И тут возникает вопрос: т.к. свойств очень много в центральной базе у объекта, а в мобильнике мало то можно как-нибудь заполнить при создании на мобильнике все свойства объекта значениями по умолчанию? Просто возникает ошибка если свойства не заполнены.
Оставьте свое сообщение