Конвертация 2 РС подчиненных регистратору

1. Adrenal1n 3 28.11.21 01:12 Сейчас в теме
Собственно мне нужно перенести один периодический РС в другой почти такой же тоже периодический. Создал ПКО РС->РС, но приезжает только одна запись. Понимаю, что каждый раз делается отбор по регистратору и перезаписывается набор, но не понимаю как этого избежать и правильно все выгрузить.

Читал похожие запросы но ни тут ни на мисте не нашел работающего варианта. Пишут сделай как для контактной информации вот тут: https://forum.infostart.ru/forum15/topic253333/ но это же точно так же и не работает. Сдала так же и он точно так же выгружает наборами, перезаписывая старыми.

Заполнить и провести документ регистратор - идея клевая, только в базе-источнике данные в него не писались, данные писались напрямую в регистр. В базе приёмнике сделано все норм, там есть табличная часть по которой делаются движения, но в базе источнике по одному документу больше 200к записей, а в документ можно впихать только 100к, а разбивать их нельзя иначе они не сойдутся по УИДу.

Еще был вариант - сделать ПВД. Ну я делаю, но все то же самое, точно так же все перезаписывается очевидно, потому что я по одному и тому же правилу выгружаю, а это правило для записи, а не для набора.

В общем очень много букв, но вопрос простой - как правильно перенести РС, подчиненный регистратору?
По теме из базы знаний
Найденные решения
5. Adrenal1n 3 29.11.21 14:00 Сейчас в теме
В общем, если по теме. У РС, подчиненного регистратору в наборе нет никаких отборов, кроме регистратора, а при загрузке данных загрузка происходит построчно. Отсюда я для себя нашел два варианта.
Первый простой, но не оптимальный - после загрузки в ПКО написать вот такой код:
НаборЗаписей.Отбор.Регистратор.Установить(Объект.Регистратор);
НаборЗаписей.Прочитать();
Запись = НаборЗаписей.Добавить();
ЗаполнитьЗначенияСвойств(Запись, Объект);
НаборЗаписей.Записать();
Отказ = Истина;

Неоптимальный он потому что он шарашит с каждой записью целый набор ровно столько раз, сколько в нем записей. Например, если записей в наборе 200, то он сначала запишет набор с одной записью, потом с двумя и так до 200. Когда записей 200к - это вообще не вариант.

Второй вариант, который я для себя нашел - это сделать таблицу в глобальном обработчике, заполнить ее при выгрузке записями, а при после загрузки всех данных единоразово загрузить:
Получается вот такой код:
Глобалный обработчик "Перед загрузкой данных"
ИР_ТаблицаНаценок = Новый ТаблицаЗначений;
ИР_ТаблицаНаценок.Колонки.Добавить("Период", Новый ОписаниеТипов("Дата", , , Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя)));
ИР_ТаблицаНаценок.Колонки.Добавить("ПолучательСкидки", Новый ОписаниеТипов("СправочникСсылка.ИР_СтатусыПокупателей,СправочникСсылка.Контрагенты", , , ));
ИР_ТаблицаНаценок.Колонки.Добавить("ОбъектСкидки", Новый ОписаниеТипов("СправочникСсылка.Номенклатура,СправочникСсылка.ЦеновыеГруппы", , , ));
ИР_ТаблицаНаценок.Колонки.Добавить("ЕдиницаИзмерения", Новый ОписаниеТипов("СправочникСсылка.КлассификаторЕдиницИзмерения,СправочникСсылка.ЕдиницыИзмерения", , , ));
ИР_ТаблицаНаценок.Колонки.Добавить("ПрямаяПоставка", Новый ОписаниеТипов("Булево", , , ));
ИР_ТаблицаНаценок.Колонки.Добавить("ПроцентСкидкиНаценки", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2, ДопустимыйЗнак.Любой), , ));
ИР_ТаблицаНаценок.Колонки.Добавить("Регистратор", Новый ОписаниеТипов("ДокументСсылка.ИР_РегистрацияСкидкиНаценки", , , ));

Параметры.Вставить("ИР_ТаблицаНаценок", ИР_ТаблицаНаценок);
Показать


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


