Дозагрузка измененных данных при помощи КД2

19.09.19

Интеграция - Перенос данных 1C

Иногда во время каких-то регламентных действий по обслуживанию базы(например, при обновлении измененной базы на много релизов) требуется обеспечить бесперебойность работы пользователей. Если конфигурации баз до и после идентичны, то тут сам Бог велел воспользоваться обработкой "ВыгрузкаЗагрузкаДанныхXML", либо такой же но с отбором(на Инфостарте есть такая). Но что если конфигурации баз различаются/значительно различаются? Ниже опишу, как вышел из положения я.

 Сразу озвучу, что на истину в последней инстанции не претендую и если вы знаете более лёгкий, логичный и оптимальный способ, то отпишитесь, пожалуйста, в комментариях - я(да и всё сообщество) будет вам безмерно благодарно. 

 Итак, сама задача: есть доработанная база на конфигурации УТАП лохматого релиза(оптовая и розничная торговля алкоголем в одной базе). Обновить надо порядка 15 релизов. Изначально я готовил последний релиз с нашими изменениями и было согласовано с заказчиком, что он самостоятельно обновляется до типовых версий промежуточных релизов по ночам(а днём в это время пользователи работают на типовом функционале) и когда доходит до последнего релиза, мы восстанавливаем все наши изменения. 

 По факту получилось, что на одном из промежуточных релизов обновление дополнительных данных происходит более суток, что приведет к простою торговли и неприемлемо. 

 Было решено, что он обновит свежую копию по нашему плану, а потом мы правилами Конвертации данных 2 перенесем все изменения, которые были сделаны с момента снятия копии, до момента окончания обновления. Таким образом, простой в работе возможен только с момента начала выгрузки измененных данных, до момента окончания загрузки этих данных в подготовленную копию. 

 Первым делом загружаю файлы конфигураций старой и новой базы в КД2 и создаю новую конвертацию данных между ними.  ПКО генерирую автоматически и автоматически же создаю для них ПВД. 

 Основная идея: необходимо взять все объекты, которые были изменены/созданы с момента снятия копии в старой базе(в которой пользователи работали до обновления) и конвертировать их в аналогичные элементы новой базы. 

 Задача разбивается на две части:

  1. Выбрать только измененные данные с момента снятия копии в в старой базе;
  2. Конвертировать их в новую базу.

 Создаю параметры, которые понадобятся нам для отбора и хранения изменений:

Первую часть можно решить двумя способами:

 Первый способ - через журнал регистрации. Нам надо прочитать изменения начиная с момента создания копии("ДатаНачалаИзменений") и выбрать их в таблицу значений ("ИзмененныеДанные"). Для того, чтоб отобрать изменения из ЖР в таблицу значений, в событии конвертации "ПередВыгрузкойДанных" прописываем заполнение таблицы изменений: 

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

  Плюс данного способа в том, что не требуется вносить изменения в исходную конфигурацию и можно начинать чтение в любой момент, но есть следующие минусы:

  • Может быть настроено удаление записей журнала регистрации - в этом случае надо договариваться с системным администратором, чтоб он отключил его временно;
  • Из ЖР не удастся извлечь изменения регистров, которые нам тоже нужны.

  Было решено воспользоваться вторым способом - через планы обмена. Я создал отдельный план обмена, в составе которого указал все необходимые объекты(Справочники, Документы, ПланыВидовХарактеристик, РегистрыСведений) с авторегистрацией.

 В пользовательском режиме, после того, как будет сделана копия, добавим новый узел в наш план обмена с кодом "002" и с этого момента все изменения объектов из плана обмена совершаемые пользователями, будут фиксироваться в данном узле.

 В событии "ПередВыгрузкойДанных" моей конвертации прописал: 

ТЗИзменений = Новый ТаблицаЗначений;
тзИзменений.Колонки.Добавить("Тип");
тзИзменений.Колонки.Добавить("Элементы");
тзИзменений.Колонки.Добавить("Количество",Новый ОписаниеТипа("Число"));

Узел = ПланыОбмена.ФиксацияДанныхДляОбновления.НайтиПоКоду("002");
ЗаписьXML = Новый ЗаписьXML(); 
ЗаписьXML.УстановитьСтроку(); 
ЗапСообщения = ПланыОбмена.СоздатьЗаписьСообщения(); 
ЗапСообщения.НачатьЗапись(ЗаписьXML, Узел); 
Количество = 0;
Выборка = ПланыОбмена.ВыбратьИзменения(Узел, ЗапСообщения.НомерСообщения); 
Пока Выборка.Следующий() Цикл 
	Данные = Выборка.Получить(); 
	Попытка
		Если Найти(Данные.Метаданные().ПолноеИмя(),"Регистр")=0 Тогда
			ст = ТЗИзменений.Найти(ТипЗнч(Данные));
			Если ст = Неопределено Тогда
				ст          = ТЗИзменений.Добавить();
				ст.Тип      = ТипЗнч(Данные);
				ст.Элементы = Новый Массив;
			КонецЕсли;	
			ст.Элементы.Добавить(Данные); 
			ст.Количество = ст.Количество + 1;
		Иначе
			ст = ТЗИзменений.Найти(ТипЗнч(Данные));
			Если ст = Неопределено Тогда
				ст          = ТЗИзменений.Добавить();
				ст.Тип      = ТипЗнч(Данные);
				ст.Элементы = Новый Массив;
			КонецЕсли;
			ст.Элементы.Добавить(Данные); 
			ст.Количество = ст.Количество + 1;
		КонецЕсли; 
		Количество = Количество + 1;
	Исключение
		ПланыОбмена.УдалитьРегистрациюИзменений(Узел, Данные);
	КонецПопытки;
КонецЦикла; 

Параметры.ИзмененныеДанные = ТЗИзменений.Скопировать();

ЗапСообщения.ПрерватьЗапись(); 

 Создаю алгоритм, который будет выполняться в событии "ПередОбработкой" в каждом ПВД и отбирать данные из параметра "ИзмененныеДанные":

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

  Следующим шагом требуется изменить ПВД всех обрабатываемых объектов(Справочники, Документы, ПланыВидовХарактеристик, РегистрыСведений) в "ПроизвольныйАлгоритм" и присвоить реквизиту "АлгоритмПередОбработкойПравила" посредством групповой обработки значение "Выполнить(Алгоритмы.ПВД_ПередОбработкой);". 

 По-идее, доработка конвертации таким образом, как у меня, необязательна и достаточно выбрать в обработке "Универсальный обмен данными в формате XML" план обмена, из которого необходимо выбирать изменения. Я сначала так пробовал, ещё на стадии отладки правил. Но заметил, чтоб после выгрузки изменений, осуществленной подобным образом у меня пропадают регистрации по изменениям справочников и документов. И закралось подозрение, что не выгружаются изменения регистров сведений. Потому реализовал так как описано выше. Возможно, было бы проще поправить обработку. 

 P.S. Чтоб вы знали - я, как истинно ленивый одинэсник, искал и другие способы попроще, чтоб перенести данные из старой базы в новую. В частности хотел попробовать посредством выгрузки через универсальный формат, но у меня в конфигурации отраслевые документы и потому он не подошел. Думал попробовать обработкой "Универсальная выгрузка/загрузка данных для отличающихся конфигураций (JSON, Такси+ОФ)" от уважаемой  Евгении Карук, но обработка при попытке загрузки первого же документа сказала мне 

Дальше решил судьбу не испытывать.

P.S.P.S.

 В процессе подготовки правил на тестовой базе выяснил, что подобным образом, как я описал выше изменения из плана обмена можно будет выбрать только один раз. При последующих попытках выбрать изменения им уже присвоены номера сообщений. Таким образом переделал алгоритм конвертации следующим образом: в обработчике события "ПередВыгрузкойДанных" конвертации закомментировал весь код, а в алгоритме "ПВД_ПередОбработкой" изменил код на следующий:

Узел = ПланыОбмена.ФиксацияДанныхДляОбновления.НайтиПоКоду("002");

	КлассРодителя = Строка(Правило.Родитель.Наименование);

    //Заменим в наименовании правила постфиксы, исключающие дубли
	ИмяОбъекта    = СтрЗаменить(Правило.Наименование,"00001","");
    ИмяОбъекта    = СтрЗаменить(Правило.Наименование,"00002","");
	ИмяОбъекта    = СтрЗаменить(Правило.Наименование,"00003","");
    ЭтоРегистр    = Ложь;
	
	//Определим класс объектов правила
    Если КлассРодителя = "ПланыВидовХарактеристик" Тогда
				Класс = "ПланВидовХарактеристик";
			ИначеЕсли КлассРодителя = "Задачи" Тогда	
				Класс = "Задача";
			ИначеЕсли КлассРодителя = "РегистрыСведений" Тогда	
				Класс = "РегистрСведений";
				 
			Иначе
				Класс = Лев(КлассРодителя,СтрДлина(КлассРодителя)-1) ;
			КонецЕсли;
	
	Если Найти("Справочники, ПланыВидовХарактеристики, Документы, БизнесПроцессы, Задачи",Строка(Правило.Родитель.Наименование))>0 тогда
			ТипОбъектов = Правило.ОбъектВыборки;
			ТипОбъекта  = ИмяОбъекта;
	Иначе  
		ТипОбъектов = Тип("РегистрСведенийНаборЗаписей."+ИмяОбъекта);
		ЭтоРегистр = Истина;
		ТипОбъекта  = ИмяОбъекта;
	КонецЕсли;
	
	Если Не ЭтоРегистр Тогда
		//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
		// Данный фрагмент построен конструктором.
		// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
		
		Запрос = Новый Запрос;
		Запрос.Текст = 
		"ВЫБРАТЬ
		|	Изменения.Ссылка КАК Ссылка
		|ИЗ
		|	<Класс>.<типОбъекта>.Изменения КАК Изменения
		|ГДЕ
		|	Изменения.Узел = &Узел";
		
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "<Класс>",     Класс);
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "<типОбъекта>",ТипОбъекта);
		
		Запрос.УстановитьПараметр("Узел", Узел);
		
		РезультатЗапроса = Запрос.Выполнить();
		
		ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
		
		Выгружено  =   0;
		
		Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
			ВыгрузитьПоПравилу(ВыборкаДетальныеЗаписи.Ссылка,,,,ИмяПКО); 
			Выгружено  = Выгружено + 1;
		КонецЦикла;
		Если Выгружено > 0 Тогда
			Сообщить(""+Класс+"."+ИмяПКО+" выгружено "+Выгружено);
		КонецЕсли;
		//}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
	Иначе
		РегистрСведений = Метаданные.РегистрыСведений[ИмяОбъекта];
		
        //Исключим РС, не имеющие измерений с признаком "Основной отбор"
		ЕстьИзмерения = Ложь;
		Для каждого Измерение из РегистрСведений.Измерения Цикл
			Если Измерение.ОсновнойОтбор Тогда
				ЕстьИзмерения = Истина;
				Прервать;
			КонецЕсли;	
		КонецЦикла;	
		
	    //Исключим измерения, подчиненные регистратору
		Если РегистрСведений.РежимЗаписи = Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.Независимый и ЕстьИзмерения тогда
			Запрос = Новый Запрос;
			Запрос.Текст =  "ВЫБРАТЬ
			|	*
			|ИЗ
			|	РегистрСведений.<типОбъекта>.Изменения КАК Изменения
			|ГДЕ
			|	Изменения.Узел = &Узел";
			Запрос.Текст = СтрЗаменить(Запрос.Текст, "<типОбъекта>",ТипОбъекта);
			
			Запрос.УстановитьПараметр("Узел", Узел);
			
			РезультатЗапроса = Запрос.Выполнить();
			
			ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
			Выгружено  =   0;
			Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
				
				СтруктураОтбора = Новый Структура;
				
				Если Не РегистрСведений.ПериодичностьРегистраСведений = Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.Непериодический Тогда
					СтруктураОтбора.Вставить("Период");
				КонецЕсли;
				
				Для каждого Измерение Из Метаданные.РегистрыСведений[ИмяОбъекта].Измерения Цикл
					СтруктураОтбора.Вставить(Измерение.Имя);
					//НЗ.Отбор[Измерение.Имя].Установить(Элемент.Отбор[Измерение.Имя].Значение);  
				КонецЦикла;	
				
				ЗаполнитьЗначенияСвойств(СтруктураОтбора, ВыборкаДетальныеЗаписи);
				
				НЗ = РегистрыСведений[ИмяОбъекта].СоздатьНаборЗаписей();
				
				Для каждого Элемент Из СтруктураОтбора Цикл
					НЗ.Отбор[Элемент.Ключ].Установить(Элемент.Значение);  
				КонецЦикла;
				
				НЗ.Прочитать();
				Для каждого Запись Из НЗ Цикл
					ВыгрузитьПоПравилу(Запись,,,,ИмяПКО);
				КонецЦикла;
				Выгружено  = Выгружено + 1;
			КонецЦикла;
			Если Выгружено > 0 Тогда
				Сообщить(""+Класс+"."+ИмяПКО+" выгружено "+Выгружено);
			КонецЕсли;


		КонецЕсли;
	КонецЕсли;

 Теперь всё работает без нареканий.

Буду рад, если мой опыт окажется кому-нибудь полезен!

Спасибо за внимание!

См. также

Перенос данных 1C Программист Платформа 1С v8.3 1С:Управление производственным предприятием 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Перенос документов, начальных остатков и справочной информации из УПП 1.3 в ERP 2 | из УПП 1.3 в УТ 11 | из УПП в КА 2 | Правила конвертации (КД 2) | Более 360 предприятий выполнили переход с использованием этого продукта! | Сэкономьте время - используйте готовое решение для перехода! | Позволяет перенести из УПП 1.3 в ERP / УТ 11 / КА 2 всю возможную информацию | В переносе есть фильтр по организации и множество других опциональных параметров выгрузки | Есть несколько алгоритмов выгрузки остатков на выбор

45650 руб.

04.08.2015    164678    379    275    

367

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Перенос данных из ERP в БП 3 | из КА 2 в БП 3 | из УТ 11 в БП 3 | из ЕРП в БП 3 | Воспользовались более 176 предприятий! | Сэкономьте время - используйте готовое решение для перехода! | Перенос разработан в формате КД 2 (правила конвертации данных) | Переносятся все возможные виды документов, начальных остатков и нормативно-справочная информация| Можно опционально выгружать каждую пару "номенклатура+характеристика" как отдельную номенклатуру | Есть выгрузка настроек счетов учета и зарплатных данных из ERP / КА 2 | Можно проверить на вашем сервере перед покупкой, обращайтесь!

45650 руб.

15.04.2019    71300    178    148    

120

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

Правила в универсальном формате обмена для ERP 2.5, КА 2.5, УТ 11.5, БП 3.0, Розница, УНФ, для последних версий конфигураций. Ссылки на другие конфигурации в описании публикации. Правила совместимы со всеми другими версиями конфигураций новыми и старыми, поддерживающими обмен и синхронизацию в формате EnterpriseData. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

26280 руб.

12.06.2017    139777    774    295    

407

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УПП 1.3 (1.3.230.x) и БП 3.0 (3.0.156.x). Правила подходят для версии ПРОФ и КОРП.

28000 руб.

15.12.2021    22840    152    46    

111

Зарплата Внешние источники данных Бюджетный учет Перенос данных 1C Системный администратор Программист Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 8 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

84000 руб.

19.08.2020    24130    22    1    

24

Перенос данных 1C Взаиморасчеты Оптовая торговля Логистика, склад и ТМЦ Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Управленческий учет Платные (руб)

Можно проверить до покупки, оставьте заявку! Воспользовались более 268 компаний! Перенос данных из УТ 10.3 в УТ 11 | из УТ 10.3 в КА 2 | из УТ 10.3 в ERP. Предлагаем качественное и проверенное временем решение для перехода с УТ 10.3. Можно перенести начальные остатки, нормативно-справочную информацию и все возможные документы. При выгрузке можно установить отбор по периоду, организациям и складам. При выходе новых релизов конфигураций 1C оперативно выпускаем обновление переноса данных.

45650 руб.

24.04.2015    193904    147    242    

278

Перенос данных 1C Системный администратор Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Правила переноса данных из БП 3.0 в УТ 11 | из БП 3.0 в КА 2 | из БП 3.0 в ERP | Сэкономьте свое время - используйте готовое решение для перехода! | Постоянно работаем над развитием переноса данных | Обновляем на новые релизы 1С | Есть фильтр выгрузки по организациям | Переносятся начальные остатки на выбранную дату, документы за период времени и вся возможная справочная информация | Перенос сделан на технологии КД 2 (правила конвертации данных) Воспользовались более 122 предприятий! |

45650 руб.

31.10.2014    235568    97    332    

303

Внешние источники данных Кадровый учет Файловый обмен (TXT, XML, DBF), FTP Перенос данных 1C Программист Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 10 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

60000 руб.

05.10.2022    10304    11    8    

13
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. user-z99999 70 12.09.19 10:54 Сейчас в теме
1) Берем пустую базу без пользователей и обновляем. (пустая база получается из cf-файла рабочей базы)
2) Выгружаем cf-файл. т.е. уже база обновлена.
3) Накатываем cf-файл на тестовую базу и проверяем. Если надо тестируем правила КД 2.0
4) из шага 2 накатываем cf-файл на рабочую базу (Конфигурация - Загрузить конфигурацию из файла)

Покритикуйте такой подход.
2. al_zzz 315 12.09.19 11:06 Сейчас в теме
(1) Я не буду критиковать ваш подход. Сам по сути так делаю, когда изменения касаются лишь структуры. В моём же случае происходит обработка данных в регламентных, запускающихся после обновления. Вот они-то и выполняются очень долго. А если их пропустить, то розничные продажи в обновленной базе не выполняются.
Оставьте свое сообщение