Пример программного заполнения дерева метаданных обработки "Выгрузка / загрузка данных XML"



Обработка ВыгрузкаЗагрузкаДанныхXML — часто используемая палочка-выручалочка при обмене объектами по заданному отбору.
При этом можно облегчить себе жизнь, заполняя дерево метаданных необходимыми отборами программно.
В статье приведен пример заполнения дерева измененными документами по выбранной организации за указанный период (анализ изменений за период проводится по журналу регистрации).

Приступим…

Снимем все флаги с дерева метаданных:

 Для Каждого СтрокаУровень1 Из ДеревоМетаданных.Строки Цикл
Для Каждого СтрокаУровень2 Из СтрокаУровень1.Строки Цикл
Для Каждого СтрокаУровень3 Из СтрокаУровень2.Строки Цикл
СтрокаУровень3.Выгружать = Ложь;
КонецЦикла;
КонецЦикла;
КонецЦикла;

Создадим параметры для выборки изменений по журналу регистрации и выгрузим изменения в таблицу значений:

    ТабЖур = Новый ТаблицаЗначений;
Фильтр = Новый Структура;
// ограничение по датам
Фильтр.Вставить("ДатаНачала", ДатаНачалаИзменений);
Фильтр.Вставить("ДатаОкончания", ДатаОкончанияИзменений);
// ограничение событиями, относящимися только к документам
МассивСобытий = Новый Массив;
МассивСобытий.Добавить("_$Data$_.Delete");
МассивСобытий.Добавить("_$Data$_.New");
МассивСобытий.Добавить("_$Data$_.Post");
МассивСобытий.Добавить("_$Data$_.Unpost");
МассивСобытий.Добавить("_$Data$_.Update");
Фильтр.Вставить("Событие", МассивСобытий);
// список колонок
КолонкиСтрокой = "Метаданные, Данные";

ВыгрузитьЖурналРегистрации(ТабЖур, Фильтр, КолонкиСтрокой, , );

Обработаем полученную таблицу значений. Найденные документы поместим в таблицу значений с двумя колонками (имя метаданного, ссылка на объект):

 ТаблицаОтчета = Новый ТаблицаЗначений;
ТаблицаОтчета.Колонки.Добавить("Метаданные");
ТаблицаОтчета.Колонки.Добавить("Данные");

Для Каждого СтрокаТЖ Из ТабЖур Цикл
ТекстМетаданные = Строка(СтрокаТЖ.Метаданные);
ТекстМетаданныеБезДокумента = СтрЗаменить(ТекстМетаданные, "Документ.", "");
Данные = СтрокаТЖ.Данные;
Если Найти(ТекстМетаданные, "Документ.") > 0 Тогда
Если Данные.Метаданные().Реквизиты.Найти("Организация") <> Неопределено Тогда
Если ЗначениеЗаполнено(Организация) И Данные.Организация <> Организация Тогда
Продолжить;
Иначе
СтрокаТО = ТаблицаОтчета.Добавить();
СтрокаТО.Метаданные = ТекстМетаданныеБезДокумента;
СтрокаТО.Данные = Данные;
КонецЕсли;
КонецЕсли;
Иначе
Продолжить;
КонецЕсли;
КонецЦикла;

И дальше заполняем строки дерева, формируя списки по группам метаданных:

        ТаблицаОтчетаМетаданные = ТаблицаОтчета.Скопировать();
ТаблицаОтчетаМетаданные.Свернуть("Метаданные");
Для Каждого СтрокаТОМ Из ТаблицаОтчетаМетаданные Цикл
СтруктураОтбора = Новый Структура;
СтруктураОтбора.Вставить("Метаданные", СтрокаТОМ.Метаданные);
СтрокиТО = ТаблицаОтчета.НайтиСтроки(СтруктураОтбора);
СписокСсылок = Новый СписокЗначений;
Для Каждого СтрокаТО Из СтрокиТО Цикл
СписокСсылок.Добавить(СтрокаТО.Данные);
КонецЦикла;
ЗаполнитьДеревоНастроекОтборамиДокументов(СтрокаТОМ.Метаданные, СписокСсылок);
КонецЦикла;

Процедура заполнения дерева:

Процедура ЗаполнитьДеревоНастроекОтборамиДокументов(ИмяМетаданного = "", СписокСсылок = "") Экспорт

// выгрузка документов
Для Каждого СтрокаУровень1 Из ДеревоМетаданных.Строки Цикл

// уровень заголовка единственный
БылиВВеткеДокументов = Ложь;
Для Каждого СтрокаУровень2 Из СтрокаУровень1.Строки Цикл
Если СтрокаУровень2.Метаданные <> "Документы" И НЕ БылиВВеткеДокументов Тогда
Продолжить;
Иначе
Если НЕ БылиВВеткеДокументов Тогда
БылиВВеткеДокументов = Истина;
СтрокаУровень2.Выгружать = 1;
Для Каждого СтрокаУровень3 Из СтрокаУровень2.Строки Цикл
Если СтрокаУровень3.Метаданные.Имя <> ИмяМетаданного Тогда
Продолжить;
КонецЕсли;
Сообщить("Заполнили флаги по " + ИмяМетаданного);
СтрокаУровень3.Выгружать = 1;
СтрокаУровень3.ИспользоватьОтбор = Истина;
СтрокаУровень3.НастройкиПостроителя = УстановитьНастройкиПостроителяОтчетаДляСтроки(СтрокаУровень3, СписокСсылок);
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЦикла;

КонецЦикла;
// конец обхода дерева
КонецПроцедуры

И самая главная процедура)

Функция УстановитьНастройкиПостроителяОтчетаДляСтроки(СтрокаДереваМетаданных, СписокКодов)

ИтоговыйТекстЗапроса = ПолучитьТекстЗапросаПоСтроке(СтрокаДереваМетаданных, ЛОЖЬ, "");

ПостроительОтчета = Новый ПостроительОтчета;

ПостроительОтчета.Текст = ИтоговыйТекстЗапроса;

ПостроительОтчета.ЗаполнитьНастройки();

ПостроительОтчета.Отбор.Сбросить();

Отбор = ПостроительОтчета.Отбор.Добавить("Ссылка");
Отбор.ВидСравнения = ВидСравнения.ВСписке;
Отбор.Использование = Истина;
Отбор.Значение = СписокКодов;

Возврат ПостроительОтчета.ПолучитьНастройки();

КонецФункции

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

Вкладка настроек выглядит так:

Дополнительные настройки

А результат работы кода вот так:

Заполненное дерево настроек

То есть, все измененные типы объектов помечены к выгрузке, в отборах — списки ссылок.

P.S. И еще несколько простых и полезных программных приемов: //infostart.ru/public/399922/

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *