Xdto 1C

XDTO — это аббревиатура, обозначающая обмен данными посредством XML (XML Data Transfer Objects). Аббревиатура придумана разработчиками 1с и вряд ли встретится где-то ещё. Но реализует она вполне стандартизированный механизм обмена информацией с помощью файлов XML, известный как XML Schema.

Суть этого механизма заключается в том, что создаётся специальный файл, называемый схемой. Этот файл описывает структуру XML-файла. Если XML-файл соответствует этой структуре, то он считается корректным. Отдающей стороне достаточно сформировать корректный XML-файл для успешного обмена. Принимающая сторона должна гарантировать, что любой корректный XML-файл будет загружен без ошибок. В результате достаточно легко можно обеспечить обмен между двумя и более закрытыми информационными системами. Каждая схема характеризуется пространством имён, которое должно быть уникальным. Оно связывает XML-файл со своей схемой.

Самым ярким примером использования такого механизма обмена являются различного рода декларации (налоговые и прочее). На сайтах соответствующих ведомств всегда можно найти файл со схемой. Другой распространённый пример — обмен данными с сайтом.

С точки зрения программиста 1с, объект XDTO очень похож на Фиксированную структуру, созданную на основе файла со схемой. Эта псевдоструктура может быть загружена из XML-файла и использована для загрузки сторонних данных. А может быть заполнена данными и записана в корректный XML-файл. Который впоследствии будет использован для загрузки в другую информационную систему. В любом случае работа с объектом состоит из 3 основных этапов: получение типа объекта, создание объекта XDTO требуемого типа, использование объекта XDTO для выгрузки или загрузки данных.

Получение типа объекта

Это наиболее трудный для понимания этап т.к. он не соответствует обычной работе с переменными 1с. Но для работы с объектами XDTO он обязателен. Прежде чем создать объект XDTO, необходимо получить его тип. Для этого используются специальные объекты — фабрики типов XDTO.

Платформа позволяет использовать 2 вида схем — встроенные в конфигурацию XDTO-пакеты или внешние файлы с расширением .xsd и оформленные в соответствии со стандартами w3c. Соответственно, существует 2 способа получения объекта-фабрики типов.

Использование XDTO-пакетов

XDTO-пакет — это отдельный объект конфигурации, расположенный в ветке Общие дерева конфигурации. Платформа позволяет создавать неограниченное количество XDTO-пакетов как с помощью конструктора, так и путём импорта существующих файлов .xsd. Эти пакеты могут служить основой для получения типов объектов XDTO. Выглядит это так:

