Тем не менее, если нельзя, но очень хочется, всегда можно найти выход. Обработка загрузки читает файлы из семерки и из восьмерки одинаково, не проверяя версию платформы-источника, так что никто не мешает нам создать нужную структуру тегов для «параметров» своими силами!
Приступим. Сразу скажу, что для примера я создал 2 простые конфигурации в 7 и в 8, с одним документом («ОбычныйДокумент») и одним справочником («Организация»). В семерке еще есть константа «ОсновнаяОрганизация», которую мы и будем передавать через параметр.
Для начала разберемся, что нам надо получить в выходном файле. После непродолжительного копания в восьмерочной обработке «УниверсальныйОбменДаннымиXML» можно найти, что параметры передаются в теге «ЗначениеПараметра» у которого есть атрибут «Имя» и, собственно, значение. Значением может быть любой объект, передаваемый через КД, по сути значение это читается при помощи той же функции, что и свойства объектов, описываемые в ПКО. Для желающих увидеть все своими глазами: процедуры «ПроизвестиЧтениеДанных()» и «ЗагрузитьЗначенияПараметровОбменаДанными()» в модуле обработки.
Объем работ теперь более-менее очерчен, посмотрим, как добиться нужного результата. Смотрим в семерочную обработку выгрузки данных и находим код для создания узлов в файле выгрузки (напр. «ВыгрузитьСвойства()»). Творчески его перерабатываем и получаем что-то такое:
УзелПараметра = СоздатьУзел("ЗначениеПараметра");
УстановитьАтрибут(УзелПараметра, "Имя", "СообщениеВсемуМиру");
ЗаписатьЭлемент(УзелПараметра, "Значение", "Здравствуй, Мир!" );
ДобавитьПодчиненный(rootNode, УзелПараметра);
Все хорошо, но таким способом можно передать только значения примитивных типов. Возникает резонный вопрос: что делать, если надо передать что-то более интересное (ссылку, например)? Выгрузим ссылку и вставим узел выгрузки как значение параметра! Вот так:
УзелПараметра = СоздатьУзел("ЗначениеПараметра");
УзелСсылки = ВыгрузитьПоПравилу(константа.ОсновнаяФирма,,,,"Организации");
УстановитьАтрибут(УзелПараметра, "Имя", "ОсновнаяОрганизация");
ДобавитьПодчиненный(УзелПараметра, узелСсылки);
ДобавитьПодчиненный(rootNode, УзелПараметра);
Как видно из кода, мы не создаем подчиненный узел «Значение», поскольку он необходим только для передачи примитивных типов. В случае передачи ссылочного типа с его работой справляется сам узел ссылки.
Отлично, с кодом выгрузки разобрались. Теперь надо понять, куда его добавить. Хотелось бы, чтобы передаваемый параметр был определен во время загрузки всех объектов, поэтому надо сделать так, чтобы код отработал перед обработкой ПВД.
Можно, например, сделать искусственное ПВД с минимальным порядком выполнения, в обработчик которому добавить вышеописанный код. Но любое ПВД можно выключить вручную в обработке выгрузки, так что этот способ нельзя назвать надежным. Поэтому посмотрим на события конвертации – «ПередВыгрузкойДанных» как раз подойдет для наших целей.
Осталось добавить передаваемые параметры в таблице настройки (важно поставить галочку «при загрузке», остальное не обязательно; см. последний скриншот к статье)
Готово! Теперь параметр будет прочтен в самом начале загрузки данных на стороне приемника и будет доступен через структуру «Параметры»!
Пара слов, зачем это вообще может быть нужно.
Через параметры можно регулировать какие-то опции загрузки. Вместо того, чтобы писать несколько «рабочих» правил с разными задачами, можно параметрами переключать различные сценарии обработки на приемнике.
Через параметры можно передавать какие-нибудь «метаданные» о выгрузке – например, имя человека, который ее делал.
Параметры можно использовать как глобальные переменные загрузки. Этот случай как раз показан в правилах, приложенных к статье (заметьте, что в семерочной конфигурации у документа нет реквизита «Организация», а в восьмерке он должен быть заполнен)
Можно придумать еще много вариантов использования этого механизма, надеюсь, кому-то он хоть немного облегчит процесс переноса данных между платформами.
PS. В прикрепленных файлах есть архив с конфигурациями источника и приемника. Они необязательны для разбора примеров, вся необходимая информация и так содержится в файле правил, но кому-то может быть проще смотреть на метаданные в родном конфигураторе, а не в обработке «Описание конфигурации» из КД.
PPS. Спасибо Totoro за дополнение, есть еще один вариант передачи параметров. Иногда бывает необходимо передать параметр не для всей конвертации, а для отдельного объекта (или более того, нескольких объектов). Например, если у приемника нет реквизита для значения, а само значение нужно для выбора варианта заполнения объекта (см. счет учета в основных средствах в семерке и, скажем, в УПП). Тогда поможет такой трюк:
Если вставить в «При выгрузке» или в «После выгрузки» ПКО код:
УзелПараметра = СоздатьУзел("ЗначениеПараметра");
УстановитьАтрибут(УзелПараметра, "Имя", "СообщениеВсемуМиру");
ЗаписатьЭлемент(УзелПараметра, "Значение", "Здравствуй, Мир!");
ДобавитьПодчиненный(Приемник, УзелПараметра);
то в обработчике «После загрузки» этого ПКО параметр можно прочитать через соответствие «ПараметрыОбъекта»:
НашПривет = ПараметрыОбъекта["СообщениеВсемуМиру"];
Молодец! Хорошая серебряная пуля. Как раз с подобным часто встречаюсь, но до такого не допетрил 🙂
Возможно автор заслужил золотую пулю, однако к нему есть вопрос: в Параметрах конвертации есть свойство «Передавать при выгрузке» — чем оно не угодило автору?! Поправьте, если не так…
(2) «Передавать при выгрузке» работает только для обмена между восьмерками. Об этом в статье написано.
Проверил: параметры передаются, а вот значения действительно не присваиваются… Так что пусть пуля достается автору. В качестве хорошего примера передачи и отработки параметров могу порекомендовать правила обмена для ЗиК-ЗУП от 1с
(4)
1. Смотрим статью: «Приступим. Сразу скажу, что для примера я создал 2 простые конфигурации в 7 и в 8»
2. Для начала сам попробовал бы что-ли передать-принять параметры
Я вас не верно понял. прошу прощения. подумал, что вы невнимательно прочитали. 🙂 а вы, как оказалось, дальше меня пошли, протестировали…
Ух как вовремя, как раз пишу правила конвертации. ПАссыба!!!!!!
Попробовал. Ни хрена не сработало — приемник параметр не получил. Может, я к нему неправильно обращаюсь — написал просто Параметры.НаименованиеОрганизации
Попробовал еще раз. Снова не получилось ни фига.
Параметр создал НаименованиеОрганизации (строка), птицу При загрузке поставил.
Вставил ПередВыгрузкой:
УзелПараметра = СоздатьУзел(«НаименованиеОрганизации»);
УстановитьАтрибут(УзелПараметра, «Имя», «НаименованиеОрганизации»);
ЗаписатьЭлемент(УзелПараметра, «Значение», «Моя организация»);
В восьмерке ПослеЗагрузки (справочника)
Наименование = Параметры.НаименованиеОрганизации;
— пустое.
Что я сделал неправильно?
После длительных и бесплодных попыток решил попробовать второй вариант — со ссылкой.
К моему большому удивлению, он сработал!
Тем не менее, испытываю большую потребность именно в первом варианте. Очень хочется иметь возможность задать параметр (строку) в диалоге и передать ее в восьмерку.
(10) chikov,
У вас в первом теге ошибка. Узел должен называться не по имени параметра, а строго «ЗначениеПараметра». Именно этот тег ищет обработка загрузки.
Таким образом, для строки код будет выглядеть так:
УзелПараметра = СоздатьУзел(«ЗначениеПараметра»);
УстановитьАтрибут(УзелПараметра, «Имя», «НаименованиеОрганизации»);
ЗаписатьЭлемент(УзелПараметра, «Значение», «Моя организация»);
ДобавитьПодчиненный(rootNode, УзелПараметра);
Перечитал статью и нашел у себя неточность: в первом примере переноса, с примитивными типами, забыл добавить созданный узел параметра в файл выгрузки («ДобавитьПодчиненный(rootNode, УзелПараметра);»)
Исправил.
Большое спасибо! До «ЗначениеПараметра» я по ходу допер, но оно, естественно, без последней строки таки не работало, да…
А теперь работет! И, мне кажется, в большинстве случаев примитивных типов вполне достаточно — в параметрах можно ввести на форме то, что нужно, а потом в восьмерке анализировать и выполнять соответствующие действия.
Молодец, как раз столкнулся, уже думал что-то мудрить.
Добавь в статью пример:
Если вставить в «При выгрузке» или в «После выгрузки» ПКО код:
УзелПараметра = СоздатьУзел(«ЗначениеПараметра»);
УстановитьАтрибут(УзелПараметра, «Имя», «СообщениеВсемуМиру»);
ЗаписатьЭлемент(УзелПараметра, «Значение», «Здравствуй, Мир!»);
ДобавитьПодчиненный(Приемник, УзелПараметра);
то в обработчике «После загрузки» этого ПКО параметр можно прочитать через соответствие «ПараметрыОбъекта»:
НашПривет = ПараметрыОбъекта[«СообщениеВсемуМиру»];
В 1С 7.7 был создан аналог регистра сведений 1С8 СоответствиеОбъектовДляОбмена для складов, номенклатуры, контрагентов. Для контрагентов хранятся соответствия многие к одному: в обменной базе много контрагентов, в текущей им соответствуют один. Теперь переносим данные справочника в регистр сведений в 1С8. Собственную ссылку выгружаю так:
//собственная ссылка
Если сокрлп(Источник.ИмяТипаПриемника) = «Справочник.Контрагенты» Тогда
ПравилаДляСсылки = «Контрагенты»;
ИначеЕсли сокрлп(Источник.ИмяТипаПриемника) = «Справочник.Номенклатура» Тогда
ПравилаДляСсылки = «Номенклатура»;
ИначеЕсли сокрлп(Источник.ИмяТипаПриемника) = «Справочник.МестаХранения» Тогда
ПравилаДляСсылки = «Склады»;
КонецЕсли;
УзелПараметра = СоздатьУзел(«ЗначениеПараметра»);
узелСсылки = ВыгрузитьПоПравилу(Источник.СобственнаяСсылка,,,,ПравилаДляСсылки);
УстановитьАтрибут(УзелПараметра, «Имя», «СобственнаяСсылка»);
ДобавитьПодчиненный(УзелПараметра, узелСсылки);
ДобавитьПодчиненный(Приемник, УзелПараметра);
В результате ДобавитьПодчиненный(УзелПараметра, узелСсылки); работает через раз (см. скриншот). И косячит именно при соответствии многие к одному: есть несколько строк соответствий, а собственная ссылка выгружается только для последней. Никто не может подсказать, в чем проблема?
в событии ПередЗагрузкойДанных правила конветации еще никаких параметров нет. а ведь передача параметров требуется в основном для инициализации базы приемника — ЗагрузитьЗначенияПараметровОбменаДанными() вызывается слишком поздно уже при чтении объектов загрузки.
Блин!! Выдает ошибку:
Процедура или функция с указанным именем не определена (ЗаписатьЭлемент)
Кто подскажет что делать?
Автору плюс за статью. Спасибо.
Здорово :), спасибо за работу
Можно ли сделать обмен параметрами между двумя 7-ми? у меня что-то не получилось (организация в документе пустая, хотя и ошибок не выдает)
для корректной работы пустых ссылок надо передавать тип (обнаружилось в процессе тестирования правил)
За статью плюс, но в ней есть много чего недостающего. Здесь описаны все нюансы передачи параметров.
http://kb.mista.ru/article.php?id=811
Можно ли так передать дату?
Для того чтобы ПараметрыОбъекта были доступны в обработчике «Поля поиска» нужно изменить порядок записи объекта в XML. Первыми подчиненными узлами объекта должны быть элементы «ЗначениеПараметра», иначе при чтении ссылки выполнится обработчик «Последовательность полей поиска», в котором ПараметрыОбъекта ещё не инициализированы.
Вот пример рабочего кода для обработчика «При выгрузке» ПКО. В параметры выгружаются 2 ссылочных объекта:
Показать
Спасибо, автор! Метод работает.
А как передать ТаблицуЗначений таким способом?
Записывается только в таком виде
<ЗначениеПараметра Имя=»ТабДокументовУдаления» Тип=»ТаблицаЗначений»><Значение>ТаблицаЗначений</Значение></ЗначениеПараметра>
А вот сами данные ТЗ не попадают в файл обмена
(28) Судя по всему, в сообщение попадает только представление переменной — собственно, «ТаблицаЗначений».
Я уже давно не смотрел на КД и не помню, есть ли там код сериализации таблицы значений. В худшем случае остается два варианта:
1. самому «конструировать» структуру таблицы значений при помощи тегов (строки/ячейки и т.д.)
2. упростить задачу перемещения данных. Например, передавать не таблицу значений, а строку с экзотическим разделителем (@, |, // или другие символы, которые точно не окажутся в «полезных данных»). На принимающей стороне эту строку надо будет разобрать обратно и дальше работать с ней.
(29)я рассматривал такой вариантhttps://infostart.ru/public/120181/ на принимающей стороне, и помещать ТЗ на стороне 7-ки с помощью ЗначениеВСтрокуВнутр, но потом исходя из моей ситуации решил получить ТЗ через COM соединение.