Выгрузка данных из 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-запроса.