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

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

При переносе документов между неидентичными базами с помощью конфигурации Конвертация данных 2.0 часто возникает ситуация, когда коды или ссылки справочника Номенклатура в источнике и приемнике не совпадают. При этом в базе-приемнике у элемента номенклатуры может присутствовать специальный реквизит (например, КодИсточника или КодВАксМебель), в котором хранится код из базы-источника.

Попытки добавить в табличную часть документа-приемника временно загружаемые колонки для дальнейшего ручного поиска — это неоптимальный путь, усложняющий конфигурацию. Разберем, как корректно настроить сопоставление объектов на уровне правил конвертации объектов (ПКО).

Почему не отрабатывает стандартный поиск

Проанализируем механику работы правил выгрузки и загрузки данных. По умолчанию в ПКО справочника включен флаг Искать объект по внутреннему идентификатору (GUID). Если элемент с таким УИД в приемнике не найден, платформа переходит к поиску по полям сопоставления (ПКС), для которых установлен флаг Поиск.

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

Шаг 1. Настройка ПКО и ПКС для справочника Номенклатура

Первым делом перейдем в ПКО справочника Номенклатура и настроим правила конвертации свойств (ПКС):

  1. Убедимся, что для реквизита источника Код сопоставлено правило выгрузки в реквизит приемника КодИсточника (или соответствующее поле приемника, где хранится код из источника).
  2. Установим флаг Поиск напротив данного реквизита.
  3. Для иерархических справочников обязательно установим флаги поиска для свойств ЭтоГруппа и Родитель, иначе платформа может некорректно обрабатывать элементы на разных уровнях иерархии.
  4. В настройках самого ПКО на вкладке Настройки можно установить флаг Не создавать новый элемент, если он не найден. В этом случае при отсутствии совпадения конвертация не будет плодить лишние элементы.

Шаг 2. Использование обработчика «Поля поиска»

Если стандартный поиск по реквизиту не находит объект из-за особенностей логики или формата данных, применим обработчик Поля поиска в ПКО справочника Номенклатура. Этот обработчик выполняется на стороне приемника перед попыткой поиска или создания объекта.

Рассмотрим пример кода, который необходимо написать в событии Поля поиска:


Если СвойстваПоиска.СвойствоСклонения("КодИсточника") <> Неопределено Тогда
    КодДляПоиска = СвойстваПоиска.КодИсточника;
    
    Если ЗначениеЗаполнено(КодДляПоиска) Тогда
        Запрос = Новый Запрос;
        Запрос.Текст = 
            "ВЫБРАТЬ ПЕРВЫЕ 1
            |	Номенклатура.Ссылка КАК Ссылка
            |ИЗ
            |	Справочник.Номенклатура КАК Номенклатура
            |ГДЕ
            |	Номенклатура.КодИсточника = &КодИсточника
            |	И НЕ Номенклатура.ПометкаУдаления";
            
        Запрос.УстановитьПараметр("КодИсточника", КодДляПоиска);
        РезультатЗапроса = Запрос.Выполнить();
        
        Если НЕ РезультатЗапроса.Пустой() Тогда
            Выборка = РезультатЗапроса.Выбрать();
            Выборка.Следующий();
            
            // Задаем найденную ссылку и прекращаем штатный поиск
            СсылкаНаНайденный = Выборка.Ссылка;
            ПрекратитьПоиск = Истина;
        КонецЕсли;
    КонецЕсли;
КонецЕсли;

Передача кода источника через произвольную структуру

Если в источнике реквизит кода передается не напрямую из элемента номенклатуры, а формируется динамически при выгрузке табличной части документа, используем механизмы ИсходящиеДанные и ВходящиеДанные.

1. В ПКС табличной части документа (в обработчике ПередВыгрузкой) сформируем структуру с данными:


ИсходящиеДанные = Новый Структура;
ИсходящиеДанные.Вставить("КодИсточника", СтрокаТЧ.Номенклатура.Код);

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

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

← На главную