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

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

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

Перейти к публикации

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Новиков 292 05.01.12 09:46 Сейчас в теме
Молодец! Хорошая серебряная пуля. Как раз с подобным часто встречаюсь, но до такого не допетрил :)
26. deaddy64 25 06.10.16 10:32 Сейчас в теме
Для того чтобы ПараметрыОбъекта были доступны в обработчике "Поля поиска" нужно изменить порядок записи объекта в XML. Первыми подчиненными узлами объекта должны быть элементы "ЗначениеПараметра", иначе при чтении ссылки выполнится обработчик "Последовательность полей поиска", в котором ПараметрыОбъекта ещё не инициализированы.
Вот пример рабочего кода для обработчика "При выгрузке" ПКО. В параметры выгружаются 2 ссылочных объекта:
хмлОрганизация = ВыгрузитьПоПравилу("Наша организация", ,,,"ОрганизацииТолькоСсылка",,);

РегВНалоговомОрганеСылка = СоздатьОбъект("СписокЗначений");
РегВНалоговомОрганеСылка.Установить("Владелец","Наша организация");
РегВНалоговомОрганеСылка.Установить("КодПоОКТМО",Источник.КодОКТМО.Получить(Параметры.МесяцНачалаЭксплуатации));
РегВНалоговомОрганеСылка.Установить("КодПоОКАТО",Источник.КодОКАТО);
РегВНалоговомОрганеСылка.Установить("КПП",Источник.КПП);
хлмРегистрация = ВыгрузитьПоПравилу(РегВНалоговомОрганеСылка, , , , "РегистрацииВНалоговомОргане",,);

УзелПараметраОрг = СоздатьУзел("ЗначениеПараметра");
УстановитьАтрибут(УзелПараметраОрг, "Имя", "сфОрганизация");
УстановитьАтрибут(УзелПараметраОрг, "Тип", "СправочникСсылка.Организации");
УстановитьАтрибут(УзелПараметраОрг, "ИмяПКО", "ОрганизацииТолькоСсылка");
ДобавитьПодчиненный(УзелПараметраОрг, хмлОрганизация.cloneNode(1));
Приемник.insertBefore(УзелПараметраОрг, Приемник.firstChild);

УзелПараметраРег = СоздатьУзел("ЗначениеПараметра");
УстановитьАтрибут(УзелПараметраРег, "Имя", "Регистрация");
УстановитьАтрибут(УзелПараметраРег, "Тип", "СправочникСсылка.РегистрацииВНалоговомОргане");
УстановитьАтрибут(УзелПараметраРег, "ИмяПКО", "РегистрацииВНалоговомОргане");
ДобавитьПодчиненный(УзелПараметраРег, хлмРегистрация.cloneNode(1));
Приемник.insertBefore(УзелПараметраРег, Приемник.firstChild);
Показать
sbsa; gamletspb; corbenSG; efrida; +4 Ответить
2. fomix 29 11.01.12 16:31 Сейчас в теме
Возможно автор заслужил золотую пулю, однако к нему есть вопрос: в Параметрах конвертации есть свойство "Передавать при выгрузке" - чем оно не угодило автору?! Поправьте, если не так...
3. Rustig 1716 11.01.12 22:39 Сейчас в теме
(2) "Передавать при выгрузке" работает только для обмена между восьмерками. Об этом в статье написано.
4. fomix 29 12.01.12 09:27 Сейчас в теме
Проверил: параметры передаются, а вот значения действительно не присваиваются... Так что пусть пуля достается автору. В качестве хорошего примера передачи и отработки параметров могу порекомендовать правила обмена для ЗиК-ЗУП от 1с
5. Rustig 1716 13.01.12 03:13 Сейчас в теме
(4)
(3) Rustig,
1. Смотрим статью: "Приступим. Сразу скажу, что для примера я создал 2 простые конфигурации в 7 и в 8"
2. Для начала сам попробовал бы что-ли передать-принять параметры


