Анализ журнала регистрации для автонастройки списка выгружаемых объектов в обработке ВыгрузкаЗагрузкаДанныхXML82.epf

06.08.15

Разработка - Механизмы платформы 1С

Сказ о том, как с помощью слегка модифицированной обработки ВыгрузкаЗагрузкаДанныхXML82.epf решить задачу "Выгрузить из базы-источника все объекты, которые заданный пользователь изменил в указанный период".
Данная публикация может быть интересна тем, кто хочет узнать: а) как программно анализировать журнал регистрации и б) как программно настраивать список выгружаемых объектов в обработке ВыгрузкаЗагрузкаДанныхXML82.epf.

История такая. Есть две базы - одна рабочая, другая тестовая копия. Так получилось (не будем обсуждать почему), что некий пользователь проделал большой объём работы в тестовой базе - он изменил в старых периодах около тысячи существующих документов и создал несколько новых. Работал он день и ночь на протяжении нескольких дней, не спал и не ел (по крайней мере примерно так мне описала ситуацию главный бухгалтер). В общем, в итоге возникла необходимость перенести эти изменённые документы из тестовой базы обратно в рабочую. Переносить ручками было нереально (большой объём, точных сведений что и где менялось нет), поэтому нужно было как-то заавтоматизировать процесс переноса.

Чтобы выполнить эту задачу, нужно было ответить на два вопроса - что переносить и чем переносить? Над вторым вопросом долго думать не пришлось, так как есть палочка-выручалочка под названием ВыгрузкаЗагрузкаДанныхXML82.epf. Теперь нужно было ответить на первый вопрос - что? Предоставить список изменённых документов пользователь, разумеется, не смог. Поэтому единственный способ узнать что же нужно переносить - это проанализировать журнал регистрации (нужно выгрузить все объекты, которые этот пользователь изменил/создал в указанный период времени).

По итогам в обработку ВыгрузкаЗагрузкаДанныхXML82.epf версии 2.1.8 была добавлена ещё одна кнопка с незамысловатым названием Кнопка1 и нарисован такой обработчик её нажатия:

