Столкнулась с простой на вид задачей, однако решение пришлось собирать по кусочкам на форумах. Выкладываю мой готовый работающий вариант, может кому-то пригодится.
Задача: с помощью правил обмена перенести Дополнительные реквизиты номенклатуры из "старой торговой программы" в УНФ. В обеих конфигурациях дополнительные реквизиты хранятся в табличной части справочника "Номенклатура" и используется план видов характеристик "ДополнительныеРеквизитыИСведения" и справочник "НаборыДополнительныхРеквизитовИСведений". В принципе это все, что для нас важно.
Шаг 1. Создаем правило обмена для справочника "НаборыДополнительныхРеквизитовИСведений". Он нам понадобится, чтобы потом создать правило обмена для ПВХ.
(скрин 1)
Шаг 2. Создаем правило обмена для ПВХ "ДополнительныеРеквизитыИСведения". Для каждого элемента пвх нужно указать тип значения. ТипЗначения - это стандартный реквизит ПВХ, но в конвертации он не отображается как реквизит и его нельзя выбрать в качестве приемника. Так что для передачи типа значения будем использовать параметры объекта. Создаем для плана видов характеристик новый ПКС: указываем "Передать данные в параметр", источник - пустой, приемник - "Типы".
(скрин 2)
Дальше есть два способа - для обмена между идентичными конфигурациями (попроще) и для всех остальных.
Шаг 2 способ №1. Если у вас обмен между двумя одинаковыми конфигурациями, то вы можете использовать функцию ЗначениеВСтрокуВнутр /ЗначениеИзСтрокиВнутр. В созданном ПКС добавляем следующий код "перед загрузкой":
ТипыСвойства = Источник.ТипЗначения.Типы();
Значение = ЗначениеВСтрокуВнутр(ТипыСвойства);
В ПКО плана видов характеристик добавляем процедуру "После выгрузки":
Типы = ЗначениеИзСтрокиВнутр(ПараметрыОбъекта.Получить("Типы"));
Объект.ТипЗначения = Новый ОписаниеТипов(Типы );
Готово.
Шаг 2 способ №2. Если конфигурации не одинаковые, то предыдущий способ работать не будет. При вызове функции ЗначениеИзСтрокиВнутр тип значения не будет определен (будет Неопределено). Мой вариант - записать типы значений в строку, а затем расшифровать ее на стороне приемника.
ПКС "Типы" "перед загрузкой":
ТипыСвойства = Источник.ТипЗначения.Типы();
МассивТиповСтроками = "";
Для Каждого ТипСвойства Из ТипыСвойства Цикл
МассивТиповСтроками = МассивТиповСтроками+ нрег(СтрЗаменить(Строка(ТипСвойства)," ","")) + ";";
КонецЦикла;
Значение = МассивТиповСтроками;
ПКО плана видов характеристик "после выгрузки":
ТипыСтрокой = ПараметрыОбъекта.Получить("Типы");
МассивТиповСтрокой = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ТипыСтрокой, ";");
МассивТипов = Новый Массив;
Для Каждого ТипСтрокой Из МассивТиповСтрокой Цикл
Если ТипСтрокой = "дополнительноезначение" Тогда
МассивТипов.Добавить(Тип("СправочникСсылка.ЗначенияСвойствОбъектов"));
ИначеЕсли ТипСтрокой = "контрагент" Тогда
МассивТипов.Добавить(Тип("СправочникСсылка.Контрагенты"));
//ИначеЕсли ...
КонецЕсли;
КонецЦикла;
Объект.ТипЗначения = Новый ОписаниеТипов(МассивТипов);
Готово.
Шаг 3. В ПКО справочника "Номенклатура" создаем стандартным способом ПКС для табличной части "Дополнительные реквизиты" и ее реквизитов (скрин 7)
Для ПКС реквизита "Значение" пишем в "перед выгрузкой":
Если ТипЗнч(ОбъектКоллекции.Значение) = Тип("СправочникСсылка.Контрагенты") Тогда
ИмяПКО = "Контрагенты";
ИначеЕсли ТипЗнч(ОбъектКоллекции.Значение) = Тип("СправочникСсылка.ЗначенияСвойствОбъектов") Тогда
ИмяПКО = "ЗначенияСвойствОбъектов";
// ИначеЕсли...
КонецЕсли;
Теперь все готово. Можно пробовать выгружать.