Как в Конвертации данных 2.1 перенести дополнительное свойство номенклатуры в отдельный справочник приемника?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей IT и автоматизация бизнеса
← На главную

При настройке обменов между конфигурациями 1С (например, при переносе данных из «Управление торговлей» в «Управление производственным предприятием») часто возникает задача трансформации данных. Типичный сценарий: в базе-источнике характеристика или марка товара хранится как строковое значение в регистре сведений ЗначенияСвойствОбъектов, а в базе-приемнике для этого предусмотрен отдельный ссылочный справочник ТорговыеМарки, ссылка на который хранится в реквизите номенклатуры.

Разберем подробно, как правильно настроить правила конвертации объектов (ПКО) и свойств (ПКС) в конфигурации «Конвертация данных 2.1», чтобы значение свойства находилось по наименованию или автоматически создавалось в приемнике и корректно подставлялось в реквизит номенклатуры.

Способ 1. Настройка через отдельное ПКО и механизм входящих данных (рекомендуемый)

Рассмотрим стандартный и наиболее надежный механизм конвертации, при котором для строкового свойства создается собственное правило конвертации объекта.

  1. Создаем ПКО для справочника-приемника:

    В конфигурации «Конвертация данных 2.1» добавляем новое ПКО (например, ТорговыеМарки). Поле «Источник» оставляем пустым, а в качестве «Приемника» выбираем СправочникСсылка.ТорговыеМарки.

    В настройках созданного ПКО обязательно снимаем флаг «Искать объект приемника по внутреннему идентификатору» и устанавливаем флаг «Продолжить поиск по полям поиска, если по идентификатору объект не найден» (или синхронизацию только по полям поиска).

  2. Настраиваем ПКС для наименования торговой марки:

    Внутри созданного ПКО ТорговыеМарки создаем одно правило конвертации свойства для реквизита Наименование. Устанавливаем для него флаг Поиск, а также флаг Получить из входящих данных.

  3. Связываем ПКС номенклатуры с подчиненным ПКО:

    Переходим в основное ПКО Номенклатура. Находим или создаем ПКС для реквизита ТорговаяМарка (источник оставляем пустым, приемник — реквизит ТорговаяМарка). В колонке «Правило» указываем ранее созданное правило ТорговыеМарки.

    В обработчике ПередВыгрузкой этого ПКС получаем строковое значение свойства из регистра сведений и упаковываем его во входящие данные:

    
    // Получаем строковое значение марки (например, из регистра сведений или запроса)
    ЗначениеСвойства = ПолучитьЗначениеСвойстваНоменклатуры(Источник); // Ваша функция или запрос
    
    Если ЗначениеЗаполнено(ЗначениеСвойства) Тогда
        ВходящиеДанные = Новый Структура;
        ВходящиеДанные.Вставить("Наименование", СокрЛП(ЗначениеСвойства));
    Иначе
        Отказ = Истина; // Если свойство не заполнено, не передаем реквизит
    КонецЕсли;
    

Способ 2. Программная выгрузка через функцию ВыгрузитьПоПравилу

Проанализируем альтернативный вариант, когда формирование подчиненного узла выполняется принудительно в коде выгрузки родительского объекта.

  1. Настройка обработчика ПКС:

    В ПКО Номенклатура для свойства ТорговаяМарка в событии ПередВыгрузкой формируем структуру параметров и передаем ее напрямую в обработку выгрузки:

    
    Если ЗначениеЗаполнено(СтрокаТорговойМарки) Тогда
        ВходящиеДанныеМарки = Новый Структура("Наименование", СокрЛП(СтрокаТорговойМарки));
        Значение = ВыгрузитьПоПравилу(,, ВходящиеДанныеМарки,, "ТорговыеМарки");
    КонецЕсли;
    

    Этот подход гарантирует создание XML-узла со ссылкой на выгружаемый элемент еще до момента сериализации основного объекта.

Способ 3. Заполнение реквизита при загрузке (ПослеЗагрузки / ПередЗаписью)

Если структура данных базы-источника сложная или требуется специфическая логика нормализации строк перед созданием элементов в базе-приемнике, можно перенести строковое значение как дополнительный параметр и обработать его при загрузке.

  1. Передача строки в параметрах объекта:

    В ПКО Номенклатура в обработчике ПередВыгрузкой передаем строку через структуру ВходящиеДанные или реквизит передачи.

  2. Поиск и создание элемента на стороне приемника:

    В обработчике ПослеЗагрузки или ПередЗаписью ПКО Номенклатура выполняем поиск и установку ссылки:

    
    Если Не ПустаяСтрока(ПараметрыОбъекта["ИмяМарки"]) Тогда
        ИмяМарки = СокрЛП(ПараметрыОбъекта["ИмяМарки"]);
        
        СсылкаНаМарку = Справочники.ТорговыеМарки.НайтиПоНаименованию(ИмяМарки, Истина);
        
        Если Не ЗначениеЗаполнено(СсылкаНаМарку) Тогда
            НовыйОбъектМарка = Справочники.ТорговыеМарки.СоздатьЭлемент();
            НовыйОбъектМарка.Наименование = ИмяМарки;
            НовыйОбъектМарка.Записать();
            СсылкаНаМарку = НовыйОбъектМарка.Ссылка;
        КонецЕсли;
        
        Объект.ТорговаяМарка = СсылкаНаМарку;
    КонецЕсли;
    

Почему созданный элемент может не подставляться в номенклатуру?

Выясним частые причины ошибок, когда элемент справочника в приемнике успешно создается, но поле в объекте-владельце остается пустым:

  1. Включен флаг «Не замещать значение свойства у существующих объектов». Если в ПКС номенклатуры активен данный режим, то при сопоставлении с уже существующей в базе номенклатурой новый реквизит не перезаписывается.
  2. Конфликт идентификации (GUID). Если в ПКО подчиненного справочника включен поиск по внутреннему идентификатору, конвертация пытается сопоставить строковое значение с GUID, что приводит к генерации пустой ссылки. Обязательно отключайте сопоставление по GUID для объектов без прямого ссылочного источника.
  3. Несовпадение имен полей входящих данных. Имя ключа в структуре ВходящиеДанные (например, "Наименование") должно строго совпадать с именем свойства в подчиненном ПКС.
← На главную