КД 2.1 Перенос регистра сведений ЦеныНоменклатурыКонтрагентов (СрезПоследних) в документ Корректировка записи регистров

1. St.Anger 09.02.22 16:10 Сейчас в теме
Добрый день.
Возникла необходимость перенести с базы УПП (источник) последние цены контрагентов в новую базу УПП (приемник).
Сначала пробовал через обработку Выгрузка и загрузка данных XML, там есть возможность сделать срез на дату. Но подтягиваются документы установки цен со всеми связанными данными. А засорять новую базу ненужной информацией не хотелось бы.
Поэтому решил организовать обмен через Универсальный обмен данными в формате XML. Для этого начал разрабатывать правило обмена данными.
Идея была такая: произвольным запросом в ПВД получать срез цен на текущую дату и выгружать выборку в параметр "ВыборкаДанных". После чего перед загрузкой данных в приемник создавать документ "Корректировка записей регистров", передавать в параметры, и в ПКО после загрузки подставлять этот документ корректировки вместо регистратора. В ПКС регистратор отключен.
При такой схеме выгрузка и загрузка проходит без ошибок, но в документе "Корректировка записей регистров" и в РС ЦеныНоменклатурыКонтрагентов остается только одна последняя запись. Скорее всего из-за того, что РС подчинен регистратору и при каждой загрузке записи РС идет перезапись регистратора с единственной записью РС (поправьте, если не так). То есть нужно записывать все записи РС сразу через набор записей.
Поэтому решил собирать все записи РС в одну ТЗ: в конвертации перед загрузкой данных определил ТЗ с колонками, соответствующими полям РС, а в ПКО после загрузки записываю поля РС в ТЗ и отменяю загрузку в приемник (Отказ = Истина).
В конвертации после загрузки данных создаю новый документ "Корректировка записей регистров", создаю набор записей РС ЦеныНоменклатурыКонтрагентов, устанавливаю отбор по регистратору (созданной корректировке), загружаю таблицу с движениями и записываю.
Код взял с типовой обработки Свертка базы:
ДокОст = сбСформироватьШапкуДокументаВводаОстатков(ТекРег, ДатаСвертки, ТипРегистра);		
НаборЗаписей = РегистрыСведений[ТекРег.Имя].СоздатьНаборЗаписей();			
НаборЗаписей.Отбор.Регистратор.Установить(ДокОст);
НаборЗаписей.Загрузить(ТабДвиж);
НаборЗаписей.Записать();

При такой схеме все проходит как нужно. Но что-то мне кажется, что можно сделать проще, без этих костылей. Поэтому и обращаюсь за помощью.
Найденные решения
3. nomad_irk 76 10.02.22 08:03 Сейчас в теме
(1)Делаете в ПКО движения документа в том числе. В коде ничего дополнительно записывать не нужно.
Прикрепленные файлы:
Drivingblind; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. nomad_irk 76 10.02.22 08:03 Сейчас в теме
(1)Делаете в ПКО движения документа в том числе. В коде ничего дополнительно записывать не нужно.
Прикрепленные файлы:
Drivingblind; +1 Ответить
2. Drivingblind 228 10.02.22 06:14 Сейчас в теме
Вам нужно конвертировать срез последних не в документ "Корректировка записей регистров", а в документ "Установка цен номенклатуры".
Делается это следующим образом (примерный алгоритм):
В ПВД собираете срез последних в таблицу значений. Помещаете в Исходящие данные и выгружаете командой "ВыгрузитьПоПравилу" с указанием нужного ПКО.
В ПКО для ТЧ "Товары" устанавливаем галку "Получить из входящих данных". Важно! Имена колонок в ТЧ "Товары" и в таблице занчений, которую мы поместили в исходящие данные, должны совпадать.
В ПКО После загрузки в применике из ТЧ "Товары" выгружаем типы цен в ТЧ "ТипыЦен".
4. St.Anger 10.02.22 10:41 Сейчас в теме
(2) у меня РС ЦеныНоменклатурыКонтрагентов
Именно контрагентов. Поэтому в Вашем предложенном варианте нужно будет создавать на каждого контрагента отдельный документ "Установка цен номенклатуры контрагентов". Мне кажется в таком случае будет больше ненужной работы.
10. Drivingblind 228 11.02.22 06:29 Сейчас в теме
(4) Да, вы правы.
Предложенный ниже подход выгружать срез последних как движения является более оптимальным
5. St.Anger 10.02.22 11:16 Сейчас в теме
(3) непонятно про какие движения идет речь, если нужно выгрузить срез РС
6. nomad_irk 76 10.02.22 11:25 Сейчас в теме
(5)Движения документа "Корректировка записей регистров" как регистратора для РС "ЦеныНоменклатурыКонтрагентов".
7. St.Anger 10.02.22 12:51 Сейчас в теме
(6) можно поподробнее как добавить в ПКО движения документа?
8. nomad_irk 76 10.02.22 13:11 Сейчас в теме
(7)Для этого должна быть выгружена структура метаданных вместе с движениями.
Добавляются так же как и ТЧ.
St.Anger; Drivingblind; +2 Ответить
9. St.Anger 10.02.22 18:21 Сейчас в теме
(8) Спасибо, все получилось. Единственное, что в ПВД нужно было выборку с запроса засунуть в тз, и потом уже присваивать ВыборкаДанных = тз Т.к. движения регистров - как табличная часть.
Код, может кому-то пригодится.
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
               |	ЦеныНоменклатурыКонтрагентовСрезПоследних.Период КАК Период,
               |	ЦеныНоменклатурыКонтрагентовСрезПоследних.Регистратор,
               |	ЦеныНоменклатурыКонтрагентовСрезПоследних.НомерСтроки,
               |	ЦеныНоменклатурыКонтрагентовСрезПоследних.Активность,
               |	ЦеныНоменклатурыКонтрагентовСрезПоследних.ТипЦен КАК ТипЦен,
               |	ЦеныНоменклатурыКонтрагентовСрезПоследних.Номенклатура КАК Номенклатура,
               |	ЦеныНоменклатурыКонтрагентовСрезПоследних.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
               |	ЦеныНоменклатурыКонтрагентовСрезПоследних.ЕдиницаИзмерения,
               |	ЦеныНоменклатурыКонтрагентовСрезПоследних.Валюта,
               |	ЦеныНоменклатурыКонтрагентовСрезПоследних.Цена
               |ИЗ
               |	РегистрСведений.ЦеныНоменклатурыКонтрагентов.СрезПоследних(&ДатаСреза, ) КАК ЦеныНоменклатурыКонтрагентовСрезПоследних
               |
               |УПОРЯДОЧИТЬ ПО
               |	Период,
               |	Номенклатура,
               |	ХарактеристикаНоменклатуры,
               |	ТипЦен";
Запрос.УстановитьПараметр("ДатаСреза", КонецДня(ТекущаяДата()));
тзРС = Новый ТаблицаЗначений;
тзРС.Колонки.Добавить("ЦеныНоменклатурыКонтрагентов");
НоваяСтрока = тзРС.Добавить();
тзРСВыборка = Запрос.Выполнить().Выгрузить();
НоваяСтрока.ЦеныНоменклатурыКонтрагентов = тзРСВыборка;
ВыборкаДанных = тзРС;
Сообщить("Количество элементов в выборке: "+Строка(тзРСВыборка.Количество()));
Показать

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

Иначе документ корректировки будет открываться пустой.
Drivingblind; +1 Ответить
11. SergeyK_ 19.08.23 11:59 Сейчас в теме
2920010341567
(9)Можете скинуть ваши правила ?
Оставьте свое сообщение

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