Простейшая выгрузка из 1С 7.7 в формате XML


Выгрузка данных из 1С:Предприятие, версии 7.7 в формат XML. Выгрузка универсальна по виду объекта выгрузки и использует компоненту «Msxml2.DOMDocument.6.0».

Данная статья планировалась как комментарий к статье [ссылка]. В качестве примера, как такую задачу решил бы я. Но, ввиду «пухлости» последней, вместе с текстом модуля обработки и примером выгрузки, представлена в виде отдельной публикации.

Так, как бы сделал я:

//*******************************************
Процедура ВыгрузитьОбъект(хмлПарсер, хмлКорень, спОбъекты, Объект) Экспорт
 
    хмлУзел = хмлПарсер.createElement("Справочник_" + Объект.Вид());
 
    хмлРек = хмлУзел.appendChild(хмлПарсер.createElement("Ид"));
    хмлРек.text = ЗначениеВСтрокуВнутр(Объект);
 
    хмлРек = хмлУзел.appendChild(хмлПарсер.createElement("Код"));
    хмлРек.text = Объект.Код;
 
    хмлРек = хмлУзел.appendChild(хмлПарсер.createElement("Наименование"));
    хмлРек.text = Объект.Наименование;
 
    Для й = 1 По Метаданные.Справочник(Объект.Вид()).Реквизит()    Цикл
        ИмяРек = Метаданные.Справочник(Объект.Вид())
            .Реквизит(й).Идентификатор;
 
        хмлРек = хмлУзел.appendChild(хмлПарсер.createElement(ИмяРек));
 
        Значение = Объект.ПолучитьАтрибут(ИмяРек);
 
        Если ТипЗначения(Значение) < 10 Тогда
            хмлРек.text = СокрЛП(Значение);
        Иначе
            хмлРек.text = ЗначениеВСтрокуВнутр(Значение);
 
            Если спОбъекты.Принадлежит(Значение) = 0 Тогда
                спОбъекты.ДобавитьЗначение(Значение);
 
                ВыгрузитьОбъект(хмлПарсер, хмлКорень, спОбъекты, Значение);
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
 
    хмлКорень.appendChild(хмлУзел);
 
КонецПроцедуры
 
//*******************************************
Процедура Выполнить()
 
    хмлПарсер = СоздатьОбъект("Msxml2.DOMDocument.6.0");
 
    хмлПарсер.appendChild(хмлПарсер.createProcessingInstruction("xml",
    "version='1.0' encoding='windows-1251'"));
 
    хмлКорень = хмлПарсер.appendChild(хмлПарсер.createElement("ROOT"));
 
    спОбъекты = СоздатьОбъект("СписокЗначений");
 
    спрКонтрагенты = СоздатьОбъект("Справочник.Контрагенты");
 
    спрКонтрагенты.ВыбратьЭлементы();
 
    Пока спрКонтрагенты.ПолучитьЭлемент() = 1 Цикл
        ВыгрузитьОбъект(хмлПарсер, хмлКорень,
            спОбъекты, спрКонтрагенты.ТекущийЭлемент());
    КонецЦикла;
 
    хмлПарсер.save("C:\scripts\test2.xml");
 
КонецПроцедуры

Надо сказать, что алгоритм представлен в самом своем примитивном варианте и позволяет выгружать только справочники. Этакий «Scrum», если позволите. Тем не менее, он прекрасно демонстрирует возможности как компоненты «Msxml», так и возможности самой платформы 1С по работе со структурой объектов данных.

Текст файла выгрузки на том же массиве данных выглядит так:

<?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</Комментарий>
    </Справочник_Контрагенты>
 
    <Справочник_Контрагенты>
        <Ид>{"B","0","0","12","0","0"," 3 "}</Ид>
        <Код>00003</Код>
        <Наименование>ИП Сидоров</Наименование>
        <ПолнНаименование>ИП Сидоров</ПолнНаименование>
        <ИНН>345</ИНН>
        <КПП>123</КПП>
        <ЮрАдрес>его ю. адр</ЮрАдрес>
        <ФактАдрес>его ф. адр</ФактАдрес>
        <ВалютаДоговора>{"B","0","0","23","0","0"," 1 "}</ВалютаДоговора>
        <ГлубинаКредита>7</ГлубинаКредита>
        <Комментарий>3</Комментарий>
    </Справочник_Контрагенты>
 
</ROOT>

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