Обмен данными между базами 1С различной конфигурации


Пример обмена данными между информационными базами различной конфигурации и, вообще говоря, на различной платформе, не только 1С:Предприятие. Используется формат XML и XSLT преобразования полученных файлов выгрузки.

В предыдущей статье [ссылка], формируя файл выгрузки средствами Msxml, я упомянул, что можно организовать обмен данными между базами 1С различной конфигурации при помощи XSLT-преобразований файла, выгруженного из базы-источника.

Например, так:

//*******************************************
Процедура Выполнить()
    
    ИсходныйФайл = "<?xml version=""1.0"" encoding=""WINDOWS-1251""?>
                    |<ROOT>
                    |<Справочник_Валюты>
                    |<Ид>{""B"",""0"",""0"",""23"",""0"",""0"","" 1 ""}</Ид>
                    |<Код>1</Код>
                    |<Наименование>Руб</Наименование>
                    |</Справочник_Валюты>
                    |<Справочник_Контрагенты>
                    |<Ид>{""B"",""0"",""0"",""12"",""0"",""0"","" 1 ""}</Ид>
                    |<Код>00001</Код>
                    |<Наименование>ИП Иванов</Наименование>
                    |<ПолнНаименование>ИП Иванов</ПолнНаименование>
                    |<ИНН>123</ИНН>
                    |<КПП>123</КПП>
                    |<ЮрАдрес>его ю. адр</ЮрАдрес>
                    |<ФактАдрес>его ф. адр</ФактАдрес>
                    |<ВалютаДоговора>{""B"",""0"",""0"",""23"",""0"",""0"","" 1 ""}</ВалютаДоговора>
                    |<ГлубинаКредита>7</ГлубинаКредита>
                    |<Комментарий>1</Комментарий>
                    |</Справочник_Контрагенты>
                    |<Справочник_Контрагенты>
                    |<Ид>{""B"",""0"",""0"",""12"",""0"",""0"","" 2 ""}</Ид>
                    |<Код>00002</Код>
                    |<Наименование>ИП Петров</Наименование>
                    |<ПолнНаименование>ИП Иванов</ПолнНаименование>
                    |<ИНН>234</ИНН>
                    |<КПП>123</КПП>
                    |<ЮрАдрес>его ю. адр</ЮрАдрес>
                    |<ФактАдрес>его ф. адр</ФактАдрес>
                    |<ВалютаДоговора>{""B"",""0"",""0"",""23"",""0"",""0"","" 1 ""}</ВалютаДоговора>
                    |<ГлубинаКредита>7</ГлубинаКредита>
                    |<Комментарий>2</Комментарий>
                    |</Справочник_Контрагенты>
                    |</ROOT>
                    |";
                    
    хмлИсходныйФайл = СоздатьОбъект("Msxml2.DOMDocument.6.0");
    хмлИсходныйФайл.async = 0;
    хмлИсходныйФайл.loadXML(ИсходныйФайл);
    
    Преобразование = "<?xml version=""1.0"" encoding=""WINDOWS-1251""?>
                |<xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:myType=""http://my.org/buh"">
                     |<xsl:template match=""/"">
                     |<ROOT>
                     |<xsl:for-each select=""ROOT/Справочник_Контрагенты"">
                     |<CatalogObject.Customers>
                     |<Ref><xsl:value-of select=""Ид""/></Ref>
                     |<Description><xsl:value-of select=""Наименование""/></Description>
                     |<Address><xsl:value-of select=""ФактАдрес""/></Address>
                     |</CatalogObject.Customers>
                     |</xsl:for-each>
                     |</ROOT>
                     |</xsl:template>
                     |</xsl:stylesheet>
                     |";
                    
    хмлПреобразование = СоздатьОбъект("Msxml2.DOMDocument.6.0");
    хмлПреобразование.async = 0;
    хмлПреобразование.loadXML(Преобразование);
    
    хмлРезультат = СоздатьОбъект("Msxml2.DOMDocument.6.0");
    хмлРезультат.async = 0;
    хмлИсходныйФайл.transformNodeToObject(хмлПреобразование, хмлРезультат);
    хмлРезультат.save("C:\scripts\test3.xml");
 
КонецПроцедуры

В результате, будет сформирован файл вида:

<?xml version="1.0" encoding="UTF-16"?>
<ROOT xmlns:myType="http://my.org/buh" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 
<CatalogObject.Customers>
<Ref>{"B","0","0","12","0","0"," 1 "}</Ref>
<Description>ИП Иванов</Description>
<Address>его ф. адр</Address>
</CatalogObject.Customers>
 
<CatalogObject.Customers>
<Ref>{"B","0","0","12","0","0"," 2 "}</Ref>
<Description>ИП Петров</Description>
<Address>его ф. адр</Address>
</CatalogObject.Customers>
 
</ROOT>

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

Роль правил обмена, в данном случае, играет шаблон XSLT-преобразования, который имеет достаточно несложную структуру и, в общем случае, вполне может быть сформирован программно, в результате действий по настройке обмена. Сами обработки выгрузки/загрузки, вместе с правилами обмена весьма компактны по объему и легко «читаются» по сравнению с аналогичными разработками, в том числе и самой компании 1С.

Если при построении информационной системы, исходить из описания структур данных, заданных в виде тех же XML-схем, прочно привязанных к словарю предметной области при помощи XSLT-преобразований. Тогда, между двумя базами, вообще говоря, различной структуры, но сопряженных с одним и тем же словарем, вероятно, можно было бы строить обмен на базе данных преобразований, что называется, «на лету».

Кстати, само такое сопряжение могло бы в разы улучшить качество справки по информационной системе, позволяя искать связи в словаре и формировать текст, релевантный текущей ситуации, автоматически.