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