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