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