Как настроить поиск номенклатуры в КД2 по нескольким дополнительным реквизитам

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

При настройке правил обмена в конфигурации Конвертация данных 2.0 / 2.1 (КД2) периодически возникает задача сопоставления объектов приемника по пользовательским дополнительным реквизитам. Поскольку дополнительные реквизиты хранятся в табличной части (например, ДополнительныеРеквизиты), штатный механизм сопоставления КД2 по простым реквизитам шапки здесь не подходят. Рассмотрим, как правильно реализовать поиск номенклатуры сразу по двум доп. реквизитам через параметры и обработчик Поля поиска.

Принцип работы поиска по дополнительным реквизитам

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

Разберем весь процесс по шагам.

Шаг 1. Передача значений дополнительных реквизитов в параметры ПКС

Для того чтобы значения дополнительных реквизитов были доступны в приемнике при поиске, их необходимо передать через Правила конвертации свойств (ПКС) или сгенерировать как параметры:

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

Шаг 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
            ПрекратитьПоиск = Истина;
        КонецЕсли;

    КонецЕсли;

КонецЕсли;

Важные особенности реализации

При настройке данного алгоритма следует учесть несколько технических нюансов:

  1. Флаг прекращения поиска: Если объект найден, обязательно установим ПрекратитьПоиск = Истина. Это укажет универсальной обработке обмена, что сопоставление завершено успешно и продолжать другие варианты поиска не требуется.
  2. Поиск по ПВХ вместо строк: Для повышения производительности запросов рекомендуется обращаться к планам видов характеристик ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения по предопределенным элементам или правильным ссылкам, а не сравнивать наименования свойств строками.
  3. Заполнение при создании нового элемента: Если объект не будет найден в приемнике, КД2 создаст новый элемент. Параметры поиска автоматически не заполнят табличную часть ДополнительныеРеквизиты нового объекта. Их явное заполнение необходимо вынести в обработчик ПриЗагрузке или ПослеЗагрузки ПКО.
← На главную