КД 2.1 Перенос регистра сведений ЦеныНоменклатурыКонтрагентов (СрезПоследних) в документ Корректировка записи регистров
Добрый день.
Возникла необходимость перенести с базы УПП (источник) последние цены контрагентов в новую базу УПП (приемник).
Сначала пробовал через обработку Выгрузка и загрузка данных XML, там есть возможность сделать срез на дату. Но подтягиваются документы установки цен со всеми связанными данными. А засорять новую базу ненужной информацией не хотелось бы.
Поэтому решил организовать обмен через Универсальный обмен данными в формате XML. Для этого начал разрабатывать правило обмена данными.
Идея была такая: произвольным запросом в ПВД получать срез цен на текущую дату и выгружать выборку в параметр "ВыборкаДанных". После чего перед загрузкой данных в приемник создавать документ "Корректировка записей регистров", передавать в параметры, и в ПКО после загрузки подставлять этот документ корректировки вместо регистратора. В ПКС регистратор отключен.
При такой схеме выгрузка и загрузка проходит без ошибок, но в документе "Корректировка записей регистров" и в РС ЦеныНоменклатурыКонтрагентов остается только одна последняя запись. Скорее всего из-за того, что РС подчинен регистратору и при каждой загрузке записи РС идет перезапись регистратора с единственной записью РС (поправьте, если не так). То есть нужно записывать все записи РС сразу через набор записей.
Поэтому решил собирать все записи РС в одну ТЗ: в конвертации перед загрузкой данных определил ТЗ с колонками, соответствующими полям РС, а в ПКО после загрузки записываю поля РС в ТЗ и отменяю загрузку в приемник (Отказ = Истина).
В конвертации после загрузки данных создаю новый документ "Корректировка записей регистров", создаю набор записей РС ЦеныНоменклатурыКонтрагентов, устанавливаю отбор по регистратору (созданной корректировке), загружаю таблицу с движениями и записываю.
Код взял с типовой обработки Свертка базы:
При такой схеме все проходит как нужно. Но что-то мне кажется, что можно сделать проще, без этих костылей. Поэтому и обращаюсь за помощью.
Возникла необходимость перенести с базы УПП (источник) последние цены контрагентов в новую базу УПП (приемник).
Сначала пробовал через обработку Выгрузка и загрузка данных XML, там есть возможность сделать срез на дату. Но подтягиваются документы установки цен со всеми связанными данными. А засорять новую базу ненужной информацией не хотелось бы.
Поэтому решил организовать обмен через Универсальный обмен данными в формате XML. Для этого начал разрабатывать правило обмена данными.
Идея была такая: произвольным запросом в ПВД получать срез цен на текущую дату и выгружать выборку в параметр "ВыборкаДанных". После чего перед загрузкой данных в приемник создавать документ "Корректировка записей регистров", передавать в параметры, и в ПКО после загрузки подставлять этот документ корректировки вместо регистратора. В ПКС регистратор отключен.
При такой схеме выгрузка и загрузка проходит без ошибок, но в документе "Корректировка записей регистров" и в РС ЦеныНоменклатурыКонтрагентов остается только одна последняя запись. Скорее всего из-за того, что РС подчинен регистратору и при каждой загрузке записи РС идет перезапись регистратора с единственной записью РС (поправьте, если не так). То есть нужно записывать все записи РС сразу через набор записей.
Поэтому решил собирать все записи РС в одну ТЗ: в конвертации перед загрузкой данных определил ТЗ с колонками, соответствующими полям РС, а в ПКО после загрузки записываю поля РС в ТЗ и отменяю загрузку в приемник (Отказ = Истина).
В конвертации после загрузки данных создаю новый документ "Корректировка записей регистров", создаю набор записей РС ЦеныНоменклатурыКонтрагентов, устанавливаю отбор по регистратору (созданной корректировке), загружаю таблицу с движениями и записываю.
Код взял с типовой обработки Свертка базы:
ДокОст = сбСформироватьШапкуДокументаВводаОстатков(ТекРег, ДатаСвертки, ТипРегистра);
НаборЗаписей = РегистрыСведений[ТекРег.Имя].СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(ДокОст);
НаборЗаписей.Загрузить(ТабДвиж);
НаборЗаписей.Записать();
При такой схеме все проходит как нужно. Но что-то мне кажется, что можно сделать проще, без этих костылей. Поэтому и обращаюсь за помощью.
Найденные решения
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Вам нужно конвертировать срез последних не в документ "Корректировка записей регистров", а в документ "Установка цен номенклатуры".
Делается это следующим образом (примерный алгоритм):
В ПВД собираете срез последних в таблицу значений. Помещаете в Исходящие данные и выгружаете командой "ВыгрузитьПоПравилу" с указанием нужного ПКО.
В ПКО для ТЧ "Товары" устанавливаем галку "Получить из входящих данных". Важно! Имена колонок в ТЧ "Товары" и в таблице занчений, которую мы поместили в исходящие данные, должны совпадать.
В ПКО После загрузки в применике из ТЧ "Товары" выгружаем типы цен в ТЧ "ТипыЦен".
Делается это следующим образом (примерный алгоритм):
В ПВД собираете срез последних в таблицу значений. Помещаете в Исходящие данные и выгружаете командой "ВыгрузитьПоПравилу" с указанием нужного ПКО.
В ПКО для ТЧ "Товары" устанавливаем галку "Получить из входящих данных". Важно! Имена колонок в ТЧ "Товары" и в таблице занчений, которую мы поместили в исходящие данные, должны совпадать.
В ПКО После загрузки в применике из ТЧ "Товары" выгружаем типы цен в ТЧ "ТипыЦен".
(2) у меня РС ЦеныНоменклатурыКонтрагентов
Именно контрагентов. Поэтому в Вашем предложенном варианте нужно будет создавать на каждого контрагента отдельный документ "Установка цен номенклатуры контрагентов". Мне кажется в таком случае будет больше ненужной работы.
Именно контрагентов. Поэтому в Вашем предложенном варианте нужно будет создавать на каждого контрагента отдельный документ "Установка цен номенклатуры контрагентов". Мне кажется в таком случае будет больше ненужной работы.
(8) Спасибо, все получилось. Единственное, что в ПВД нужно было выборку с запроса засунуть в тз, и потом уже присваивать ВыборкаДанных = тз Т.к. движения регистров - как табличная часть.
Код, может кому-то пригодится.
Так же в ПКО в обработчике ПослеЗагрузки нужно написать:
Иначе документ корректировки будет открываться пустой.
Код, может кому-то пригодится.
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ЦеныНоменклатурыКонтрагентовСрезПоследних.Период КАК Период,
| ЦеныНоменклатурыКонтрагентовСрезПоследних.Регистратор,
| ЦеныНоменклатурыКонтрагентовСрезПоследних.НомерСтроки,
| ЦеныНоменклатурыКонтрагентовСрезПоследних.Активность,
| ЦеныНоменклатурыКонтрагентовСрезПоследних.ТипЦен КАК ТипЦен,
| ЦеныНоменклатурыКонтрагентовСрезПоследних.Номенклатура КАК Номенклатура,
| ЦеныНоменклатурыКонтрагентовСрезПоследних.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
| ЦеныНоменклатурыКонтрагентовСрезПоследних.ЕдиницаИзмерения,
| ЦеныНоменклатурыКонтрагентовСрезПоследних.Валюта,
| ЦеныНоменклатурыКонтрагентовСрезПоследних.Цена
|ИЗ
| РегистрСведений.ЦеныНоменклатурыКонтрагентов.СрезПоследних(&ДатаСреза, ) КАК ЦеныНоменклатурыКонтрагентовСрезПоследних
|
|УПОРЯДОЧИТЬ ПО
| Период,
| Номенклатура,
| ХарактеристикаНоменклатуры,
| ТипЦен";
Запрос.УстановитьПараметр("ДатаСреза", КонецДня(ТекущаяДата()));
тзРС = Новый ТаблицаЗначений;
тзРС.Колонки.Добавить("ЦеныНоменклатурыКонтрагентов");
НоваяСтрока = тзРС.Добавить();
тзРСВыборка = Запрос.Выполнить().Выгрузить();
НоваяСтрока.ЦеныНоменклатурыКонтрагентов = тзРСВыборка;
ВыборкаДанных = тзРС;
Сообщить("Количество элементов в выборке: "+Строка(тзРСВыборка.Количество()));
ПоказатьТак же в ПКО в обработчике ПослеЗагрузки нужно написать:
НовСтр = Объект.ТаблицаРегистровСведений.Добавить();
НовСтр.Имя = "ЦеныНоменклатурыКонтрагентов";
НовСтр.Представление = "Цены номенклатуры контрагентов";
Иначе документ корректировки будет открываться пустой.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот