Механизм 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

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

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

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

58000 руб.

04.08.2015    190969    460    307    

460

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 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" с помощью правил конвертации будет максимально комфортным! | Можно бесплатно проверить перенос на вашем сервере!

50050 руб.

25.02.2015    190064    369    292    

427

SALE! 20%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 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. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

27633 руб.

12.06.2017    162445    981    324    

484

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

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

58000 руб.

15.04.2019    85590    229    180    

166

SALE! 10%

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

Переносите справочную информацию, остатки и документы из УПП 1.3 в Бухгалтерию 3.0 с помощью готовых правил. Переносится более 50 видов документов. Простой интерфейс и понятные настройки.

42000 37800 руб.

15.12.2021    35192    261    64    

199

Перенос данных 1C Программист 1С:Предприятие 8 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 Россия Платные (руб)

Перенос данных из УПП 1.3 в УНФ | из КА 1.1 в УНФ | из УТ 10.3 в УНФ | Перенос разработан в формате КД 2 (правила конвертации объектов) | Выгружаются все возможные виды документов, начальных остатков и вся нормативно-справочная информация | Есть фильтр по организациям при выгрузке данных | Есть несколько алгоритмов выгрузки начальных остатков товаров на выбор | Можно проверить перед покупкой на своем сервере!

58000 руб.

17.10.2019    45246    60    117    

62

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

Перенос данных из БП 2 в БП 3 готовые правила конвертации данных (КД 2), сэкономьте свое время! | Выполнить переход с БП 2 на БП 3 в ситуациях, когда простым обновлением перейти не получается | Переносится вся справочная информация, документы за выбранный период, а также начальные остатки на выбранную дату (то есть можно еще и свертку базы сделать при переносе) | Есть фильтр по организациям при выгрузке данных | Перенос можно проверить перед покупкой прямо на вашем сервере! Обращайтесь за проверкой!

50600 руб.

21.05.2019    59099    81    134    

73

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

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

58000 руб.

31.10.2014    247285    123    362    

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

1. А ты сторонним валидатором проверял?
2. Если сторонний валидатор принял (я что-то не уверен в этом), то ответ: "1С плохо работает со встроенными, (а главное) анонимными типами".
2. awk 746 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. И тут возникает вопрос: т.к. свойств очень много в центральной базе у объекта, а в мобильнике мало то можно как-нибудь заполнить при создании на мобильнике все свойства объекта значениями по умолчанию? Просто возникает ошибка если свойства не заполнены.
Для отправки сообщения требуется регистрация/авторизация