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