При настройке обменов между конфигурациями 1С (например, при переносе данных из «Управление торговлей» в «Управление производственным предприятием») часто возникает задача трансформации данных. Типичный сценарий: в базе-источнике характеристика или марка товара хранится как строковое значение в регистре сведений ЗначенияСвойствОбъектов, а в базе-приемнике для этого предусмотрен отдельный ссылочный справочник ТорговыеМарки, ссылка на который хранится в реквизите номенклатуры.
Разберем подробно, как правильно настроить правила конвертации объектов (ПКО) и свойств (ПКС) в конфигурации «Конвертация данных 2.1», чтобы значение свойства находилось по наименованию или автоматически создавалось в приемнике и корректно подставлялось в реквизит номенклатуры.
Рассмотрим стандартный и наиболее надежный механизм конвертации, при котором для строкового свойства создается собственное правило конвертации объекта.
В конфигурации «Конвертация данных 2.1» добавляем новое ПКО (например, ТорговыеМарки). Поле «Источник» оставляем пустым, а в качестве «Приемника» выбираем СправочникСсылка.ТорговыеМарки.
В настройках созданного ПКО обязательно снимаем флаг «Искать объект приемника по внутреннему идентификатору» и устанавливаем флаг «Продолжить поиск по полям поиска, если по идентификатору объект не найден» (или синхронизацию только по полям поиска).
Внутри созданного ПКО ТорговыеМарки создаем одно правило конвертации свойства для реквизита Наименование. Устанавливаем для него флаг Поиск, а также флаг Получить из входящих данных.
Переходим в основное ПКО Номенклатура. Находим или создаем ПКС для реквизита ТорговаяМарка (источник оставляем пустым, приемник — реквизит ТорговаяМарка). В колонке «Правило» указываем ранее созданное правило ТорговыеМарки.
В обработчике ПередВыгрузкой этого ПКС получаем строковое значение свойства из регистра сведений и упаковываем его во входящие данные:
// Получаем строковое значение марки (например, из регистра сведений или запроса)
ЗначениеСвойства = ПолучитьЗначениеСвойстваНоменклатуры(Источник); // Ваша функция или запрос
Если ЗначениеЗаполнено(ЗначениеСвойства) Тогда
ВходящиеДанные = Новый Структура;
ВходящиеДанные.Вставить("Наименование", СокрЛП(ЗначениеСвойства));
Иначе
Отказ = Истина; // Если свойство не заполнено, не передаем реквизит
КонецЕсли;
Проанализируем альтернативный вариант, когда формирование подчиненного узла выполняется принудительно в коде выгрузки родительского объекта.
В ПКО Номенклатура для свойства ТорговаяМарка в событии ПередВыгрузкой формируем структуру параметров и передаем ее напрямую в обработку выгрузки:
Если ЗначениеЗаполнено(СтрокаТорговойМарки) Тогда
ВходящиеДанныеМарки = Новый Структура("Наименование", СокрЛП(СтрокаТорговойМарки));
Значение = ВыгрузитьПоПравилу(,, ВходящиеДанныеМарки,, "ТорговыеМарки");
КонецЕсли;
Этот подход гарантирует создание XML-узла со ссылкой на выгружаемый элемент еще до момента сериализации основного объекта.
Если структура данных базы-источника сложная или требуется специфическая логика нормализации строк перед созданием элементов в базе-приемнике, можно перенести строковое значение как дополнительный параметр и обработать его при загрузке.
В ПКО Номенклатура в обработчике ПередВыгрузкой передаем строку через структуру ВходящиеДанные или реквизит передачи.
В обработчике ПослеЗагрузки или ПередЗаписью ПКО Номенклатура выполняем поиск и установку ссылки:
Если Не ПустаяСтрока(ПараметрыОбъекта["ИмяМарки"]) Тогда
ИмяМарки = СокрЛП(ПараметрыОбъекта["ИмяМарки"]);
СсылкаНаМарку = Справочники.ТорговыеМарки.НайтиПоНаименованию(ИмяМарки, Истина);
Если Не ЗначениеЗаполнено(СсылкаНаМарку) Тогда
НовыйОбъектМарка = Справочники.ТорговыеМарки.СоздатьЭлемент();
НовыйОбъектМарка.Наименование = ИмяМарки;
НовыйОбъектМарка.Записать();
СсылкаНаМарку = НовыйОбъектМарка.Ссылка;
КонецЕсли;
Объект.ТорговаяМарка = СсылкаНаМарку;
КонецЕсли;
Выясним частые причины ошибок, когда элемент справочника в приемнике успешно создается, но поле в объекте-владельце остается пустым:
ВходящиеДанные (например, "Наименование") должно строго совпадать с именем свойства в подчиненном ПКС.