Как простейшая выгрузка в формат xml выглядит в 1С 8


Пример выгрузки данных из 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-преобразованием, для организации обмена в неоднородной среде.