Каталог решений - XDTO на службе надежности обмена

XDTO на службе надежности обмена

XDTO на службе надежности обмена

В наличии

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

Категория:

Описание

Введение 

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

Постоянная разработка 

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

В моём конкретном случае объектов обмена было много и кодить каждую строчку пакета обмена мне не улыбалось. Универсальная процедура/ функция, которая получала бы на вход любой объект конфигурации и отдавала готовую запись XML решила бы мой когнитивный диссонанс.

Фабрика XDTO может хранить описание любых объектов, а метод Тип() возвращает коллекцию свойств и их типов указанного объекта фабрики.

Команды экспорт / импорт объекта конфигурации XDTO-пакеты позволяют сохранить в конфигурациях описание объектов друг друга.

Я решил соединить эти две возможности и вот, что получилось:

Процедура(ЗаписьXML, Данные, ИмяТипа); 

XDTOТипПолучателя = ФабрикаXDTO.Тип("//sale.itcity.ru", ИмяТипа);

ЗаписьXML.ЗаписатьНачалоЭлемента(ИмяТипа);

Для каждого Свойство Из XDTOТипПолучателя.Свойства Цикл

        Если Свойство.ВерхняяГраница > 1 Тогда

            ЗаписьXML.ЗаписатьНачалоЭлемента(Свойство.Имя);

XDTOТипСтроки = Свойство.Тип;

            Для каждого Строка Из Данные[Свойство.Имя] Цикл

                ЗаписьXML.ЗаписатьНачалоЭлемента("Row");

                Для каждого Колонка Из XDTOТипСтроки.Свойства Цикл

                    ЗаписатьXML(ЗаписьXML, Строка[Колонка.Имя], Колонка.Имя);

                КонецЦикла; 

                ЗаписьXML.ЗаписатьКонецЭлемента();

            КонецЦикла; 

            ЗаписьXML.ЗаписатьКонецЭлемента();

        Иначе

            ЗаписатьXML(ЗаписьXML, Данные[Свойство.Имя], Свойство.Имя);

        КонецЕсли; 

КонецЦикла;         

ЗаписьXML.ЗаписатьКонецЭлемента();

КонецПроцедуры

Эта процедура пишет Данные в переданную ЗаписьXML используя тип объекта XDTO ИмяТипа. Всё что нужно, это импортировать в конфигурацию-отправитель XSD-схему, экспортированную из конфигурации-получателя. При этом имена реквизитов передаваемых объектов должны совпадать.

Таким образом, я:

  • не пишу для каждого объекта обмена свою процедуру получения Объекта XDTO/ Записи XML; 
  • не боюсь добавления реквизитов в объекты, участвующие в обмене, на стороне конфигурации-отправителя; 
  • не пишу процедуру разбора пакета в конфигурации-получателе (ведь можно перестраховаться от ошибок в обмене и анализировать пакет при получении).

Если мне нужно добавить реквизит в обмен, достаточно обновить импортированную схему XSD.

У предложенного кода есть следующие недостатки. Обмен "упадёт" в случае, если: 

  • у XDTOТипа получателя есть свойства, отсутствующие в объекте отправителя
  • у реквизита объекта отправителя составной тип данных.

Предлагаю, эти моменты решать самостоятельно, чтобы не одним “copy-paste”-ом жил 1С-ник 🙂

 

has been added to your cart:
Оформление заказа