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