Я вас не верно понял. прошу прощения. подумал, что вы невнимательно прочитали. :) а вы, как оказалось, дальше меня пошли, протестировали...
6. vbuots 20 13.01.12 11:53 Сейчас в теме
Ух как вовремя, как раз пишу правила конвертации. ПАссыба!!!!!!
8. chikov 17.01.12 16:05 Сейчас в теме
Попробовал. Ни хрена не сработало - приемник параметр не получил. Может, я к нему неправильно обращаюсь - написал просто Параметры.НаименованиеОрганизации
9. chikov 17.01.12 22:42 Сейчас в теме
Попробовал еще раз. Снова не получилось ни фига.

Параметр создал НаименованиеОрганизации (строка), птицу При загрузке поставил.

Вставил ПередВыгрузкой:

УзелПараметра = СоздатьУзел("НаименованиеОрганизации");
УстановитьАтрибут(УзелПараметра, "Имя", "НаименованиеОрганизации");
ЗаписатьЭлемент(УзелПараметра, "Значение", "Моя организация");

В восьмерке ПослеЗагрузки (справочника)

Наименование = Параметры.НаименованиеОрганизации;

- пустое.

Что я сделал неправильно?
10. chikov 18.01.12 03:34 Сейчас в теме
После длительных и бесплодных попыток решил попробовать второй вариант - со ссылкой.
К моему большому удивлению, он сработал!
Тем не менее, испытываю большую потребность именно в первом варианте. Очень хочется иметь возможность задать параметр (строку) в диалоге и передать ее в восьмерку.
11. Филин 149 18.01.12 15:26 Сейчас в теме
(10) chikov,
У вас в первом теге ошибка. Узел должен называться не по имени параметра, а строго "ЗначениеПараметра". Именно этот тег ищет обработка загрузки.

Таким образом, для строки код будет выглядеть так:

УзелПараметра = СоздатьУзел("ЗначениеПараметра");
УстановитьАтрибут(УзелПараметра, "Имя", "НаименованиеОрганизации");
ЗаписатьЭлемент(УзелПараметра, "Значение", "Моя организация");
ДобавитьПодчиненный(rootNode, УзелПараметра);
12. Филин 149 18.01.12 15:30 Сейчас в теме
Перечитал статью и нашел у себя неточность: в первом примере переноса, с примитивными типами, забыл добавить созданный узел параметра в файл выгрузки ("ДобавитьПодчиненный(rootNode, УзелПараметра);")
Исправил.
13. chikov 18.01.12 21:24 Сейчас в теме
Большое спасибо! До "ЗначениеПараметра" я по ходу допер, но оно, естественно, без последней строки таки не работало, да...
А теперь работет! И, мне кажется, в большинстве случаев примитивных типов вполне достаточно - в параметрах можно ввести на форме то, что нужно, а потом в восьмерке анализировать и выполнять соответствующие действия.
15. NickAn 19.04.12 10:48 Сейчас в теме
Молодец, как раз столкнулся, уже думал что-то мудрить.
16. Totoro 559 12.06.12 00:39 Сейчас в теме
Добавь в статью пример:

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

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

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

НашПривет = ПараметрыОбъекта["СообщениеВсемуМиру"];
SergIG; _Amator_; +2 Ответить
17. Lili4ka 17.12.12 12:59 Сейчас в теме
В 1С 7.7 был создан аналог регистра сведений 1С8 СоответствиеОбъектовДляОбмена для складов, номенклатуры, контрагентов. Для контрагентов хранятся соответствия многие к одному: в обменной базе много контрагентов, в текущей им соответствуют один. Теперь переносим данные справочника в регистр сведений в 1С8. Собственную ссылку выгружаю так:

//собственная ссылка
Если сокрлп(Источник.ИмяТипаПриемника) = "Справочник.Контрагенты" Тогда
ПравилаДляСсылки = "Контрагенты";
ИначеЕсли сокрлп(Источник.ИмяТипаПриемника) = "Справочник.Номенклатура" Тогда
ПравилаДляСсылки = "Номенклатура";
ИначеЕсли сокрлп(Источник.ИмяТипаПриемника) = "Справочник.МестаХранения" Тогда
ПравилаДляСсылки = "Склады";
КонецЕсли;

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

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