Процедура Кнопка1Нажатие(Элемент)
	
	Дата1 = Дата(2015, 08, 01); // Отбор записей ЖР по периоду: дата начала периода (или Неопределено)
	Дата2 = Дата(2015, 08, 31);	// Отбор записей ЖР по периоду: дата окончания периода (или Неопределено)
	Пользователь = "Иванов И.И.";	// Отбор записей ЖР по пользователю: имя пользователя (или Неопределено)
	
	// {{ Получаем таблицу значений с записями ЖР
	ТЗ = Новый ТаблицаЗначений;
	Фильтр = Новый Структура;
	Если ЗначениеЗаполнено(Дата1) Тогда
		Фильтр.Вставить("ДатаНачала", НачалоДня(Дата1));	
	КонецЕсли; 
	Если ЗначениеЗаполнено(Дата2) Тогда
		Фильтр.Вставить("ДатаОкончания", КонецДня(Дата2));
	КонецЕсли; 
	Если ЗначениеЗаполнено(Пользователь) Тогда
		Фильтр.Вставить("Пользователь", Пользователь);
	КонецЕсли; 
	МассивСобытий = Новый Массив;
	МассивСобытий.Добавить("_$Data$_.New");
	МассивСобытий.Добавить("_$Data$_.Post");
	МассивСобытий.Добавить("_$Data$_.Unpost");
	МассивСобытий.Добавить("_$Data$_.Update");
	Фильтр.Вставить("Событие", МассивСобытий);
	МассивМетаданных = Новый Массив;
	Для Каждого МетаДок Из Метаданные.Документы Цикл
		МассивМетаданных.Добавить(МетаДок);
	КонецЦикла; 
	Фильтр.Вставить("Метаданные", МассивМетаданных);
	ВыгрузитьЖурналРегистрации(ТЗ, Фильтр, "Дата, Пользователь, Событие, Метаданные, Данные, ПредставлениеДанных");
	// Получаем таблицу значений с записями ЖР }}
	
	// Для целей отладки можно посмотреть содержимое таблицы с записями ЖР: 
	//Если ТЗ.ВыбратьСтроку() = Неопределено Тогда
	//	Возврат;
	//КонецЕсли;
	
	ТЗ.Свернуть("Метаданные, Данные"); // удаляем дубли
	
	// {{ Формируем соответствие, у которого в качестве ключей - тип метаданных,
	// а в качестве значений - массивы ссылок на объекты
	// (возможно, лучше было бы использовать ДеревоЗначений, но уже лень переделывать)
	ВремСоотв = Новый Соответствие;
	Для Каждого СтрокаТЗ Из ТЗ Цикл
		МассивДанных = ВремСоотв[СтрокаТЗ.Метаданные];
		Если МассивДанных = Неопределено Тогда
			МассивДанных = Новый Массив; 
		КонецЕсли; 
		МассивДанных.Добавить(СтрокаТЗ.Данные);
		ВремСоотв[СтрокаТЗ.Метаданные] = МассивДанных;
	КонецЦикла; 
	// Формируем соответствие, у которого в качестве ключей - тип метаданных,
	// а в качестве значений - массивы ссылок на объекты }}
	
	КолвоОшибок = 0;
	
	// {{ Настраиваем какие типы объектов выгружать и какие при этом отборы использовать
	Для Каждого КлючИЗначение Из ВремСоотв Цикл
		ТекИмяМетаданных = КлючИЗначение.Ключ;
		ТекМассивСсылок = КлючИЗначение.Значение;
		
		ТекОбъектМД = Метаданные.НайтиПоПолномуИмени(ТекИмяМетаданных);
		
		ТекущаяСтрока = ДеревоМетаданных_КопияФормы.Строки.Найти(ТекОбъектМД, "Метаданные", Истина);
		Если ТекущаяСтрока = Неопределено Тогда
			Сообщить("Не найдена строка дерева метаданных для " + ТекИмяМетаданных);
			КолвоОшибок = КолвоОшибок + 1; 
			Продолжить;
		КонецЕсли; 
		ЭлементыФормы.ДеревоМетаданных.ТекущаяСтрока = ТекущаяСтрока;
		ДеревоМетаданныхПриАктивизацииСтроки(Неопределено); // выполним стандартную настройку построителя 
		// Очищаем существующие отборы построителя
		КолвоОтборов = Построитель.Отбор.Количество();
		Для ОбратныйИндекс = 1 По КолвоОтборов Цикл
			ТекИндекс = КолвоОтборов - ОбратныйИндекс;
			Построитель.Отбор.Удалить(ТекИндекс);
		КонецЦикла;
		// Добавляем отбор по списку ссылок
		ЭлемОтбора = Построитель.Отбор.Добавить("Ссылка");
		ЭлемОтбора.ВидСравнения = ВидСравнения.ВСписке;
		ЭлемОтбора.Значение = Новый СписокЗначений;
		ЭлемОтбора.Значение.ЗагрузитьЗначения(ТекМассивСсылок);
		ЭлемОтбора.Использование = Истина;
		ТекущаяСтрока.НастройкиПостроителя = Построитель.ПолучитьНастройки();
		ТекущаяСтрока.ИспользоватьОтбор    = ИСТИНА;
		ТекущаяСтрока.Выгружать = Истина; // устанавливаем флажок "Выгружать" для текущего типа объектов
		// Для целей отладки можно вывести какие объекты попали в отбор:
		//Сообщить("Для объектов с типом " + ТекИмяМетаданных + " добавлен отбор по ссылке со следующим списком значений:");
		//Для Каждого ЭлемСЗ Из СЗ Цикл
		//	Сообщить(" - " + ЭлемСЗ.Значение);
		//КонецЦикла; 
	КонецЦикла;
	// Настраиваем какие типы объектов выгружать и какие при этом отборы использовать }}
	
	Сообщить("Настройка отборов завершена! Ошибок: " + КолвоОшибок);

КонецПроцедуры

На выходе получили требуемый XML, который и загрузили в рабочую базу.

P.S. Кстати говоря, в модификации самой обработки ВыгрузкаЗагрузкаДанныхXML82.epf особой нужды, скорее всего, нет. Полагаю, что можно нарисовать отдельную обработку-обёртку, которая получит из ЖР необходимые данные, создаст объект штатной обработки ВыгрузкаЗагрузкаДанныхXML82.epf и программно настроит у неё список выгружаемых объектов. Но это уже совсем другая история...

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    3628    dsdred    48    

66

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    5043    YA_418728146    25    

62

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6173    dsdred    36    

110

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18204    SeiOkami    46    

116

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    11779    human_new    27    

72

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8566    YA_418728146    6    

139

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6205    sebekerga    54    

93

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15540    SeiOkami    31    

103
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. bforce 481 12.08.15 14:54 Сейчас в теме
Мне понравилась сама идея чтения журнала регистрации для отлова изменившихся объектов. Ранее она мне в голову не приходила. Спасибо!
infostart user; +1 Ответить
2. echo77 1868 24.05.17 20:32 Сейчас в теме
Как раз то что нужно, не хватает только обработки, в которой все параметры выгрузки журнала регистрации можно задать на форме
Оставьте свое сообщение