Введение
В рамках задачи существует две различных конфигурации, между которыми происходит постоянный обмен общими объектами конфигурации (наименования объектов и общих реквизитов совпадает). Поскольку ведётся постоянная доработка объектов, участвующих в обмене, была поставлена задача написать надежный обмен.
Постоянная разработка
Подход с построчной записью пакета обмена в целом решает проблему с надёжностью обмена: формируется объект необходимой структуры и конфигурация-получатель читает всё без ошибок. Нужно только выделить время на написание формирования пакетов поскольку таких объектов может быть много и со сложной структурой. После добавления в объект обмена реквизитов, не участвующих в обмене, дорабатывать код обмена не нужно.
В моём конкретном случае объектов обмена было много и кодить каждую строчку пакета обмена мне не улыбалось. Универсальная процедура/ функция, которая получала бы на вход любой объект конфигурации и отдавала готовую запись XML решила бы мой когнитивный диссонанс.
Фабрика XDTO может хранить описание любых объектов, а метод Тип() возвращает коллекцию свойств и их типов указанного объекта фабрики.
Команды экспорт / импорт объекта конфигурации XDTO-пакеты позволяют сохранить в конфигурациях описание объектов друг друга.
Я решил соединить эти две возможности и вот, что получилось:
Процедура(ЗаписьXML, Данные, ИмяТипа);
XDTOТипПолучателя = ФабрикаXDTO.Тип("//infostart.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С-ник :)