Глобальный обработчик "После загрузки данных"
Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
|	Таблица.Период КАК Период,
|	Таблица.Регистратор КАК Регистратор,
|	Таблица.ПолучательСкидки КАК ПолучательСкидки,
|	Таблица.ОбъектСкидки КАК ОбъектСкидки,
|	Таблица.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
|	Таблица.ПрямаяПоставка КАК ПрямаяПоставка,
|	Таблица.ПроцентСкидкиНаценки КАК ПроцентСкидкиНаценки
|ПОМЕСТИТЬ ВТДанные
|ИЗ
|	&Таблица КАК Таблица
|;
|
|////////////////////////////////////////////////////////////­////////////////////
|ВЫБРАТЬ
|	ВТДанные.ПолучательСкидки КАК ПолучательСкидки,
|	ВТДанные.ОбъектСкидки КАК ОбъектСкидки,
|	ВТДанные.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
|	ВТДанные.ПрямаяПоставка КАК ПрямаяПоставка,
|	МАКСИМУМ(ВТДанные.ПроцентСкидкиНаценки) КАК ПроцентСкидкиНаценки,
|	ВТДанные.Регистратор КАК Регистратор,
|	ВТДанные.Период КАК Период
|ИЗ
|	ВТДанные КАК ВТДанные
|
|СГРУППИРОВАТЬ ПО
|	ВТДанные.ПолучательСкидки,
|	ВТДанные.ОбъектСкидки,
|	ВТДанные.ЕдиницаИзмерения,
|	ВТДанные.ПрямаяПоставка,
|	ВТДанные.Регистратор,
|	ВТДанные.Период
|ИТОГИ ПО
|	Регистратор";

Запрос.УстановитьПараметр("Таблица", Параметры.ИР_ТаблицаНаценок);
Результат = Запрос.Выполнить();
ВыборкаРегистратор = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаРегистратор.Следующий() Цикл

	НаборЗаписей = РегистрыСведений.ИР_СкидкиНаценки.СоздатьНаборЗаписей();
	НаборЗаписей.Отбор.Регистратор.Установить(ВыборкаРегистратор.Регистратор);
	НаборЗаписей.Прочитать();
	НаборЗаписей.Очистить();
	
	Выборка = ВыборкаРегистратор.Выбрать();
	Пока Выборка.Следующий() Цикл
		Запись = НаборЗаписей.Добавить();
		ЗаполнитьЗначенияСвойств(Запись, Выборка);
	КонецЦикла;	
	
	НаборЗаписей.Записать();
	
КонецЦикла;
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. vadim1011985 100 28.11.21 18:30 Сейчас в теме
Заполнить и провести документ регистратор - идея клевая, только в базе-источнике данные в него не писались, данные писались напрямую в регистр

Я не понял в базе Источнике РС подчинён регистратору или нет ?

Как можно записать данные в подчиненный регистр без регистратора ?
3. Adrenal1n 3 28.11.21 20:18 Сейчас в теме
(2) Регистратор есть, но в самом документе нет реквизитов, документ - это просто как ссылка, как корректировка регистров, а записи записаны через движения в базе источнике. Так вот там 200к строк. А в базе приемнике есть документ, у которого есть табличная часть по которой делаются движения. И я хотел сначала перенести движения в табличную часть в приемнике и даже сделал это, но приехали только первые 100к, о чем я и пишу. Мне нужно либо перенести записи просто через конвертацию регистров либо как то в конвертации обратиться к движениям документа и дописать ему движения. Все никак не пойму как это сделать.
4. erazh 29.11.21 11:12 Сейчас в теме
(2)
Как можно записать данные в подчиненный регистр без регистратора ?

Да, такое возможно, но я так не "извращался". Регистратор там есть, но движения в регистр делает не он, а что-то другое.
5. Adrenal1n 3 29.11.21 14:00 Сейчас в теме
В общем, если по теме. У РС, подчиненного регистратору в наборе нет никаких отборов, кроме регистратора, а при загрузке данных загрузка происходит построчно. Отсюда я для себя нашел два варианта.
Первый простой, но не оптимальный - после загрузки в ПКО написать вот такой код:
НаборЗаписей.Отбор.Регистратор.Установить(Объект.Регистратор);
НаборЗаписей.Прочитать();
Запись = НаборЗаписей.Добавить();
ЗаполнитьЗначенияСвойств(Запись, Объект);
НаборЗаписей.Записать();
Отказ = Истина;

Неоптимальный он потому что он шарашит с каждой записью целый набор ровно столько раз, сколько в нем записей. Например, если записей в наборе 200, то он сначала запишет набор с одной записью, потом с двумя и так до 200. Когда записей 200к - это вообще не вариант.

