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