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

05.07.12

Интеграция - Файловый обмен (TXT, XML, DBF), FTP

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

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

Скачать исходный код

Наименование Файл Версия Размер
Правила
.xml 10,56Kb
61
.xml 10,56Kb 61 Скачать
конфигурации
.zip 12,59Kb
27
.zip 12,59Kb 27 Скачать

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

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

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

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

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

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

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

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

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

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

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

 

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

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

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

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

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

 

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

 

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

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

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

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

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

См. также.

Файловый обмен (TXT, XML, DBF), FTP Учет документов Распознавание документов и образов Бухгалтер Пользователь Платформа 1С v7.7 Платформа 1С v8.3 Платформа 1C v8.2 Конфигурации 1cv8 Конфигурации 1cv7 Россия Платные (руб)

Программный комплекс способный распознавать сотни листов за раз любых сканированных(фото) документов (УПД, ТОРГ12, СФ, паспорт и пр.) и загружать их в любую 1С (БП3.0, УТ, КА, УНФ, УПП, 1С7.7 ТиС, ЗУП3 и пр.), а также формировать архив сканированных документов.<br> Робот применяет до 5 способов распознавания. Максимальное качество загрузки документов из бесплатных OCR. Работает без Интернета.

10800 руб.

13.10.2022    8051    1    12    

9

Файловый обмен (TXT, XML, DBF), FTP ЭДО и ОФД Программист Бухгалтерский учет 7.7 1С:Бухгалтерия 7.7 1С:Торговля и склад 7.7 1С:Бухгалтерия 1.6 1С:Упрощенное налогообложение 7.7 Россия Бухгалтерский учет Абонемент ($m)

Обмениваемся УПД (УКД) с различными контрагентами через СБИС. А чтобы загрузить УПД (УКД) из 7.7 в Сбис, используем данную обработку, которая создает файл в формате XML, который можно импортировать в систему электронного документооборота. Для конфигурации "Бухгалтерский учет" (тестировалась на релизе 7.70.663) Для конфигурации "Упрощенная система налогообложения" ( тестировалась на релизе 7.70.305) Для конфигурации "Торговля и Склад 7.7" (тестировалась на релизе 7.70.1007)

1 стартмани

31.07.2021    15496    213    AndKovalchuk    50    

18

Перенос данных 1C Программист Платформа 1С v7.7 Платформа 1С v8.3 Платформа 1C v8.2 1С:Управление торговлей 10 1С:Комплексная 7.7 Россия Управленческий учет Платные (руб)

Начните вести учет в УТ 10.3! Перенесите все свои данные в УТ 10.3 в любом месяце года и продолжите вести учет! Программа перенесёт любое количество баз с документами и остатками в больших количествах. Обработка выгрузки выполнит проверку исходных данных и сформирует отчет о найденных ошибках в справочниках и документах. Партии переносятся с себестоимостью. Штрихкоды номенклатуры загружаются. Цена переносится. Автор консультирует.

8400 руб.

17.03.2021    15679    5    13    

6

Зарплата Перенос данных 1C Программист Бухгалтер Бухгалтерский учет 7.7 Сложные периодические расчеты 1С:Бухгалтерия 7.7 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Платные (руб)

Как известно, Бухгалтерия 7.7 не имеет штатной возможности для обмена с ЗУП 3.1. Данная разработка пригодится тем, кто перешел с ЗиК 2.3 на ЗУП 3.1, но вынужден по каким-то своим причинам оставаться на Бухгалтерии 7.7.

18000 руб.

29.09.2020    13659    2    0    

5

Файловый обмен (TXT, XML, DBF), FTP Перенос данных 1C Программист Платформа 1С v7.7 Платформа 1С v8.3 1С:Бухгалтерия 7.7 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Перенос данных из 1С:Бухгалтерия 7.7 в БП 3.0 | Продукт является развитием и исправлением ошибок стандартной обработки для выгрузки данных из 1С Бухгалтерии 7.7 в Бухгалтерию 3.0 | Предоставляем техподдержку | Обновляем на новые релизы 1С | Перенос из 7.7 является сложным, и на рынке сложно найти специалистов 1С по "семерке" - сотрудники помогут вам выполнить переход в рамках техподдержки предлагаемого переноса данных!

45650 руб.

26.05.2020    34477    10    69    

16

Перенос данных 1C Программист Платформа 1С v7.7 Платформа 1С v8.3 1С:Торговля и склад 7.7 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Обработка позволяет выгружать данные из ТиС 7.7 в конфигурации 8.3 для сдачи отчетности, для переноса данных при переходе на 8.3, для организации обмена внутри компании при использовании разных версий 1С в структурных подразделениях или формирования отгрузочных накладных для клиентов.

6000 руб.

18.05.2020    23097    59    39    

36

Перенос данных 1C Программист Платформа 1С v7.7 Платформа 1С v8.3 1С:Конвертация данных Бесплатно (free)

При переходе на новую версию 1С в период параллельной эксплуатации может возникнуть необходимость обратной конвертации данных (по правилам КД версии 2.1) из 1С:Предприятие 8.3 в 1С:Предприятие 7.7 для переноса данных из 1С:Предприятие 8.3 в 7.7. Сделать это поможет следующая инструкция по КД2 о том, как создать новую конвертацию из 8.3 в 7.7, сохранить модуль и правила загрузки данных, сделать загрузку данных. КД2.

17.10.2019    14449    ksnik    0    

16

Файловый обмен (TXT, XML, DBF), FTP Перенос данных 1C Программист Платформа 1С v7.7 Платформа 1С v8.3 1С:Комплексная 7.7 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х Абонемент ($m)

Разработка позволяет перенести остатки по всем счетам бух. учета из "1С:Комплексная конфигурация, редакция 4.5 (7.7)" в программу "1С:Управление предприятием ERP 2.0", на выбранную дату начала ведения учета. Также переносятся документы за период и вся необходимая справочная информация. Конфигурация "1С:Управление предприятием ERP 2.0" является полностью типовой.

5 стартмани

11.01.2019    15845    39    sulig    14    

13
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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 33 11.01.12 16:31 Сейчас в теме
Возможно автор заслужил золотую пулю, однако к нему есть вопрос: в Параметрах конвертации есть свойство "Передавать при выгрузке" - чем оно не угодило автору?! Поправьте, если не так...
3. RustIG 1691 11.01.12 22:39 Сейчас в теме
(2) "Передавать при выгрузке" работает только для обмена между восьмерками. Об этом в статье написано.
4. fomix 33 12.01.12 09:27 Сейчас в теме
Проверил: параметры передаются, а вот значения действительно не присваиваются... Так что пусть пуля достается автору. В качестве хорошего примера передачи и отработки параметров могу порекомендовать правила обмена для ЗиК-ЗУП от 1с
5. RustIG 1691 13.01.12 03:13 Сейчас в теме
(4)
(3) Rustig,
1. Смотрим статью: "Приступим. Сразу скажу, что для примера я создал 2 простые конфигурации в 7 и в 8"
2. Для начала сам попробовал бы что-ли передать-принять параметры


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

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

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

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

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

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

- пустое.

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

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

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

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

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

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

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

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

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

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


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

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

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