КД: Передача параметров из 7.7 в 8.x


В «Конвертации Данных» заложен удобный механизм передачи параметров – по сути переменных конвертации – между базами. Одна проблема: передача эта работает только если обмен происходит между двумя «восьмерками». По какой-то причине «семерочная» сторона обмена вообще обделена всякими интересными плюшками КД.

Тем не менее, если нельзя, но очень хочется, всегда можно найти выход. Обработка загрузки читает файлы из семерки и из восьмерки одинаково, не проверяя версию платформы-источника, так что никто не мешает нам создать нужную структуру тегов для «параметров» своими силами!

Приступим. Сразу скажу, что для примера я создал 2 простые конфигурации в 7 и в 8, с одним документом («ОбычныйДокумент») и одним справочником («Организация»).  В семерке еще есть константа «ОсновнаяОрганизация», которую мы и будем передавать  через параметр.

Для начала разберемся, что нам надо получить в выходном файле. После непродолжительного копания в восьмерочной обработке «УниверсальныйОбменДаннымиXML» можно найти, что параметры передаются в теге «ЗначениеПараметра» у которого есть атрибут «Имя» и, собственно, значение. Значением может быть любой объект, передаваемый через КД, по сути значение это читается при помощи той же функции, что и свойства объектов, описываемые в ПКО. Для желающих увидеть все своими глазами: процедуры «ПроизвестиЧтениеДанных()» и «ЗагрузитьЗначенияПараметровОбменаДанными()» в модуле обработки.  

Объем работ теперь более-менее очерчен, посмотрим, как добиться нужного результата. Смотрим в семерочную обработку выгрузки данных и находим код для создания узлов в файле выгрузки (напр. «ВыгрузитьСвойства()»). Творчески его перерабатываем и получаем что-то такое:

УзелПараметра = СоздатьУзел("ЗначениеПараметра");
УстановитьАтрибут(УзелПараметра, "Имя", "СообщениеВсемуМиру");
ЗаписатьЭлемент(УзелПараметра, "Значение", "Здравствуй, Мир!" );
ДобавитьПодчиненный(rootNode, УзелПараметра);

Все хорошо, но таким способом можно передать только значения примитивных типов. Возникает резонный вопрос: что делать, если надо передать что-то более интересное (ссылку, например)?  Выгрузим ссылку и вставим узел выгрузки как значение параметра! Вот так:

УзелПараметра = СоздатьУзел("ЗначениеПараметра");
УзелСсылки = ВыгрузитьПоПравилу(константа.ОсновнаяФирма,,,,"Организации");
УстановитьАтрибут(УзелПараметра, "Имя", "ОсновнаяОрганизация");
ДобавитьПодчиненный(УзелПараметра, узелСсылки);
ДобавитьПодчиненный(rootNode, УзелПараметра);

Как видно из кода, мы не создаем подчиненный узел «Значение», поскольку он необходим только для передачи примитивных типов. В случае передачи ссылочного типа с его работой справляется сам узел ссылки.

Отлично, с кодом выгрузки разобрались. Теперь надо понять, куда его добавить. Хотелось бы, чтобы передаваемый параметр был определен во время загрузки всех объектов, поэтому надо сделать так, чтобы код отработал перед обработкой ПВД.

Можно, например, сделать искусственное ПВД с минимальным порядком выполнения, в обработчик которому добавить вышеописанный код. Но любое ПВД можно выключить вручную в обработке выгрузки, так что этот способ нельзя назвать надежным.  Поэтому посмотрим на события конвертации – «ПередВыгрузкойДанных» как раз подойдет для наших целей.

 Осталось добавить передаваемые параметры в таблице настройки (важно поставить галочку «при загрузке», остальное не обязательно; см. последний скриншот к статье)

 Готово! Теперь параметр будет прочтен в самом начале загрузки данных на стороне приемника  и будет доступен через структуру «Параметры»!

 

Пара слов, зачем это вообще может быть нужно.

Через параметры можно регулировать какие-то опции загрузки. Вместо того, чтобы писать несколько «рабочих» правил с разными задачами, можно параметрами переключать различные сценарии обработки на приемнике.

Через параметры можно передавать какие-нибудь «метаданные» о выгрузке – например, имя  человека, который ее делал.

Параметры можно использовать как глобальные переменные загрузки. Этот случай как раз показан в правилах, приложенных к статье (заметьте, что в семерочной конфигурации у документа нет реквизита «Организация», а в восьмерке он должен быть заполнен)

Можно придумать еще много вариантов использования этого механизма, надеюсь, кому-то он хоть немного облегчит процесс переноса данных между платформами.

 

PS. В прикрепленных файлах есть архив с конфигурациями источника и приемника. Они необязательны для разбора примеров, вся необходимая информация и так содержится в файле правил, но кому-то может быть проще смотреть на метаданные в родном конфигураторе, а не в обработке «Описание конфигурации» из КД.

 

PPS. Спасибо Totoro за дополнение, есть еще один вариант передачи параметров. Иногда бывает необходимо передать параметр не для всей конвертации, а для отдельного объекта (или более того, нескольких объектов). Например, если у приемника нет реквизита для значения, а само значение нужно для выбора варианта заполнения объекта (см. счет учета в основных средствах в семерке и, скажем, в УПП). Тогда поможет такой трюк:

Если вставить в "При выгрузке" или в "После выгрузки" ПКО код:

УзелПараметра = СоздатьУзел("ЗначениеПараметра");
УстановитьАтрибут(УзелПараметра, "Имя", "СообщениеВсемуМиру");
ЗаписатьЭлемент(УзелПараметра, "Значение", "Здравствуй, Мир!");
ДобавитьПодчиненный(Приемник, УзелПараметра);

то в обработчике "После загрузки" этого ПКО параметр можно прочитать через соответствие "ПараметрыОбъекта":

НашПривет = ПараметрыОбъекта["СообщениеВсемуМиру"];

Файлы обработки:

-