Пример выгрузки данных из 1С 8.Х в формат XML с использованием механизмов XDTO.
В статье [ссылка] я показал, как можно организовать универсальную обработку выгрузки данных информационной базы 1С 7.7 в xml-формат. В 1С 8, спасибо, парни хорошо постарались, такую выгрузку организовать гораздо проще. Приведу текст модуля с комментариями:
// выгружать будем не все объекты конфигурации, а с фильтром
// по типу объектов
Перем ПростыеТипы, ФильтрПоТипуОбъектов;
// обработчик действий кнопки выбора файла выгрузки
Процедура ПолеВвода1НачалоВыбора(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Фильтр = "xml-файл|*.xml";
Диалог.Заголовок = "Выбор файла";
Если Диалог.Выбрать() Тогда
ИмяФайла = Диалог.ПолноеИмяФайла;
КонецЕсли;
КонецПроцедуры
// обработчик выбора периода выгрузки документов
Процедура ВыбПериодНажатие(Элемент)
НастройкаПериода = Новый НастройкаПериода;
НастройкаПериода.РедактироватьКакИнтервал = Истина;
НастройкаПериода.РедактироватьКакПериод = Истина;
НастройкаПериода.ВариантНастройки = ВариантНастройкиПериода.Период;
НастройкаПериода.УстановитьПериод(НачПериода, ?(КонПериода='0001-01-01', КонПериода, КонецДня(КонПериода)));
Если НастройкаПериода.Редактировать() Тогда
НачПериода = НастройкаПериода.ПолучитьДатуНачала();
КонПериода = НастройкаПериода.ПолучитьДатуОкончания();
КонецЕсли;
КонецПроцедуры
// подготовка файла выгрузки - инициализация парсера
Процедура ПодготовитьФайлВыгрузки(хмлПарсер, хмлКорень, ЗаписьУзлов, Сериализатор, спОбъектов)
хмлПарсер = Новый ДокументDOM;
хмлКорень = хмлПарсер.ДобавитьДочерний(хмлПарсер.СоздатьЭлемент("ROOT"));
хмлКорень.УстановитьАтрибут("ИнфБаза", "Бухгалтерия");
хмлКорень.УстановитьАтрибут("ДатаВыгрузки", "" + ТекущаяДата());
хмлКорень.УстановитьАтрибут("Период", "" + НачПериода + "-" + КонПериода);
хмлКорень.УстановитьАтрибут("Пользователь", "" + ПараметрыСеанса.ТекущийПользователь);
ЗаписьУзлов = Новый ЗаписьУзловDOM;
ЗаписьУзлов.Открыть(хмлПарсер);
Сериализатор = Новый СериализаторXDTO(ФабрикаXDTO);
спОбъектов = Новый СписокЗначений;
КонецПроцедуры
// собственно, "центровая" процедура всей обработки - выгрузка объектов
// информационной базы в xml-файл рекурсивно с фильтром по типу объекта
Процедура ЗаписатьОбъектРекурсивно(Ссылка, хмлКорень, ЗаписьУзлов, Сериализатор, спОбъектов);
Если НЕ ЗначениеЗаполнено(Ссылка) Тогда
Возврат;
ИначеЕсли спОбъектов.НайтиПоЗначению(Ссылка) <> Неопределено Тогда
Возврат;
Иначе
спОбъектов.Добавить(Ссылка);
КонецЕсли;
Объект = Ссылка.ПолучитьОбъект();
ОбъектXDTO = Сериализатор.ЗаписатьXDTO(Объект);
Мета = Ссылка.Метаданные();
Для Каждого Реквизит Из Мета.Реквизиты Цикл
//Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(Ссылка[Реквизит.Имя]))
// ИЛИ Документы.ТипВсеСсылки().СодержитТип(ТипЗнч(Ссылка[Реквизит.Имя])) Тогда
Если ФильтрПоТипуОбъектов.СодержитТип(ТипЗнч(Ссылка[Реквизит.Имя])) Тогда
ЗаписатьОбъектРекурсивно(Ссылка[Реквизит.Имя], хмлКорень, ЗаписьУзлов,
Сериализатор, спОбъектов);
ИначеЕсли ПростыеТипы.СодержитТип(ТипЗнч(Ссылка[Реквизит.Имя])) Тогда
Иначе
ОбъектXDTO.Сбросить(Реквизит.Имя);
КонецЕсли;
КонецЦикла;
ФабрикаXDTO.ЗаписатьXML(ЗаписьУзлов, ОбъектXDTO);
хмлКорень.ДобавитьДочерний(ЗаписьУзлов.УзелDOM);
КонецПроцедуры
// сохранение результирующего xml-файла
Процедура ЗаписатьФайлВыгрузки(хмлПарсер, ЗаписьУзлов)
ЗаписьУзлов.Закрыть();
ЗаписьXMLСтрока = Новый ЗаписьXML;
ЗаписьXMLСтрока.УстановитьСтроку("UTF-8");
ЗаписьDOM = Новый ЗаписьDOM;
ЗаписьDOM.Записать(хмлПарсер, ЗаписьXMLСтрока);
ЗаписьXMLФайл = Новый ЗаписьXML;
ЗаписьXMLФайл.ОткрытьФайл(ИмяФайла);
ЗаписьXMLФайл.ЗаписатьБезОбработки(ЗаписьXMLСтрока.Закрыть());
ЗаписьXMLФайл.Закрыть();
КонецПроцедуры
// формирование выборки документов для выгрузки, запуск рекурсивной
// процедуры для выгрузки каждого из них
Процедура ВыгрузитьДанныеОбмена()
Перем хмлПарсер, хмлКорень, ЗаписьУзлов, Сериализатор, спОбъектов;
ПодготовитьФайлВыгрузки(хмлПарсер, хмлКорень, ЗаписьУзлов, Сериализатор, спОбъектов);
//МассивТипов = Новый Массив;
//ФильтрПоТипуОбъектов = Новый ОписаниеТипов(МассивТипов);
//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровУслуг.Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|ГДЕ
| РеализацияТоваровУслуг.Дата МЕЖДУ &НачПериода И &КонПериода
| И РеализацияТоваровУслуг.Грузополучатель В ИЕРАРХИИ(&Грузополучатель)";
Запрос.УстановитьПараметр("НачПериода", НачПериода);
Запрос.УстановитьПараметр("КонПериода", КонПериода);
Запрос.УстановитьПараметр("Грузополучатель", Грузополучатель);
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
// Вставить обработку выборки ВыборкаДетальныеЗаписи
ЗаписатьОбъектРекурсивно(ВыборкаДетальныеЗаписи.Ссылка, хмлКорень,
ЗаписьУзлов, Сериализатор, спОбъектов);
КонецЦикла;
//}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
ЗаписатьФайлВыгрузки(хмлПарсер, ЗаписьУзлов);
КонецПроцедуры
// процедура-обработчик действия "Выгрузить" на форме обработки
Процедура КнопкаВыполнитьНажатие(Кнопка)
ВыгрузитьДанныеОбмена();
КонецПроцедуры
// определение массива типов выгружаемых объектов информационной базы
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("Строка"));
МассивТипов.Добавить(Тип("Число"));
МассивТипов.Добавить(Тип("Дата"));
МассивТипов.Добавить(Тип("Булево"));
//МассивТипов.Добавить(Тип("ПеречислениеСсылка.ВидыДоговоровКонтрагентов"));
//МассивТипов.Добавить(Тип("ПеречислениеСсылка.ЮрФизЛицо"));
ПростыеТипы = Новый ОписаниеТипов(МассивТипов);
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("СправочникСсылка.Банки"));
МассивТипов.Добавить(Тип("СправочникСсылка.БанковскиеСчета"));
МассивТипов.Добавить(Тип("СправочникСсылка.Валюты"));
МассивТипов.Добавить(Тип("СправочникСсылка.ДоговорыКонтрагентов"));
МассивТипов.Добавить(Тип("СправочникСсылка.КлассификаторЕдиницИзмерения"));
МассивТипов.Добавить(Тип("СправочникСсылка.Контрагенты"));
МассивТипов.Добавить(Тип("СправочникСсылка.НоменклатурныеГруппы"));
МассивТипов.Добавить(Тип("СправочникСсылка.ОбъектыСтроительства"));
МассивТипов.Добавить(Тип("СправочникСсылка.Организации"));
МассивТипов.Добавить(Тип("СправочникСсылка.ОсновныеСредства"));
МассивТипов.Добавить(Тип("СправочникСсылка.ПодразделенияОрганизаций"));
МассивТипов.Добавить(Тип("СправочникСсылка.ПрочиеДоходыИРасходы"));
МассивТипов.Добавить(Тип("СправочникСсылка.СтатьиЗатрат"));
МассивТипов.Добавить(Тип("СправочникСсылка.ФизическиеЛица"));
МассивТипов.Добавить(Тип("ДокументСсылка.ДокументРасчетовСКонтрагентом"));
МассивТипов.Добавить(Тип("ДокументСсылка.ОперацияБух"));
ФильтрПоТипуОбъектов = Новый ОписаниеТипов(МассивТипов);
Примечание
Благодаря появившемуся в 1С 8 XDTO-механизму, делать выгрузку объектов информационной базы значительно легче. Аналогично примеру для 1С 7.7, на полученный xml-файл можно подействовать xslt-преобразованием, для организации обмена в неоднородной среде.