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