Выгрузка данных из табличной части документа или справочника в независимый регистр сведений

Версия для печатиPDF-версия

Конфигурация:

При переносе данных между двумя самописными конфигурациями возникла необходимость выгрузки табличной части справочника в независимый регистр сведений. Обмен данными производится по правилам обмена, созданным с помощью конфигурации Конвертация данных 2.1. Представляю найденное решение.
 
1. Создаём правило конвертации объектов (ПКО).  Объект-источник оставляем пустым, объект-приемник - РегистрСведенийЗапись.<ИмяРегистра>.
Создание правила конвертации объектов
2. Для каждого необходимго свойства регистра сведений создаём правило конвертации свойств (ПКС). В ПКС ставим галку Получить значение из входящих данных.
Настройка правил конвертации свойств Настройка правил обмена
3. Создаём ПКО для справочника.
Настройка правил обмена
4. В обработчике события После выгрузки пишем подобный код:
Если Источник.<ТабличнаяЧасть>.Количество() > 0 Тогда
	ИсходящиеДанные = Новый Структура("Период, <Измерения, Ресурсы, Реквизиты>");
	ИсходящиеДанные.<СвязующееИзмерение> = Источник.Ссылка;
	Для Каждого ТекСтрока Из Источник.<ТабличнаяЧасть> Цикл
		ИсходящиеДанные.Период = ТекСтрока.<РеквизитТабличнойЧасти>;
		ИсходящиеДанные.<Измерение> = ТекСтрока.<РеквизитТабличнойЧасти>;
		ИсходящиеДанные.<Ресурс> = ТекСтрока.<РеквизитТабличнойЧасти>;
		ИсходящиеДанные.<Реквизит> = ТекСтрока.<РеквизитТабличнойЧасти>; 
		ВыгрузитьПоПравилу(,,ИсходящиеДанные,,"<ИмяПКОДляРегистраСведений>");
	КонецЦикла;
КонецЕсли;
Обработчик После выгрузки
 
Полезность материала: 
5
Ваша оценка: Нет Средняя: 4.9 (12 оценок)
Оцените полезность материала

Комментарии

Огромное спасибо - наконец-то нашел действительно рабочую идею по переносу табчасти в РС!

Правда, тут не учтен (или не раскрыт) один важный нЬюанс: при УДАЛЕНИИ какой-то записи табчасти в источнике, это удаление никак не отразится в приемнике - там запись останется!! Надо что-то мутить в правилах на стороне приемника...Вот над этим сейчас работаю - если добью, постараюсь поделиться.

Можно попробовать в обработчике "После загрузки" в ПКО объекта добавить запись пустого набора записей РС с отбором по объекту (если объект найден).Тогда, по идее, РС будет очищаться, а потом заполняться заново.

мой "объект" - одно из измерений, строковый тип; поэтому, при таком варианте после загрузки осталась бы единственная (последняя загруженная) запись.

Сделал так (копирую из ветки нимфостарта, где уже откомментился - https://infostart.ru/public/402469/):

 
1. В обработчике КОНВЕРТАЦИИ "Перед загрузкой данных" инициируем глобальную ТЗ с полями, как у регистра-приемника (ОБЯЗАТЕЛЬНО явно типизируем поля)
 
2. В обработчике КОНВЕРТАЦИИ (хотя можно и в аналогичном ПКО) "После загрузки объекта" добавляем строчку в ТЗ, заполняем ее из объекта - и отказываемся от записи объекта
 
3. В обработчике КОНВЕРТАЦИИ "После загрузки данных" делаем всю работу:
 
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |    ТЗЗаписей.*
    |ПОМЕСТИТЬ Записи
    |ИЗ
    |    &ТЗЗаписей КАК ТЗЗаписей
    |;
    |ВЫБРАТЬ
    |    Записи.*
    |ИЗ
    |    Записи КАК Записи
    |ИТОГИ ПО GUIN
    |";
 
Запрос.УстановитьПараметр("ТЗЗаписей", Параметры.ТЗЗаписей);
 
Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока Выборка.Следующий() Цикл
    
    НаборЗаписей = РегистрыСведений.ЮИ_СырьеМолокоДляAITS.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.GUIN.Установить(Выборка.GUIN);
    НаборЗаписей.Записать();
 
    ВыборкаДетали = Выборка.Выбрать();
    Пока ВыборкаДетали.Следующий() Цикл
        Строка = НаборЗаписей.Добавить();
        ЗаполнитьЗначенияСвойств(Строка, ВыборкаДетали);
    КонецЦикла;    
 
    НаборЗаписей.Записать();
    
КонецЦикла;
 
© При копировании материалов сайта ссылка на оригинал обязательна.