Второй вариант, который я для себя нашел - это сделать таблицу в глобальном обработчике, заполнить ее при выгрузке записями, а при после загрузки всех данных единоразово загрузить:
Получается вот такой код:
Глобалный обработчик "Перед загрузкой данных"
ИР_ТаблицаНаценок = Новый ТаблицаЗначений;
ИР_ТаблицаНаценок.Колонки.Добавить("Период", Новый ОписаниеТипов("Дата", , , Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя)));
ИР_ТаблицаНаценок.Колонки.Добавить("ПолучательСкидки", Новый ОписаниеТипов("СправочникСсылка.ИР_СтатусыПокупателей,СправочникСсылка.Контрагенты", , , ));
ИР_ТаблицаНаценок.Колонки.Добавить("ОбъектСкидки", Новый ОписаниеТипов("СправочникСсылка.Номенклатура,СправочникСсылка.ЦеновыеГруппы", , , ));
ИР_ТаблицаНаценок.Колонки.Добавить("ЕдиницаИзмерения", Новый ОписаниеТипов("СправочникСсылка.КлассификаторЕдиницИзмерения,СправочникСсылка.ЕдиницыИзмерения", , , ));
ИР_ТаблицаНаценок.Колонки.Добавить("ПрямаяПоставка", Новый ОписаниеТипов("Булево", , , ));
ИР_ТаблицаНаценок.Колонки.Добавить("ПроцентСкидкиНаценки", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2, ДопустимыйЗнак.Любой), , ));
ИР_ТаблицаНаценок.Колонки.Добавить("Регистратор", Новый ОписаниеТипов("ДокументСсылка.ИР_РегистрацияСкидкиНаценки", , , ));

Параметры.Вставить("ИР_ТаблицаНаценок", ИР_ТаблицаНаценок);
Показать


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


Глобальный обработчик "После загрузки данных"
Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
|	Таблица.Период КАК Период,
|	Таблица.Регистратор КАК Регистратор,
|	Таблица.ПолучательСкидки КАК ПолучательСкидки,
|	Таблица.ОбъектСкидки КАК ОбъектСкидки,
|	Таблица.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
|	Таблица.ПрямаяПоставка КАК ПрямаяПоставка,
|	Таблица.ПроцентСкидкиНаценки КАК ПроцентСкидкиНаценки
|ПОМЕСТИТЬ ВТДанные
|ИЗ
|	&Таблица КАК Таблица
|;
|
|////////////////////////////////////////////////////////////­////////////////////
|ВЫБРАТЬ
|	ВТДанные.ПолучательСкидки КАК ПолучательСкидки,
|	ВТДанные.ОбъектСкидки КАК ОбъектСкидки,
|	ВТДанные.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
|	ВТДанные.ПрямаяПоставка КАК ПрямаяПоставка,
|	МАКСИМУМ(ВТДанные.ПроцентСкидкиНаценки) КАК ПроцентСкидкиНаценки,
|	ВТДанные.Регистратор КАК Регистратор,
|	ВТДанные.Период КАК Период
|ИЗ
|	ВТДанные КАК ВТДанные
|
|СГРУППИРОВАТЬ ПО
|	ВТДанные.ПолучательСкидки,
|	ВТДанные.ОбъектСкидки,
|	ВТДанные.ЕдиницаИзмерения,
|	ВТДанные.ПрямаяПоставка,
|	ВТДанные.Регистратор,
|	ВТДанные.Период
|ИТОГИ ПО
|	Регистратор";

Запрос.УстановитьПараметр("Таблица", Параметры.ИР_ТаблицаНаценок);
Результат = Запрос.Выполнить();
ВыборкаРегистратор = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаРегистратор.Следующий() Цикл

	НаборЗаписей = РегистрыСведений.ИР_СкидкиНаценки.СоздатьНаборЗаписей();
	НаборЗаписей.Отбор.Регистратор.Установить(ВыборкаРегистратор.Регистратор);
	НаборЗаписей.Прочитать();
	НаборЗаписей.Очистить();
	
	Выборка = ВыборкаРегистратор.Выбрать();
	Пока Выборка.Следующий() Цикл
		Запись = НаборЗаписей.Добавить();
		ЗаполнитьЗначенияСвойств(Запись, Выборка);
	КонецЦикла;	
	
	НаборЗаписей.Записать();
	
КонецЦикла;
Показать
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот