Собственно мне нужно перенести один периодический РС в другой почти такой же тоже периодический. Создал ПКО РС->РС, но приезжает только одна запись. Понимаю, что каждый раз делается отбор по регистратору и перезаписывается набор, но не понимаю как этого избежать и правильно все выгрузить.
Читал похожие запросы но ни тут ни на мисте не нашел работающего варианта. Пишут сделай как для контактной информации вот тут: https://forum.infostart.ru/forum15/topic253333/ но это же точно так же и не работает. Сдала так же и он точно так же выгружает наборами, перезаписывая старыми.
Заполнить и провести документ регистратор - идея клевая, только в базе-источнике данные в него не писались, данные писались напрямую в регистр. В базе приёмнике сделано все норм, там есть табличная часть по которой делаются движения, но в базе источнике по одному документу больше 200к записей, а в документ можно впихать только 100к, а разбивать их нельзя иначе они не сойдутся по УИДу.
Еще был вариант - сделать ПВД. Ну я делаю, но все то же самое, точно так же все перезаписывается очевидно, потому что я по одному и тому же правилу выгружаю, а это правило для записи, а не для набора.
В общем очень много букв, но вопрос простой - как правильно перенести РС, подчиненный регистратору?
В общем, если по теме. У РС, подчиненного регистратору в наборе нет никаких отборов, кроме регистратора, а при загрузке данных загрузка происходит построчно. Отсюда я для себя нашел два варианта.
Первый простой, но не оптимальный - после загрузки в ПКО написать вот такой код:
Неоптимальный он потому что он шарашит с каждой записью целый набор ровно столько раз, сколько в нем записей. Например, если записей в наборе 200, то он сначала запишет набор с одной записью, потом с двумя и так до 200. Когда записей 200к - это вообще не вариант.
Второй вариант, который я для себя нашел - это сделать таблицу в глобальном обработчике, заполнить ее при выгрузке записями, а при после загрузки всех данных единоразово загрузить:
Получается вот такой код:
Глобалный обработчик "Перед загрузкой данных"
ИР_ТаблицаНаценок = Новый ТаблицаЗначений;
ИР_ТаблицаНаценок.Колонки.Добавить("Период", Новый ОписаниеТипов("Дата", , , Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя)));
ИР_ТаблицаНаценок.Колонки.Добавить("ПолучательСкидки", Новый ОписаниеТипов("СправочникСсылка.ИР_СтатусыПокупателей,СправочникСсылка.Контрагенты", , , ));
ИР_ТаблицаНаценок.Колонки.Добавить("ОбъектСкидки", Новый ОписаниеТипов("СправочникСсылка.Номенклатура,СправочникСсылка.ЦеновыеГруппы", , , ));
ИР_ТаблицаНаценок.Колонки.Добавить("ЕдиницаИзмерения", Новый ОписаниеТипов("СправочникСсылка.КлассификаторЕдиницИзмерения,СправочникСсылка.ЕдиницыИзмерения", , , ));
ИР_ТаблицаНаценок.Колонки.Добавить("ПрямаяПоставка", Новый ОписаниеТипов("Булево", , , ));
ИР_ТаблицаНаценок.Колонки.Добавить("ПроцентСкидкиНаценки", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2, ДопустимыйЗнак.Любой), , ));
ИР_ТаблицаНаценок.Колонки.Добавить("Регистратор", Новый ОписаниеТипов("ДокументСсылка.ИР_РегистрацияСкидкиНаценки", , , ));
Параметры.Вставить("ИР_ТаблицаНаценок", ИР_ТаблицаНаценок);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Таблица.Период КАК Период,
| Таблица.Регистратор КАК Регистратор,
| Таблица.ПолучательСкидки КАК ПолучательСкидки,
| Таблица.ОбъектСкидки КАК ОбъектСкидки,
| Таблица.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| Таблица.ПрямаяПоставка КАК ПрямаяПоставка,
| Таблица.ПроцентСкидкиНаценки КАК ПроцентСкидкиНаценки
|ПОМЕСТИТЬ ВТДанные
|ИЗ
| &Таблица КАК Таблица
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТДанные.ПолучательСкидки КАК ПолучательСкидки,
| ВТДанные.ОбъектСкидки КАК ОбъектСкидки,
| ВТДанные.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| ВТДанные.ПрямаяПоставка КАК ПрямаяПоставка,
| МАКСИМУМ(ВТДанные.ПроцентСкидкиНаценки) КАК ПроцентСкидкиНаценки,
| ВТДанные.Регистратор КАК Регистратор,
| ВТДанные.Период КАК Период
|ИЗ
| ВТДанные КАК ВТДанные
|
|СГРУППИРОВАТЬ ПО
| ВТДанные.ПолучательСкидки,
| ВТДанные.ОбъектСкидки,
| ВТДанные.ЕдиницаИзмерения,
| ВТДанные.ПрямаяПоставка,
| ВТДанные.Регистратор,
| ВТДанные.Период
|ИТОГИ ПО
| Регистратор";
Запрос.УстановитьПараметр("Таблица", Параметры.ИР_ТаблицаНаценок);
Результат = Запрос.Выполнить();
ВыборкаРегистратор = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаРегистратор.Следующий() Цикл
НаборЗаписей = РегистрыСведений.ИР_СкидкиНаценки.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(ВыборкаРегистратор.Регистратор);
НаборЗаписей.Прочитать();
НаборЗаписей.Очистить();
Выборка = ВыборкаРегистратор.Выбрать();
Пока Выборка.Следующий() Цикл
Запись = НаборЗаписей.Добавить();
ЗаполнитьЗначенияСвойств(Запись, Выборка);
КонецЦикла;
НаборЗаписей.Записать();
КонецЦикла;
(2) Регистратор есть, но в самом документе нет реквизитов, документ - это просто как ссылка, как корректировка регистров, а записи записаны через движения в базе источнике. Так вот там 200к строк. А в базе приемнике есть документ, у которого есть табличная часть по которой делаются движения. И я хотел сначала перенести движения в табличную часть в приемнике и даже сделал это, но приехали только первые 100к, о чем я и пишу. Мне нужно либо перенести записи просто через конвертацию регистров либо как то в конвертации обратиться к движениям документа и дописать ему движения. Все никак не пойму как это сделать.
В общем, если по теме. У РС, подчиненного регистратору в наборе нет никаких отборов, кроме регистратора, а при загрузке данных загрузка происходит построчно. Отсюда я для себя нашел два варианта.
Первый простой, но не оптимальный - после загрузки в ПКО написать вот такой код:
Неоптимальный он потому что он шарашит с каждой записью целый набор ровно столько раз, сколько в нем записей. Например, если записей в наборе 200, то он сначала запишет набор с одной записью, потом с двумя и так до 200. Когда записей 200к - это вообще не вариант.
Второй вариант, который я для себя нашел - это сделать таблицу в глобальном обработчике, заполнить ее при выгрузке записями, а при после загрузки всех данных единоразово загрузить:
Получается вот такой код:
Глобалный обработчик "Перед загрузкой данных"
ИР_ТаблицаНаценок = Новый ТаблицаЗначений;
ИР_ТаблицаНаценок.Колонки.Добавить("Период", Новый ОписаниеТипов("Дата", , , Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя)));
ИР_ТаблицаНаценок.Колонки.Добавить("ПолучательСкидки", Новый ОписаниеТипов("СправочникСсылка.ИР_СтатусыПокупателей,СправочникСсылка.Контрагенты", , , ));
ИР_ТаблицаНаценок.Колонки.Добавить("ОбъектСкидки", Новый ОписаниеТипов("СправочникСсылка.Номенклатура,СправочникСсылка.ЦеновыеГруппы", , , ));
ИР_ТаблицаНаценок.Колонки.Добавить("ЕдиницаИзмерения", Новый ОписаниеТипов("СправочникСсылка.КлассификаторЕдиницИзмерения,СправочникСсылка.ЕдиницыИзмерения", , , ));
ИР_ТаблицаНаценок.Колонки.Добавить("ПрямаяПоставка", Новый ОписаниеТипов("Булево", , , ));
ИР_ТаблицаНаценок.Колонки.Добавить("ПроцентСкидкиНаценки", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2, ДопустимыйЗнак.Любой), , ));
ИР_ТаблицаНаценок.Колонки.Добавить("Регистратор", Новый ОписаниеТипов("ДокументСсылка.ИР_РегистрацияСкидкиНаценки", , , ));
Параметры.Вставить("ИР_ТаблицаНаценок", ИР_ТаблицаНаценок);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Таблица.Период КАК Период,
| Таблица.Регистратор КАК Регистратор,
| Таблица.ПолучательСкидки КАК ПолучательСкидки,
| Таблица.ОбъектСкидки КАК ОбъектСкидки,
| Таблица.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| Таблица.ПрямаяПоставка КАК ПрямаяПоставка,
| Таблица.ПроцентСкидкиНаценки КАК ПроцентСкидкиНаценки
|ПОМЕСТИТЬ ВТДанные
|ИЗ
| &Таблица КАК Таблица
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТДанные.ПолучательСкидки КАК ПолучательСкидки,
| ВТДанные.ОбъектСкидки КАК ОбъектСкидки,
| ВТДанные.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| ВТДанные.ПрямаяПоставка КАК ПрямаяПоставка,
| МАКСИМУМ(ВТДанные.ПроцентСкидкиНаценки) КАК ПроцентСкидкиНаценки,
| ВТДанные.Регистратор КАК Регистратор,
| ВТДанные.Период КАК Период
|ИЗ
| ВТДанные КАК ВТДанные
|
|СГРУППИРОВАТЬ ПО
| ВТДанные.ПолучательСкидки,
| ВТДанные.ОбъектСкидки,
| ВТДанные.ЕдиницаИзмерения,
| ВТДанные.ПрямаяПоставка,
| ВТДанные.Регистратор,
| ВТДанные.Период
|ИТОГИ ПО
| Регистратор";
Запрос.УстановитьПараметр("Таблица", Параметры.ИР_ТаблицаНаценок);
Результат = Запрос.Выполнить();
ВыборкаРегистратор = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаРегистратор.Следующий() Цикл
НаборЗаписей = РегистрыСведений.ИР_СкидкиНаценки.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(ВыборкаРегистратор.Регистратор);
НаборЗаписей.Прочитать();
НаборЗаписей.Очистить();
Выборка = ВыборкаРегистратор.Выбрать();
Пока Выборка.Следующий() Цикл
Запись = НаборЗаписей.Добавить();
ЗаполнитьЗначенияСвойств(Запись, Выборка);
КонецЦикла;
НаборЗаписей.Записать();
КонецЦикла;