Единый семинар «1С» для бухгалтеров и руководителей

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

Обмен - Перенос данных из 1C8 в 1C8

Принцип настройки правил обмена в БСП между регистрами сведений, когда один из них подчинен регистратору, а второй независимый.

1. Структура регистров

2. Основной отбор 

   Основной отбор - это свойство измерений регистра сведений. Если это свойство установлено в измерениях, то когда формируется таблица регистрации она имеет структуру только из полей основного отбора. Если РС независимый и периодический, то основной отбор можно поставить на любое измерение и на измерение Период это галочка "Основной отбор по периоду". Если РС подчиненный регистратору, то у него Регистратор и является полем основного отбора. Соответственно в таблице регистрации есть только документы регистраторы наборов данных. 

3. Проблемы возникшие при написании правил конвертации

   Изначально я не учел этого принципа регистрации, что был описан выше. Сделал все по пунктам: 

  1. Добавил РС (подчиненный регистратору) в план обмена, отключил авторегистрацию в нем.
  2. Добавил в подписку, которая регистрирует наборы данных.
  3. Написал обычные правила для двух идентичных РС. Регистратор в эти правила не включал вообще решил он не нужен в другой базе ж нету такого документа.
  4. Создал правила выгрузки.

   В итоге данные начали ходить не корректно. Как решение подумал сделать так как на рисунку ниже. В итоге данные перегрузились но если было в моем регистре 2 записи в одну секунду то они друг друга перетирали в базе приемнике. 

   

4. Решение проблемы

Пишем обычные ПКО тут нету никаких хитростей

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

Листинг кода:

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

СтрокаОтбора = Отбор.Добавить ();
СтрокаОтбора.Имя	 		= 	"Регистратор";
СтрокаОтбора.Значение 		= 	Объект.Отбор.Регистратор.Значение.Номер;
СтрокаОтбора.Использование	= 	Истина;

Строки = Новый ТаблицаЗначений;
Строки.Колонки.Добавить("Период");
Строки.Колонки.Добавить("Регистратор");
Строки.Колонки.Добавить("Номенклатура");
Строки.Колонки.Добавить("Характеристика");
Строки.Колонки.Добавить("Количество");

// Объект - набор записей из базы источника
// формируем таблицу строк 
Для каждого Запись Из Объект Цикл	
	
	Строка = Строки.Добавить();
	Строка.Период				= 	Запись.Период;
	Строка.Регистратор			= 	Запись.Регистратор.Номер;
	Строка.Номенклатура			= 	Запись.Номенклатура;
	Строка.Характеристика		= 	Запись.Характеристика;
	Строка.Количество			= 	Запись.Количество;
	
КонецЦикла;

НаборЗаписей = Новый Структура("Отбор, Строки");
НаборЗаписей.Отбор 	= Отбор;
НаборЗаписей.Строки = Строки;

ВыгрузитьРегистр(НаборЗаписей,,,,"ПродажиЗаДень");

Отказ = Истина;

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

 

См. также

В этой теме еще нет сообщений.
Оставьте свое сообщение