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