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





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

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

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

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

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

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

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

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

   

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

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

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

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

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

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

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

// Объект - набор записей из базы источника
// формируем таблицу строк
Для каждого Запись Из Объект Цикл

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

КонецЦикла;

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

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

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

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

 

2 Comments

  1. Serge_ASB

    А «ВыгрузитьРегистр» — это что за процедура?

    Reply
  2. Altez

    (1)ИЗ БСП. В Документообороте делал через

    Обработки.КонвертацияОбъектовИнформационныхБаз.Создать().ВыгрузитьРегистр(НаборЗаписей) — вышла ошибка, вернулся к проверенному временем

    Пока Выборка.Следующий () Цикл
    
    ВыгрузитьПоПравилу(Выборка,,,,»ДвоичныеДанныеФайлов»);
    
    КонецЦикла;
    Reply

Leave a Comment

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