В результате ДобавитьПодчиненный(УзелПараметра, узелСсылки); работает через раз (см. скриншот). И косячит именно при соответствии многие к одному: есть несколько строк соответствий, а собственная ссылка выгружается только для последней. Никто не может подсказать, в чем проблема?
Прикрепленные файлы:
18. Gorr 39 02.01.13 07:25 Сейчас в теме
в событии ПередЗагрузкойДанных правила конветации еще никаких параметров нет. а ведь передача параметров требуется в основном для инициализации базы приемника - ЗагрузитьЗначенияПараметровОбменаДанными() вызывается слишком поздно уже при чтении объектов загрузки.
19. daho 8 25.03.13 19:42 Сейчас в теме
Блин!! Выдает ошибку:
Процедура или функция с указанным именем не определена (ЗаписатьЭлемент)
Кто подскажет что делать?
20. juker 234 16.04.13 15:46 Сейчас в теме
Автору плюс за статью. Спасибо.
21. Rudakov_D 11.11.13 12:29 Сейчас в теме
Здорово :), спасибо за работу
22. volha-77 19 09.03.14 17:46 Сейчас в теме
Можно ли сделать обмен параметрами между двумя 7-ми? у меня что-то не получилось (организация в документе пустая, хотя и ошибок не выдает)
23. Yimaida 35 27.02.15 13:09 Сейчас в теме
для корректной работы пустых ссылок надо передавать тип (обнаружилось в процессе тестирования правил)

УзелРеквизитов = СоздатьУзел("ЗначениеПараметра");
УзелСсылки = ВыгрузитьПоПравилу(Источник.Регион,,,,"БизнесРегионы",,);
УстановитьАтрибут(УзелРеквизитов, "Имя", "БизнесРегион");
УстановитьАтрибут(УзелРеквизитов, "Тип", "СправочникСсылка.БизнесРегионы");
ДобавитьПодчиненный(УзелРеквизитов, УзелСсылки);
ДобавитьПодчиненный(Приемник, УзелРеквизитов);
24. pyrkin_vanya 427 01.11.15 12:29 Сейчас в теме
За статью плюс, но в ней есть много чего недостающего. Здесь описаны все нюансы передачи параметров.
http://kb.mista.ru/article.php?id=811
25. Ольга_tmp 61 10.02.16 14:48 Сейчас в теме
Можно ли так передать дату?
27. slawanix 14 27.03.17 16:16 Сейчас в теме
Спасибо, автор! Метод работает.
28. user1090556 11.03.19 12:56 Сейчас в теме
А как передать ТаблицуЗначений таким способом?
Записывается только в таком виде
<ЗначениеПараметра Имя="ТабДокументовУдаления" Тип="ТаблицаЗначений"><Значение>ТаблицаЗначений</Значение></ЗначениеПараметра>
А вот сами данные ТЗ не попадают в файл обмена
29. Филин 149 12.03.19 12:44 Сейчас в теме
(28) Судя по всему, в сообщение попадает только представление переменной -- собственно, "ТаблицаЗначений".

Я уже давно не смотрел на КД и не помню, есть ли там код сериализации таблицы значений. В худшем случае остается два варианта:
1. самому "конструировать" структуру таблицы значений при помощи тегов (строки/ячейки и т.д.)
2. упростить задачу перемещения данных. Например, передавать не таблицу значений, а строку с экзотическим разделителем (@, |, // или другие символы, которые точно не окажутся в "полезных данных"). На принимающей стороне эту строку надо будет разобрать обратно и дальше работать с ней.
30. user1090556 13.03.19 10:06 Сейчас в теме
(29)я рассматривал такой вариант https://infostart.ru/public/120181/ на принимающей стороне, и помещать ТЗ на стороне 7-ки с помощью ЗначениеВСтрокуВнутр, но потом исходя из моей ситуации решил получить ТЗ через COM соединение.
Оставьте свое сообщение
Вопросы с вознаграждением