КД: Передача параметров из 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 1743 11.01.12 22:39 Сейчас в теме
(2) "Передавать при выгрузке" работает только для обмена между восьмерками. Об этом в статье написано.
4. fomix 29 12.01.12 09:27 Сейчас в теме
Проверил: параметры передаются, а вот значения действительно не присваиваются... Так что пусть пуля достается автору. В качестве хорошего примера передачи и отработки параметров могу порекомендовать правила обмена для ЗиК-ЗУП от 1с
5. Rustig 1743 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 560 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 236 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 431 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 соединение.
Оставьте свое сообщение
Вопросы с вознаграждением
Вакансии
Программист 1С
Санкт-Петербург
зарплата от 110 000 руб.
Полный день

Программист 1С
Москва
зарплата от 170 000 руб.
Полный день

Программист 1С (Казань)
Казань
зарплата до 130 000 руб.
Полный день

Программист 1С (Новосибирск)
Новосибирск
зарплата до 130 000 руб.
Полный день

Консультант-аналитик 1С
Москва
зарплата от 180 000 руб.
Полный день