Каталог решений - Алгоритм для выгрузки регистра накопления (остатки) из 7.7 в 8.x

Алгоритм для выгрузки регистра накопления (остатки) из 7.7 в 8.x

Алгоритм для выгрузки регистра накопления (остатки) из 7.7 в 8.x

В наличии

Алгоритм помогает выгружать регистры накопления (Конвертация данных, редакция 2.1).

Категория:

Описание

1) Добавляем в правила выгрузки объектов регистр конечный (в моем случае это такой же по составу регистр накопления)

 

2) Добавляем ПВД:

 

 

В событии "Перед обработкой" нужно в алгоритм передать необходимую информацию (ИмяРегистра и т.д.).Иного способа как через параметр я не нашел (а может, плохо искал!).

3) Сам алгоритм (ДвижениеРегистраНакопления):

  // не знаю насколько оправдано держать описание 
  // колонок в отдельном массиве
  СписокКолонок =  СоздатьОбъект("СписокЗначений");
  
  КоллекцияОбъектов = СоздатьОбъект("ТаблицаЗначений");
  
  // Создаем текст запроса из имени регистра
  // по всем измерениям, ресурсам, реквизитам
  ОбъектМетаданных = Метаданные.Регистр(Параметры.ИмяРегистра);
  
  Запрос=СоздатьОбъект("Запрос"); 
  ТекстЗапроса= 
  "
  |ПЕРИОД С '" + Формат(ДатаНачала, "Д ДДММГГ") + "' ПО '" + Формат(ДатаОкончания, "Д ДДММГГ") + "';";
  		
  Для Индекс = 1 по ОбъектМетаданных.Измерение()  Цикл
  	ИмяКолонки = ОбъектМетаданных.Измерение(Индекс).Идентификатор;
  	КоллекцияОбъектов.НоваяКолонка(ИмяКолонки);
  	СписокКолонок.ДобавитьЗначение(ИмяКолонки);
  КонецЦикла;
  
  Для Индекс = 1 по ОбъектМетаданных.Реквизит() Цикл
  	ИмяКолонки = ОбъектМетаданных.Реквизит(Индекс).Идентификатор;
  	КоллекцияОбъектов.НоваяКолонка(ИмяКолонки);
  	СписокКолонок.ДобавитьЗначение(ИмяКолонки);
  КонецЦикла;
  
  Для Индекс = 1 по ОбъектМетаданных.Ресурс() Цикл
  	ИмяКолонки = ОбъектМетаданных.Ресурс(Индекс).Идентификатор;  
  	КоллекцияОбъектов.НоваяКолонка(ИмяКолонки);
  	СписокКолонок.ДобавитьЗначение(ИмяКолонки);
  	ТекстЗапроса = ТекстЗапроса + "
  	|" + ИмяКолонки + " = " +  Параметры.ПолноеИмяРегистра + "." + ИмяКолонки + ";";
  КонецЦикла;
  
  ТекстЗапроса = ТекстЗапроса + "
  |Док = " +  Параметры.ПолноеИмяРегистра + ".ТекущийДокумент;
  |ГРУППИРОВКА Док;"; 
  		
  Для Индекс = 1 по ОбъектМетаданных.Ресурс() Цикл
  	ИмяКолонки = ОбъектМетаданных.Ресурс(Индекс).Идентификатор;
  	ТекстЗапроса = ТекстЗапроса + " 
  	|ФУНКЦИЯ Приход" + ИмяКолонки + " = Приход(" + ИмяКолонки + ");
  	|ФУНКЦИЯ Расход" + ИмяКолонки + " = Расход(" + ИмяКолонки + ");";
  КонецЦикла;
  		
  // обяз. изм. для 8.x
  КоллекцияОбъектов.НоваяКолонка("Регистратор");
  КоллекцияОбъектов.НоваяКолонка("Период");
  КоллекцияОбъектов.НоваяКолонка("ВидДвижения");
  		           
  Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда 
  	Сообщить("Не выполнен");  
  Иначе
  	Пока Запрос.Группировка("Док") = 1 Цикл 
  		
                  // привычка при использовании обнулять коллекцию
  		КоллекцияОбъектов.УдалитьСтроки();
  		
  		ДвиженияДокумента = "";
  		Регистратор = Запрос.Док.ТекущийДокумент(); 
                  // объект регистра
  		ДвиженияДокумента = СоздатьОбъект(Параметры.ПолноеИмяРегистра);
  		
                  // перебираем движения по регистратору
  		Если ДвиженияДокумента.ВыбратьДвиженияДокумента(Регистратор) = 1 Тогда
  			ТекущаяСтрока = 1;
  			Пока ДвиженияДокумента.ПолучитьДвижение() = 1 Цикл
  				// новая строка
  				КоллекцияОбъектов.НоваяСтрока();
  				// заполняем строку
  				Для Индекс = 1 По СписокКолонок.РазмерСписка() Цикл
  					ИмяКолонки = СписокКолонок.ПолучитьЗначение(Индекс);
  					Значение = ДвиженияДокумента.ПолучитьАтрибут(ИмяКолонки);
  					КоллекцияОбъектов.УстановитьЗначение(КоллекцияОбъектов.НомерСтроки, ИмяКолонки, Значение);
  				КонецЦикла;
  				
  				// дополняем строку
  				КоллекцияОбъектов.Регистратор = Регистратор;
  				КоллекцияОбъектов.Период = Регистратор.ДатаДок;
  				Если ДвиженияДокумента.Приход = 1 Тогда
  					КоллекцияОбъектов.ВидДвижения = "Приход";
  				КонецЕсли;
  				Если ДвиженияДокумента.Расход = 1 Тогда
  					КоллекцияОбъектов.ВидДвижения = "Расход";
  				КонецЕсли;   
  				
  				ТекущаяСтрока = ТекущаяСтрока + 1;
  			КонецЦикла;		
  		КонецЕсли;
  		
  		ИсходящиеДанные = СоздатьОбъект("СписокЗначений");
  		ИсходящиеДанные.Установить(Параметры.ИмяТаблицыПриемника, КоллекцияОбъектов);
  		
                  //Регистратор наверное не нужен
                  //Имя ПКО - у меня по имени Регистра
  		ВыгрузитьПоПравилу(Регистратор, , ИсходящиеДанные, , Параметры.ИмяРегистра);    
  		
                  // вывод отладочной информации
  		//Сообщить("Документ: " + Строка(Регистратор) + " " + Параметры.НаименованиеРегистра + ": " + Строка(КоллекцияОбъектов.КоличествоСтрок()));	 
  	КонецЦикла; 
  КонецЕсли;
  

Насколько качественно написал функцию, судить вам ! Доброго дня и новых идей!

has been added to your cart:
Оформление заказа