Xdto в таблицу значений

Записки, отметки, примеры разработки на 1C 8.2,8.3, Android Studio,Visual Studio C#, etc

среда, 16 сентября 2015 г.

Таблица значений в XML и обратно в 1С с помощью XDTO

Режим = РежимДиалогаВыбораФайла.Сохранение;
ДиалогСохраненияФайла = Новый ДиалогВыбораФайла(Режим);
ДиалогСохраненияФайла.ПолноеИмяФайла = "РезервноеКопированиеНастроекОтчета_"+Формат(ТекущаяДата(),"ДФ=dd_MM_yyyy");
Фильтр = "Текст(*.XML)|*.XML";
ДиалогСохраненияФайла.Фильтр = Фильтр;
ДиалогСохраненияФайла.МножественныйВыбор = Ложь;
ДиалогСохраненияФайла.Заголовок = "Выберите файл";
Если ДиалогСохраненияФайла.Выбрать() Тогда
ПутьКФайлу = ДиалогСохраненияФайла.ПолноеИмяФайла;
Сериализатор = Новый СериализаторXDTO(ФабрикаXDTO);
XML = Новый ЗаписьXML;
XML.ОткрытьФайл(ПутьКФайлу);
Данные = НастройкиСтрок.Выгрузить();
Сериализатор.ЗаписатьXML(XML,Данные);
КонецЕсли;

//2. Загружаем таблицу значений из XML в табличную часть отчета.
Процедура ЗагрузитьНастройки()
//Выбор файла
Режим = РежимДиалогаВыбораФайла.Открытие;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытияФайла.ПолноеИмяФайла = "";
Фильтр = "Текст(*.XML)|*.XML";
ДиалогОткрытияФайла.Фильтр = Фильтр;
ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
ДиалогОткрытияФайла.Заголовок = "Выберите файл для загрузки";
Если ДиалогОткрытияФайла.Выбрать() Тогда
ПутьКФайлу = ДиалогОткрытияФайла.ПолноеИмяФайла;
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ПутьКФайлу);
Сериализатор = Новый СериализаторXDTO(ФабрикаXDTO);
ТЗ = Сериализатор.ПрочитатьXML(ЧтениеXML,Тип("ТаблицаЗначений"));
ЧтениеXML.Закрыть();
КонецЕсли;
НастройкиСтрок.Очистить();
НастройкиСтрок.Загрузить(ТЗ);
КонецПроцедуры

Для начала, давайте разберемся, для чего это нужно!? Например, требуется передать таблицу значений с клиента на сервер, либо передать ее из одной базы в другую без написания сложных правил обмена.

На помощь придут 3 простых способа:

Способ 1: использование ЗначениеВСтрокуВнутр()

Самый простой и быстрый способ — использовать функцию ЗначениеВСтрокуВнутр(), встроенную в платформу. На одной стороне (стороне отправки) мы упаковываем данные во внутренний формат:

На другой (приемной) стороне, мы распаковываем полученные данные:

и продолжаем с ними работу, как будто никуда не передавали.

Способ 2: использование сериализации XML

На платформе 1С:Предприятие 8 большинство типов значений сериализуются (м.б. представлены в строковом виде). Таблица значений — не исключение. На стороне отправки мы упаковываем данные в формат XML:

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

Читайте также:  Pioneer vsx 521 инструкция

Способ 3: использование временного хранилища

Механизм временного хранилища предназначен для передачи некоторых значений мутабельного типа между клиентом и сервером (как туда, так и обратно). На стороне отправки мы помещаем данные во временное хранилище и передаем на приемный конец только адрес во временном хранилище:

На приемной стороне достаточно будет получить эти данные из временного хранилища по адресу:

Есть очень много статей о том, как работать с XSL/XSD из 1С, но все они в стиле: возьмем нашу XSD схему (простую и удбоную) или наш web-сервис и смотрите, как все легко экспортировать или импортировать. А что делать, если нам дали пачку XSD-схем со сложным взаимосвязями и изменять мы них не можем, а работать и поддерживать актуальность схем надо?

Сразу скажу, вопросы шифрования/подписи по ГОСТУ при работе с ГИС ЖКХ за рамками этой статьи и на хабре уже освещались. Хотя без подписей запросы выполнить не удастся.


Начнем с простого — скачаем пакет форматов по интеграционному взаимодействию с ГИС ЖКХ, импортируем все xsd схемы из пакета интеграций, наведем порядок переименуем все как нам удобно. В итоге получим как показано на картинке:

Ну а теперь приступим к магии. Попробуем запросить данные из справочника организаций по ОРГН. Это подсистема organizations-registry-common метод exportOrgRegist.

В hcs-organizations-registry-common-service.wsdl указано:

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

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

Начнем с тела exportOrgRegistryRequest.

Напишем функцию для сбора XML-запроса:

В итоге получим запрос:

Ответ от серверов ГИС ЖКХ (СИТ-1):

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

В итоге работать можно с очень сложными xsd схемами через стандартные инструменты платформы. В целом 1С контролируют типизацию и заполнения, бывает чересчур излишне, особенно когда внутри свойства пакета используется базовый тип другого пакета, но в любом случае тип нужно привести к локальному из-за другого пространства URI. Удобно работать с десериализоваными данными, так как там всю работу на себя берет платформа. Но проверки происходят на этапе выполнения, а при написания кода платформа 1С не предоставляет никаких подсказок и проходится пользоваться сторонними утилитами, и даже при выполнении большая часть элементов находится в состоянии «Неопределено» и даже тип или его свойство можно увидеть только в спецификации.

Rate this post

Добавить комментарий

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