ТипОбъектаНоменклатура = ФабрикаXDTO.Тип(«http://www.wiki-1c.ru/xdto», «Номенклатура»);

Здесь ФабрикаXDTO — это особый глобальный объект, который знает всё обо всех объектах XDTO, описанных в имеющихся в конфигурации XDTO-пакетах. Метод Тип() возвращает искомый тип объекта XDTO (ТипОбъектаXDTO). Он принимает 2 параметра — пространство имён и имя типа (оба — строки). Результат полезно запомнить в переменной, в дальнейшем её можно использовать для создания объектов XDTO произвольное количество раз.

Заметим, что в параметре передаётся не имя пакета, а его пространство имён. Имя пакета вообще нигде не используется и задаётся только для удобства поиска в дереве конфигурации.

Использование файлов с описанием схемы XML

Такие файлы традиционно имеют расширение .xsd. Преимущество данного метода в том, что он работает независимо от конфигурации. И если первому методу обязательно требуется отдельный объект конфигурации, этот требует только наличия файла со схемой. Вот код создания соответствующего объекта-фабрики и получение типа объекта XDTO:

МояФабрикаXDTO = СоздатьФабрикуXDTO(«D:\Temp\goods.xsd»); ТипОбъектаНоменклатура = МояФабрикаXDTO.Тип(«http://www.wiki-1c.ru/xdto», «Номенклатура»);

Здесь мы использовали глобальную функцию СоздатьФабрикуXDTO, которая считывает файл со схемой (параметр функции) и создаёт объект-фабрику. Этот объект в будущем может произвольное число раз использоваться для создания любых доступных в схеме типов объектов. Если требуется загрузить несколько файлов со схемами, можно передать массив строк с именами файлов. Дальнейшая работа с фабрикой объектов не отличается от описанного в 1 способе.

Создание объекта XDTO

Сами объекты XDTO также создаются фабрикой объектов. Причём той же самой, которая использовалась при получении типа. Но используется уже другой метод — Создать():

Номенклатура = МояФабрикаXDTO.Создать(ТипОбъектаНоменклатура);

В результате в переменной Номенклатура окажется объект XDTO, описанный в файле-схеме. К его реквизитам можно обращаться наподобие реквизитов фиксированной структуры. Естественно, нельзя добавлять или удалять реквизиты. В отличие от фиксированной структуры, каждый реквизит имеет определённый тип, поэтому произвольное присваивание не получится. Объект имеет тип ОбъектXDTO.

Запись объектов XDTO в файл

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

Заполнение объекта XDTO

Использование фабрики объектов на этом не закончится. Ведь у переменной Номенклатура есть несколько реквизитов, и каждый из реквизитов относится к какому-то типу. К счастью, простые типы можно использовать без подобных преобразований простым присваиванием:

Номенклатура.Наименование = «Носки суровые»;

Более сложные типы требуют обращения к фабрике объектов:

ТипОбъектаЕдиницаИзмерения = МояФабрикаXDTO.Тип(«http://www.wiki-1c.ru/xdto», «ЕдиницаИзмерения»); ЕдиницаИзмерения = МояФабрикаXDTO.Создать(ТипОбъектаЕдиницаИзмерения); ЕдиницаИзмерения.ОКЕИ = 796; ЕдиницаИзмерения.Наименование = «шт»; Номенклатура.ЕдиницаИзмерения = ЕдиницаИзмерения;

Стандарт позволяет создавать реквизиты-списки и реквизиты-структуры без создания отдельных типов. Заполнять такие реквизиты можно следующим образом:

// Список элементов простых типов Штрихкоды = Номенклатура.ПолучитьСписок(«Штрихкоды»); Штрихкоды.Добавить(«4601546124937»); Штрихкоды.Добавить(«4601546093981»); // Список элементов сложных типов, описанных в схеме ПрочиеЕдиницыИзмерения = Номенклатура.ПолучитьСписок(«ПрочиеЕдиницыИзмерения»); ЕдиницаИзмерения = МояФабрикаXDTO.Создать(ТипОбъектаЕдиницаИзмерения); ЕдиницаИзмерения.ОКЕИ = 166; ЕдиницаИзмерения.Наименование = «кг»; ПрочиеЕдиницыИзмерения.Добавить(ЕдиницаИзмерения);

Здесь мы получаем объект-список методом ПолучитьСписок() объекта XDTO. Объект-список имеет тип СписокXDTO.

Получение типа элементов-структур немного напоминает работу с метаданными конфигурации. Используем метод Свойства() для получения списка реквизитов (КоллекцияСвойствXDTO). Далее получаем параметры реквизита методом списка Получить() (СвойствоXDTO). В его реквизите Тип и находится искомый тип значения.

// Список элементов-структур Характеристики = Номенклатура.ПолучитьСписок(«Характеристики»); ТипЭлементаХарактеристика = Номенклатура.Свойства().Получить(«Характеристики»).Тип; Характеристика = МояФабрикаXDTO.Создать(ТипЭлементаХарактеристика); Характеристика.Код = 1; Характеристика.Наименование = «Жёлтые»; Характеристики.Добавить(Характеристика); // Реквизиты-структуры ТипОбъектаСчетаУчета = Номенклатура.Свойства().Получить(«СчетаУчета»).Тип; Номенклатура.СчетаУчета = МояФабрикаXDTO.Создать(ТипОбъектаСчетаУчета); Номенклатура.СчетаУчета.СчетУчетаОстатков = «10.01»; Номенклатура.СчетаУчета.СчетУчетаРасходов = «26»;

Сейчас объект заполнен и его можно записать.

Запись объекта XDTO

Для записи воспользуемся объектом типа ЗаписьXML. В него умеет писать фабрика объектов с помощью метода ЗаписатьXML().

РезультатXML = Новый ЗаписьXML; РезультатXML.УстановитьСтроку(«UTF-8»); РезультатXML.ЗаписатьОбъявлениеXML(); МояФабрикаXDTO.ЗаписатьXML(РезультатXML, Номенклатура); Результат = РезультатXML.Закрыть();

В результате в переменной «Результат» будет следующее содержимое:

<?xml version=»1.0″ encoding=»UTF-8″?> <Номенклатура xmlns=»http://www.wiki-1c.ru/xdto» xmlns:xs=»http://www.w3.org/2001/XMLSchema» xmlns:xsi=»http://www.w3.org/2001/XMLSchema-instance»> <Наименование>Носки суровые</Наименование> <ЕдиницаИзмерения> <ОКЕИ>796</ОКЕИ> <Наименование>шт</Наименование> </ЕдиницаИзмерения> <Штрихкоды>4601546124937</Штрихкоды> <Штрихкоды>4601546093981</Штрихкоды> <ПрочиеЕдиницыИзмерения> <ОКЕИ>166</ОКЕИ> <Наименование>кг</Наименование> </ПрочиеЕдиницыИзмерения> <Характеристики> <Код>1</Код> <Наименование>Жёлтые</Наименование> </Характеристики> <СчетаУчета> <СчетУчетаОстатков>10.01</СчетУчетаОстатков> <СчетУчетаРасходов>26</СчетУчетаРасходов> </СчетаУчета> </Номенклатура>

Первая строка была добавлена методом ЗаписатьОбъявлениеXML() объекта ЗаписьXML. Остальное сделала фабрика. Из интересных моментов можно отметить наличие пары дополнительных пространств имён помимо используемого нами. В них описываются базовые типы реквизитов, таких как строка.

Если требуется результат записать сразу в файл, можно воспользоваться соответствующими методами объекта ЗаписьXML.

Чтение объектов XDTO из файла

Процесс чтения проще чем процесс записи. Сначала выполняем непосредственно чтение с помощью объекта ЧтениеXML и метода ПрочитатьXML() фабрики:

РезультатXML = Новый ЧтениеXML; РезультатXML.УстановитьСтроку(Результат); НоменклатураСчитанная = МояФабрикаXDTO.ПрочитатьXML(РезультатXML, ТипОбъектаНоменклатура); РезультатXML.Закрыть(); НоменклатураСчитанная.Проверить();

Как видим, ПрочитатьXML() требует в качестве параметра указания типа принимаемого XDTO-объекта. Параметр не обязательный, при его отсутствии метод попытается сам определить тип объекта. В результате в переменную «НоменклатураСчитанная» поместится объект, аналогичный записанному ранее.

В последней строке кода мы воспользовались методом Проверить() объекта XDTO. Этот метод вызовет исключение, если считанный объект не соответствует схеме XML. Рекомендуется этот метод вызывать и непосредственно перед записью объекта, чтобы гарантировать что сохранённый файл будет корректным.

Обращение к реквизитам аналогично обращению к реквизитам фиксированных структур. Для реквизитов-списков можно воспользоваться итератором:

Для Каждого Штрихкод Из НоменклатураСчитанная.Штрихкоды Цикл Сообщить(Штрихкод); КонецЦикла;

Разумеется, содержимое считанного объекта можно менять. Впоследствии он может быть сохранён.

См. также

Объекты 1с и их типы:
Фиксированная структура, ФабрикаXDTO, СоздатьФабрикуXDTO, ТипОбъектаXDTO, ОбъектXDTO, СписокXDTO, КоллекцияСвойствXDTO, СвойствоXDTO, ЗаписьXML, ЧтениеXML.

Другие статьи на эту тему:

Одним из самых популярных форматов данных, используемых практически в любой компании, является XML (расширяемый язык разметки). Разработчики 1С создали специальный объект XDTO для удобства своих клиентов и простого взаимодействия с файлами XML, поэтому программисту 1С важно работать с этими объектами платформы, так как обмен данными через XML встречается постоянно.

Преимущества механизма XDTO

Этот функционал создавался как удобный инструмент обмена данными между конфигурациями и другими приложениями. Также этот механизм используют для работы с web-сервисами и для обработки произвольных данных. Большое преимущество XDTO перед другими способами – в нем есть возможность обращаться к файлу XML, как к объекту 1С. То есть все реквизиты можно будет получить, описывая структуру через точку, не задумываясь о скобках, тегах и атрибутах.

Взаимодействие с файлами XML происходит по заранее установленным правилам, описанным в объекте структуры конфигурации – XDTO – пакеты в 1С 8.3. Суть этих элементов структуры в том, что они представляют собой схемы, по которым будут распознаваться данные из XML-файлов. В типовых конфигурациях уже присутствуют подобные объекты, но при работе с конкретными файлами понадобятся другие схемы.

Существует два способа добавить XDTO-пакет в конфигурацию:

  • Собственноручно создать. Этот вариант подойдет при самостоятельной работе с XML определенного формата. Зная, какие данные будут подаваться на вход для импорта с использованием XDTO, можно заранее создать в конфигурации нужный объект. Этот вариант хорош, если обмен данными налажен и никаких изменений не планируется;
    Рис.1 XDTO пакеты
  • Импорт присланной схемы. Когда нам присылают данные, их схема может оказаться какой угодно, особенно, если раньше мы не работали с источником. Сильно упростит ситуацию, если вместе с XML нам пришлют и файл формата xsd. В нем содержится выгрузка XDTO-пакета, который может разобрать конкретные XML. Нам останется лишь импортировать его.

Чтобы загрузить данные из присланной нам схемы, необходимо в режиме конфигуратор открыть раздел «Общие» и «XDTO-пакеты». Через контекстное меню выбрать пункт «Импорт XML-схемы…», выбрать файл и подтвердить пространство имен, взятое из файла. После этого необходимо обновить конфигурацию, и предварительные настройки сделаны.

Но на самом деле в последнем случае нам необязательно создавать XDTO-пакеты в конфигурации 1С 8.3. Существует возможность только использовать XSD-схему, присланную нам из отдельного файла, не внося изменения в структуру базы 1С. Для этого нужно воспользоваться кодом, объясняющим платформе 1С, какой тип объекта с какими параметрами будет загружаться.

Это происходит следующими командами:

ФайлXSD = Новый Массив(); ФайлXSD.Добавить(«D:\1\strust.xsd»); ФабрикаXDTOИзФайла = СоздатьФабрикуXDTO(ФайлXSD); Номенклатура = ФабрикаXDTOИзФайла.Тип(«http://www.1c.ru/products», «Номенклатура»);

Экспорт и импорт файла

После того как мы разобрались с принципами использования пакетов XDTO, нужно посмотреть на механику работы с файлами XML. Лучше всего это будет видно на простом примере, чтобы понять основы. Добавим новый элемент в раздел XDTO-пакетов и настроим его следующим образом:

  1. Заполняем URI-пространство имен в свойствах XDTO пакета. Среди разработчиков 1С принято заполнять этот реквизит адресом страницы, заполненной описанием тех данных, с которыми происходит работа. Это помогает в работе, но не всегда возможно. В иных случаях заполняют произвольным текстом;
  2. Задаем тип объекта и его свойства, используя контекстное меню. Задаем имя этих параметров и для свойств определяем тип, выбирая его из предложенных платформой.

Рис.2 Параметры пакета

Следующим этапом будет написание процедуры для создания файла XML по описанной выше схеме. Код достаточно прост, поскольку создан XDTO-пакет, а у элемента всего 2 свойства – «Наименование» и «Артикул». Обращаться к конкретной схеме позволяет объект платформы «ФабрикаXDTO». Сама процедура состоит из:

Чтение XML-файлов с помощью конкретной фабрики XDTO по уже созданному в конфигурации пакету ничуть не сложнее. Алгоритм похож по структуре и отличается только операциями взаимодействия с XML-файлами. В данном случае нам нужно воспользоваться объектом платформы «ЧтениеXML» и прочитать содержимое в переменную. На выходе у нее будет тип «ОбъектXDTO», и вы сможете обращаться ко всем ее свойствам через точку.

ТипФабрики = ФабрикаXDTO.Тип(«http://www.primerXML.ru/Nomen»,»Номенклатура»); ИмяФайла = «D:\1\struct1.xml»; МойXML = Новый ЧтениеXML; МойXML.ОткрытьФайл(ИмяФайла); номенклатура = ФабрикаXDTO.ПрочитатьXML(МойXML, ТипФабрики); МойXML.Закрыть();

Теперь попробуем прочитать файл, схемы которого нет в нашей конфигурации. Для этого экспортируем XDTO-пакет в файл формата xsd и удалим схему из конфигурации. После этого нам придется объяснить платформе, откуда ей брать схему читаемой XML-кодом, продемонстрированным ранее. Однако в простейших случаях 1С самостоятельно может распознать все свойства.

Рис.3 Экспорт XDTO-пакета

Лучше все-таки не рассчитывать на понятливость платформы 1С, а использовать точную схему XML. Многие специалисты используют сторонний софт для их создания, но для этого необходим достаточно большой опыт и уровень подготовки. Работа с пакетами XDTO требует внимания и соблюдения точного соответствия файлов заданной схеме, чтобы минимизировать возможные ошибки.

Исправление ошибок

Одной из достаточно распространенных ошибок, связанных с работой с XDTO-пакетами, является «Ошибка преобразования данных XDTO». Ее суть заключается в том, что платформа не может разобрать данный ей XML-файл по заданной схеме. При получении подобной ошибки при импорте данных, необходимо проверить формат файлов – возможно, присутствуют незакрытые теги.

Зачастую проблема с ошибками преобразования данных возникает и по другим причинам:

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

Чтобы исправить эту ошибку, сначала почистите кэш или удалите, а также заново добавьте информационную базу в список баз. Затем внимательно проверьте файл XML – вдруг случайно сделали ошибку в его тексте, проверьте соответствие структуры пакету XDTO. Если ошибка появилась после обновления, сделайте тестирование и исправление ИБ, сохранив перед этим резервную копию базы. Если проблема не уйдет, вернитесь на предыдущую версию и подождите, пока разработчики 1С не разберутся с этой проблемой.

Рис.4 Ошибка преобразования данных

Еще одна проблема, часто мучающая программистов 1С, работающих с XDTO, – ошибка проверки данных. Если при импорте вы видите подобный текст, то с высокой долей вероятности источник проблемы в несоответствии файла нужной схеме. Но проблема может быть не на вашей стороне, а в базе, из которой выгружали XML. Чтобы исправить эту оплошность, придется внимательно изучить всю последовательность действий и найти, после чего файл перестал соответствовать ожиданиям.

Рис.5 Ошибка проверки данных

Более сложная для анализа проблема, если при обмене информацией 1С выдает ошибку о несоответствии типов XDTO. В этом случае придется проверять все данные, находить ошибки и их причины. В некоторых случаях ошибки могут быть в коде, иногда – в данных информационной базы. Чтобы это понять, необходимо иметь доступ к базам причастным к обмену и четко понимать всю суть происходящего экспорта и импорта.

Рис.6 Несоответствие типов XDTO

На первый взгляд работа с XDTO достаточно сложна, поэтому на первое время рекомендуется добавлять XDTO-пакеты в 1С для большего порядка и учета. Конечно, все нюансы изучить сразу невозможно, но в процессе работы вы будете продолжать учиться. Но с уверенной теоретической базой намного удобнее начинать разбираться в этом вопросе.

По пакетам XDTO уже существует достаточно много статей, прочитав которые я потратил еще достаточно много времени чтобы разобраться как написать обмен, используя эту технологию. Сейчас я уверенно могу сказать, что все достаточно просто и покажу это на примере.

В примере мы выгрузим из демо базы БП 3 документ «Реализация (акты, накладные)» в самописную конфигурацию.

Конфигурация, в которую будем загружать данные будет состоять из следующих объектов:
Справочники: Номенклатура, Контрагенты. Перечисления: СтавкиНДС. Документы: РеализацияТоваровУслуг.

Оказывается, в демо базе БП 3 есть расширение «ФормированиеТестовыхДанных», значит им и воспользуемся, не будем создавать собственное.

Добавим пакет XDTO. Имя: ВыгрузкаРеализаций. URI пространство имен: infostart.

В пакете добавим тип объекта «ДокументРеализация».

В объект добавим свойства: Ссылка, Дата, Номер, Контрагент.

Создадим обработку «Выгрузка реализаций»

Код команды выгрузки:

&НаСервере Функция КомандаВыгрузитьНаСервере() // Вставить содержимое обработчика. ЗаписьXML = Новый ЗаписьXML(); ЗаписьXML.УстановитьСтроку(); РеализацияXDTO = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(«infostart», «ДокументРеализация»)); РеализацияXDTO.Ссылка = СериализаторXDTO.XMLСтрока(выбРеализация.Ссылка); РеализацияXDTO.Дата = выбРеализация.Дата; РеализацияXDTO.Номер = выбРеализация.Номер; РеализацияXDTO.Контрагент = выбРеализация.Контрагент.Наименование; ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, РеализацияXDTO); Возврат ЗаписьXML.Закрыть(); КонецФункции &НаКлиенте Процедура КомандаВыгрузить(Команда) ОбъектXDTO = КомандаВыгрузитьНаСервере(); ЗаписьXML = Новый ЗаписьXML(); ЗаписьXML.ОткрытьФайл(выбФайл); ЗаписьXML.ЗаписатьОбъявлениеXML(); ЗаписьXML.ЗаписатьБезОбработки(ОбъектXDTO); ЗаписьXML.Закрыть(); КонецПроцедуры

Результат

<?xml version=»1.0″ encoding=»UTF-8″?> <ДокументРеализация xmlns:xsi=»http://www.w3.org/2001/XMLSchema-instance» xmlns:xs=»http://www.w3.org/2001/XMLSchema» xmlns=»infostart»> <Ссылка xsi:type=»xs:string»>63d07913-1e98-11e6-a31d-14dae9b19a48</Ссылка> <Дата xsi:type=»xs:dateTime»>2016-12-29T12:00:00</Дата> <Номер xsi:type=»xs:string»>0000-000603</Номер> <Контрагент xsi:type=»xs:string»>Внуковский комбинат бортового питания</Контрагент> </ДокументРеализация>

Изменим форму представления для свойств объекта XDTO

Результат

<?xml version=»1.0″ encoding=»UTF-8″?> <ДокументРеализация Контрагент=»Внуковский комбинат бортового питания» Номер=»0000-000603″ Дата=»2016-12-29T12:00:00″ Ссылка=»63d07913-1e98-11e6-a31d-14dae9b19a48″ xmlns:xsi=»http://www.w3.org/2001/XMLSchema-instance» xmlns:xs=»http://www.w3.org/2001/XMLSchema» xmlns=»infostart»/>

Переходим к загрузке данных. Создадим обработку загрузки.

Код

&НаСервереБезКонтекста Функция ПолучитьСсылкуПоУИ(УникальныйИдентификатор, МенеджерОбъекта) УИДСсылки = СериализаторXDTO.XMLЗначение(Тип(«УникальныйИдентификатор»), УникальныйИдентификатор); Возврат МенеджерОбъекта.ПолучитьСсылку(УИДСсылки); КонецФункции &НаСервереБезКонтекста Процедура ЗагрузитьРеализации(ТекстФайла) ЧтениеXML = Новый ЧтениеXML(); ЧтениеXML.УстановитьСтроку(ТекстФайла); РеализацияXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML, ФабрикаXDTO.Тип(«infostart», «ДокументРеализация»)); сРеализацияТоваров = ПолучитьСсылкуПоУИ(РеализацияXDTO.Ссылка, Документы.РеализацияТоваровУслуг); оРеализацияТоваров = сРеализацияТоваров.ПолучитьОбъект(); Если оРеализацияТоваров = Неопределено Тогда оРеализацияТоваров = Документы.РеализацияТоваровУслуг.СоздатьДокумент(); оРеализацияТоваров.УстановитьСсылкуНового(сРеализацияТоваров); КонецЕсли; оРеализацияТоваров.Дата = РеализацияXDTO.Дата; оРеализацияТоваров.Номер = РеализацияXDTO.Номер; оРеализацияТоваров.Записать(РежимЗаписиДокумента.Запись); КонецПроцедуры &НаКлиенте Процедура КомандаЗагрузить(Команда) // Вставить содержимое обработчика. ЧтениеТекста = Новый ЧтениеТекста(выбФайл); ТекстФайла = ЧтениеТекста.Прочитать(); ЗагрузитьРеализации(ТекстФайла); КонецПроцедуры

Проверяем загрузку. Выполнение прерывается ошибкой. Через отладку можно увидеть, что значения свойств объекта РеализацияXDTO имеют строковый тип, конкретно дата в таком виде преобразуется к пустому значению.

В пакете XDTO укажем свойству «Дата» тип

Проверим еще раз загрузку, все должно было пройти успешно.

Отдельно обращу внимание на эту строчку кода

РеализацияXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML, ФабрикаXDTO.Тип(«infostart», «ДокументРеализация»));

При чтение объекта XDTO я принудительно указал его тип, хотя параметр не является обязательным. И сделал я это не просто так, для корневого элемента тип объекта не выгружается, это хорошо видно в xml файле, где все свойства выгружали в форме элементов. Для объекта ДокументРеализация не указан атрибут xsi:type.

<?xml version=»1.0″ encoding=»UTF-8″?> <ДокументРеализация xmlns:xsi=»http://www.w3.org/2001/XMLSchema-instance» xmlns:xs=»http://www.w3.org/2001/XMLSchema» xmlns=»infostart»> <Ссылка xsi:type=»xs:string»>63d07913-1e98-11e6-a31d-14dae9b19a48</Ссылка> <Дата xsi:type=»xs:dateTime»>2016-12-29T12:00:00</Дата> <Номер xsi:type=»xs:string»>0000-000603</Номер> <Контрагент xsi:type=»xs:string»>Внуковский комбинат бортового питания</Контрагент> </ДокументРеализация>

В свойство «контрагент» мы помещали наименование контрагента. Добавим новый тип объекта в пакет XDTO «СправочникКонтрагенты» со свойствами: Ссылка, Код, Наименование, НаименованиеПолное. Для свойства «Контрагент» в типе объекта «ДокументРеализация» укажем форму хранения в виде элемента. Внесем изменения в код выгрузки.

&НаСервере Функция КомандаВыгрузитьНаСервере() // Вставить содержимое обработчика. ЗаписьXML = Новый ЗаписьXML(); ЗаписьXML.УстановитьСтроку(); КонтрагентXDTO = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(«infostart», «СправочникКонтрагенты»)); КонтрагентXDTO.Ссылка = СериализаторXDTO.XMLСтрока(выбРеализация.Контрагент.Ссылка); КонтрагентXDTO.Код = выбРеализация.Контрагент.Код; КонтрагентXDTO.Наименование = выбРеализация.Контрагент.Наименование; КонтрагентXDTO.НаименованиеПолное = выбРеализация.Контрагент.НаименованиеПолное; РеализацияXDTO = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(«infostart», «ДокументРеализация»)); РеализацияXDTO.Ссылка = СериализаторXDTO.XMLСтрока(выбРеализация.Ссылка); РеализацияXDTO.Дата = выбРеализация.Дата; РеализацияXDTO.Номер = выбРеализация.Номер; РеализацияXDTO.Контрагент = КонтрагентXDTO; ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, РеализацияXDTO); Возврат ЗаписьXML.Закрыть(); КонецФункции

Думаю, здесь все понятно.

Дольше всего я не мог разобраться, как выгружать табличные части.

Создадим тип объекта «ТабличнаяЧасть» со свойством «Строки».

Максимальное количество -1, означает неограниченное количество элементов.

Создадим объект.

ТоварыXDTO = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(«infostart», «ТабличнаяЧасть»));

И посмотрим его свойства в отладчике.

Дальше, думаю, уже все понятно. Изменения в коде обработки выгрузки.

&НаСервере Функция КомандаВыгрузитьНаСервере() // Вставить содержимое обработчика. ЗаписьXML = Новый ЗаписьXML(); ЗаписьXML.УстановитьСтроку(); КонтрагентXDTO = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(«infostart», «СправочникКонтрагенты»)); КонтрагентXDTO.Ссылка = СериализаторXDTO.XMLСтрока(выбРеализация.Контрагент.Ссылка); КонтрагентXDTO.Код = выбРеализация.Контрагент.Код; КонтрагентXDTO.Наименование = выбРеализация.Контрагент.Наименование; КонтрагентXDTO.НаименованиеПолное = выбРеализация.Контрагент.НаименованиеПолное; РеализацияXDTO = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(«infostart», «ДокументРеализация»)); РеализацияXDTO.Ссылка = СериализаторXDTO.XMLСтрока(выбРеализация.Ссылка); РеализацияXDTO.Дата = выбРеализация.Дата; РеализацияXDTO.Номер = выбРеализация.Номер; РеализацияXDTO.Контрагент = КонтрагентXDTO; ТоварыXDTO = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(«infostart», «ТабличнаяЧасть»)); Для Каждого сТовары Из выбРеализация.Товары Цикл НоменклатураXDTO = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(«infostart», «СправочникНоменклатура»)); НоменклатураXDTO.Ссылка = СериализаторXDTO.XMLСтрока(сТовары.Номенклатура); НоменклатураXDTO.Код = сТовары.Номенклатура.Код; НоменклатураXDTO.Наименование = сТовары.Номенклатура.Наименование; НоменклатураXDTO.НаименованиеПолное = сТовары.Номенклатура.НаименованиеПолное; сТоварыXDTO = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(«infostart», «ДокументРеализацияТовары»)); сТоварыXDTO.Номенклатура = НоменклатураXDTO; сТоварыXDTO.Количество = сТовары.Количество; сТоварыXDTO.Цена = сТовары.Цена; сТоварыXDTO.Сумма = сТовары.Сумма; сТоварыXDTO.СтавкаНДС = XMLСтрока(сТовары.СтавкаНДС); сТоварыXDTO.СуммаНДС = сТовары.СуммаНДС; ТоварыXDTO.Строки.Добавить(сТоварыXDTO); КонецЦикла; РеализацияXDTO.тчТовары = ТоварыXDTO; ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, РеализацияXDTO); Возврат ЗаписьXML.Закрыть(); КонецФункции

Код загрузки

&НаСервереБезКонтекста Процедура ЗагрузитьРеализации(ТекстФайла) ЧтениеXML = Новый ЧтениеXML(); ЧтениеXML.УстановитьСтроку(ТекстФайла); РеализацияXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML, ФабрикаXDTO.Тип(«infostart», «ДокументРеализация»)); сРеализацияТоваров = ПолучитьСсылкуПоУИ(РеализацияXDTO.Ссылка, Документы.РеализацияТоваровУслуг); оРеализацияТоваров = сРеализацияТоваров.ПолучитьОбъект(); Если оРеализацияТоваров = Неопределено Тогда оРеализацияТоваров = Документы.РеализацияТоваровУслуг.СоздатьДокумент(); оРеализацияТоваров.УстановитьСсылкуНового(сРеализацияТоваров); КонецЕсли; оРеализацияТоваров.Дата = РеализацияXDTO.Дата; оРеализацияТоваров.Номер = РеализацияXDTO.Номер; КонтрагентXDTO = РеализацияXDTO.Контрагент; сКонтрагент = ПолучитьСсылкуПоУИ(КонтрагентXDTO.Ссылка, Справочники.Контрагенты); оКонтрагент = сКонтрагент.ПолучитьОбъект(); Если оКонтрагент = Неопределено Тогда оКонтрагент = Справочники.Контрагенты.СоздатьЭлемент(); оКонтрагент.УстановитьСсылкуНового(сКонтрагент); КонецЕсли; оКонтрагент.Код = КонтрагентXDTO.Код; оКонтрагент.Наименование = КонтрагентXDTO.Наименование; оКонтрагент.НаименованиеПолное = КонтрагентXDTO.НаименованиеПолное; оКонтрагент.Записать(); оРеализацияТоваров.Контрагент = оКонтрагент.Ссылка; оРеализацияТоваров.Товары.Очистить(); Для Каждого сТоварыXDTO Из РеализацияXDTO.тчТовары.Строки Цикл сТовары = оРеализацияТоваров.Товары.Добавить(); ЗаполнитьЗначенияСвойств(сТовары, сТоварыXDTO,,»СтавкаНДС,Номенклатура»); сТовары.СтавкаНДС = Перечисления.СтавкиНДС; НоменклатураXDTO = сТоварыXDTO.Номенклатура; сНоменклатура = ПолучитьСсылкуПоУИ(НоменклатураXDTO.Ссылка, Справочники.Номенклатура); оНоменклатура = сНоменклатура.ПолучитьОбъект(); Если оНоменклатура = Неопределено Тогда оНоменклатура = Справочники.Номенклатура.СоздатьЭлемент(); оНоменклатура.УстановитьСсылкуНового(сНоменклатура); КонецЕсли; оНоменклатура.Код = НоменклатураXDTO.Код; оНоменклатура.Наименование = НоменклатураXDTO.Наименование; оНоменклатура.НаименованиеПолное = НоменклатураXDTO.НаименованиеПолное; оНоменклатура.Записать(); сТовары.Номенклатура = оНоменклатура.Ссылка; КонецЦикла; оРеализацияТоваров.Записать(РежимЗаписиДокумента.Запись); КонецПроцедуры

Для создания примера использовались программные файлы 1С:Предприятие 8.3 (8.3.14.1694).

Есть очень много статей о том, как работать с XSL/XSD из 1С, но все они в стиле: возьмем нашу XSD схему (простую и удбоную) или наш web-сервис и смотрите, как все легко экспортировать или импортировать. А что делать, если нам дали пачку XSD-схем со сложным взаимосвязями и изменять мы них не можем, а работать и поддерживать актуальность схем надо?
Сразу скажу, вопросы шифрования/подписи по ГОСТУ при работе с ГИС ЖКХ за рамками этой статьи и на хабре уже освещались. Хотя без подписей запросы выполнить не удастся.
Начнем с простого — скачаем пакет форматов по интеграционному взаимодействию с ГИС ЖКХ, импортируем все xsd схемы из пакета интеграций, наведем порядок переименуем все как нам удобно. В итоге получим как показано на картинке:
Ну а теперь приступим к магии. Попробуем запросить данные из справочника организаций по ОРГН. Это подсистема organizations-registry-common метод exportOrgRegist.
В hcs-organizations-registry-common-service.wsdl указано:

Спецификация из hcs-organizations-registry-common-service.wsdl … <wsdl:message name=»exportOrgRegistryRequest»> <wsdl:part name=»exportOrgRegistryRequest» element=»ro:exportOrgRegistryRequest»/> </wsdl:message> <wsdl:message name=»exportOrgRegistryResult»> <wsdl:part name=»exportOrgRegistryResult» element=»ro:exportOrgRegistryResult»/> </wsdl:message> … <wsdl:message name=»ISRequestHeader»> <wsdl:part name=»Header» element=»ISRequestHeader»/> </wsdl:message> … <wsdl:operation name=»exportOrgRegistry»> <wsdl:documentation>экспорт сведений об организациях</wsdl:documentation> <wsdl:input message=»tns:exportOrgRegistryRequest»/> <wsdl:output message=»tns:exportOrgRegistryResult»/> <wsdl:fault name=»InvalidRequest» message=»tns:Fault»/> </wsdl:operation> … <wsdl:operation name=»exportOrgRegistry»> <soap:operation soapAction=»urn:exportOrgRegistry»/> <wsdl:input> <soap:body use=»literal»/> <soap:header message=»tns:ISRequestHeader» part=»Header» use=»literal»/> </wsdl:input> <wsdl:output> <soap:body use=»literal»/> <soap:header message=»tns:ResultHeader» part=»Header» use=»literal»/> </wsdl:output> <wsdl:fault name=»InvalidRequest»> <soap:fault name=»InvalidRequest» use=»literal»/> </wsdl:fault> </wsdl:operation>
Надо собрать SOAP пакет из заголовка ISRequestHeader, тела exportOrgRegistryRequest. Посмотрим их в xsd схемах спецификаций по интеграций.
hcs-base.xsd… <xs:element name=»ISRequestHeader» type=»tns:HeaderType»> <xs:annotation> <xs:documentation>Заголовок запроса</xs:documentation> </xs:annotation> </xs:element> … <xs:complexType name=»HeaderType»> <xs:annotation> <xs:documentation>Базовый тип заголовка</xs:documentation> </xs:annotation> <xs:sequence> <xs:element name=»Date» type=»xs:dateTime»> <xs:annotation> <xs:documentation>Дата отправки пакета</xs:documentation> </xs:annotation> </xs:element> <xs:element name=»MessageGUID» type=»tns:GUIDType»> <xs:annotation> <xs:documentation>Идентификатор сообщения</xs:documentation> </xs:annotation> </xs:element> </xs:sequence> </xs:complexType> … <xs:simpleType name=»GUIDType»> <xs:annotation> <xs:documentation>GUID-тип.</xs:documentation> </xs:annotation> <xs:restriction base=»xs:string»> <xs:pattern value=»(){8}-(){4}-(){4}-(){4}-(){12}»/> </xs:restriction> </xs:simpleType> …
hcs-organizations-base.xsd… <xs:element name=»OGRN» type=»tns:OGRNType»> <xs:annotation> <xs:documentation>ОГРН</xs:documentation> </xs:annotation> </xs:element> <xs:simpleType name=»OGRNType»> <xs:restriction base=»xs:string»> <xs:length value=»13″/> </xs:restriction> </xs:simpleType> …
hcs-organizations-registry-common-types.xsd… <!—Экспорт из реестра организаций—> <xs:element name=»exportOrgRegistryRequest»> <xs:annotation> <xs:documentation>Экспорт сведений из реестра организаций</xs:documentation> </xs:annotation> <xs:complexType> <xs:complexContent> <xs:extension base=»base:BaseType»> <xs:sequence> <xs:element name=»SearchCriteria» maxOccurs=»100″> <xs:annotation> <xs:documentation>Критерий поиска организаций.</xs:documentation> </xs:annotation> <xs:complexType> <xs:sequence> <xs:choice> <xs:choice> <xs:annotation> <xs:documentation>Поиск по реквизитам.</xs:documentation> </xs:annotation> <xs:element ref=»organizations-base:OGRNIP»/> <xs:sequence> <xs:element ref=»organizations-base:OGRN»/> <xs:element ref=»organizations-base:KPP» minOccurs=»0″/> </xs:sequence> <xs:element ref=»organizations-base:NZA»/> </xs:choice> <xs:element ref=»organizations-registry-base:orgVersionGUID»/> <xs:element ref=»organizations-registry-base:orgRootEntityGUID»/> </xs:choice> <xs:element name=»isRegistered» type=»xs:boolean» fixed=»true» minOccurs=»0″> <xs:annotation> <xs:documentation>Поиск среди организаций, имеющих личных кабинет</xs:documentation> </xs:annotation> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:element name=»lastEditingDateFrom» type=»xs:date» minOccurs=»0″> <xs:annotation> <xs:documentation>Время последнего изменения (от)</xs:documentation> </xs:annotation> </xs:element> </xs:sequence> <xs:attribute ref=»base:version» use=»required» fixed=»10.0.2.1″/> </xs:extension> </xs:complexContent> </xs:complexType> </xs:element> <xs:element name=»exportOrgRegistryResult»> <xs:complexType> <xs:complexContent> <xs:extension base=»base:BaseType»> <xs:choice> <xs:element ref=»base:ErrorMessage»/> <xs:element name=»OrgData» type=»tns:exportOrgRegistryResultType» minOccurs=»0″ maxOccurs=»unbounded»> <xs:annotation> <xs:documentation>Найденная организация.</xs:documentation> </xs:annotation> </xs:element> </xs:choice> <xs:attribute ref=»base:version» use=»required» fixed=»10.0.2.1″/> </xs:extension> </xs:complexContent> </xs:complexType> </xs:element> <xs:complexType name=»exportOrgRegistryResultType»> <xs:sequence> <xs:element ref=»organizations-registry-base:orgRootEntityGUID»/> <xs:element name=»OrgVersion»> <xs:annotation> <xs:documentation>Версия организации в реестре организаций</xs:documentation> </xs:annotation> <xs:complexType> <xs:sequence> <xs:element ref=»organizations-registry-base:orgVersionGUID»/> <xs:element name=»lastEditingDate» type=»xs:date»> <xs:annotation> <xs:documentation>Время последнего изменения</xs:documentation> </xs:annotation> </xs:element> <xs:element name=»IsActual» type=»xs:boolean»> <xs:annotation> <xs:documentation>Признак актуальности записи</xs:documentation> </xs:annotation> </xs:element> <xs:choice> <xs:element name=»Legal» type=»organizations-registry-base:LegalType»> <xs:annotation> <xs:documentation>Юридическое лицо</xs:documentation> </xs:annotation> </xs:element> <xs:element name=»Subsidiary»> <xs:annotation> <xs:documentation>Обособленное подразделение</xs:documentation> </xs:annotation> <xs:complexType> <xs:complexContent> <xs:extension base=»organizations-registry-base:SubsidiaryType»> <xs:sequence> <xs:element name=»StatusVersion»> <xs:annotation> <xs:documentation>Статус версии </xs:documentation> </xs:annotation> <xs:simpleType> <xs:restriction base=»xs:string»/> </xs:simpleType> </xs:element> <xs:element name=»ParentOrg»> <xs:annotation> <xs:documentation>Информация о головной организации</xs:documentation> </xs:annotation> <xs:complexType> <xs:sequence> <xs:element ref=»organizations-registry-base:RegOrgVersion»/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType> </xs:element> <xs:element name=»Entrp» type=»organizations-registry-base:EntpsType»> <xs:annotation> <xs:documentation>Индивидуальный предприниматель</xs:documentation> </xs:annotation> </xs:element> <xs:element name=»ForeignBranch» type=»organizations-registry-base:ForeignBranchType»> <xs:annotation> <xs:documentation>ФПИЮЛ (Филиал или представительство иностранного юридического лица)</xs:documentation> </xs:annotation> </xs:element> </xs:choice> <xs:element name=»registryOrganizationStatus» minOccurs=»0″> <xs:annotation> <xs:documentation>Статус: (P)UBLISHED — опубликована в одном из документов в рамках раскрытия</xs:documentation> </xs:annotation> <xs:simpleType> <xs:restriction base=»xs:string»> <xs:enumeration value=»P»/> </xs:restriction> </xs:simpleType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:element ref=»base:orgPPAGUID» minOccurs=»0″/> <xs:element name=»organizationRoles» type=»nsi-base:nsiRef» minOccurs=»0″ maxOccurs=»unbounded»> <xs:annotation> <xs:documentation>Полномочие организации (НСИ №20)</xs:documentation> </xs:annotation> </xs:element> <xs:element name=»isRegistered» type=»xs:boolean» fixed=»true» minOccurs=»0″> <xs:annotation> <xs:documentation>Зарегистрирована в ГИС ЖКХ</xs:documentation> </xs:annotation> </xs:element> </xs:sequence> </xs:complexType> …

Ну приступим, откроем нужные нам пакеты XDTO. Оказывается, нужные сущности являются не типами, а свойствами, как с этим работать в документации на XDTO в статьях, которые я находил, не описано, поэтому воспользуемся урокам магии:

  • Создадим объекты из свойств
  • Создадим объекты из внутренних типов свойств или тип объектов
  • Создадим объекты из Типов значений

Начнем с тела exportOrgRegistryRequest.
&НаСервереБезКонтекста Функция ПолучитьДанныеОрганизацияПоОГРН(ОГРН) //Получим нужные пакеты ПакетOrgRegCom = ФабрикаXDTO.Пакеты.Получить(«http://dom.gosuslugi.ru/schema/integration/organizations-registry-common/»); ПакетOrgBase = ФабрикаXDTO.Пакеты.Получить(«http://dom.gosuslugi.ru/schema/integration/organizations-base/»); //Магия:выйдем на нужный тип через свойство, этот метод нам очень часто пригодится: СвойствоXDTO = ПакетOrgRegCom.КорневыеСвойства.Получить(«exportOrgRegistryRequest»); //Создадим сам объект для тела запроса ОбъектXDTO = ФабрикаXDTO.Создать(СвойствоXDTO.Тип); //признак что это элемент надо подписать сертификатом ОбъектXDTO.Id = «signed-data-container»; //требования стандарта, импорт XDTO не обрабатывает аттрибут fixed ОбъектXDTO.version = «10.0.2.1»; //критерий поиска //Магия:опять выйдем на строенный тип, через свойства объекта SearchCriteriaЗапись = ФабрикаXDTO.Создать(ОбъектXDTO.SearchCriteria.ВладеющееСвойство.Тип); //огрн надо ставить через типизированное значение OGRN = ФабрикаXDTO.Создать(ПакетOrgBase.КорневыеСвойства.Получить(«OGRN»).Тип, Строка(ОГРН)); SearchCriteriaЗапись.OGRN = OGRN; ОбъектXDTO.SearchCriteria.Добавить(SearchCriteriaЗапись); //сохраним тело Запрос = Новый Структура(«ОбъектXDTO,СвойствоXDTO,Имя», ОбъектXDTO, СвойствоXDTO); //сохраним тип ответа, нам по надобиться для десериализаций ответа ОтветСвойствоXDTOResult = ПакетOrgRegCom.КорневыеСвойства.Получить(«exportOrgRegistryResult»); Возврат СформироватьXMLЗапрос(Новый УникальныйИдентификатор, Запрос, ОтветСвойствоXDTOResult ); КонецФункции
Напишем функцию для сбора XML-запроса:
&НаСервереБезКонтекста Функция СформироватьXMLЗапрос(GuidЗаголовка, ОтправкаXDTO, ОтветXDTO) ПакетBase = ФабрикаXDTO.Пакеты.Получить(«http://dom.gosuslugi.ru/schema/integration/base/»); ПространствоИменSOAP = «http://schemas.xmlsoap.org/soap/envelope/»; //XML файл ЗаписьXML = Новый ЗаписьXML; ПараметрыЗаписиXML = Новый ПараметрыЗаписиXML(«UTF-8»); ЗаписьXML.УстановитьСтроку(ПараметрыЗаписиXML); ЗаписьXML.ЗаписатьОбъявлениеXML(); ЗаписьXML.ЗаписатьНачалоЭлемента(«Envelope», ПространствоИменSOAP); ЗаписьXML.ЗаписатьСоответствиеПространстваИмен(«soap», ПространствоИменSOAP); ЗаписьXML.ЗаписатьСоответствиеПространстваИмен(«xsi», «http://www.w3.org/2001/XMLSchema-instance»); ЗаписьXML.ЗаписатьСоответствиеПространстваИмен(«xs», «http://www.w3.org/2001/XMLSchema»); ЗаписьXML.ЗаписатьСоответствиеПространстваИмен(«base», «http://dom.gosuslugi.ru/schema/integration/base/»); ЗаписьXML.ЗаписатьСоответствиеПространстваИмен(«organizations-registry-base», «http://dom.gosuslugi.ru/schema/integration/organizations-registry-base/»); ЗаписьXML.ЗаписатьСоответствиеПространстваИмен(«ns», «http://www.w3.org/2000/09/xmldsig#»); ЗаписьXML.ЗаписатьСоответствиеПространстваИмен(«ro», «http://dom.gosuslugi.ru/schema/integration/organizations-registry-common/»); //Заголовок ISRequestHeader ЗаписьXML.ЗаписатьНачалоЭлемента(«Header», ПространствоИменSOAP); //снова метод через свойства ЗаголовокСвойствоXDTO = ПакетBase.КорневыеСвойства.Получить(«ISRequestHeader»); ЗаголовокЗапроса = ФабрикаXDTO.Создать(ЗаголовокСвойствоXDTO.Тип); ЗаголовокЗапроса.Date = ТекущаяДата(); ЗаголовокЗапроса.MessageGUID = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(«http://dom.gosuslugi.ru/schema/integration/base/», «GUIDType»), Строка(GuidЗаголовка)); ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ЗаголовокЗапроса, ЗаголовокСвойствоXDTO.ЛокальноеИмя); ЗаписьXML.ЗаписатьКонецЭлемента(); //Тело у нас будет подготовленый exportOrgRegistryRequest ЗаписьXML.ЗаписатьНачалоЭлемента(«Body», ПространствоИменSOAP); ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ОтправкаXDTO.ОбъектXDTO, ОтправкаXDTO.СвойствоXDTO.ЛокальноеИмя, ОтправкаXDTO.СвойствоXDTO.URIПространстваИмен); ЗаписьXML.ЗаписатьКонецЭлемента(); ЗаписьXML.ЗаписатьКонецЭлемента(); //отдаем результат для отправки XMLЗапрос = Новый Структура(); XMLЗапрос.Вставить(«XMLTекст», ЗаписьXML.Закрыть()); XMLЗапрос.Вставить(«ОтветXDTO», ОтветXDTO); Возврат XMLЗапрос; КонецФункции
В итоге получим запрос:
XML запрос exportOrgRegistryRequest <?xml version=»1.0″ encoding=»UTF-8″?> <soap:Envelope xmlns:base=»http://dom.gosuslugi.ru/schema/integration/base/» xmlns:hm=»http://dom.gosuslugi.ru/schema/integration/house-management/» xmlns:ns=»http://www.w3.org/2000/09/xmldsig#» xmlns:nsi-base=»http://dom.gosuslugi.ru/schema/integration/nsi-base/» xmlns:nsi-common=»http://dom.gosuslugi.ru/schema/integration/nsi-common/» xmlns:organizations-registry-base=»http://dom.gosuslugi.ru/schema/integration/organizations-registry-base/» xmlns:ro=»http://dom.gosuslugi.ru/schema/integration/organizations-registry-common/» xmlns:soap=»http://schemas.xmlsoap.org/soap/envelope/» xmlns:soapenc=»http://schemas.xmlsoap.org/soap/encoding/» xmlns:tns=»http://dom.gosuslugi.ru/schema/integration/house-management-service/» xmlns:xs=»http://www.w3.org/2001/XMLSchema» xmlns:xsi=»http://www.w3.org/2001/XMLSchema-instance»> <soap:Header> <base:ISRequestHeader> <base:Date>2016-10-29T20:06:35</base:Date> <base:MessageGUID>8120c453-d4ee-4918-84f8-276257bb2c84</base:MessageGUID> </base:ISRequestHeader> </soap:Header> <soap:Body> <ro:exportOrgRegistryRequest Id=»signed-data-container» base:version=»10.0.2.1″> <!—в боевых запросах тут большой кусок подписи запроса, куски сертификатов и прочие—> <ro:SearchCriteria> <OGRN xmlns=»http://dom.gosuslugi.ru/schema/integration/organizations-base/»>1027700132195</OGRN> </ro:SearchCriteria> </ro:exportOrgRegistryRequest> </soap:Body> </soap:Envelope>
Отправим запрос:
&НаСервере Процедура ТестоваяОтправкаНаСервере() //Узнаем данные по Сбербанку XMLЗапрос = ПолучитьДанныеОрганизацияПоОГРН(«1027700132195»); //Это тема для другой статья //тут мы подписываем пакет данных //и отправляем Post запрос на сервис XMLОтвет = ОтправкаXMLЗапроса(XMLЗапрос); Если XMLОтвет.КодОтвета < 299 Тогда //запрос успешен ОбъектXDTO = ДесериализацияОтвета(XMLОтвет.ИмяФайлРезультата, XMLЗапрос.ОтветXDTO) КонецЕсли; КонецПроцедуры
Ответ от серверов ГИС ЖКХ (СИТ-1):
XML ответ exportOrgRegistryResult <?xml version=»1.0″ encoding=»UTF-8″?> <soap:Envelope xmlns:ns10=»http://dom.gosuslugi.ru/schema/integration/organizations-base/» xmlns:ns11=»http://dom.gosuslugi.ru/schema/integration/payments-base/» xmlns:ns12=»http://dom.gosuslugi.ru/schema/integration/bills-base/» xmlns:ns13=»http://dom.gosuslugi.ru/schema/integration/organizations-registry-common/» xmlns:ns3=»http://www.w3.org/2000/09/xmldsig#» xmlns:ns4=»http://dom.gosuslugi.ru/schema/integration/base/» xmlns:ns5=»http://dom.gosuslugi.ru/schema/integration/account-base/» xmlns:ns6=»http://dom.gosuslugi.ru/schema/integration/nsi-base/» xmlns:ns7=»http://dom.gosuslugi.ru/schema/integration/individual-registry-base/» xmlns:ns8=»http://dom.gosuslugi.ru/schema/integration/metering-device-base/» xmlns:ns9=»http://dom.gosuslugi.ru/schema/integration/organizations-registry-base/» xmlns:soap=»http://schemas.xmlsoap.org/soap/envelope/»> <soap:Header> <ns4:ResultHeader> <ns4:Date>2016-10-29T20:06:37.185+03:00</ns4:Date> <ns4:MessageGUID>8120c453-d4ee-4918-84f8-276257bb2c84</ns4:MessageGUID> </ns4:ResultHeader> </soap:Header> <soap:Body> <ns13:exportOrgRegistryResult Id=»signed-data-container» ns4:version=»10.0.2.1″> <!—опистул кусок подписи пакета он не особо интересен—> <ns13:OrgData> <ns9:orgRootEntityGUID>50a8619b-2d27-4f20-8233-eab1ccf9dffe</ns9:orgRootEntityGUID> <ns13:OrgVersion> <ns9:orgVersionGUID>50a8619b-2d27-4f20-8233-eab1ccf9dffe</ns9:orgVersionGUID> <ns13:lastEditingDate>2015-08-10+03:00</ns13:lastEditingDate> <ns13:IsActual>true</ns13:IsActual> <ns13:Legal> <ns9:ShortName>ОАО «Сбербанк России»</ns9:ShortName> <ns9:FullName>ОАО «Сбербанк России»</ns9:FullName> <ns10:OGRN>1027700132195</ns10:OGRN> <ns9:StateRegistrationDate>2015-08-10+03:00</ns9:StateRegistrationDate> <ns10:INN>7707083893</ns10:INN> <ns10:KPP>775001001</ns10:KPP> <ns10:OKOPF>12247</ns10:OKOPF> <ns9:Address>г. Москва, ул. Вавилова, д. 19</ns9:Address> <ns9:FIASHouseGuid>93409d8c-d8d4-4491-838f-f9aa1678b5e6</ns9:FIASHouseGuid> </ns13:Legal> <ns13:registryOrganizationStatus>P</ns13:registryOrganizationStatus> </ns13:OrgVersion> <ns4:orgPPAGUID>2c57ed5e-583a-4471-839e-776250bdde50</ns4:orgPPAGUID> <ns13:organizationRoles> <ns6:Code>1</ns6:Code> <ns6:GUID>9875cc2e-73f9-41d6-bceb-47b48ed23395</ns6:GUID> <ns6:Name>Управляющая организация</ns6:Name> </ns13:organizationRoles> <ns13:isRegistered>true</ns13:isRegistered> </ns13:OrgData> </ns13:exportOrgRegistryResult> </soap:Body> </soap:Envelope>

Как мы видим, ответ напрямую десериализовать не получится, потому что нет такого типа в предложенных xsd схемах. Нам надо как-то пропустить часть тэгов и обработать только область ответа. На эту тему я тоже не нашел информации, но методом проб и ошибок приходим к кусочку магий:
&НаСервереБезКонтекста Функция ДесериализацияОтвета(ПутьКФайлу, ОтветXDTO) //Откроем файл Чтение = новый ЧтениеXML; Чтение.ОткрытьФайл(ПутьКФайлу, , , «UTF-8»); //Начинаем пропускать все служебное заголовки, тело ищем наш тэг ответа Пока Чтение.Прочитать() Цикл Если Чтение.ЛокальноеИмя = ОтветXDTO.СвойствоXDTO.Имя Тогда //т.к. вы спозиционировались на нужном место можно десериализовать данные. Магия ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(Чтение, ОтветXDTO.СвойствоXDTO.Тип); КонецЕсли; КонецЦикла; Возврат ОбъектXDTO; КонецФункции
В итоге работать можно с очень сложными xsd схемами через стандартные инструменты платформы. В целом 1С контролируют типизацию и заполнения, бывает чересчур излишне, особенно когда внутри свойства пакета используется базовый тип другого пакета, но в любом случае тип нужно привести к локальному из-за другого пространства URI. Удобно работать с десериализоваными данными, так как там всю работу на себя берет платформа. Но проверки происходят на этапе выполнения, а при написания кода платформа 1С не предоставляет никаких подсказок и проходится пользоваться сторонними утилитами, и даже при выполнении большая часть элементов находится в состоянии «Неопределено» и даже тип или его свойство можно увидеть только в спецификации.

Add a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *