При переносе документов между неидентичными базами с помощью конфигурации Конвертация данных 2.0 часто возникает ситуация, когда коды или ссылки справочника Номенклатура в источнике и приемнике не совпадают. При этом в базе-приемнике у элемента номенклатуры может присутствовать специальный реквизит (например, КодИсточника или КодВАксМебель), в котором хранится код из базы-источника.
Попытки добавить в табличную часть документа-приемника временно загружаемые колонки для дальнейшего ручного поиска — это неоптимальный путь, усложняющий конфигурацию. Разберем, как корректно настроить сопоставление объектов на уровне правил конвертации объектов (ПКО).
Проанализируем механику работы правил выгрузки и загрузки данных. По умолчанию в ПКО справочника включен флаг Искать объект по внутреннему идентификатору (GUID). Если элемент с таким УИД в приемнике не найден, платформа переходит к поиску по полям сопоставления (ПКС), для которых установлен флаг Поиск.
Если поиск по реквизитам также не приносит результатов, конвертация создает новый элемент справочника. Чтобы избежать появления дублей и правильно подставить существующую номенклатуру, рассмотрим правильный алгоритм настройки правила конвертации.
Первым делом перейдем в ПКО справочника Номенклатура и настроим правила конвертации свойств (ПКС):
Код сопоставлено правило выгрузки в реквизит приемника КодИсточника (или соответствующее поле приемника, где хранится код из источника).ЭтоГруппа и Родитель, иначе платформа может некорректно обрабатывать элементы на разных уровнях иерархии.Если стандартный поиск по реквизиту не находит объект из-за особенностей логики или формата данных, применим обработчик Поля поиска в ПКО справочника Номенклатура. Этот обработчик выполняется на стороне приемника перед попыткой поиска или создания объекта.
Рассмотрим пример кода, который необходимо написать в событии Поля поиска:
Если СвойстваПоиска.СвойствоСклонения("КодИсточника") <> Неопределено Тогда
КодДляПоиска = СвойстваПоиска.КодИсточника;
Если ЗначениеЗаполнено(КодДляПоиска) Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Номенклатура.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.КодИсточника = &КодИсточника
| И НЕ Номенклатура.ПометкаУдаления";
Запрос.УстановитьПараметр("КодИсточника", КодДляПоиска);
РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
// Задаем найденную ссылку и прекращаем штатный поиск
СсылкаНаНайденный = Выборка.Ссылка;
ПрекратитьПоиск = Истина;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если в источнике реквизит кода передается не напрямую из элемента номенклатуры, а формируется динамически при выгрузке табличной части документа, используем механизмы ИсходящиеДанные и ВходящиеДанные.
1. В ПКС табличной части документа (в обработчике ПередВыгрузкой) сформируем структуру с данными:
ИсходящиеДанные = Новый Структура;
ИсходящиеДанные.Вставить("КодИсточника", СтрокаТЧ.Номенклатура.Код);
2. В ПКО Номенклатура для ПКС нужного реквизита установим флаг Получать из входящих данных. В этом случае переданное значение будет доступно в структуре СвойстваПоиска при загрузке документа и обработки каждой строки табличной части.
После применения описанных настроек при перегрузке документа платформа автоматически найдет существующую номенклатуру в базе-приемнике и подставит ее в табличную часть без необходимости изменения метаданных конфигурации-приемника.