1с 8 кд передача параметров в приемник
1. Для передачи параметра (или параметров, количество передаваемого может быть произвольным)
в обработчике Правила Конвертации Объекта(ПКО) ПриВыгрузке пишем следующее
Количество таких блоков может быть произвольным, в зависимости от количества передаваемого.
««ИмяПараметрПКО» и «ЗначениеПараметрПКО» - имена обязательные, потому что по ним потом будет поиск в при загрузке.
«Клиент» и Строка(Источник.Клиент) - величины произвольные.
Первое вы сами назначаете и сами же потом будите использовать в обработчиках загрузки. А второе - это и есть передаваемое значение. Оно может быть любым, но при записи в файл все равно приведется к типу Строка.
2. Для получения переданных параметров в базе-приемнике надо немного изменить обработку загрузки
Открываем в конфигурации модуль объекта обработки и ищем
Идем от начала в низ, пропускаем обработчики ПередЗагрузкой и находим вот такой кусок кода
Для начала перед циклом
поставим свою строчку :
Дальше в цикле нас интересует именно переменная ЭтоПараметрДляОбъекта. Поэтому быстренько проверив ее заполняем наше свежерожденное соответствие:
Вот собственно и все. Соответствие ПараметрыПКО доступно в обработчиках ПриЗагрузке и ПослеЗагрузки. А там - вспоминайте уже сами какими именами вы называли ваши параметры и доставайте их из него. Например :
В ПКС есть хитрая галка «Передавать данные в параметр». И казалось бы сам бог велел ее использовать. НО…
ЭТО ТОЛЬКО ДЛЯ ОБМЕНА V8 - V8 И ОБРАБОТКИ ВЫГРУЗКИ И ЗАГРУЗКИ НЕ НИЖЕ 2.0.18.1
Данный функционал позволяет передавать дополнительные параметры в информационную базу приемник из источника.
Но если исходная конвертация 7.7 , не удивляйтесь если эта галка не доступна для использования. по мне так лучше бы вообще убрали видимость, чтобы не вводить в заблуждение и искушение.
3. Передача глобальных параметров при конвертации 7.7 ==> 8 без правки штатных модулей
Кратко суть проблемы можно озвучить цитатой из документации:
«Передача параметра из источника в приемник доступна только при обмене между информационными базами на платформе 1С:Предприятие 8».
Ниже излагается способ передачи глобальных параметров при таком обмене без правки выгруженного из КД 2 модуля выгрузки и без правки самой КД 2. Итак:
в обработчике ПередВыгрузкойДанных пишем код:
После этого данные параметры будут абсолютно штатно загружены в стандартной обработке «Универсальный обмен данными в формате XML (2.1.5)».
Нюанс: чтобы иметь параметры на ранних стадиях загрузки (предшествующих загрузке параметров), например, в обработчиках ПередЗагрузкойДанных или ПередОбработкой в ПОД (правилах очистки данных), нужно каким-то образом устанавливать параметры на этапе выполнения ПередЗагрузкойДанных. Как это сделать, не меняя штатный механизм (т.е. без исправления модулей выгрузки/загрузки)? Можно, например, так: дописываем в ПередВыгрузкойДанных следующий код:
- Последние изменения: 03.04.2022 22:07
- — Asmody
За исключением случаев, когда указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: CC Attribution-Share Alike 3.0 Unported
В «Конвертации Данных» заложен удобный механизм передачи параметров – по сути переменных конвертации – между базами. Одна проблема: передача эта работает только если обмен происходит между двумя «восьмерками». По какой-то причине «семерочная» сторона обмена вообще обделена всякими интересными плюшками КД.
Тем не менее, если нельзя, но очень хочется, всегда можно найти выход. Обработка загрузки читает файлы из семерки и из восьмерки одинаково, не проверяя версию платформы-источника, так что никто не мешает нам создать нужную структуру тегов для «параметров» своими силами!
Приступим. Сразу скажу, что для примера я создал 2 простые конфигурации в 7 и в 8, с одним документом («ОбычныйДокумент») и одним справочником («Организация»). В семерке еще есть константа «ОсновнаяОрганизация», которую мы и будем передавать через параметр.
Для начала разберемся, что нам надо получить в выходном файле. После непродолжительного копания в восьмерочной обработке «УниверсальныйОбменДаннымиXML» можно найти, что параметры передаются в теге «ЗначениеПараметра» у которого есть атрибут «Имя» и, собственно, значение. Значением может быть любой объект, передаваемый через КД, по сути значение это читается при помощи той же функции, что и свойства объектов, описываемые в ПКО. Для желающих увидеть все своими глазами: процедуры «ПроизвестиЧтениеДанных()» и «ЗагрузитьЗначенияПараметровОбменаДанными()» в модуле обработки.
Объем работ теперь более-менее очерчен, посмотрим, как добиться нужного результата. Смотрим в семерочную обработку выгрузки данных и находим код для создания узлов в файле выгрузки (напр. «ВыгрузитьСвойства()»). Творчески его перерабатываем и получаем что-то такое:
Все хорошо, но таким способом можно передать только значения примитивных типов. Возникает резонный вопрос: что делать, если надо передать что-то более интересное (ссылку, например)? Выгрузим ссылку и вставим узел выгрузки как значение параметра! Вот так:
Как видно из кода, мы не создаем подчиненный узел «Значение», поскольку он необходим только для передачи примитивных типов. В случае передачи ссылочного типа с его работой справляется сам узел ссылки.
Отлично, с кодом выгрузки разобрались. Теперь надо понять, куда его добавить. Хотелось бы, чтобы передаваемый параметр был определен во время загрузки всех объектов, поэтому надо сделать так, чтобы код отработал перед обработкой ПВД.
Можно, например, сделать искусственное ПВД с минимальным порядком выполнения, в обработчик которому добавить вышеописанный код. Но любое ПВД можно выключить вручную в обработке выгрузки, так что этот способ нельзя назвать надежным. Поэтому посмотрим на события конвертации – «ПередВыгрузкойДанных» как раз подойдет для наших целей.
Осталось добавить передаваемые параметры в таблице настройки (важно поставить галочку «при загрузке», остальное не обязательно; см. последний скриншот к статье)
Готово! Теперь параметр будет прочтен в самом начале загрузки данных на стороне приемника и будет доступен через структуру «Параметры»!
Пара слов, зачем это вообще может быть нужно.
Через параметры можно регулировать какие-то опции загрузки. Вместо того, чтобы писать несколько «рабочих» правил с разными задачами, можно параметрами переключать различные сценарии обработки на приемнике.
Через параметры можно передавать какие-нибудь «метаданные» о выгрузке – например, имя человека, который ее делал.
Параметры можно использовать как глобальные переменные загрузки. Этот случай как раз показан в правилах, приложенных к статье (заметьте, что в семерочной конфигурации у документа нет реквизита «Организация», а в восьмерке он должен быть заполнен)
Можно придумать еще много вариантов использования этого механизма, надеюсь, кому-то он хоть немного облегчит процесс переноса данных между платформами.
PS. В прикрепленных файлах есть архив с конфигурациями источника и приемника. Они необязательны для разбора примеров, вся необходимая информация и так содержится в файле правил, но кому-то может быть проще смотреть на метаданные в родном конфигураторе, а не в обработке «Описание конфигурации» из КД.
PPS. Спасибо Totoro за дополнение, есть еще один вариант передачи параметров. Иногда бывает необходимо передать параметр не для всей конвертации, а для отдельного объекта (или более того, нескольких объектов). Например, если у приемника нет реквизита для значения, а само значение нужно для выбора варианта заполнения объекта (см. счет учета в основных средствах в семерке и, скажем, в УПП). Тогда поможет такой трюк:
Если вставить в "При выгрузке" или в "После выгрузки" ПКО код:
то в обработчике "После загрузки" этого ПКО параметр можно прочитать через соответствие "ПараметрыОбъекта":
Мне нужно вызвать из общей формы отчет который создан с пом СКД, существует стандартный отчет в типовой конфигурации но в отчете пользователь сам задает период , а мне нужно чтобы он сразу открывался с нужным периодом т.е мне необходимо передать в запрос параметр из процедуры вызова.Как это сделать в если отчет сформирован СКД ?
(2) sai_NT, Спасибо, а не подскажите где об этих ф-циях можно прочитать по-подробнее (кроме синтаксис помощника)
И еще такой вопрос, у отчета в типовой конфе нет созданной формы, можно ли как-то задать параметры ели форма создается системой?
и еще,совсем забыл - отчет формируется по команде создать, можно освободить пользователя от этого не легкого труда?(дать команду программно)
(10) alw-1, этот код, который програмно выполняет функции идентичные клику по кнопке "Сформировать", необходимо поместить в обработчике кнопки. В отчете, который я как пример дал, этого нет, но зато есть форма и установка параметров.
Файл не могу открыть:
Ошибка при выполнении файловой операции
по причине:
Неверный формат хранилища данных
Дополнение к вопросу - У меня 8.2 управляемая форма и приходится учитывать клиент и сервер. Параметры передать удается, но в учебнике Хрусталевой по 8.1 нашел код позволяющий сделать автоматический вывод отчета, немного изменил с учетом 8.2 Вот он:
При запуске поцедура проходит без ошибок, но в макете все равно приходится нажать Выполнить - нет автозагрузки.
Может кто знает в чем причина?
Причина была в том, что в свойствах формы по умолчанию АвтоотображениеСостояния - Авто, надо Не отображать.
Да и код чуть усовершенствовал:
А вот как можно передать параметр в управляемую форму отчета и не только в настройки, но и в пользовательские настройки(в качестве примера):
Dims163; adhocprog; simgo83; Realyzer; wowik; Anubis23; ganz123; bonya_by; sumpavig; Serginyos; markers; user608739_serg999h; maikl007; Papilion; bulpi; pavel_pss; user705522_constantin_h; nastrou1c; matashin; leonidt84; + 20 – Ответить
(16)
Огромное спасибо! Полдня потратил, чуть не рехнулся. Всякой фигни в интернете на эту тему написаны тома, но знаете , похоже, только Вы.
а как передать параметры в этот отчет, если именно его я и открываю. Параметры передать нужно при открытии (формы у отчета нет).
СКД - это шаманство. Нигде нет нормального мануала. Если есть где, подскажите.
Если нужно из какого нибуть места открыть отчет и передать туда настройки сделал следующее
КомпоновщикНастроек = Отчеты.МойОтчет.Создать().КомпоновщикНастроек;
Настройки = КомпоновщикНастроек.Настройки;
Дальше в отладчике посмотрел какие настройки есть. Посмотреть можно ТОЛЬКО нажав на кнопку "Показать значение в отдельном окне". Там у меня было заполнено "Правое значение" и "Вид сравнения". Я догадался, что само значение это "Правое значение".
Весь код написан только на интуиции. Есть подозрение, что не оптимально, но слава Одину он работает.
Переношу документы ПКО из бухгалтерии в УПП.
При этом статьи ДДС из Бухи не должны переноситься, если не найдены в УПП.
Задача: отобразить ненайденные статьи в комментарии, добавив в существующий комментарий статью из Бухи.
Документы у меня перенеслись четко, статьи ДДС подставились найденные, но не создавались новые, а как добавить в комментарий статьи из бухгалтерии не знаю.
Пробывал через параметры, но увы. ничего не получается.
Помогите советом.
В ПКО после загрузки писал "ПараметрыОбъекта.Получить("ДДС")", где ДДС - имя параметра. В параметре выставлял галки при занрузке и при выгрузке, но. ничего.
В чем ошибка?
Я хочу в приемнике получить значение статью ДДС из источника, чтобы это значение можно было вставить в комментарий.
Может быть это делается не так, подскажите.
Это я понимаю, как можно строковое значение(Наименование) статьи ДДС из источника запихнуть в комментарий приемника?
Пока я даже не могу просто прочитать значение параметра после загрузки.
Одно ПКС у тебя будет для выгрузки статьи в документ (передавать данные в приемник). По нему будут выгружаться статьи и заполняться при загрузке найденные.
Создай еще одно ПКС где статью уже передавай в параметр и в нем перед выгрузкой:
Значение = Источник.СтатьяДДС.Наименование;
В обработчике после загрузки проверяй заполнена ли статья у объекта. Если нет, то дописывай в комментарий то что есть в параметре
13. Да попутал.
А правильно обращаться к параметрамобъекта ПараметрыОбъекта["СтДДС"] или ПараметрыОбъекта.Получить("СтДДС").
Ничего про параметры не знаю в КД :(
Получить (Get)
Синтаксис:
Получить()
Параметры:
(обязательный)
Тип: Произвольный. Ключ значения.
Возвращаемое значение:
Значение элемента соответствия.
Описание:
Получает значение по ключу. Работает аналогично оператору [].
15,16. Спасибо. Может быть кто-то подскажет как значение из источника можно вставить в комментарий приемника. Если есть пример выложите пожалуйста.
Читал, спасибо. Но своего или похожего примера не нашел.
Как Вы решили бы эту задачу, может я вообще не в ту степь пошел?
(19) попробуй как в (11) сделать. Суть в том, что после загрузки ты проверяешь, заполнена ли статья в документе. Т.к. новые статьи не создаются при загрузке, то если статья в загруженном объекте не заполнена, то значит она или не найдена или не заполнена в источнике. Вот тогда и бери из параметра текстовое наименование статьи и дописывай Объект.Комментарий = Объект.Комментарий + " "+ ПараметрыОбъекта["СтДДС"]
+(20) 2 правила ПКС сделай: одно статья - статья по правилу конвертации справочника статьи, у которого ты видимо поставил галку "не создавать новый если не найден".
А второе - статья - параметр "СтДДС". и в нем перед выгрузкой:
Значение = Источник.СтатьяДДС.Наименование;
19,20. Это я понимаю, но у меня не получается ИМЕННО передать значение стДДС в этот параметр и прочитать его после загрузки. Создал уже 2 ПКС для стДДС, одно пишется в параметр, второе передает полное значение в приемник. По второму вопросов нет, статья подставляется, если найдена, а значение первого в ПКО ПослеЗагрузки равно ПУСТОТА.
И Объект.Комментарий = Объект.Комментарий + " \ "+ ПараметрыОбъекта["СтДДС"] --- в комментарий записывается только "\", даже старое значение стирается
PS: проблема в том, что в параметр значение почему то не записывается.
22. ". И Объект.Комментарий = Объект.Комментарий + " \ "+ ПараметрыОбъекта["СтДДС"] --- в комментарий записывается только "\", даже старое значение стирается. "
- старое значение выводится (просто много уже напробывал, немного сбился) и знак разделителя, а сам параметр не хочет передаваться.
24. Заполнено (СтатьиДвиженияДенежныхСредств). Изменил - все тоже самое. Насколько я понимаю проблема в том, что у меня ни в первом ни во втором ПКС не сообщает СТДДС ни в одном из обработчиков.
Из-за этого ничего и не передается. Может мне стоит как-то получить объект=источник сначала, может запросом?
Только что попробовал передать комментарий в параметр и дописать его в старый после загрузки - получилось.
Значит проблема именно в том что в ПКС я не могу получить значение стДДС. Буду пробывать дальше :)
Да, вот в чем проблема. Подскажите как в обработчике ПКС мне все-таки получить значение СтДДС, если СтДДС в источнике находится в ТЧ. Для ТЧ у меня есть ПКГС и ПКС для каждого реквизита, но значение стДДС я увидеть не могу
Проблема была в том, что СтДДС была в ТЧ, учитывая это сделал изменения ПКС для параметра.
Жан Пердежон спасибо за наводку!
ssh2006 большое спасибо, что разжевали как записывать значение в параметр!
Все получилось. В ПКС для передачи в параметр указал Значение = Источник.РасшифровкаПлатежа[0].СтДДС, так как в УПП РасшифровкаПлатежа имеет одну строку, его словил ПослеЗагрузки и по условию добавил в комментарий.
1. Для передачи параметра (или параметров, количество передаваемого может быть произвольным)
в обработчике Правила Конвертации Объекта(ПКО) ПриВыгрузке пишем следующее
Количество таких блоков может быть произвольным, в зависимости от количества передаваемого.
""ИмяПараметрПКО" и " ЗначениеПараметрПКО" - имена обязательные, потому что по ним потом будет поиск в при загрузке.
"Клиент" и Строка(Источник.Клиент) - величины произвольные.
Первое вы сами назначаете и сами же потом будите использовать в обработчиках загрузки.
А второе- это и есть передаваемое значение. Оно может быть любым, но при записи в файл все равно приведется к типу Строка.
2. Для получения переданных параметров в базе-приемнике надо немного изменить обработку загрузки.
Открываем в конфигурации модуль объекта обработки
и ищем
Идем от начала в низ, пропускаем обработчики ПередЗагрузкой и находим вот такой кусок кода
Для начала перед циклом
поставим свою строчку :
Дальше в цикле нас интересует именно переменная .
Поэтому быстренько проверив ее заполняем наше свежерожденное соответствие:
Вот собственно и все.
Соответствие ПараметрыПКО доступно в обработчиках ПриЗагрузке и ПослеЗагрузки. А там - вспоминайте уже сами какими именами вы называли ваши параметры и доставайте их из него. Например :
*В ПКС есть хитрая галка "Передавать данные в параметр". И казалось бы сам бог велел ее использовать.
ЭТО ТОЛЬКО ДЛЯ ОБМЕНА V8 - V8 И ОБРАБОТКИ ВЫГРУЗКИ И ЗАГРУЗКИ НЕ НИЖЕ 2.0.18.1
Данный функционал позволяет передавать дополнительные параметры в информационную базу приемник из источника.
Но если исходная конвертация 7.7 , не удивляйтесь если эта галка не доступна для использования. по мне так лучше бы вообще убрали видимость, чтобы не вводить в заблуждение и искушение.
3. Передача глобальных параметров при конвертации 7.7 ==> 8 без правки штатных модулей
Кратко суть проблемы можно озвучить цитатой из документации:
"Передача параметра из источника в приемник доступна только при обмене между информационными базами на платформе 1С:Предприятие 8".
Ниже излагается способ передачи глобальных параметров при таком обмене без правки выгруженного из КД 2 модуля выгрузки и без правки самой КД 2. Итак:
в обработчике ПередВыгрузкойДанных пишем код:
после этого данные параметры будут абсолютно штатно загружены в стандартной обработке "Универсальный обмен данными в формате XML (2.1.5)".
Нюанс: чтобы иметь параметры на ранних стадиях загрузки (предшествующих загрузке параметров), например, в обработчиках ПередЗагрузкойДанных или ПередОбработкой в ПОД (правилах очистки данных), нужно каким-то образом устанавливать параметры на этапе выполнения ПередЗагрузкойДанных. Как это сделать, не меняя штатный механизм (т.е. без исправления модулей выгрузки/загрузки)?
Можно, например, так:
дописываем в ПередВыгрузкойДанных следующий код:
Читайте также: